3. 完整性评估(上):字段级空值率计算、行级缺失度分析、缺失模式识别

数据完整性是风控数据质量的核心支柱之一。缺失值不仅会直接导致模型特征失效,更会在策略规则链中引发“静默拒绝”或“误放过”的连锁反应。本章聚焦完整性评估的三大基础动作:字段级空值率、行级缺失度以及缺失模式识别,为后续的缺失值处理与报告生成奠定量化基础。

3.1 字段级空值率计算

字段级空值率是最直观的完整性指标,用于衡量单个字段中缺失值占总记录数的比例。计算公式如下:

空值率(%) = (该字段空值记录数 / 总记录数) × 100%

在风控场景中,不同字段对空值的容忍度差异极大。例如,身份证号空值率超过 1% 即视为严重异常,而职业信息空值率在 10% 以内可能仍属可接受范围。下表展示了典型风控字段的空值率阈值参考:

字段类别 典型字段 严重告警阈值 一般告警阈值 正常范围
强身份标识 身份证号、手机号 > 1% 0.5% – 1% < 0.5%
核心财务字段 收入、负债金额 > 5% 2% – 5% < 2%
基础人口学 年龄、性别、学历 > 10% 5% – 10% < 5%
扩展行为标签 消费偏好、社交活跃度 > 30% 15% – 30% < 15%
实战提示:在计算空值率时,务必区分“真实缺失”与“业务含义上的空值”。例如,字段值为空字符串 ''、占位符 'NULL'、或特殊值 '-999' 均需根据业务规则统一映射为缺失标记,否则会严重低估空值率。

3.2 行级缺失度分析

行级缺失度从记录维度评估单条数据的完整程度,用于识别“高缺失”的脏数据行。计算公式为:

行缺失度(%) = (该行空值字段数 / 总字段数) × 100%

在风控数据集中,行缺失度分析通常遵循以下步骤:

  1. 设定缺失度阈值:例如,将行缺失度 > 50% 的记录定义为“严重缺失行”。
  2. 统计分布:计算不同缺失度区间(0%、0-10%、10-30%、30-50%、>50%)的记录数及占比。
  3. 定位高缺失行:筛选出严重缺失行,分析其共性特征(如是否集中在特定数据源、特定时间批次)。
  4. 评估影响:判断高缺失行是否可修复,或是否需要直接剔除。

以下是一个行级缺失度分布统计的示例输出:

缺失度区间 记录数 占比 处理建议
0% 85,432 71.19% 完全完整,直接使用
0% – 10% 18,210 15.18% 轻度缺失,可填充或保留
10% – 30% 9,876 8.23% 中度缺失,需评估填充方案
30% – 50% 4,321 3.60% 重度缺失,建议标记或剔除
> 50% 2,161 1.80% 严重缺失,直接剔除
注意:行级缺失度分析不能孤立进行。一条记录虽然缺失度低,但如果缺失的是关键风控字段(如收入、负债),其风险远高于一条缺失度高但缺失的都是非核心字段的记录。因此,行级分析必须与字段级重要性权重结合。

3.3 缺失模式识别

缺失模式识别旨在发现字段之间缺失值的关联规律,是比单字段空值率更深层的分析。常见的缺失模式包括:

  • 完全随机缺失(MCAR):缺失与否完全随机,与其他字段无关。例如,系统随机丢包导致部分记录缺失。
  • 随机缺失(MAR):缺失依赖于其他已观测字段。例如,高收入人群更倾向于不填写“其他收入”字段。
  • 非随机缺失(MNAR):缺失依赖于自身真实值。例如,负债过高的人故意不填写负债金额。

识别缺失模式的常用方法包括:

  1. 缺失矩阵可视化:以热力图形式展示字段间的缺失共现关系。
  2. 关联规则挖掘:使用 Apriori 或 FP-Growth 算法发现“字段 A 缺失 → 字段 B 也缺失”的强关联规则。
  3. 分组对比检验:将数据按某字段是否缺失分组,检验其他字段的分布差异是否显著。

下图展示了风控数据集中常见的三种缺失模式结构:

缺失模式识别结构图 缺失模式识别 — 三种典型结构 模式一:完全随机缺失 (MCAR) 字段A缺失 字段B缺失 缺失事件之间无关联 完全独立随机发生 模式二:随机缺失 (MAR) 字段C已观测 字段D缺失 字段D的缺失依赖于字段C的值 可通过其他字段预测缺失概率 模式三:非随机缺失 (MNAR) 字段E缺失 字段E真实值 字段E的缺失由其自身真实值决定 例如:高负债者故意不填负债 识别方法 缺失矩阵可视化 → 关联规则挖掘 → 分组对比检验 → 业务逻辑验证

3.4 缺失模式识别实战案例

以下是一个使用 Python 进行缺失模式识别的代码示例,基于模拟的风控数据集:

import pandas as pd
import numpy as np
from mlxtend.frequent_patterns import apriori, association_rules

# 模拟风控数据
np.random.seed(42)
data = {
    'income': np.random.choice([np.nan, 5000, 8000, 12000], size=1000, p=[0.1, 0.4, 0.3, 0.2]),
    'debt': np.random.choice([np.nan, 2000, 5000, 10000], size=1000, p=[0.15, 0.35, 0.3, 0.2]),
    'age': np.random.choice([np.nan, 25, 35, 45], size=1000, p=[0.05, 0.3, 0.4, 0.25]),
    'credit_score': np.random.choice([np.nan, 600, 700, 800], size=1000, p=[0.08, 0.3, 0.4, 0.22])
}
df = pd.DataFrame(data)

# 构建缺失指示矩阵
missing_matrix = df.isnull().astype(int)
missing_matrix.columns = [col + '_missing' for col in missing_matrix.columns]

# 使用Apriori算法挖掘频繁项集
frequent_itemsets = apriori(missing_matrix, min_support=0.05, use_colnames=True)
rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1.2)

# 筛选强关联缺失规则
strong_rules = rules[(rules['lift'] > 1.5) & (rules['confidence'] > 0.6)]
print(strong_rules[['antecedents', 'consequents', 'support', 'confidence', 'lift']])
输出解读:上述代码会输出类似“income_missing → debt_missing”的关联规则。如果 lift > 1.5,说明收入字段缺失时,负债字段也缺失的概率显著高于随机水平,提示这两个字段的缺失可能由同一数据源问题或同一批用户行为导致。

3.5 完整性评估报告输出规范

在风控数据质量评估报告中,完整性评估部分应至少包含以下三个输出表:

报告组件 内容说明 输出格式
字段级空值率汇总表 每个字段的空值率、空值记录数、告警等级 表格 + 柱状图
行级缺失度分布表 各缺失度区间的记录数、占比、累计占比 表格 + 直方图
缺失模式关联规则表 强关联缺失规则的前项、后项、支持度、置信度、提升度 表格 + 网络图

通过上述三个维度的系统性评估,风控团队可以精准定位数据完整性短板,为后续的数据清洗、特征工程和模型训练提供可靠的输入依据。