上一篇地址
2、探索分析
探索 数据 分析(Exploratory Data Analysis)是为了更好的了解数据之间的有没有啥关联和关联大小。而在多变量分析中根据相关性大小,可以把相关性强的参数剔除。常用的探索 数据 分析方法有:直方图、散点图、折线图、热度图和箱线图等。
a、单变量分析
就是分析参数变量和结果的函数关系,可以做图形象的观看变化趋势,我们看看年龄和违约的关系
age_cut=pd.cut(data['age'],10)
age_cut_group=data['SeriousDlqin2yrs'].groupby(age_cut).count()
age_cut_groupbad=data["SeriousDlqin2yrs"].groupby(age_cut).sum()
age_cut_groupbadrate=age_cut_groupbad/age_cut_group
ax1=age_cut_groupbadrate.plot(figsize=(15,15))
ax1.set_xticklabels(age_cut_groupbadrate.index)
ax1.set_ylabel("bad ratio")
ax1.set_title("age-badratio")
plt.show()
违约客户率随着年龄增大而逐步下降,但是最后有个翘尾
现在看看月收入对违约的影响,将月收入划分为以下几个级别:1000,3000,5000,8000,12000,16000,20000,100000,500000.由下面两图可知,刚开始随着收入增加违约率降低,而在2w-10w,最低,而收入再增加时,违约客户率又随收入增高发生递增。
再来看看逾期30-59天次数与违约客户率之间的关系,可以这个情况比较复杂。
同理可以其他参数逐个看看
b、多变量分析
多变量分析主要看变量之间的相关系数大小,最大是1,相关强的变量可以考虑去重,python中可采用corr()函数计算各变量间的相关性。一般相关系数大于0.6可以进行变量剔除去重。
corr = data.corr()#计算各变量的相关性系数
xticks = list(corr.index)#x轴标签
yticks = list(corr.index)#y轴标签
fig = plt.figure(figsize=(15,10))
ax1 = fig.add_subplot(1, 1, 1)
sns.heatmap(corr, annot=True, cmap="rainbow",ax=ax1,linewidths=.5, annot_kws={'size': 9, 'weight': 'bold', 'color': 'blue'})
ax1.set_xticklabels(xticks, rotation=35, fontsize=15)
ax1.set_yticklabels(yticks, rotation=0, fontsize=15)
plt.show()
图如下
这个图看起来各个变量之间相关性不大。上篇文章提到违约次数异常如果置之不理会对这个图有很大影响,那我把异常数据放进去后再来看看 变量关系。
可见有3个变量有强相关,这就是异常值对模型的干扰,而到底该剔除还是保留,最好还是都测试一下效果。
c、数据切分
因为只有一份数据,为了训练和验证评估模型效果,我们把数据集进行切分,分成训练集和测试集。
from sklearn.model_selection import train_test_split
if __name__ == '__main__':
#载入数据
data = pd.read_csv('MissingData.csv')
Y = data['SeriousDlqin2yrs']
X = data.iloc[:, 1:]
#测试集占比20%
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)
#print(Y_train)
train = pd.concat([Y_train, X_train], axis=1)
test = pd.concat([Y_test, X_test], axis=1)
#clasTest = test.groupby('SeriousDlqin2yrs')['SeriousDlqin2yrs'].count()
train.to_csv('TrainData.csv',index=False)
test.to_csv('TestData.csv',index=False)
3、特征选择
特征选择就是分析出哪些变量对违约率影响大,选出来作为模型的变量。而评估特征的方法有很多,常用的就是iv值法评估。为计算变量的iv值,需要对变量分箱、woe值计算最后是iv值计算。
a、变量分箱
变量分箱(binning)就是对变量离散化(discretization)的一种称呼。特征离散化后,模型会更稳定,降低了模型过拟合的风险。同时分箱之后可以降低数据量,使模型泛化能力增强。一般常用的分箱有:等距分箱、等深分箱、最优分箱等。等距是指区间是一致的,比如年龄以十年作为一个分箱;等深是先确定分箱数量,然后令每个分箱中数据数量大致相等;最优分箱(Optimal Binning)又叫有监督分箱(supervised discretizaion),如使用递归划分(Recursive Partitioning)将连续变量分箱。这些分箱方式都可以逐个试试效果。
在pd里cut是等距分箱,qcut是等深分箱。简单点的话直接用等距等深处理。最好么各种分箱算法都试试。
分箱代码:
cut1=pd.qcut(train["RevolvingUtilizationOfUnsecuredLines"],5,labels=False)
cut2=pd.qcut(train["age"],8,labels=False)
bins3=[-1,0,1,3,5,13]
cut3=pd.cut(train["NumberOfTime30-59DaysPastDueNotWorse"],bins3,labels=False)
cut4=pd.qcut(train["DebtRatio"],5,labels=False)
cut5=pd.qcut(train["MonthlyIncome"],5,labels=False)
cut6=pd.qcut(train["NumberOfOpenCreditLinesAndLoans"],5,labels=False)
bins7=[-1, 0, 1, 3,5, 20]
cut7=pd.cut(train["NumberOfTimes90DaysLate"],bins7,labels=False)
bins8=[-1, 0,1,2, 3, 33]
cut8=pd.cut(train["NumberRealEstateLoansOrLines"],bins8,labels=False)
bins9=[-1, 0, 1, 3, 12]
cut9=pd.cut(train["NumberOfTime60-89DaysPastDueNotWorse"],bins9,labels=False)
bins10=[-1, 0, 1, 2, 3, 5, 21]
cut10=pd.cut(train["NumberOfDependents"],bins10,labels=False)
b,woe值计算
WOE(Weight of Evidence)翻译成证据权重。可以评估变量值的重要性。woe的概念细节这里不展开讲了。
要计算变量的WOE值,首先把这个变量进行分箱。WOE的计算公式如下:
woe=ln(分箱里坏好比/总量数据里坏好比)
表示的是分箱中违约客户和好客户的比值,与所有样本中这个比值的差异。再取对数。WOE越大,说明这种差异越大,说明这个分箱的价值就越大,WOE越小,差异越小,说明这个分箱的价值越小。
py代码
#计算woe值
def get_woe_data(data,cut):
rate=data["SeriousDlqin2yrs"].sum()/(data["SeriousDlqin2yrs"].count()-data["SeriousDlqin2yrs"].sum())
grouped=data["SeriousDlqin2yrs"].groupby(cut,as_index = True).value_counts()
woe=np.log(grouped.unstack().iloc[:,1]/grouped.unstack().iloc[:,0]/rate)
return woe
c,iv值计算
IV全称是Information Value,翻译成信息价值。IV用来确定变量的预测能力。iv可以看作是woe的加权求和。
#计算iv值
def get_IV_data(data,cut,cut_woe):
grouped=data["SeriousDlqin2yrs"].groupby(cut,as_index = True).value_counts()
cut_IV=((grouped.unstack().iloc[:,1]/data["SeriousDlqin2yrs"].sum()-grouped.unstack().iloc[:,0]/(data["SeriousDlqin2yrs"].count()-data["SeriousDlqin2yrs"].sum()))*cut_woe).sum()
return cut_IV
各变量的iv
#计算各分组的IV值
cut1_IV=get_IV_data(train,cut1,cut1_woe)
cut2_IV=get_IV_data(train,cut2,cut2_woe)
cut3_IV=get_IV_data(train,cut3,cut3_woe)
cut4_IV=get_IV_data(train,cut4,cut4_woe)
cut5_IV=get_IV_data(train,cut5,cut5_woe)
cut6_IV=get_IV_data(train,cut6,cut6_woe)
cut7_IV=get_IV_data(train,cut7,cut7_woe)
cut8_IV=get_IV_data(train,cut8,cut8_woe)
cut9_IV=get_IV_data(train,cut9,cut9_woe)
cut10_IV=get_IV_data(train,cut10,cut10_woe)
结果
IV
可用额度比值 0.855609
年龄 0.190955
逾期30-59天笔数 0.609889
负债率 0.058016
月收入 0.073055
信贷数量 0.050973
逾期90天笔数 0.782562
固定资产贷款量 0.048099
逾期60-89天笔数 0.475483
家属数量 0.035488
看图
通过IV值判断变量的标准通常是:
< 0.02: unpredictive
0.02 to 0.1: weak
0.1 to 0.3: medium
0.3 to 0.5: strong
> 0.5: suspicious
一般选取IV大于0.02的特征变量进行后续训练,从以上可以看出所有变量均满足。但我们可以尝试更高点的标准来测试一下,比如选用0.1以上的。
本文完