4、特征缺失率统计方法:单特征缺失率计算、整体数据缺失率、按时间窗口(日/周/月)统计缺失率
特征缺失率是金融风控模型数据质量监控中最基础、最核心的指标之一。缺失率过高不仅会降低模型的有效样本量,还可能导致特征分布偏移、模型预测偏差甚至上线事故。本章系统讲解缺失率的三种统计维度:单特征、整体数据以及时间窗口,并给出可直接落地的 Python 实现。
4.1 单特征缺失率计算
单特征缺失率衡量的是某个特征在全部样本中缺失值的占比,是特征级数据质量巡检的起点。计算公式如下:
单特征缺失率 = (缺失样本数 / 总样本数) × 100%
在金融风控场景中,不同特征的缺失容忍度差异很大。下表列出常见特征的缺失率阈值参考:
| 特征类型 | 典型特征示例 | 可接受缺失率 | 触发告警阈值 |
|---|---|---|---|
| 强征信类 | 人行征信查询次数、信贷历史最长逾期天数 | ≤ 5% | > 10% |
| 弱三方类 | 电商消费分、社交活跃度评分 | ≤ 20% | > 30% |
| 用户自填类 | 职业、学历、收入范围 | ≤ 30% | > 50% |
| 衍生计算类 | 近3个月收入波动率、多头借贷指数 | ≤ 10% | > 15% |
Python 实现单特征缺失率计算:
import pandas as pd
import numpy as np
def single_feature_missing_rate(df, feature_name):
"""
计算单特征缺失率
:param df: DataFrame
:param feature_name: 特征列名
:return: 缺失率(百分比)
"""
total = len(df)
missing = df[feature_name].isnull().sum()
rate = (missing / total) * 100
return round(rate, 4)
# 示例:计算 'income' 特征的缺失率
missing_rate = single_feature_missing_rate(loan_data, 'income')
print(f"特征 income 缺失率: {missing_rate}%")
4.2 整体数据缺失率
整体数据缺失率反映整个数据集的数据完整程度,通常有两种计算口径:
- 全局缺失率:所有特征所有样本中缺失值总数 / (样本数 × 特征数) × 100%
- 平均特征缺失率:各特征缺失率的算术平均值
两种口径各有适用场景:全局缺失率对特征数量敏感,适合评估整体数据填充成本;平均特征缺失率则更公平地反映每个特征的缺失水平,避免高基数特征被低基数特征稀释。
| 口径 | 计算公式 | 适用场景 |
|---|---|---|
| 全局缺失率 | ∑缺失值 / (N × M) × 100% | 数据仓库完整性评估、存储成本估算 |
| 平均特征缺失率 | (∑单特征缺失率) / M | 特征质量巡检、模型输入质量监控 |
Python 实现:
def overall_missing_rate(df):
"""
计算整体数据缺失率(全局口径)
"""
total_cells = df.shape[0] * df.shape[1]
missing_cells = df.isnull().sum().sum()
return round((missing_cells / total_cells) * 100, 4)
def avg_feature_missing_rate(df):
"""
计算平均特征缺失率
"""
feature_rates = df.isnull().mean() * 100
return round(feature_rates.mean(), 4)
print(f"全局缺失率: {overall_missing_rate(loan_data)}%")
print(f"平均特征缺失率: {avg_feature_missing_rate(loan_data)}%")
实践建议:在金融风控模型监控中,建议同时监控两种口径。全局缺失率用于数据仓库层面的完整性告警,平均特征缺失率用于特征工程层面的质量评估。当平均特征缺失率超过 15% 时,应启动特征级根因分析。
4.3 按时间窗口统计缺失率
单时间点的缺失率无法反映数据质量的变化趋势。在金融业务中,数据源接口波动、上游系统变更、节假日数据延迟等因素都可能导致缺失率在特定时间窗口内异常升高。因此,按日、周、月统计缺失率是监控体系的核心能力。
4.3.1 时间窗口统计逻辑
- 日窗口:以自然日为单位,统计当日所有样本的特征缺失率。适合监控高频数据源(如每日跑批的征信查询、多头借贷数据)。
- 周窗口:以自然周(周一至周日)为单位,聚合周内每日缺失率。适合过滤日级噪声,观察周度趋势。
- 月窗口:以自然月为单位,统计月度整体缺失率。适合月度模型重训前的数据质量评估。
下图展示了按时间窗口统计缺失率的完整流程:
4.3.2 Python 实现:按日/周/月统计缺失率
def window_missing_rate(df, date_col, feature_cols, window='D'):
"""
按时间窗口统计特征缺失率
:param df: DataFrame,必须包含日期列
:param date_col: 日期列名
:param feature_cols: 需要统计的特征列列表
:param window: 时间窗口,'D'=日,'W'=周,'M'=月
:return: DataFrame,每行一个窗口,每列一个特征的缺失率
"""
# 确保日期列是 datetime 类型
df[date_col] = pd.to_datetime(df[date_col])
# 按窗口分组
if window == 'D':
group_key = df[date_col].dt.date
elif window == 'W':
group_key = df[date_col].dt.isocalendar().year.astype(str) + '-W' + df[date_col].dt.isocalendar().week.astype(str)
elif window == 'M':
group_key = df[date_col].dt.to_period('M')
else:
raise ValueError("window 参数仅支持 'D', 'W', 'M'")
# 计算每个窗口内各特征的缺失率
result = df.groupby(group_key)[feature_cols].apply(
lambda x: x.isnull().mean() * 100
).reset_index()
return result
# 示例:按周统计 'income', 'credit_score', 'loan_amount' 的缺失率
weekly_missing = window_missing_rate(
loan_data,
date_col='apply_date',
feature_cols=['income', 'credit_score', 'loan_amount'],
window='W'
)
print(weekly_missing.head())
4.3.3 时间窗口缺失率监控的典型模式
在实际监控中,以下三种模式需要重点关注:
| 模式 | 表现 | 可能原因 | 应对措施 |
|---|---|---|---|
| 突发尖峰 | 某个时间窗口缺失率突然飙升,随后恢复正常 | 数据源接口超时、上游系统短暂故障 | 触发即时告警,检查数据源日志 |
| 持续攀升 | 连续多个窗口缺失率逐步上升 | 数据源服务降级、字段废弃、上游变更未同步 | 启动根因分析,联系数据源负责人 |
| 周期性波动 | 缺失率在固定周期(如周末、月末)规律性升高 | 业务周期性(如周末申请量少)、数据批量处理延迟 | 设置动态阈值,排除周期性影响 |
注意:在金融风控场景中,时间窗口缺失率监控必须与业务日历对齐。例如,春节、国庆等长假期间,部分数据源可能暂停服务,缺失率会系统性升高。建议在监控系统中维护业务日历白名单,避免误告警。
4.4 三种统计维度的对比与选择
下表总结了单特征缺失率、整体数据缺失率和时间窗口缺失率的适用场景与优缺点:
| 维度 | 监控粒度 | 主要用途 | 优点 | 局限 |
|---|---|---|---|---|
| 单特征缺失率 | 特征级 | 特征质量准入、特征废弃决策 | 定位精确,直接指导特征处理 | 无法反映整体数据完整性 |
| 整体数据缺失率 | 数据集级 | 数据仓库完整性评估、存储成本估算 | 宏观视角,适合管理层汇报 | 高缺失率特征可能被低缺失率特征稀释 |
| 时间窗口缺失率 | 时间序列级 | 数据质量趋势监控、异常检测 | 发现趋势性变化,提前预警 | 需要维护时间窗口配置和业务日历 |
在实际的金融特征模型监控系统中,建议将三种维度组合使用:以单特征缺失率作为日常巡检的基本单元,以整体数据缺失率作为月度质量报告的汇总指标,以时间窗口缺失率作为实时监控和异常告警的核心依据。三者形成从微观到宏观、从静态到动态的完整缺失率监控体系。