第三章 数据探索与质量检查(EDA)
数据探索性分析,圈里人叫 EDA。说白了就是在建模之前,先跟你手头的样本“聊聊天”。
我刚开始做评分卡那会儿,总急着算 IV、搞分层。结果质量差的变量直接跑出离谱的 IV 值,回头查数据才发现异常值没处理。从那以后,我给自己定了规矩——EDA 不做到位,绝不开算 IV。
本章咱们就聊聊:在信用评分 IV 分层前,到底该怎么系统地检查数据质量。
缺失值处理:先数清楚,再想办法
你想想看,一个变量 80% 都是空值,就算 IV 算出来再高,你敢用吗?反正我不敢。
我个人习惯,先把每列的缺失率算一遍。用 pandas 一行代码就能搞定:
import pandas as pd
missing_rate = df.isnull().mean().sort_values(ascending=False)
print(missing_rate[missing_rate > 0])
拿到缺失率后,我一般按这个规则处理:
| 缺失率范围 | 处理方式 | 适用场景 |
|---|---|---|
| < 5% | 直接删除该行 | 样本量充足时 |
| 5% ~ 30% | 均值/中位数/众数填补 | 连续变量用中位数,分类变量用众数 |
| 30% ~ 60% | 单独设一个“缺失”类别 | 非常适合信用评分中的类别变量 |
| > 60% | 直接删除该变量 | 信息量太少,保留只会增加噪音 |
实战小技巧:我在做「收入」字段时,发现缺失率 35%。直接删掉太可惜,但用均值填补又会扭曲分布。最后我把它变成三档:有收入(填真实值)、收入缺失、收入为0。效果反而比简单填补好。
异常值检测:别让几个坏点毁了 IV
IV 对特征分布的极端值非常敏感。比如「年龄」字段突然冒出一个 150 岁,你用这个变量算出的 IV 会非常 “好看”——但完全是虚的。
常用的检测方法有三类:
- 箱线图法:认为 Q1-1.5IQR ~ Q3+1.5IQR 之外的都是异常。适合正态或近似分布。
- 标准差法:均值的 3 倍标准差以外视为异常。对偏态分布效果差。
- 业务规则法:最硬核。比如消费金额不能为负数、贷款金额必须大于 0。
我曾经踩过的坑:做「信用卡额度」变量时,箱线法检测出了上千个异常点。我一看,都是高端客户——额度几百万。删掉这些客户后,模型对高净值人群直接失效。后来我用业务规则法,只标记「额度超过 100 万」为单独类别,不再粗暴删除。
# 箱线法检测示例
import numpy as np
Q1 = df['amount'].quantile(0.25)
Q3 = df['amount'].quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
outliers = df[(df['amount'] < lower) | (df['amount'] > upper)]
分布检查:变量长什么样?
在计算 IV 之前,你得知道每个变量的分布形态。连续变量要关注偏度和峰度,分类变量要看各个类别的占比。
- 如果偏度太大(比如 > 2),IV 的 WOE 计算容易受极值影响。我通常会做对数变换或分箱。
- 如果某个分类的占比 < 1%,建议合并到“其他”类别,否则 IV 计算时该分箱的 WOE 会极其不稳定。
一个简单的检查代码:
# 连续变量描述统计
df.describe(percentiles=[0.01, 0.05, 0.25, 0.5, 0.75, 0.95, 0.99])
# 分类变量占比
df['educ'].value_counts(normalize=True)
相关性分析:怕共线性,也怕没关系
IV 分层本身不需要考虑变量间相关性,但如果你后续要建逻辑回归模型,强相关变量同时进入模型会出问题。
我会在 EDA 阶段先算一个相关系数矩阵。重点看两类情况:
- 特征之间相关系数 > 0.7:需要剔除一个或做 PCA 降维。
- 特征与目标变量的相关系数 < 0.05:基本可以宣告该变量是噪音,IV 大概率很低。
总结一下 EDA 的输出:一张干净的数据集 + 一份变量质量报告(缺失率、异常点数量、分布偏度、相关系数)。这份报告就是我后续计算 IV 和分层的“通行证”。
好了,EDA 这块儿咱们就聊到这儿。你拿着这些方法,去跑一遍自己的数据,应该能发现不少之前忽略的问题。下节咱们就要开始算 IV 了——但前提是数据已经洗得干干净净。