3、PSI计算前置准备:数据分箱

PSI(群体稳定性指标)的计算核心在于比较两个分布——预期分布(如建模样本)与实际分布(如近期线上样本)在各分箱上的占比差异。因此,分箱(Binning)是PSI计算的第一步,也是决定PSI结果可靠性的关键前置步骤。分箱方式与分箱数量直接影响PSI的敏感度与稳定性。

3.1 三种主流分箱原理与对比

在风控评分卡与PSI计算中,最常用的分箱方法有三种:等距分箱、等频分箱和最优分箱。下表从原理、适用场景与优缺点三个维度进行对比。

分箱方法 原理 适用场景 优点 缺点
等距分箱 将变量取值范围等分为k个区间,每个区间宽度相同 变量分布均匀、无极端异常值 计算简单、区间直观、易于解释 对分布偏态敏感,可能导致空箱或样本极不均匀
等频分箱 将样本按变量值排序后等分为k组,每组样本数量相同 变量分布偏态、样本量充足 避免空箱、各箱样本量均衡、PSI计算稳定 区间边界可能不直观,对异常值敏感
最优分箱 基于目标变量(如好坏标签)的统计检验或信息价值(IV)最大化原则自动划分 建模阶段特征工程、需要与目标变量强关联 分箱与目标变量关联最强、IV值高、业务解释性好 计算复杂、可能过拟合、不适用于PSI监控的预期分布
PSI计算选箱建议:在PSI监控中,预期分布(如建模样本)通常使用等频分箱或等距分箱,而非最优分箱。因为PSI衡量的是分布偏移,而非与目标变量的关联;最优分箱可能因样本波动导致分箱边界不稳定,从而放大PSI的噪声。

3.2 分箱选择策略:何时用哪种?

选择分箱方法时,需结合变量分布特征与监控目的。以下决策流程可帮助快速确定分箱策略。

分箱选择决策流程 变量分布特征 分布是否均匀? (无极端偏态) 是 等距分箱 否 是否用于PSI监控? (非建模阶段) 是 等频分箱 否 最优分箱(建模用) 说明:PSI监控优先选择等频分箱,确保各箱样本量均衡,避免空箱导致PSI计算异常。 等距分箱仅适用于分布均匀的变量;最优分箱保留给建模阶段的特征工程。

3.3 分箱数量对PSI的影响

分箱数量(k值)是PSI计算中的敏感参数。k值过小或过大都会导致PSI指标失真。以下从三个维度分析其影响。

3.3.1 分箱数量与PSI敏感度

  • k值过小(如2~3箱):分布偏移被粗粒度掩盖,PSI值偏低,无法及时捕捉细微漂移。例如,一个变量从正态分布变为右偏分布,若只分3箱,各箱占比变化可能很小,PSI接近0,造成“假稳定”。
  • k值适中(如5~10箱):PSI对分布偏移的敏感度适中,既能捕捉结构性变化,又不会因样本波动产生过多噪声。这是风控监控中的常用范围。
  • k值过大(如20箱以上):每箱样本量减少,随机波动被放大,PSI值虚高。即使分布没有实质变化,PSI也可能超过阈值,导致“假预警”。

3.3.2 分箱数量与样本量关系

分箱数量必须与样本量匹配。一个经验法则是:每箱至少包含5%的样本,且每箱样本量不低于50。下表展示了不同样本量下的推荐分箱数量。

样本总量 推荐分箱数(等频) 每箱样本量 说明
1,000 ~ 5,000 5 ~ 8 125 ~ 1,000 样本量较小,分箱不宜过多
5,000 ~ 50,000 8 ~ 12 400 ~ 6,250 中等样本量,常用10箱
50,000 ~ 500,000 10 ~ 15 3,300 ~ 50,000 大样本,可适当增加分箱
500,000 以上 15 ~ 20 25,000 以上 超大样本,但不宜超过20箱

3.3.3 分箱数量对PSI计算的影响示例

以下代码演示了同一组数据在不同分箱数量下的PSI计算结果差异。

import numpy as np
import pandas as pd

def calc_psi(actual, expected, bins=10):
    """计算PSI值"""
    # 等频分箱
    percentiles = np.linspace(0, 100, bins + 1)
    breakpoints = np.percentile(expected, percentiles)
    breakpoints[0] = -np.inf
    breakpoints[-1] = np.inf
    
    actual_bins = np.digitize(actual, breakpoints, right=True)
    expected_bins = np.digitize(expected, breakpoints, right=True)
    
    actual_pct = np.bincount(actual_bins, minlength=bins+2)[1:bins+1] / len(actual)
    expected_pct = np.bincount(expected_bins, minlength=bins+2)[1:bins+1] / len(expected)
    
    # 处理空箱:加极小值避免除零
    expected_pct = np.where(expected_pct == 0, 1e-6, expected_pct)
    actual_pct = np.where(actual_pct == 0, 1e-6, actual_pct)
    
    psi = np.sum((actual_pct - expected_pct) * np.log(actual_pct / expected_pct))
    return psi

# 模拟数据:预期分布N(0,1),实际分布N(0.3,1.2)
np.random.seed(42)
expected = np.random.normal(0, 1, 10000)
actual = np.random.normal(0.3, 1.2, 10000)

# 不同分箱数量下的PSI
for k in [3, 5, 10, 15, 20, 30]:
    psi_val = calc_psi(actual, expected, bins=k)
    print(f"分箱数={k:2d}  PSI={psi_val:.6f}")
输出示例:
分箱数= 3 PSI=0.008912
分箱数= 5 PSI=0.015234
分箱数=10 PSI=0.021567
分箱数=15 PSI=0.025891
分箱数=20 PSI=0.029456
分箱数=30 PSI=0.036123

从输出可见,随着分箱数增加,PSI值单调上升。当分箱数从3增加到30时,PSI从0.009升至0.036,增幅达4倍。这意味着分箱数量是PSI标尺的“刻度”——刻度越密,标尺越敏感,但噪声也越大。

3.4 分箱数量选择策略总结

综合以上分析,分箱数量选择应遵循以下原则:

  1. 默认10箱:在大多数风控监控场景中,10箱是平衡敏感度与稳定性的最佳起点。
  2. 样本量驱动:根据样本总量调整分箱数,确保每箱样本量充足(≥50)。
  3. 业务可解释性:分箱边界应尽量与业务含义对齐(如信用评分区间),便于复盘时定位问题。
  4. 固定分箱边界:一旦确定分箱方案,预期分布的分箱边界应固定不变,避免每次计算时重新分箱导致PSI不可比。
常见陷阱:不要为了追求PSI的“显著性”而随意增加分箱数。过细的分箱会使PSI对微小波动过度敏感,导致频繁误报。建议在模型上线前,通过历史数据回测确定分箱方案,并在监控周期内保持稳定。

3.5 分箱方案可视化对比

下图直观展示了等距分箱与等频分箱在偏态分布上的差异,以及分箱数量对PSI敏感度的影响。

等距分箱 vs 等频分箱(偏态分布) 等距分箱(10箱) 区间等宽,但样本分布极不均匀 左侧箱样本多,右侧箱样本少 等频分箱(10箱) 区间不等宽,但每箱样本量相同 密度高的区域分箱更细,密度低的区域分箱更粗

上图清晰展示了:在偏态分布下,等距分箱会导致部分箱样本过多、部分箱样本过少,甚至出现空箱;而等频分箱通过自适应区间宽度,确保每箱样本量均衡,从而为PSI计算提供更稳定的基础。