目录
老饼讲解:一步一步上手学习

【详述】rev变量-详细分箱过程

作者 : 老饼 发表日期 : 2026-03-24 10:37:37 更新日期 : 2026-05-12 15:37:32
老饼讲解-简单易懂,干货满满,爽过嗦螺!


本文展示rev变量(信贷待还余额占比)的详细分箱过程,以及代码实现示例。

一、rev变量-分箱过程

rev变量是"信贷待还余额占比",即待还余额/总信贷额度,是一个连续数值变量,下面讲解rev变量的分箱过程。

1.1. rev变量初探

在正式分箱前,先对rev变量粗略分箱,试探rev变量的取值分布与badrate趋势,由于rev变量是数值变量,不妨先用等距分箱,将它分为10个分箱,结果如下:

rev变量初探结果

由于大部分样本都集中在第0个分组(即<=1830),难以有效观察rev的分布,因此,我们尝试将<=1830等距分为10个箱,但实际会发现样本还是过于集中,所以我们继续将过于集中的组别进行调整,直到能有效观察rev的分布,最终调整为:

rev变量的分箱调整方案

样本在上述分箱策略的统计结果如下:

rev变量调整分箱后的效果

可以看到,随着rev提升,badrate在大趋势上也增大,因此,rev变量是有效的。

1.2. rev变量-正式分箱

根据初探的结果,我们可以初步将badrate较近似的一段划为一组,初步分箱结果如下:

rev变量初步分箱结果

可以看到,badrate并不是单调的,这主要是第0组(x<=0)与第6组(x>2)较为特殊,由于第0组与第2组badrate相似,我们将它合并,同理,将第6组与与第4组合并(这里的合并是需要有业务解释支撑的,下一节会进行详细解释),最终分箱结果如下:

rev变量最终分箱结果

在评分卡中一般要求分箱不小于3组,不大于5组,这里我们最终将它分为了5组。

二、rev变量-分箱结果解说

本节对rev变量的分箱结果进行解说。

2.1. rev变量-分箱结果解读

最后,我们来欣赏一下rev变量最终的分箱结果:

rev变量最终分箱结果

(一) 整体情况

从结果可以看到,变量的badrate单调且有区分度,即组与组之间的badrate差异较大,而在业务逻辑上,微小rev的人是最好的,而随着rev越大,badrate越大。

(二) 特殊情况

其中,rev=0与rev>2较为特殊,我们详细来分析一下。

1. rev=0时,会比微小rev逾期概率较大一些

这可能是因为rev为0代表该客户没有信用卡,而微小rev则代表一定有信用卡,因此没用过信用卡的人可能没信贷概念,自然就会比用过信用卡的人要差一些。

2. 而rev>2时,反而比rev在(1.2,2]的更好一些

rev>1时,在贷额度比授信额度还要大,这代表信贷额度被缩减了。由于额度是有基数的,而rev极大,代表在贷也较大,即曾经授信较大,因此客户曾经质量很好,所以他比一般授信缩减客户的质量要好一些。

(三) IV表现

最后,我们看一下IV值,IV值主要由第0组和第3组一起贡献,总的IV值为1.088,说明好坏客户在该变量的分布上有明显差异,即该变量对y极有区分度。

2.2. rev变量-自动分箱结果

最后,看一下卡方分箱的自动分箱结果,如下:

rev变量卡方分箱结果

相比手动分箱,会发现卡方分箱虽然也不错,但没有手动分箱的效果更好,最重要的是,我们需要一个业务解释逻辑,卡方分箱的结果往往不符合业务逻辑,即使效果更好,在实际中也会更容易导致模型过拟合。因此,在实际中,如果能手动分箱,一般都会使用手动分箱,而自动分箱仅作为辅助参考。

三、rev变量-分箱代码

本节展示rev变量分箱过程中每一步的详细代码。

3.1. rev变量分箱的代码示例

上述分箱的每一步过程,所对应的具体代码实现如下:

import bbbrisk as br
from  bbbrisk import bins

																		           
# 加载数据                                                                         
data = br.datasets.load_bloan()                                                    # 加载数据
x = data['rev']                                                                    # rev变量
y = data['is_bad']                                                                 # 标签
br.display.pd.set(width=300,max_colwidth=30,max_rows=30)                           # 美化pandas的显示方式

																		           
# 将变量等距分为10个箱                                                             
bin_set = bins.merge.eDist(x,10)                                                   # 将变量进行等距分箱
bin_stat = bins.Bins(bin_set).binStat(x,y)                                         # 统计分箱结果
print(bin_stat)                                                                    # 显示分箱结果
																		           
# 将变量在(-inf,1830]等距分为10个箱,(1830,+inf]分为1个箱                           
bin_set = bins.merge.eDist(x,[('-',1830,10),(1830,'+',1)])                         # 将变量进行等距分箱
bin_stat = bins.Bins(bin_set).binStat(x,y)                                         # 统计分箱结果
print(bin_stat)                                                                    # 显示分箱结果
																				   
 # 将变量在(-inf,0]分为1一个箱,(0,0.1]等距分为5个箱,(0.1,1]等距分为10个箱...       
bin_set = bins.merge.eDist(x,[('-',0,1),(0,0.1,5),(0.1,1,10),(1,2,5),(2,'+',1)])   # 将变量进行等距分箱
bin_stat = bins.Bins(bin_set).binStat(x,y)                                         # 统计分箱结果
print(bin_stat)                                                                    # 显示分箱结果
																				   
# 将变量分箱为(-inf,0],(0,0.1],(0.1,0.37],(0.37,0.64],(0.64,1.2],(1.2,2],(2,inf]   
bin_set = [['-',0],[0,0.1],[0.1,0.37],[0.37,0.64],[0.64,1.2],[1.2,2],[2,'+']]      # 设置变量的分箱
bin_stat = bins.Bins(bin_set).binStat(x,y)                                         # 统计分箱结果
print(bin_stat)                                                                    # 显示分箱结果

# 将变量分箱为(0,0.1],(-inf,0]或(0.1,0.37],(0.37,0.64],(0.64,1.2]或(2,inf],(1.2,2]
bin_set = [[0,0.1],(['-',0],[0.1,0.37]),[0.37,0.64],([0.64,1.2],[2,'+']),[1.2,2]]  # 设置变量的分箱
bin_stat = bins.Bins(bin_set).binStat(x,y)                                         # 统计分箱结果
print(bin_stat)                                                                    # 显示分箱结果

# 对变量进行卡方分箱
bin_set = bins.merge.chi2(x,y)                                                     # 对变量进行卡方分箱
bin_stat = bins.Bins(bin_set).binStat(x,y)                                         # 统计分箱结果
print(bin_stat)                                                                    # 显示分箱结果

运行上述代码,每一步都会打印出如下的结果:

变量分箱代码运行结果

从结果中就可以看到每组的样本数、badrate和IV等等信息。

好了,以上就是rev变量的详细分箱过程,以及代码实现了~

结束语

在实际建模中一般都是以手动分箱为主,相对会更细致与贴切业务逻辑一些,在分箱过程中更多的是分析工作,边分箱、边分析、边调整,直到合理为止,实在不行就只能丢弃变量了,所以分箱的过程往往也是分析的过程。



图标 评论
添加评论