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)}")
注意:风控场景中,部分“异常值”可能代表高风险客户(如极高负债率),不应直接删除,而应单独标记或分箱处理。
异常值检测方法对比 Z-Score 方法 假设正态分布 IQR 方法 基于四分位距 孤立森林 无分布假设 适用场景对比 • Z-Score:适用于近似正态分布的连续变量(如年龄、收入对数) • IQR:适用于偏态分布,对异常值不敏感,风控中最常用 • 孤立森林:适用于高维数据,能捕捉复杂异常模式

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:弱相关或无关,通常不会引起共线性问题。
EDA 流程与输出 数据概览 缺失值分布 异常值检测 单/双变量分析 相关性热力图(最终输出) EDA 输出清单 • 数据质量报告(缺失率、异常率、数据类型) • 特征分布统计表 • 相关性矩阵 • 初步特征筛选建议

4.6 EDA 输出与建模决策

完成 EDA 后,应形成一份清晰的 数据质量报告,包含以下内容:

  1. 数据概览表:样本量、特征数、目标分布、缺失率最高的 Top 5 特征。
  2. 异常值清单:每个特征的异常值比例、异常值分布区间。
  3. 强相关特征对:列出 |r| > 0.7 的特征对,并给出保留建议。
  4. 初步特征筛选:基于缺失率、IV 值、相关性,给出删除或保留的初步意见。
最佳实践:将 EDA 结果保存为 HTML 报告(可使用 pandas-profiling 或 sweetviz 自动生成),便于团队评审和后续建模回溯。