3. 缺失模式识别:单变量缺失、多变量缺失、单调缺失、任意缺失
在金融风控场景中,特征缺失并非随机出现,而是往往遵循特定的缺失模式(Missing Pattern)。识别缺失模式是选择缺失值处理方法的前提。错误的模式判断可能导致偏差估计或模型失效。本节将系统讲解四种核心缺失模式的特征与识别方法。
3.1 缺失模式分类总览
根据缺失变量数量与缺失结构,可将缺失模式分为以下四类:
| 缺失模式 | 定义 | 金融场景典型示例 | 处理难度 |
|---|---|---|---|
| 单变量缺失 | 仅一个特征存在缺失值,其余特征完整 | 仅“收入”字段缺失,其他字段(年龄、职业、负债)完整 | 低 |
| 多变量缺失 | 两个及以上特征同时存在缺失值,但缺失之间无固定依赖关系 | “收入”与“征信评分”同时缺失,但缺失原因独立 | 中 |
| 单调缺失 | 缺失值呈现层级递进关系:若变量A缺失,则变量B必然缺失 | “房产估值”缺失 → “抵押率”必然缺失(后者依赖前者计算) | 中高 |
| 任意缺失 | 缺失模式无规律可循,变量间缺失相互独立 | 各字段缺失完全随机,无任何结构 | 高 |
巡检要点: 在金融数据巡检中,单调缺失是最容易被忽视但影响最大的模式。例如,若“担保人信息”缺失导致“担保额度”也缺失,直接删除或填充都会破坏业务逻辑。
3.2 单变量缺失(Univariate Missing)
特征定义: 数据集中仅有一个特征存在缺失值,其余特征均为完整观测。
识别方法:
- 缺失率统计: 计算每个特征的缺失比例,仅一个特征缺失率 > 0。
- 缺失矩阵可视化: 绘制缺失值热力图或二值矩阵,观察缺失是否集中在单一列。
- 条件缺失检查: 确认其他特征在缺失样本中是否均为非空。
金融案例: 某消费贷产品中,仅“职业信息”字段缺失 12%,其余字段完整。经排查,缺失源于前端表单该字段为非必填项。处理方式:根据“收入”与“学历”进行多重插补。
# Python 快速识别单变量缺失
import pandas as pd
import numpy as np
def detect_univariate_missing(df, threshold=0.0):
"""
检测单变量缺失模式
:param df: 输入DataFrame
:param threshold: 缺失率阈值,默认0表示只要存在缺失即标记
:return: 是否为单变量缺失,缺失变量名
"""
missing_ratio = df.isnull().mean()
missing_vars = missing_ratio[missing_ratio > threshold]
if len(missing_vars) == 1:
return True, missing_vars.index[0], missing_vars.values[0]
else:
return False, None, None
# 示例调用
is_univariate, var_name, ratio = detect_univariate_missing(loan_data)
print(f"单变量缺失: {is_univariate}, 变量: {var_name}, 缺失率: {ratio:.2%}")
3.3 多变量缺失(Multivariate Missing)
特征定义: 两个及以上特征同时存在缺失值,但缺失之间不存在确定的依赖关系。
识别方法:
- 缺失相关性矩阵: 计算特征间缺失指示变量的相关系数(Phi系数)。
- 缺失模式表: 统计不同缺失组合的样本频次。
- 卡方独立性检验: 检验两个特征的缺失事件是否独立。
常见陷阱: 多变量缺失不等于随机缺失(MAR)。即使缺失变量间独立,缺失机制仍可能与观测值相关。例如,“收入”与“负债”同时缺失,但缺失概率可能受“年龄”影响。
# 缺失相关性矩阵计算
def missing_correlation_matrix(df):
"""计算特征间缺失指示变量的相关系数矩阵"""
missing_indicator = df.isnull().astype(int)
corr_matrix = missing_indicator.corr(method='pearson')
return corr_matrix
# 输出缺失相关性热力图数据
corr = missing_correlation_matrix(credit_data)
print("缺失相关性矩阵(仅显示 |r| > 0.3 的配对):")
for i in range(len(corr.columns)):
for j in range(i+1, len(corr.columns)):
if abs(corr.iloc[i, j]) > 0.3:
print(f" {corr.columns[i]} ↔ {corr.columns[j]}: r = {corr.iloc[i, j]:.3f}")
3.4 单调缺失(Monotone Missing)
特征定义: 缺失模式呈现层级结构:若变量A缺失,则变量B必然缺失;反之不成立。这种模式在金融衍生变量中极为常见。
识别方法:
- 条件缺失检查: 对任意两个变量X、Y,检查 P(Y缺失 | X缺失) 是否等于1。
- 缺失层级图: 构建有向图,节点为变量,边表示“若父节点缺失则子节点必然缺失”。
- 业务规则验证: 结合特征衍生逻辑确认单调关系。
金融案例: 在抵押贷款场景中,“房产估值”缺失 → “贷款价值比(LTV)”缺失 → “风险评级”缺失。这是一个三级单调缺失链。处理时需从源头(房产估值)开始插补,而非逐变量独立填充。
3.5 任意缺失(Arbitrary Missing)
特征定义: 缺失模式无任何可识别的结构或规律,每个样本的缺失变量组合完全随机。
识别方法:
- 缺失模式多样性统计: 计算唯一缺失模式的数量占总样本数的比例。
- Little's MCAR检验: 检验缺失是否完全随机(MCAR)。若检验显著,则排除MCAR,但仍可能是任意缺失。
- 缺失模式热力图: 观察缺失分布是否呈现均匀、无聚类特征。
处理警示: 任意缺失是处理难度最高的模式。由于缺乏结构,简单的均值填充或删除都可能引入较大偏差。建议优先使用多重插补(MICE)或基于模型的填充方法。
# 缺失模式多样性统计
def missing_pattern_diversity(df):
"""计算缺失模式的多样性指标"""
# 生成缺失模式标识
missing_pattern = df.isnull().astype(int).apply(lambda x: ''.join(x.astype(str)), axis=1)
unique_patterns = missing_pattern.nunique()
total_samples = len(df)
diversity_ratio = unique_patterns / total_samples
return unique_patterns, diversity_ratio
# 示例
unique_pat, ratio = missing_pattern_diversity(transaction_data)
print(f"唯一缺失模式数: {unique_pat}, 多样性比率: {ratio:.4f}")
# 若 ratio > 0.5,通常提示任意缺失模式
3.6 缺失模式识别流程
在实际金融数据巡检中,建议按以下步骤系统识别缺失模式:
- Step 1:缺失率概览 — 计算各特征缺失率,筛选缺失特征集合。
- Step 2:单变量判断 — 若仅一个特征缺失,直接归为单变量缺失。
- Step 3:单调性检验 — 对多变量缺失,计算条件缺失概率矩阵,识别层级依赖。
- Step 4:相关性分析 — 计算缺失指示变量间的相关系数,判断多变量缺失结构。
- Step 5:多样性评估 — 若以上均无显著结构,归为任意缺失。
3.7 金融场景模式识别对照表
| 金融业务场景 | 常见缺失模式 | 典型缺失变量 | 推荐识别工具 |
|---|---|---|---|
| 信用卡申请评分 | 单变量缺失 | “他行信用卡额度” | 缺失率统计 |
| 小微企业贷款 | 多变量缺失 | “财务报表”、“纳税记录” | 缺失相关性矩阵 |
| 抵押贷款审批 | 单调缺失 | “房产估值”→“LTV”→“风险评级” | 条件缺失概率 |
| 交易反欺诈 | 任意缺失 | “IP地址”、“设备指纹”、“地理位置” | Little's MCAR检验 |
| 保险核保 | 单调缺失 | “体检报告”→“健康评分”→“保费调整系数” | 缺失层级图 |
巡检效率提示: 在每日自动化巡检中,建议将缺失模式识别嵌入数据质量监控流水线。当检测到单调缺失时,自动触发上游数据溯源告警;当检测到任意缺失时,自动切换至鲁棒性更强的模型训练策略。