3. 数据探索性分析(EDA):数据质量检查、缺失值分布、异常值检测、单变量与双变量分析
数据探索性分析(EDA)是特征工程的基石。在构建任何评分模型之前,必须对原始数据进行彻底的“体检”。本章将系统性地讲解数据质量检查、缺失值分布、异常值检测以及单变量与双变量分析的核心方法与实战技巧。
核心原则:EDA 不是一次性任务,而是一个迭代过程。每次发现数据问题,都应回溯至上游数据源或调整特征工程策略,形成闭环。
3.1 数据质量检查
数据质量直接决定模型的上限。质量检查通常从以下四个维度展开:
| 维度 | 检查内容 | 常见问题 | 处理建议 |
|---|---|---|---|
| 完整性 | 缺失值比例、空字符串、占位符 | 关键字段缺失率 > 50% | 删除字段或使用强相关特征插补 |
| 准确性 | 数据类型、取值范围、逻辑一致性 | 年龄为负数、收入为 0 | 设定业务阈值截断或标记为异常 |
| 一致性 | 编码统一、单位换算、时间格式 | 性别编码 1/2 与 M/F 混用 | 统一映射为标准编码表 |
| 唯一性 | 主键重复、样本重复 | 同一客户 ID 出现多次 | 按时间戳保留最新记录或去重 |
实战提示:在风控场景中,准确性和一致性比完整性更致命。一个错误的收入字段可能直接导致信用评分偏差超过 50 个点。
3.2 缺失值分布分析
缺失值不是简单的“空”,其分布模式往往蕴含业务信息。我们需要区分三种缺失机制:
- 完全随机缺失(MCAR):缺失与数据本身无关,如系统随机故障。可直接删除或均值填充。
- 随机缺失(MAR):缺失依赖于其他观测变量,如高收入人群更不愿填写收入。需用模型预测填充。
- 非随机缺失(MNAR):缺失依赖于缺失值本身,如违约客户故意隐瞒负债。这是风控中最危险的情况,需单独编码为“缺失”类别。
以下是一个典型的缺失值分布可视化流程(使用 Python 伪代码示意):
import pandas as pd
import missingno as msno
# 加载数据
df = pd.read_csv('credit_data.csv')
# 缺失值矩阵图(白色为缺失)
msno.matrix(df)
# 缺失值相关性热力图
msno.heatmap(df)
# 按缺失率排序输出
missing_ratio = df.isnull().mean().sort_values(ascending=False)
print(missing_ratio[missing_ratio > 0.05])
避坑指南:不要对缺失率超过 70% 的字段做复杂填充。在风控评分卡中,这类字段通常直接删除,或仅保留“是否缺失”作为二值特征。
3.3 异常值检测
异常值在风控中可能是欺诈信号,也可能是数据录入错误。常用检测方法分为统计法和距离法:
| 方法 | 适用场景 | 阈值设定 | 风控案例 |
|---|---|---|---|
| Z-Score | 近似正态分布 | |Z| > 3 | 交易金额异常 |
| IQR 四分位距 | 偏态分布 | Q1 - 1.5*IQR 或 Q3 + 1.5*IQR | 收入字段 |
| 孤立森林 | 高维数据 | 异常得分 > 0.6 | 多头借贷特征组合 |
| DBSCAN | 密度分布不均 | 核心点距离 > ε | 地理位置异常 |
以下 SVG 图展示了异常值检测的完整流程与决策路径:
3.4 单变量分析
单变量分析关注每个特征自身的分布特性,是特征筛选的第一步。核心指标包括:
- 集中趋势:均值、中位数、众数——判断特征是否偏态。
- 离散程度:标准差、方差、极差——衡量特征波动性。
- 分布形状:偏度(Skewness)和峰度(Kurtosis)——决定是否需要做 Box-Cox 变换。
- 类别平衡:对于分类特征,计算每个类别的占比,警惕长尾类别。
风控经验:在信用评分中,偏度 > 2 的特征通常需要做对数变换或分箱处理,否则模型会过度关注极端值。
3.5 双变量分析
双变量分析揭示特征与目标变量(如是否违约)之间的关系,是特征有效性的直接证据。常用方法如下:
| 特征类型 | 目标类型 | 分析方法 | 关键指标 |
|---|---|---|---|
| 连续型 | 二分类 | 箱线图、小提琴图、KS 检验 | KS 统计量、IV 值 |
| 连续型 | 连续型 | 散点图、Pearson/Spearman 相关系数 | 相关系数 r、p 值 |
| 分类型 | 二分类 | 堆叠柱状图、卡方检验 | 卡方值、WOE 编码 |
| 分类型 | 分类型 | 交叉表、Cramér's V | V 值(0~1) |
以下 SVG 图展示了双变量分析中连续特征与二分类目标的典型分析框架:
3.6 EDA 实战清单
在实际项目中,建议按以下步骤执行 EDA,确保不遗漏关键环节:
- 数据概览:使用
df.info()和df.describe()快速了解字段数量、类型和基本统计量。 - 缺失值矩阵:使用
missingno库绘制缺失值矩阵,识别缺失模式。 - 异常值扫描:对每个连续特征绘制箱线图,标记超出 1.5 倍 IQR 的样本。
- 单变量分布:绘制直方图 + 核密度曲线,计算偏度和峰度。
- 双变量交叉:对每个特征计算 IV 值(信息量),筛选 IV > 0.02 的特征进入建模。
- 相关性矩阵:计算 Pearson 相关系数,剔除相关性 > 0.8 的特征对,避免多重共线性。
效率技巧:使用
pandas-profiling 或 ydata-profiling 可以一键生成 EDA 报告,但务必人工复核异常值标记和缺失模式,避免自动化误判。