4. 数据准备:历史坏账率数据清洗、分箱处理与时间窗口对齐
在构建 PSI 漂移监控体系之前,必须对原始坏账率数据进行系统化的预处理。原始数据通常包含缺失值、异常波动、口径不一致以及时间戳错位等问题,直接计算 PSI 会导致监控信号失真。本章节聚焦三个核心环节:数据清洗、分箱处理与时间窗口对齐,确保输入 PSI 计算的数据具备一致性、可比性与稳定性。
4.1 数据清洗:剔除噪声与修复异常
坏账率原始数据来自多个业务系统(贷后系统、核算系统、催收系统),常见问题包括:
- 缺失值:某日或某批次坏账率字段为空,通常由数据采集延迟或系统故障导致。
- 极端值:单日坏账率突增至正常水平的 5 倍以上,可能源于大额核销或数据重复上报。
- 口径漂移:不同时期对“坏账”的定义不一致(如 M3+ 与 M6+ 混用)。
- 重复记录:同一批次被多次统计,导致坏账率虚高。
清洗规则示例:
- 缺失率超过 30% 的月份直接剔除,不参与 PSI 计算。
- 单日坏账率超过历史均值 ±3 倍标准差时,使用前后 7 日中位数填充。
- 统一坏账口径为“逾期 90 天以上且未核销金额 / 期末在贷余额”。
- 按批次 ID 去重,保留最新一条记录。
| 异常类型 | 检测方法 | 处理策略 |
|---|---|---|
| 缺失值 | isnull() 统计 | 线性插值或前向填充 |
| 极端值 | Z-score > 3 | 中位数平滑 |
| 口径漂移 | 字段注释比对 | 统一映射至标准口径 |
| 重复记录 | 主键去重 | 保留最新时间戳 |
4.2 分箱处理:将连续坏账率转化为离散分布
PSI 的计算基础是离散概率分布,因此需要将连续的坏账率数值划分为若干个区间(分箱)。分箱质量直接影响 PSI 的敏感度与稳定性。
4.2.1 分箱方法选择
- 等距分箱:按固定宽度划分区间(如 0-1%, 1-2%, 2-3%...)。适用于坏账率分布均匀的场景,但容易在稀疏区间产生零计数。
- 等频分箱:每个箱体包含相同数量的样本。适用于长尾分布,能保证每个箱体都有统计意义。
- 业务规则分箱:根据风控阈值划分(如 0-0.5% 正常, 0.5-2% 关注, 2-5% 预警, >5% 高危)。可解释性强,但需要专家经验。
实践建议:在 PSI 监控中优先使用 等频分箱,确保每个箱体在基准期与对比期都有足够的样本量(建议每个箱体占比不低于 5%)。若业务有明确阈值,可结合业务规则分箱作为辅助验证。
4.2.2 分箱参数设定
| 参数 | 推荐值 | 说明 |
|---|---|---|
| 箱体数量 | 10 ~ 20 | 过少会丢失细节,过多会导致零箱体 |
| 最小箱体占比 | 5% | 低于此阈值合并至相邻箱体 |
| 边界处理 | 左闭右开 | 避免数据点落在边界上产生歧义 |
# Python 示例:等频分箱实现
import pandas as pd
import numpy as np
def equal_freq_binning(data, n_bins=10):
"""
对坏账率序列进行等频分箱
:param data: 坏账率 Series
:param n_bins: 箱体数量
:return: 分箱标签与边界
"""
# 使用分位数划分边界
bins = pd.qcut(data, q=n_bins, duplicates='drop', retbins=True)
labels, edges = bins
return labels, edges
# 示例调用
bad_rate = np.random.rand(1000) * 0.1 # 模拟 0-10% 坏账率
labels, edges = equal_freq_binning(bad_rate, n_bins=10)
print("分箱边界:", np.round(edges, 4))
4.3 时间窗口对齐:统一基准期与对比期
PSI 漂移监控的核心是比较两个时间窗口的分布差异。时间窗口对齐不当会导致“假漂移”——例如将淡季与旺季的坏账率直接对比,或使用不同长度的窗口。
4.3.1 窗口定义规则
- 基准窗口(Reference Window):通常选取业务稳定期,如最近 12 个月或最近 4 个季度。窗口长度应覆盖至少一个完整业务周期。
- 对比窗口(Monitoring Window):当前监控期,长度必须与基准窗口一致。例如基准窗口为 12 个月,对比窗口也必须是 12 个月。
- 滑动步长:按月或按周滑动,推荐按月滑动以匹配财务报表周期。
常见陷阱:不要将不同长度的窗口直接比较。例如基准窗口用 12 个月数据,对比窗口只用 3 个月数据,会导致 PSI 值被低估或高估。必须保持窗口长度严格一致。
4.3.2 对齐流程
- 确定基准窗口的起止时间(如 2023-01 至 2023-12)。
- 将对比窗口设置为相同长度(如 2024-01 至 2024-12)。
- 对两个窗口内的坏账率数据分别进行分箱,得到两个概率分布。
- 检查两个窗口的箱体边界是否一致(若不一致,需重新分箱或插值对齐)。
4.4 数据准备清单与质量检查
在进入 PSI 计算之前,建议按以下清单逐项确认数据准备状态:
| 检查项 | 通过标准 | 验证方法 |
|---|---|---|
| 缺失值处理 | 无缺失值或已合理填充 | isnull().sum() == 0 |
| 极端值处理 | 无超过 ±3σ 的异常点 | Z-score 统计 |
| 口径一致性 | 所有记录使用同一坏账定义 | 字段值枚举检查 |
| 分箱稳定性 | 每个箱体占比 ≥ 5% | value_counts(normalize=True) |
| 窗口长度 | 基准与对比窗口长度相同 | len(reference) == len(monitoring) |
| 时间连续性 | 窗口内无缺失月份 | 日期序列差分检查 |
数据准备阶段产出物:
- 清洗后的坏账率时序表(含日期、坏账率、批次标识)
- 分箱边界定义表(箱体编号、下限、上限、基准期占比、对比期占比)
- 时间窗口对齐配置(基准窗口起止、对比窗口起止、滑动步长)
完成上述三个步骤后,即可获得标准化、可比较的坏账率分布数据,为后续 PSI 计算与漂移判定奠定可靠基础。