4. 探索性数据分析(EDA)
探索性数据分析是建模前最关键的数据准备环节。通过 EDA,我们能够快速掌握数据全貌、识别数据质量问题、发现变量间的潜在关系,为后续的特征工程与模型选型提供决策依据。本章将系统讲解 EDA 的五个核心步骤:数据概览、缺失值分布、异常值检测、单变量与双变量分析、相关性热力图。
4.1 数据概览
数据概览的目的是快速了解数据集的基本结构、字段类型、统计量以及数据质量。通常使用 pandas 库的 .info() 和 .describe() 方法完成。
核心检查项:
- 样本量:总记录数是否满足建模最低要求(通常建议 > 5000 条)。
- 特征数量:数值型、类别型、文本型各有多少。
- 目标变量分布:好客户与坏客户的比例是否严重失衡。
- 内存占用:数据集是否过大,是否需要分块读取或降采样。
import pandas as pd
# 加载数据
df = pd.read_csv('credit_data.csv')
# 数据概览
print(df.info())
print(df.describe())
# 目标变量分布
print(df['target'].value_counts(normalize=True))
4.2 缺失值分布
缺失值处理是风控建模中的常见挑战。缺失可能来源于数据采集失败、用户未填写、系统截断等。我们需要统计每个特征的缺失比例,并判断缺失机制(MCAR、MAR、MNAR)。
| 缺失机制 | 含义 | 处理建议 |
|---|---|---|
| MCAR(完全随机缺失) | 缺失与任何变量无关 | 可直接删除或均值填充 |
| MAR(随机缺失) | 缺失与其他观测变量相关 | 使用回归/模型填充 |
| MNAR(非随机缺失) | 缺失与缺失值本身相关 | 需业务判断,谨慎处理 |
# 缺失值统计
missing_ratio = df.isnull().mean().sort_values(ascending=False)
print(missing_ratio[missing_ratio > 0])
经验法则:缺失率超过 70% 的特征通常直接删除;缺失率在 30%-70% 之间的特征,建议结合业务含义决定是否保留;缺失率低于 30% 的特征,可采用中位数、众数或模型预测填充。
4.3 异常值检测
异常值会严重影响模型稳定性,尤其在逻辑回归等线性模型中。常用的检测方法包括:Z-Score、IQR(四分位距)、孤立森林等。
# IQR 方法检测异常值
Q1 = df['income'].quantile(0.25)
Q3 = df['income'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
outliers = df[(df['income'] < lower_bound) | (df['income'] > upper_bound)]
print(f"异常值数量: {len(outliers)}")
注意:风控场景中,部分“异常值”可能代表高风险客户(如极高负债率),不应直接删除,而应单独标记或分箱处理。
4.4 单变量与双变量分析
4.4.1 单变量分析
单变量分析关注每个特征自身的分布形态。对于数值型变量,观察均值、中位数、标准差、偏度、峰度;对于类别型变量,观察频数、占比、类别数量。
# 数值型变量分布
df['age'].hist(bins=30)
# 类别型变量频数
print(df['education'].value_counts())
4.4.2 双变量分析
双变量分析用于探索特征与目标变量之间的关系。常用方法包括:分组统计、箱线图、小提琴图、交叉表等。
| 变量类型 | 分析方法 | 输出指标 |
|---|---|---|
| 数值型 vs 二分类目标 | 分组均值、箱线图 | 均值差异、IV值 |
| 类别型 vs 二分类目标 | 交叉表、卡方检验 | 坏账率、卡方统计量 |
| 数值型 vs 数值型 | 散点图、相关系数 | Pearson/Spearman 系数 |
# 双变量分析示例:收入与违约率
df.groupby('income_bin')['target'].mean().plot(kind='bar')
# 交叉表
pd.crosstab(df['education'], df['target'], normalize='index')
4.5 相关性热力图
相关性热力图用于可视化数值型变量之间的线性相关程度。在风控建模中,高相关性特征会导致多重共线性,影响模型稳定性。通常使用 Pearson 相关系数,并设定阈值(如 |r| > 0.7)作为强相关标记。
import seaborn as sns
import matplotlib.pyplot as plt
# 计算相关系数矩阵
corr_matrix = df.corr()
# 绘制热力图
plt.figure(figsize=(12, 10))
sns.heatmap(corr_matrix, annot=True, fmt='.2f', cmap='coolwarm',
vmin=-1, vmax=1, center=0)
plt.title('特征相关性热力图')
plt.show()
关键判断标准:
- |r| ≥ 0.7:强相关,建议保留业务意义更强的特征,删除冗余特征。
- 0.4 ≤ |r| < 0.7:中等相关,可考虑 PCA 或特征组合。
- |r| < 0.4:弱相关或无关,通常不会引起共线性问题。
4.6 EDA 输出与建模决策
完成 EDA 后,应形成一份清晰的 数据质量报告,包含以下内容:
- 数据概览表:样本量、特征数、目标分布、缺失率最高的 Top 5 特征。
- 异常值清单:每个特征的异常值比例、异常值分布区间。
- 强相关特征对:列出 |r| > 0.7 的特征对,并给出保留建议。
- 初步特征筛选:基于缺失率、IV 值、相关性,给出删除或保留的初步意见。
最佳实践:将 EDA 结果保存为 HTML 报告(可使用
pandas-profiling 或 sweetviz 自动生成),便于团队评审和后续建模回溯。