3. 缺失值探索性分析
在风控数据质量沙盘推演中,缺失值探索性分析是承上启下的关键环节。它不仅要回答“缺失了多少”,更要回答“缺失在哪里、缺失之间有何关联、缺失是否与目标变量相关”。本章将围绕三个核心工具展开:pandas-profiling 数据概览、缺失值矩阵可视化、缺失值热力图,帮助您快速建立对缺失模式的全局认知。
3.1 使用 pandas-profiling 进行数据概览
pandas-profiling(现更名为 ydata-profiling)是快速生成数据质量报告的首选工具。它能在几秒内输出包含缺失值统计、分布直方图、相关性矩阵、高频值等信息的 HTML 报告,特别适合在风控建模前对原始数据进行“体检”。
适用场景: 当您拿到一份新的风控样本数据(如申请评分卡、贷中行为数据)时,先用 pandas-profiling 跑一遍,可以快速发现缺失率超过 50% 的字段、异常分布、以及缺失值之间的关联规则。
以下代码演示如何在 Jupyter Notebook 中生成数据概览报告:
import pandas as pd
from ydata_profiling import ProfileReport
# 加载风控样本数据(假设包含 30 个特征,10 万条样本)
df = pd.read_csv('risk_control_sample.csv')
# 生成数据概览报告
profile = ProfileReport(df, title='风控数据质量概览报告', explorative=True)
# 输出为 HTML 文件
profile.to_file('risk_data_profile.html')
报告中的关键缺失值信息集中在 “缺失值” 选项卡下,主要包括:
| 指标 | 说明 | 风控场景解读 |
|---|---|---|
| 缺失值总数 | 数据集中所有缺失值的总和 | 若缺失值总数超过总单元格数的 5%,需重点关注 |
| 缺失值占比 | 缺失值占总单元格数的百分比 | 超过 20% 的字段应考虑是否保留或重构 |
| 缺失值最多的列 | 按缺失率降序排列的前 10 个字段 | 风控中常见缺失字段:收入、工作年限、学历等 |
| 缺失值热力图 | 显示列与列之间缺失值的共现关系 | 帮助发现“系统性缺失”模式,如收入与负债同时缺失 |
实战建议: 在风控建模中,不要只看单列缺失率。pandas-profiling 的“缺失值热力图”能揭示多列缺失之间的关联——例如,如果“月收入”和“工作单位”同时缺失的比例很高,可能意味着这些样本来自自雇人士或非正式就业群体,需要单独处理。
3.2 缺失值矩阵可视化
缺失值矩阵(Missing Value Matrix)是一种将数据集的缺失模式以二维网格形式呈现的可视化方法。每一行代表一个样本,每一列代表一个特征,缺失值用深色标记,非缺失值用浅色标记。通过观察矩阵的“条纹”和“块状”结构,可以快速识别缺失模式。
在 Python 中,missingno 库提供了最简洁的实现方式:
import missingno as msno
import matplotlib.pyplot as plt
# 绘制缺失值矩阵
msno.matrix(df, figsize=(12, 6), fontsize=10, color=(0.2, 0.4, 0.6))
plt.title('风控数据缺失值矩阵', fontsize=14)
plt.show()
缺失值矩阵的典型模式及其风控含义:
| 矩阵模式 | 可视化特征 | 风控解读 |
|---|---|---|
| 随机散落 | 深色点均匀分布,无明显聚集 | 缺失完全随机(MCAR),可直接删除或简单插补 |
| 列条纹 | 某一整列大部分为深色 | 该字段缺失率高,可能是采集遗漏或字段废弃 |
| 行条纹 | 某几行几乎全为深色 | 这些样本可能是“僵尸样本”,建议直接剔除 |
| 块状聚集 | 深色区域形成矩形块 | 多列缺失存在关联,可能是系统性问题 |
注意: 缺失值矩阵在样本量超过 5 万时,渲染速度会明显变慢。建议先对数据进行随机抽样(如取 1 万条)后再绘制矩阵,既能保持模式特征,又能提升绘图效率。
3.3 缺失值热力图
缺失值热力图(Missing Value Heatmap)用于量化展示不同特征之间缺失值的共现强度。热力图中的每个单元格表示两个特征同时缺失的样本比例,颜色越深表示共现程度越高。这一工具在风控场景中尤其重要,因为它能揭示“缺失联动”现象——例如,当申请人的“工作单位”缺失时,“月收入”也往往缺失,这可能暗示该申请人属于非标准就业群体。
使用 missingno 库绘制热力图的代码:
import missingno as msno
import matplotlib.pyplot as plt
# 绘制缺失值热力图
msno.heatmap(df, figsize=(10, 8), fontsize=10, cmap='RdBu')
plt.title('风控特征缺失值热力图', fontsize=14)
plt.show()
热力图的解读要点:
- 对角线: 始终为 1.0(自身与自身的共现比例),可忽略。
- 高值区域(>0.5): 两个特征同时缺失的比例超过 50%,存在强关联缺失机制。
- 低值区域(<0.1): 两个特征几乎不会同时缺失,缺失机制相对独立。
- 负值(在 RdBu 色系中显示为蓝色): 表示两个特征倾向于“互斥缺失”——一个缺失时另一个往往不缺失。