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() 实现等距分箱只需三步:
- 确定分箱数:根据业务经验或探索性分析设定
bins参数。 - 执行分箱:调用
pd.cut()将连续变量映射到区间标签。 - 检查分布:统计每箱的样本数、坏样本率,评估分箱质量。
参数速查:
pd.cut(x, bins, labels=None, right=True, include_lowest=False)。bins 可以是整数(分箱数)或序列(自定义边界);right=True 表示区间左开右闭。
2.4 等距分箱流程示意图
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 等距分箱与等频分箱对比图
2.9 关键参数与调优建议
- bins 参数:整数时自动等宽切分;列表时自定义边界,推荐先用
df.describe()观察分位数后再设定。 - labels 参数:建议使用有业务含义的标签(如“青年”“中年”),避免使用默认的区间符号。
- right 参数:默认左开右闭,若需左闭右开可设为
False。 - include_lowest 参数:当最小值恰好等于第一个边界时,设为
True将其包含在内。
最佳实践: 先用等距分箱快速探索变量分布,再根据每箱的坏样本率趋势决定是否调整边界或改用等频分箱。等距分箱是 WOE 编码的“快速原型”工具,而非最终方案。