2、等距分箱原理与实现:将连续变量按固定宽度切分,使用 pandas cut 函数

2.1 等距分箱的核心思想

等距分箱(Equal-Width Binning)是最直观的连续变量离散化方法。它将变量的取值范围 [min, max] 均匀划分为 k 个宽度相等的区间,每个区间对应一个分箱。箱的宽度由公式决定:

bin_width = (max - min) / k

每个样本根据其数值落入的区间被分配到对应的分箱中。这种方法计算简单、可重复性强,特别适合在数据探索阶段快速了解变量分布,或作为后续 WOE 编码的前置步骤。

适用场景: 变量分布相对均匀、无极端长尾、业务上对等距分段有明确解释(如年龄按 10 岁一组、收入按固定金额区间)。

2.2 等距分箱 vs. 等频分箱

对比维度 等距分箱 等频分箱
划分依据 数值范围等宽 样本数量等量
箱宽 固定相同 可能差异很大
每箱样本数 可能严重不均 大致相等
对异常值敏感度 高(极端值会拉宽所有箱) 低(极端值单独成箱)
业务解释性 强(区间边界整齐) 弱(边界依赖分位数)
常用函数 pd.cut() pd.qcut()

2.3 等距分箱流程

使用 pandas.cut() 实现等距分箱只需三步:

  1. 确定分箱数:根据业务经验或探索性分析设定 bins 参数。
  2. 执行分箱:调用 pd.cut() 将连续变量映射到区间标签。
  3. 检查分布:统计每箱的样本数、坏样本率,评估分箱质量。
参数速查: pd.cut(x, bins, labels=None, right=True, include_lowest=False)。
bins 可以是整数(分箱数)或序列(自定义边界);right=True 表示区间左开右闭。

2.4 等距分箱流程示意图

等距分箱流程(pd.cut) 原始连续变量 确定分箱数 k 计算箱宽 pd.cut() 执行分箱 分箱结果(区间标签) 分布检查与评估 箱宽 = (max - min) / k

2.5 代码实现:pd.cut() 实战

以下代码演示如何在信用评分卡场景中对“年龄”和“收入”两个连续变量进行等距分箱:

import pandas as pd
import numpy as np

# 模拟数据:1000 条客户年龄与收入
np.random.seed(42)
df = pd.DataFrame({
    'age': np.random.randint(18, 70, size=1000),
    'income': np.random.normal(50000, 15000, size=1000).clip(20000, 100000)
})

# 等距分箱:年龄按 10 岁一组
df['age_bin'] = pd.cut(df['age'], bins=5, labels=['18-28', '28-38', '38-48', '48-58', '58-68'])

# 等距分箱:收入按 20000 宽度
income_bins = [20000, 40000, 60000, 80000, 100000]
df['income_bin'] = pd.cut(df['income'], bins=income_bins,
                          labels=['20K-40K', '40K-60K', '60K-80K', '80K-100K'])

# 查看分箱分布
print(df['age_bin'].value_counts().sort_index())
print(df['income_bin'].value_counts().sort_index())

2.6 分箱结果统计与评估

分箱完成后,必须检查每箱的样本覆盖情况。等距分箱容易出现“空箱”或“样本极不均衡”的问题,需要结合业务判断是否合并相邻箱。

# 统计每箱的样本数与坏样本率(假设 bad_flag 为 1 表示违约)
df['bad_flag'] = np.random.choice([0, 1], size=1000, p=[0.9, 0.1])

bin_stats = df.groupby('age_bin', observed=False).agg(
    总样本=('bad_flag', 'count'),
    坏样本=('bad_flag', 'sum')
)
bin_stats['坏样本率'] = bin_stats['坏样本'] / bin_stats['总样本']
print(bin_stats)
常见陷阱: 等距分箱在变量分布偏斜时,中间箱样本密集、两端箱样本稀疏甚至为空。此时应优先考虑等频分箱或自定义分箱边界,避免分箱失效。

2.7 等距分箱的优缺点总结

优点 缺点
实现简单,代码一行完成 对异常值敏感,极端值会拉宽所有箱
区间边界整齐,业务解释性强 样本分布可能严重不均
适合均匀分布或近似均匀的变量 无法自适应数据密度变化
可重复性高,适合自动化流水线 分箱数 k 的选择缺乏理论指导

2.8 等距分箱与等频分箱对比图

等距分箱 vs 等频分箱(数据分布对比) 等距分箱(固定宽度) 箱1 箱2 箱3 箱4 样本分布:中间密集,两端稀疏 等频分箱(固定样本数) 箱1 箱2 箱3 箱4 样本分布:每箱样本数大致相等 箱宽相同,样本数不均 箱宽不同,样本数均衡

2.9 关键参数与调优建议

  • bins 参数:整数时自动等宽切分;列表时自定义边界,推荐先用 df.describe() 观察分位数后再设定。
  • labels 参数:建议使用有业务含义的标签(如“青年”“中年”),避免使用默认的区间符号。
  • right 参数:默认左开右闭,若需左闭右开可设为 False。
  • include_lowest 参数:当最小值恰好等于第一个边界时,设为 True 将其包含在内。
最佳实践: 先用等距分箱快速探索变量分布,再根据每箱的坏样本率趋势决定是否调整边界或改用等频分箱。等距分箱是 WOE 编码的“快速原型”工具,而非最终方案。