缺失值统计描述:缺失率计算、按特征分组统计缺失、按时间窗口统计缺失模式

在风控数据质量沙盘推演中,缺失值统计描述是数据质量诊断的第一步。通过系统化的统计方法,我们可以量化缺失问题的严重程度、定位高缺失特征、识别缺失的时间规律,为后续的缺失值处理策略提供数据支撑。本节将围绕三个核心维度展开:全局缺失率计算、按特征分组统计缺失、按时间窗口统计缺失模式。

1. 缺失率计算:全局与局部视角

缺失率是最基础的量化指标,通常定义为缺失样本数占总样本数的百分比。在风控场景中,我们不仅需要计算全局缺失率,还需要按特征维度计算每个字段的缺失率,以识别高缺失风险字段。

缺失率范围 风险等级 建议处理策略
< 1% 低风险 可忽略或直接删除缺失样本
1% - 5% 中风险 均值/中位数填充或模型预测填充
5% - 20% 高风险 需分析缺失机制,考虑多重插补或特征工程
> 20% 极高风险 评估特征保留价值,可能需删除或重构特征
关键指标: 风控建模中,缺失率超过 20% 的特征通常需要谨慎评估。若该特征与逾期率强相关,则需优先处理而非直接删除。
import pandas as pd
import numpy as np

# 加载风控样本数据
df = pd.read_csv('risk_data_sample.csv')

# 计算全局缺失率
total_missing = df.isnull().sum().sum()
total_cells = df.size
global_missing_rate = total_missing / total_cells
print(f"全局缺失率: {global_missing_rate:.2%}")

# 按特征计算缺失率
feature_missing_rate = df.isnull().mean().sort_values(ascending=False)
print("特征缺失率 Top 10:")
print(feature_missing_rate.head(10))

2. 按特征分组统计缺失:定位高缺失字段

按特征分组统计缺失能够帮助我们快速定位哪些字段是缺失问题的重灾区。在风控数据中,常见的缺失高发字段包括:收入信息、工作单位、联系人信息、征信查询记录等。分组统计时,建议同时输出缺失样本数与缺失率,并结合业务含义进行交叉分析。

实战技巧: 对于分类特征,可以进一步计算每个类别下的缺失率,识别是否存在“类别偏好缺失”。例如,某些职业类别的收入字段缺失率显著高于其他类别,可能暗示数据采集环节的系统性偏差。
# 按特征分组统计缺失样本数与缺失率
missing_summary = pd.DataFrame({
    '缺失样本数': df.isnull().sum(),
    '缺失率': df.isnull().mean()
}).sort_values('缺失率', ascending=False)

# 添加特征数据类型列
missing_summary['数据类型'] = df.dtypes

print("特征缺失统计摘要:")
print(missing_summary[missing_summary['缺失率'] > 0.05])
按特征分组缺失率分布图(Top 8 高缺失特征) 0% 25% 50% 75% 收入 78% 工作单位 68% 联系人电话 58% 征信查询次数 48% 房产信息 38% 学历 28% 婚姻状况 18% 年龄 8% 红色:极高风险(>50%) | 橙色:高风险(20%-50%) | 蓝色:中风险(10%-20%) | 绿色:低风险(<10%)

3. 按时间窗口统计缺失模式:识别时序规律

风控数据通常具有明显的时间属性,缺失模式可能随时间变化。按时间窗口(如日、周、月)统计缺失率,可以帮助我们发现数据采集流程中的系统性故障、周期性缺失或突发性缺失事件。常见的时序缺失模式包括:

  • 趋势性缺失: 缺失率随时间逐渐上升或下降,可能反映数据源质量退化或采集流程变更。
  • 周期性缺失: 缺失率在特定时间窗口(如周末、月末)规律性升高,可能与业务节奏相关。
  • 突发性缺失: 在某个时间点缺失率突然飙升,通常对应系统故障、接口异常或数据源中断。
# 假设数据包含 'apply_date' 字段
df['apply_date'] = pd.to_datetime(df['apply_date'])

# 按周统计缺失率
weekly_missing = df.set_index('apply_date').resample('W').apply(
    lambda x: x.isnull().mean()
)

# 提取关键特征的周缺失率趋势
key_features = ['income', 'work_company', 'contact_phone']
weekly_trend = weekly_missing[key_features]

print("周度缺失率趋势(近4周):")
print(weekly_trend.tail(4))
按时间窗口(周)统计缺失模式 0% 25% 50% 75% W1 W2 W3 W4 W5 W6 W7 收入字段 工作单位 联系人电话 趋势解读:收入字段缺失率波动较大,W4出现异常峰值;工作单位缺失率呈缓慢下降趋势;联系人电话缺失率整体下降但W4反弹

4. 综合统计报告:多维度缺失诊断

将上述三个维度的统计结果整合为一份综合缺失诊断报告,能够为数据质量治理提供全景视图。建议报告包含以下核心模块:

  1. 全局概览: 总缺失率、缺失样本数、受影响特征数。
  2. 特征缺失排名: 按缺失率降序排列,标注风险等级。
  3. 时间窗口缺失热力图: 展示关键特征在不同时间窗口的缺失率变化。
  4. 缺失模式分类: 识别随机缺失(MCAR)、条件缺失(MAR)或非随机缺失(MNAR)。
注意: 缺失模式分类需要结合业务逻辑进行判断。例如,收入字段缺失率在周末显著升高,可能因为周末申请用户多为自由职业者,收入信息难以核实,这属于条件缺失(MAR)而非随机缺失。错误的模式判断会导致后续填充策略失效。
# 生成综合缺失诊断报告
def generate_missing_report(df, date_col='apply_date'):
    report = {}
    
    # 1. 全局缺失率
    report['global_missing_rate'] = df.isnull().sum().sum() / df.size
    
    # 2. 特征缺失排名
    feature_missing = df.isnull().mean().sort_values(ascending=False)
    report['top_missing_features'] = feature_missing[feature_missing > 0.05]
    
    # 3. 时间窗口缺失统计
    if date_col in df.columns:
        df[date_col] = pd.to_datetime(df[date_col])
        weekly = df.set_index(date_col).resample('W').apply(
            lambda x: x.isnull().mean()
        )
        report['weekly_missing_trend'] = weekly.mean(axis=1)
    
    return report

# 执行诊断
diagnosis = generate_missing_report(df)
print(f"全局缺失率: {diagnosis['global_missing_rate']:.2%}")
print("高缺失特征:")
print(diagnosis['top_missing_features'])

通过系统化的缺失值统计描述,我们能够从全局、特征和时间三个维度全面掌握数据缺失状况,为后续的缺失值处理策略制定提供坚实的数据基础。在风控数据质量沙盘推演中,这一步是数据治理的起点,也是确保模型稳定性和可靠性的关键环节。