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)”缺失 → “风险评级”缺失。这是一个三级单调缺失链。处理时需从源头(房产估值)开始插补,而非逐变量独立填充。
单调缺失层级结构(抵押贷款场景) 房产估值 贷款价值比 (LTV) 风险评级 单调缺失规则 若“房产估值”缺失 则“LTV”必然缺失 则“风险评级”必然缺失 缺失率 8% 缺失率 8% 缺失率 8%

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 缺失模式识别流程

在实际金融数据巡检中,建议按以下步骤系统识别缺失模式:

  1. Step 1:缺失率概览 — 计算各特征缺失率,筛选缺失特征集合。
  2. Step 2:单变量判断 — 若仅一个特征缺失,直接归为单变量缺失。
  3. Step 3:单调性检验 — 对多变量缺失,计算条件缺失概率矩阵,识别层级依赖。
  4. Step 4:相关性分析 — 计算缺失指示变量间的相关系数,判断多变量缺失结构。
  5. Step 5:多样性评估 — 若以上均无显著结构,归为任意缺失。
缺失模式识别决策流程 缺失特征集合 仅一个特征缺失? 单变量缺失 存在单调依赖? 单调缺失 缺失相关性显著? 多变量缺失 任意缺失 条件缺失概率 = 1 则判定为单调缺失

3.7 金融场景模式识别对照表

金融业务场景 常见缺失模式 典型缺失变量 推荐识别工具
信用卡申请评分 单变量缺失 “他行信用卡额度” 缺失率统计
小微企业贷款 多变量缺失 “财务报表”、“纳税记录” 缺失相关性矩阵
抵押贷款审批 单调缺失 “房产估值”→“LTV”→“风险评级” 条件缺失概率
交易反欺诈 任意缺失 “IP地址”、“设备指纹”、“地理位置” Little's MCAR检验
保险核保 单调缺失 “体检报告”→“健康评分”→“保费调整系数” 缺失层级图
巡检效率提示: 在每日自动化巡检中,建议将缺失模式识别嵌入数据质量监控流水线。当检测到单调缺失时,自动触发上游数据溯源告警;当检测到任意缺失时,自动切换至鲁棒性更强的模型训练策略。