第三章 数据探索与质量检查(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 了——但前提是数据已经洗得干干净净。