iv值计算(含qcut细节)

本文通过实例展示了使用pandas的qcut函数进行等频分组,并探讨了含有和不含有重复数据时的处理方式。在含有重复数据的情况下,必须设置`duplicates='drop'`以避免错误。接着,对一个实际数据集计算了IV值,分析了变量的IV值与坏账率的相关性,强调了IV值在模型构建中的作用。
摘要由CSDN通过智能技术生成

1 背景

在计算woe以及相关的iv值的时候,需要首先对数据进行分箱,分箱一般采用qcut,即等频分组。

下面希望验证qcut(等频分组)-相同的值会在一组,即如果一组数据一半都是0,这些会被分在一组。

同时计算iv值并进行相关分析

2 含有重复的数据

2.1 数据准备

import pandas as pd

a = [0]*50 + list(range(0,50))
print(len(a))
a[:5]
100





[0, 0, 0, 0, 0]
df = pd.DataFrame({'a':a})
print(df.shape)
df.head()
(100, 1)
a
00
10
20
30
40

2.2 等频分组

pd.qcut(df['a'], 3).value_counts()
---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-17-47659b591f84> in <module>
----> 1 pd.qcut(df['a'], 3).value_counts()


~\Anaconda3\lib\site-packages\pandas\core\reshape\tile.py in qcut(x, q, labels, retbins, precision, duplicates)
    339         quantiles = q
    340     bins = algos.quantile(x, quantiles)
--> 341     fac, bins = _bins_to_cuts(
    342         x,
    343         bins,


~\Anaconda3\lib\site-packages\pandas\core\reshape\tile.py in _bins_to_cuts(x, bins, right, labels, precision, include_lowest, dtype, duplicates)
    378     if len(unique_bins) < len(bins) and len(bins) != 2:
    379         if duplicates == "raise":
--> 380             raise ValueError(
    381                 f"Bin edges must be unique: {repr(bins)}.\n"
    382                 f"You can drop duplicate edges by setting the 'duplicates' kwarg"


ValueError: Bin edges must be unique: array([ 0.,  0., 16., 49.]).
You can drop duplicate edges by setting the 'duplicates' kwarg

报错原因:有很多的重复值并且没有加上去掉重复值的语句!

2.3 等频分组-加上去掉重复的值

pd.qcut(df['a'], 3, duplicates='drop').value_counts()
(-0.001, 16.0]    67
(16.0, 49.0]      33
Name: a, dtype: int64

3 不含有重复的数据

3.1 数据准备

a = list(range(0,100))
df = pd.DataFrame({'a':a})
print(df.shape)
df.head()
(100, 1)
a
00
11
22
33
44

3.2 等频分组

pd.qcut(df['a'], 3).value_counts()
(-0.001, 33.0]    34
(66.0, 99.0]      33
(33.0, 66.0]      33
Name: a, dtype: int64

3.3 等频分组-加上去掉重复值

pd.qcut(df['a'], 3, duplicates='drop').value_counts()
(-0.001, 33.0]    34
(66.0, 99.0]      33
(33.0, 66.0]      33
Name: a, dtype: int64

4 iv计算

4.1 读入数据

import pandas as pd
from IV_Cal import * # 自己建立的脚本文件
df = pd.read_excel('工作簿1.xlsx')
print(df.shape)
df.head()
(51000, 31)
idLoanActiveNumidLoan30dNumidLoan90dNumidLoan180dNumidLoan360dNumidOrg30dNumidOrg90dNumidOrg180dNumidOrg360dNumidOrgActiveNum...idOverdueLoanAmt60idOverdueLoanAmt90idOverdueLoanAmt120idOverdueLoanAmt150idOverdueLoanAmt180idActiveOverdueOrgNumidOverdueOrgNum30idOverdueOrgNum90idOverdueOrgNum180Y
0-1.0-1.0-1.0-1.0-1.0-1.0-1.0-1.0-1.0-1.0...-1.0-1.0-1.0-1.0-1.0-1.0-1.0-1.0-1.00
1-1.0-1.0-1.0-1.0-1.0-1.0-1.0-1.0-1.0-1.0...-1.0-1.0-1.0-1.0-1.0-1.0-1.0-1.0-1.00
2-1.0-1.0-1.0-1.0-1.0-1.0-1.0-1.0-1.0-1.0...-1.0-1.0-1.0-1.0-1.0-1.0-1.0-1.0-1.00
3-1.0-1.0-1.0-1.0-1.0-1.0-1.0-1.0-1.0-1.0...-1.0-1.0-1.0-1.0-1.0-1.0-1.0-1.0-1.00
4-1.0-1.0-1.0-1.0-1.0-1.0-1.0-1.0-1.0-1.0...-1.0-1.0-1.0-1.0-1.0-1.0-1.0-1.0-1.00

5 rows × 31 columns

4.2 iv值计算

iv = IV_Cal(df,y_name='Y') # 指定y变量就好!
iv.cal()
iv.plot_iv('./output')
iv.save_info('./output')
                                   IV图生成
Try 10 bins.
Set bin label: mean.
Plotting idOverdueOrgNum180... (30/30)                                           idOverdueLoanAmt180... (26/30)
Done.

最关键的还是看每个变量各自的iv值

df_var_iv = pd.read_csv('output/iv_rank_table.csv')
# 看一下iv值前五
df_var_iv[:5]
var_nameiv_valueiv_rankn_of_binmissing_rate(%)n_of_uniquedtypesis_continuous
0idOverdueLoanAmt1500.657071110.810float64False
1idOverdueLoanAmt1200.643382110.810float64False
2idOverdueLoanAmt1800.632213110.810float64False
3idOverdueLoanAmt900.625114110.810float64False
4idOverdueLoanAmt600.613405110.810float64False

4.3 结果分析

df['idOverdueLoanAmt'].value_counts()
 0.0    25484
-1.0    20030
 1.0     2462
 2.0      948
 3.0      706
 5.0      314
 4.0      311
 6.0      263
 7.0       90
 8.0        8
 9.0        1
Name: idOverdueLoanAmt, dtype: int64
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 51000 entries, 0 to 50999
Data columns (total 31 columns):
 #   Column                  Non-Null Count  Dtype  
---  ------                  --------------  -----  
 0   idLoanActiveNum         50617 non-null  float64
 1   idLoan30dNum            50617 non-null  float64
 2   idLoan90dNum            50617 non-null  float64
 3   idLoan180dNum           50617 non-null  float64
 4   idLoan360dNum           50617 non-null  float64
 5   idOrg30dNum             50617 non-null  float64
 6   idOrg90dNum             50617 non-null  float64
 7   idOrg180dNum            50617 non-null  float64
 8   idOrg360dNum            50617 non-null  float64
 9   idOrgActiveNum          50617 non-null  float64
 10  idOverdueLoanAmt        50617 non-null  float64
 11  idActiveOverdueLoanBal  50617 non-null  float64
 12  idActiveOverdueLoanNum  50617 non-null  float64
 13  idOverdueLoanNum30      50617 non-null  float64
 14  idOverdueLoanNum60      50617 non-null  float64
 15  idOverdueLoanNum90      50617 non-null  float64
 16  idOverdueLoanNum120     50617 non-null  float64
 17  idOverdueLoanNum150     50617 non-null  float64
 18  idOverdueLoanNum180     50617 non-null  float64
 19  idTotalOverdueLoanNum   50617 non-null  float64
 20  idOverdueLoanAmt30      50617 non-null  float64
 21  idOverdueLoanAmt60      50617 non-null  float64
 22  idOverdueLoanAmt90      50617 non-null  float64
 23  idOverdueLoanAmt120     50617 non-null  float64
 24  idOverdueLoanAmt150     50617 non-null  float64
 25  idOverdueLoanAmt180     50617 non-null  float64
 26  idActiveOverdueOrgNum   50617 non-null  float64
 27  idOverdueOrgNum30       50617 non-null  float64
 28  idOverdueOrgNum90       50617 non-null  float64
 29  idOverdueOrgNum180      50617 non-null  float64
 30  Y                       51000 non-null  int64  
dtypes: float64(30), int64(1)
memory usage: 12.1 MB

以变量idOverdueLoanAmt为例进行分析:
在这里插入图片描述

具体箱子怎么划分的看上面txt的结果,而需要讲故事,看该变量的iv值和bad rate是否呈线性相关,无论是正相关还是负相关!方便解释以及放入到线性模型中(比如逻辑回归)~

对应曲线为:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值