【Python数据挖掘】应用toad包中的KS_bucket函数统计好坏样本率、KS值

大数据时代的到来,使得很多工作都需要进行数据挖掘,从而发现更多有利的规律,或规避风险,或发现商业价值。

比如在支付领域,通过挖掘商户的交易数据,分析商户是否有欺诈、盗刷、赌博、套现等风险。

对于有风险的商户,及时进行关闭处理,或者实时中断交易,从而保护个人的资金安全。

在金融领域,通过客户的历史还款和多头借贷等数据,挖掘客户的还款能力和还款意愿,进行贷前评估。

本文和你一起探索数据挖掘常用的函数toad.metrics.KS_bucket。

本文目录
  1. 安装toad包

  2. 导入数据

  3. KS_bucket函数参数详解

  4. 应用KS_bucket函数计算变量的KS值

    4.1 等频分割

    4.2 等距分割

  5. 循环计算所有变量的KS值


一、安装toad包

首先打开cmd,安装toad包,安装语句如下:

pip install toad
若安装成功,会显示结果如下:


二、导入数据

背景:现需分析7252个客户的多头、关联风险、法院执行、风险名单和逾期信息,用于构建客户的贷前评分卡A卡。

在进行评分卡搭建之前需要对客户的信息进行筛选,挑选出和客户逾期信息相关性高的变量。

抽取部分指标用于本文的统计指标展示,具体分析如下。

接着导入需分析的数据。
#[1]读取数据import osimport toadimport numpy as npimport pandas as pd
os.chdir(r'F:\公众号\70.数据分析报告')date = pd.read_csv('testtdmodel1.csv', encoding='gbk')date.head(3)
展示前几行数据如下:


三、KS_bucket函数参数详解

有时我们知道一个函数,但是记不清楚这个函数有哪些参数和具体的使用方法。

可以使用Python中自助查看帮助文档的方法,很方便就可以看到这个函数里面有哪些参数,这些参数需要填什么值。

具体语句如下:

help(toad.metrics.KS_bucket)
得到结果如下:
Help on function KS_bucket in module toad.metrics:
KS_bucket(score, target, bucket=10, method='quantile', return_splits=False, **kwargs) calculate ks value by bucket Args: score (array-like): list of score or probability that the model predict target (array-like): list of real target bucket (int): n groups that will bin into method (str): method to bin score. `quantile` (default), `step` return_splits (bool): if need to return splits of bucket Returns: DataFrame

参数详解:

score:模型预测出来的分数或概率列表,可以推广到自变量x。

target:真实的目标变量列表。

bucket:分箱的箱数,默认是10箱。

method:分箱的方法,包含等频分箱和等距分箱。

return_splits:是否返回分箱的分割点,如果值等于True则返回,否则不返回,默认不返回。


四、应用KS_bucket函数计算变量的KS值

 1   等频分割

接着,调用toad库下的KS_bucket函数,设置10等分等频分箱,进行数据统计分析,语句如下:

d1=toad.metrics.KS_bucket(date['7天内申请人在多个平台申请借款'], date['y'],bucket=10,method='quantile',return_splits=True)d1[0]
由于return_splits=True,所以该语句得到一个元组,元组的第一个数据是包含区间、好坏样本数量、占比、KS值等信息的数据框,第二个数据是分箱的分割点。
第一个数据具体展示如下:

可以发现虽然设置了10等分,但是由于数据在切割时0值的占比已经超过了一半,所以把0先分了一箱,总计分了3箱。

第二个数据具体展示如下:

为了看得更清晰,我们把第一个数据的结果导出到csv中,具体代码如下:
d1[0].to_csv('d1.csv', encoding='gbk')
得到结果:

常用指标详解:

min列展示分箱区间的左端点。

max列展示分箱区间的右端点。
bads列统计对应分箱中坏样本的数量。
goods列统计对应分箱中好样本的数量。
total列统计对应分箱中总计样本的数量。
bad_rate列统计对应分箱中坏样本占比
good_rate列统计对应分箱中好样本占比
odds列统计对应分箱中坏样本率除以好样本率的比率。
bad_prop列统计对应分箱中的坏样本占全体坏样本的比率。
good_prop统计对应分箱中好样本占全体好样本的比率。
total_prop统计对应分箱中总计样本占全体样本的比率。
cum_bad_rate统计对应分箱中累计坏样本占累计全体样本的比率。
cum_bads_prop列统计对应分箱中累计坏样本占全体坏样本的比率。
ks列统计对应分箱中累计好样本率和累计坏样本率的差值。详细的KS原理可以参考本公众号文章:模型评价指标—KS
lift列统计对应分箱中坏样本率和全体坏样本率的比值,该比值越大,说明该分箱中坏样本浓度越高,在策略中会考虑拒绝高lift组客户进件 。

 2   等距分割

为了对比,调用toad库下的KS_bucket函数,设置10等分等距分箱,进行数据统计分析,语句如下:

d1=toad.metrics.KS_bucket(date['7天内申请人在多个平台申请借款'], date['y'],bucket=10,method='step')d1
得到结果:

可以发现,等距分箱是按分割的值大致距离相等来切割。

五、循环计算所有变量的KS值

最后,挑选需要统计KS值的变量,先展示全体变量,语句如下:

columns = list(date.columns)columns

得到结果:

['input_time', '申请状态', '历史最高逾期天数.x', '原始分', '历史最高逾期天数.y', 'y', 'Ratio', '7天内申请人在多个平台申请借款', '1个月内申请人在多个平台申请借款', '3个月内申请人在多个平台申请借款', '7天内借款人手机申请借款平台数', '1个月内借款人手机申请借款平台数', '3个月内借款人手机申请借款平台数', '7天内借款人身份证申请借款平台数', '1个月内借款人身份证申请借款平台数', '3个月内借款人身份证申请借款平台数', '7天内关联P2P网贷平台数', '1个月内关联P2P网贷平台数', '3个月内关联P2P网贷平台数', '7天内申请人关联融资租赁平台数', '1个月内申请人关联融资租赁平台数', '3个月手机号关联身份证数', '1个月内申请人关联一般消费分期平台数', '3个月内申请人关联一般消费分期平台数', '风险名单占比', '一度关联节点个数', '二度关联节点个数', '一度风险名单个数', '二度风险名单个数', '一度风险名单占比', '二度风险名单占比', 'X3个月内申请人手机号作为第二联系人手机号出现的次数', 'X3个月内申请人手机号作为前三联系人手机号出现的次数', '是否命中法院执行模糊名单', '是否命中法院结案模糊名单', '是否命中手机风险关注名单', '是否命中身份证风险关注名单', '命中中风险关注名单笔数', '客户异常借款笔数', '信用异常笔数', '执行标的', '申请人执行标的是否超过100000', '3个月内申请人关联融资租赁平台数', '3个月身份证关联手机号数', '三个月银行相关平台数']

从第七变量开始,就是我们想分析的自变量,写循环一次性统计所有需要分析的变量,语句如下:

d1=toad.metrics.KS_bucket(date[columns[7]], date['y'],bucket=10,method='quantile')d1['name'] = columns[7]all_woe = d1for i in columns[8:]:    #print('变量为:', i)    d1=toad.metrics.KS_bucket(date[i], date['y'], bucket=10,method = 'quantile')    d1['name'] = i    all_woe = all_woe.append(d1)all_woe.to_csv('all_woe_10deg.csv', encoding='gbk')

得到结果如下:

至此,在Python中应用toad.metrics.KS_bucket进行数据挖掘已经讲解完毕,感兴趣的同学可以自己实现一遍

往期回顾:
白羊座
520表白代码合集
黑客帝国中的代码雨
逻辑回归项目实战-附Python实现代码
Python绘制米老鼠,为余生请多指教打call
Python常用函数合集1—clip函数、range函数等


扫一扫关注我

19967879837

联系微信号、手机号

请使用浏览器的分享功能分享到微信等