4. 缺失率计算与统计:单特征缺失率、整体缺失率、滑动窗口缺失率计算方法
缺失率是衡量特征数据完整性的核心指标。在特征巡检与PSI监控体系中,缺失率不仅反映数据采集质量,更是触发数据漂移预警的前置信号。本节系统讲解三种缺失率指标的定义、计算公式与工程实现方法。
4.1 单特征缺失率
单特征缺失率衡量某个特定特征在样本集合中的缺失比例,是最基础的缺失度量单元。
| 指标 | 定义 | 计算公式 |
|---|---|---|
| 单特征缺失率 | 特征 f 在数据集 D 中缺失值的占比 | missing_rate(f) = count(null(f)) / count(total(f)) × 100% |
计算要点:
- 缺失定义:包括
NULL、NaN、空字符串""、占位符-999等业务约定的缺失标记。 - 分母选择:通常使用当前批次总样本数,若存在过滤逻辑(如只统计活跃用户),需在文档中明确分母范围。
- 阈值预警:单特征缺失率超过 5% 应触发黄色预警,超过 20% 触发红色预警。
工程示例: 使用 Python 计算单特征缺失率
import pandas as pd
def single_feature_missing_rate(df, feature):
total = len(df)
missing = df[feature].isna().sum()
rate = round(missing / total * 100, 4)
return rate
# 示例:计算 'age' 特征的缺失率
rate = single_feature_missing_rate(data, 'age')
print(f"age 缺失率: {rate}%")
4.2 整体缺失率
整体缺失率从全局视角评估数据集的完整程度,用于判断当前批次数据是否可接受进入模型推理流程。
| 指标 | 定义 | 计算公式 |
|---|---|---|
| 整体缺失率 | 数据集中所有特征缺失值占总数据单元的比例 | overall_missing_rate = sum(missing_cells) / (rows × cols) × 100% |
计算步骤:
- 统计每个特征的缺失数量,求和得到
total_missing。 - 计算数据单元总数:
total_cells = 样本数 × 特征数。 - 计算比率:
overall_missing_rate = total_missing / total_cells。
注意: 整体缺失率对高缺失率特征不敏感。例如,一个特征缺失 90% 而其他特征完整,整体缺失率可能仅为 5%,容易掩盖局部严重缺失。建议同时监控单特征缺失率的最大值。
def overall_missing_rate(df):
total_cells = df.shape[0] * df.shape[1]
total_missing = df.isna().sum().sum()
rate = round(total_missing / total_cells * 100, 4)
return rate
print(f"整体缺失率: {overall_missing_rate(data)}%")
4.3 滑动窗口缺失率
滑动窗口缺失率用于监控缺失率在时间序列上的变化趋势,能够及时发现数据采集系统的间歇性故障或上游数据源的退化。
核心参数:
| 参数 | 说明 | 推荐值 |
|---|---|---|
| 窗口大小 W | 每次计算包含的连续批次数量 | 7 天 / 30 批次 |
| 滑动步长 S | 每次窗口移动的批次间隔 | 1 批次 / 1 天 |
| 统计粒度 | 单特征或整体缺失率 | 两者均需监控 |
计算流程:
- 按时间顺序排列各批次数据。
- 从第 1 个批次开始,取连续 W 个批次组成窗口。
- 计算窗口内的单特征缺失率或整体缺失率。
- 窗口向后滑动 S 个批次,重复步骤 2-3,直至覆盖所有批次。
监控策略: 滑动窗口缺失率连续 3 个窗口上升,或单窗口缺失率超过历史均值 + 3σ,应立即触发告警并检查上游数据管道。
def sliding_window_missing_rate(df_list, window_size=7, step=1):
"""
df_list: 按时间排序的 DataFrame 列表
window_size: 窗口大小(批次数量)
step: 滑动步长
"""
rates = []
for i in range(0, len(df_list) - window_size + 1, step):
window_df = pd.concat(df_list[i:i+window_size], ignore_index=True)
rate = overall_missing_rate(window_df)
rates.append({
'window_start': i,
'window_end': i + window_size - 1,
'missing_rate': rate
})
return rates
4.4 三种缺失率对比与适用场景
| 指标 | 监控粒度 | 时间维度 | 主要用途 | 告警灵敏度 |
|---|---|---|---|---|
| 单特征缺失率 | 单个特征 | 单批次 | 定位具体特征的采集异常 | 高 |
| 整体缺失率 | 全数据集 | 单批次 | 判断批次数据整体可用性 | 中 |
| 滑动窗口缺失率 | 单特征或整体 | 连续多批次 | 发现趋势性退化与间歇性故障 | 高(趋势敏感) |
4.5 缺失率计算流程架构
下图展示了从原始数据输入到缺失率指标输出的完整计算链路,包含单特征、整体与滑动窗口三种路径。
4.6 缺失率监控最佳实践
- 分层监控:同时部署单特征缺失率(定位问题特征)与整体缺失率(评估批次质量),避免单一指标盲区。
- 滑动窗口基线:以过去 30 天滑动窗口缺失率的均值 ± 2 倍标准差作为动态阈值,适应业务周期性波动。
- 缺失模式分析:当缺失率上升时,进一步分析缺失是否集中在特定时间段、特定数据源或特定取值区间,辅助根因定位。
- 缺失与PSI联动:缺失率突变常伴随特征分布偏移,建议在缺失率告警后自动触发对应特征的 PSI 计算,形成巡检闭环。
巡检清单: 每日巡检应包含以下缺失率指标:
1. 所有特征的 单特征缺失率 列表(按缺失率降序排列)
2. 当前批次的 整体缺失率 与过去 7 天均值对比
3. 缺失率排名前 5 特征的 滑动窗口趋势图(窗口大小=7)
1. 所有特征的 单特征缺失率 列表(按缺失率降序排列)
2. 当前批次的 整体缺失率 与过去 7 天均值对比
3. 缺失率排名前 5 特征的 滑动窗口趋势图(窗口大小=7)