
用Python和Pandas复现Lending Club数据分析从数据清洗到可视化洞察的完整实战在数据驱动的时代掌握数据分析技能已成为职场竞争力的关键。Lending Club作为全球知名的P2P借贷平台其公开数据集为数据分析学习者提供了绝佳的实战素材。本文将带你从零开始使用Python中的Pandas、Matplotlib和Seaborn等工具完整复现一个数据分析项目涵盖数据清洗、特征工程、可视化分析等全流程。1. 环境准备与数据加载在开始分析前我们需要搭建合适的工作环境。推荐使用Anaconda发行版它集成了数据分析所需的绝大多数工具包。# 安装必要库如未安装 !pip install pandas numpy matplotlib seaborn加载数据是任何分析项目的第一步。Lending Club数据集通常以CSV格式提供我们可以直接从官网下载或使用Kaggle等平台获取。import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns # 设置可视化风格 plt.style.use(seaborn) sns.set_palette(husl) # 加载数据集 loan_df pd.read_csv(loan.csv, low_memoryFalse) print(f数据集形状: {loan_df.shape})表Lending Club数据集关键字段说明字段名类型描述loan_amntfloat贷款金额termobject贷款期限(36/60个月)int_ratefloat利率gradeobject信用等级(A-G)emp_lengthobject工作年限home_ownershipobject房产状况annual_incfloat年收入issue_dobject贷款发放日期loan_statusobject贷款状态2. 数据清洗与预处理原始数据往往包含缺失值、异常值和格式不一致等问题需要进行系统性的清洗。2.1 处理缺失值首先检查各列的缺失情况# 计算每列缺失值比例 missing_ratio loan_df.isnull().mean().sort_values(ascendingFalse) missing_ratio[missing_ratio 0].plot(kindbarh, figsize(10,8)) plt.title(各字段缺失值比例) plt.xlabel(缺失比例)对于缺失值我们采取分列处理策略删除缺失率超过50%的列对关键数值列用中位数填充对分类变量用众数或Unknown填充# 删除高缺失率列 loan_df loan_df.dropna(threshlen(loan_df)*0.5, axis1) # 填充数值型缺失值 num_cols [loan_amnt, int_rate, annual_inc] loan_df[num_cols] loan_df[num_cols].fillna(loan_df[num_cols].median()) # 填充分类变量 cat_cols [emp_length, home_ownership] loan_df[cat_cols] loan_df[cat_cols].fillna(Unknown)2.2 特征工程原始数据中的某些字段需要转换才能用于分析# 转换日期字段 loan_df[issue_d] pd.to_datetime(loan_df[issue_d]) loan_df[issue_year] loan_df[issue_d].dt.year # 提取贷款期限数值 loan_df[term_months] loan_df[term].str.extract((\d)).astype(int) # 处理工作年限字段 loan_df[emp_length] loan_df[emp_length].str.replace(\ years, ) loan_df[emp_length] loan_df[emp_length].str.replace( 1 year, 0) loan_df[emp_length] loan_df[emp_length].str.extract((\d)).fillna(0).astype(int)3. 探索性数据分析(EDA)3.1 贷款金额分布plt.figure(figsize(12,6)) sns.histplot(dataloan_df, xloan_amnt, bins30, kdeTrue) plt.title(贷款金额分布) plt.xlabel(贷款金额($)) plt.ylabel(频数)贷款金额的关键统计量均值: $14,822中位数: $13,000众数: $10,00075%分位数: $20,000最大值: $35,0003.2 贷款期限分析term_counts loan_df[term].value_counts() plt.figure(figsize(8,8)) plt.pie(term_counts, labelsterm_counts.index, autopct%1.1f%%) plt.title(贷款期限分布)贷款期限呈现明显两极分化36个月期限占比69.8%60个月期限占比30.2%3.3 年度贷款趋势annual_trend loan_df.groupby(issue_year)[loan_amnt].agg([count,sum]) fig, (ax1, ax2) plt.subplots(2,1, figsize(12,10)) ax1.plot(annual_trend.index, annual_trend[count], markero) ax1.set_title(年度贷款数量趋势) ax1.set_ylabel(贷款笔数) ax2.plot(annual_trend.index, annual_trend[sum], markero, colororange) ax2.set_title(年度贷款总额趋势) ax2.set_ylabel(总金额($))从2007到2015年贷款业务呈现指数级增长2007年仅有少量试点贷款2012年后进入快速增长期2015年贷款笔数达到峰值4. 坏账风险分析4.1 定义坏账标准# 定义坏账状态 bad_status [ Charged Off, Default, Late (31-120 days), Does not meet the credit policy. Status:Charged Off ] loan_df[loan_condition] np.where( loan_df[loan_status].isin(bad_status), bad, good ) # 计算整体坏账率 bad_ratio loan_df[loan_condition].value_counts(normalizeTrue)[bad] print(f整体坏账率: {bad_ratio:.2%})4.2 坏账影响因素分析信用等级与坏账率grade_bad loan_df.groupby(grade)[loan_condition].apply( lambda x: (x bad).mean() ).sort_index() plt.figure(figsize(10,6)) grade_bad.plot(kindbar) plt.title(各信用等级坏账率) plt.ylabel(坏账率)信用等级从A到G坏账率呈现中间高两头低的特点A级最低(约2%)C级最高(约6%)G级反而较低(约4%)工作年限与坏账率emp_bad loan_df.groupby(emp_length)[loan_condition].apply( lambda x: (x bad).mean() ) plt.figure(figsize(12,6)) emp_bad.plot(kindline, markero) plt.title(工作年限与坏账率关系) plt.xlabel(工作年限(年)) plt.ylabel(坏账率)工作年限与坏账率呈现U型曲线新人(0-2年)坏账率较高3-8年经验者坏账率最低10年以上经验者坏账率回升4.3 多维交叉分析使用Seaborn的catplot进行多维度分析g sns.catplot( xgrade, yloan_amnt, hueloan_condition, dataloan_df.sample(10000), kindbox, height6, aspect2 ) g.fig.suptitle(信用等级、贷款金额与坏账关系)分析发现高信用等级(A-B)贷款金额较小中等信用等级(C-D)贷款金额较大且坏账集中低信用等级(F-G)贷款金额适中但利率较高5. 高级可视化技巧5.1 热力图分析# 计算相关系数矩阵 corr_matrix loan_df[[loan_amnt, int_rate, annual_inc, emp_length]].corr() plt.figure(figsize(10,8)) sns.heatmap(corr_matrix, annotTrue, cmapcoolwarm, center0) plt.title(特征相关性热力图)关键发现贷款金额与利率正相关(0.42)年收入与工作年限弱相关(0.18)利率与工作年限负相关(-0.12)5.2 时间序列分析monthly_trend loan_df.set_index(issue_d).resample(M)[loan_amnt].agg([count,sum]) fig, (ax1, ax2) plt.subplots(2,1, figsize(14,10)) monthly_trend[count].plot(axax1, title月度贷款笔数趋势) monthly_trend[sum].plot(axax2, title月度贷款总额趋势, colororange)业务呈现明显季节性每年Q4贷款量激增年初(1-2月)为低谷期2015年后增长趋缓5.3 交互式可视化(可选)使用Plotly创建交互式图表import plotly.express as px fig px.scatter( loan_df.sample(10000), xannual_inc, yloan_amnt, colorloan_condition, hover_data[grade, emp_length], title年收入vs贷款金额(坏账状态着色) ) fig.show()6. 分析结论与业务建议通过上述分析我们得出以下关键发现业务增长趋势2007-2015年业务呈指数增长2012年后进入高速发展期具有明显的季节性波动客户贷款特征70%客户选择3年期贷款贷款金额集中在$10k-$20k年收入与贷款金额正相关风险管控建议加强对C-D级客户的审核关注工作10年以上客户的还款能力优化中等信用等级的风控策略# 保存清洗后的数据 loan_df.to_csv(cleaned_loan_data.csv, indexFalse)这个项目展示了如何用Python进行端到端的数据分析。从原始数据到业务洞察每个步骤都需要仔细思考和验证。在实际工作中还可以进一步探索构建预测模型预估违约风险分析不同地区的贷款特征研究利率定价策略的优化空间