大数据时代的到来,使得很多工作都需要进行数据挖掘,从而发现更多有利的规律,或规避风险,或发现商业价值。比如在支付领域,通过挖掘商户的交易数据,分析商户是否有欺诈、盗刷、赌博、套现等风险。对于有风险的商户,及时进行关闭处理,或者实时中断交易,从而保护个人的资金安全。在金融领域,通过客户的历史还款和多头借贷等数据,挖掘客户的还款能力和还款意愿,进行贷前评估。
本文和你一起探索数据挖掘常用的函数toad.metrics.KS_bucket。
文章目录
- 一、安装toad包
- 二、导入数据
- 三、KS_bucket函数参数详解
- 四、应用KS_bucket函数计算变量的KS值
- 1 等频分割
- 2 等距分割
- 五、循环计算所有变量的KS值
一、安装toad包
首先打开cmd,安装toad包,安装语句如下:
pip install toad
若安装成功,会显示结果如下:
二、导入数据
背景:现需分析7252个客户的多头、关联风险、法院执行、风险名单和逾期信息,用于构建客户的贷前评分卡A卡。在进行评分卡搭建之前需要对客户的信息进行筛选,挑选出和客户逾期信息相关性高的变量。抽取部分指标用于本文的统计指标展示,具体分析如下。
接着导入需分析的数据。
#[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中自助查看帮助文档的方法,很方便就可以看到这个函数里面有哪些参数,这些参数需要填什么值。
具体语句如下:
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 = 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进行数据挖掘已经讲解完毕,感兴趣的同学可以自己实现一遍图片。
【限时免费进群】群内提供学习Python、玩转Python、风控建模、人工智能、数据分析相关招聘内推信息、优秀文章、学习视频,也可交流学习工作中遇到的相关问题。需要的朋友添加微信号19967879837,加时备注想进的群,比如风控建模。
参考文献
https://baike.baidu.com/
https://zhuanlan.zhihu.com/《数据科学与大数据技术》学校排名 - 知乎 (zhihu.com)
你可能感兴趣:
用Python绘制皮卡丘
用Python绘制词云图
Python人脸识别—我的眼里只有你
Python画好看的星空图(唯美的背景)
用Python中的py2neo库操作neo4j,搭建关联图谱
Python浪漫表白源码合集(爱心、玫瑰花、照片墙、星空下的告白)