4. 缺失率统计:全局缺失率、字段缺失率、样本缺失率的计算与阈值设定

在金融风控场景中,特征缺失并非均匀分布。一个字段可能在整体上缺失率很低,但在某些高风险样本子集中却完全为空;反之,某个样本可能仅缺失少量字段,但恰好缺失了模型最关键的入模变量。因此,仅靠单一的“全局缺失率”无法定位问题。本章建立三级缺失率指标体系,并给出金融场景下的推荐阈值。

4.1 三级缺失率定义与计算公式

指标名称 计算口径 公式 适用场景
全局缺失率 整个数据集中所有单元格的缺失比例 缺失单元格总数 / (行数 × 列数) 数据质量大盘监控,快速判断批次数据是否可用
字段缺失率 单个特征列中空值占比 该列空值数 / 总样本数 特征筛选、入模变量评估、数据源稳定性监控
样本缺失率 单个样本(客户/交易)中空值占比 该样本空值字段数 / 总字段数 样本质量评分、异常样本识别、拒绝推断预处理
金融场景关键认知: 全局缺失率低于 5% 不代表字段级安全。例如,授信额度字段缺失 2% 但恰好集中在欺诈样本中,就会严重破坏模型区分度。必须三级联动分析。

4.2 阈值设定原则与推荐值

阈值设定需结合业务容忍度、模型鲁棒性和数据成本。以下为风控建模常用基线:

  • 字段缺失率阈值:
    • 严格(建模用): < 5% —— 可直接填充或删除;5%–20% —— 需分析缺失机制(MCAR/MAR/MNAR);> 20% —— 建议剔除或构造缺失指示变量。
    • 宽松(报表/监控用): < 30% 可保留,但必须做缺失值标记。
  • 样本缺失率阈值:
    • 正常样本: < 10% —— 常规填充即可。
    • 预警样本: 10%–40% —— 需人工复核或降权。
    • 高风险样本: > 40% —— 建议标记为“信息不足”并进入人工调查流程。
  • 全局缺失率阈值:
    • 日/周批次监控: < 3% 为正常;3%–8% 触发告警;> 8% 阻断自动建模流程。
实践建议: 在风控流水线中,将字段缺失率 > 20% 的特征自动移入“待观察区”,不参与主模型训练,但保留在宽表中用于回溯分析。

4.3 三级缺失率联动分析框架

下图展示了从全局到字段再到样本的逐层下钻路径,以及各层对应的处置动作:

三级缺失率联动分析框架 全局缺失率 大盘健康度 > 3% 触发告警 字段缺失率(逐列扫描) < 5% 直接填充 | 5%–20% 分析缺失机制 | > 20% 剔除或构造指示变量 样本缺失率(逐行扫描) < 10% 常规填充 | 10%–40% 降权/复核 | > 40% 标记为信息不足 输出:缺失报告 + 处置建议

4.4 快速计算实现(Python 参考代码)

以下代码片段可直接嵌入风控数据巡检脚本,输出三级缺失率并自动判定阈值等级:

import pandas as pd
import numpy as np

def missing_rate_audit(df: pd.DataFrame, 
                       field_threshold_high=0.20,
                       sample_threshold_high=0.40):
    """
    三级缺失率快速巡检
    返回:全局缺失率、字段缺失率Series、样本缺失率Series、告警列表
    """
    total_cells = df.shape[0] * df.shape[1]
    missing_cells = df.isnull().sum().sum()
    global_rate = missing_cells / total_cells

    # 字段缺失率
    field_missing = df.isnull().mean()
    # 样本缺失率
    sample_missing = df.isnull().mean(axis=1)

    alerts = []
    if global_rate > 0.03:
        alerts.append(f"[告警] 全局缺失率 {global_rate:.2%} > 3%")

    high_missing_fields = field_missing[field_missing > field_threshold_high].index.tolist()
    if high_missing_fields:
        alerts.append(f"[剔除建议] 字段缺失率 > {field_threshold_high:.0%} 的字段: {high_missing_fields}")

    high_missing_samples = sample_missing[sample_missing > sample_threshold_high].index.tolist()
    if high_missing_samples:
        alerts.append(f"[高风险样本] 样本缺失率 > {sample_threshold_high:.0%} 的样本数: {len(high_missing_samples)}")

    return {
        'global_rate': global_rate,
        'field_missing': field_missing,
        'sample_missing': sample_missing,
        'alerts': alerts,
        'high_missing_fields': high_missing_fields,
        'high_missing_samples': high_missing_samples
    }

# 使用示例
# result = missing_rate_audit(loan_data)
# print(result['alerts'])

4.5 金融场景特殊注意事项

避坑指南:
  • 零值 ≠ 缺失: 在收入、额度等字段中,0 可能是真实值(如无授信),不能直接视为缺失。
  • 缺失率与时间窗口相关: 月初数据源延迟可能导致字段缺失率飙升,需与数据源SLA联动判断。
  • 样本缺失率与拒绝推断: 被拒绝客户的样本缺失率通常偏高,直接删除会导致样本选择偏差,建议使用缺失指示变量。
  • 阈值动态调整: 在模型监控期,若某字段缺失率从 2% 突增至 15%,即使未超过 20% 阈值也应触发告警。

4.6 缺失率报告模板(字段级)

下表为字段缺失率巡检的标准输出格式,可直接用于风控日报:

字段名称 缺失率 阈值判定 建议动作
授信额度 1.2% ✅ 正常 均值填充
收入证明 18.5% ⚠️ 预警 分析缺失机制,考虑增加第三方数据源
征信查询次数 35.0% 🚫 高风险 剔除或构造缺失指示变量
抵押物估值 62.3% 🚫 高风险 建议剔除,仅保留在宽表中

通过三级缺失率体系,风控团队可以在 5 分钟内完成一次全量特征的缺失健康度扫描,并直接输出可执行的字段处置清单与样本风险名单,为后续特征工程和模型训练提供干净的数据基础。