前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Python数据挖掘】应用toad包中的KS_bucket函数统计好坏样本率、KS值

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

作者头像
阿黎逸阳
发布2023-08-21 19:19:06
1.4K0
发布2023-08-21 19:19:06
举报

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

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

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

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

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

一、安装toad包

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

代码语言:javascript
复制
pip install toad

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

二、导入数据

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

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

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

接着导入需分析的数据。

代码语言:javascript
复制
#[1]读取数据
import os
import toad
import numpy as np
import pandas as pd

os.chdir(r'F:\公众号\70.数据分析报告')
date = pd.read_csv('testtdmodel1.csv', encoding='gbk')
date.head(3)

展示前几行数据如下:

三、KS_bucket函数参数详解

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

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

具体语句如下:

代码语言:javascript
复制
help(toad.metrics.KS_bucket)

得到结果如下:

代码语言:javascript
复制
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等分等频分箱,进行数据统计分析,语句如下:

代码语言:javascript
复制
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中,具体代码如下:

代码语言:javascript
复制
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等分等距分箱,进行数据统计分析,语句如下:

代码语言:javascript
复制
d1=toad.metrics.KS_bucket(date['7天内申请人在多个平台申请借款'], date['y'],bucket=10,method='step')
d1

得到结果:

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

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

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

代码语言:javascript
复制
columns = list(date.columns)
columns

得到结果:

代码语言:javascript
复制
['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个月身份证关联手机号数',
 '三个月银行相关平台数']

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

代码语言:javascript
复制
d1=toad.metrics.KS_bucket(date[columns[7]], date['y'],bucket=10,method='quantile')
d1['name'] = columns[7]
all_woe = d1
for 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进行数据挖掘已经讲解完毕,感兴趣的同学可以自己实现一遍。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-07-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 阿黎逸阳的代码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档