信用卡违约预测分析
自1985年第一张信用卡在中国诞生,其经历了从开始的不被认可到现在逐步替代纸币的流通,信用卡的普及速度惊人。据央行数据显示,截至2012年底,我国信用卡累计发卡量达3.3亿张,全年信用卡交易金额达10万亿元。众所周知,任何信贷业务都有一定的风险,而信用卡业务又具有无担保无抵押的特性,因此信用卡是一种高风险的金融产品。近年来,信用卡违约事件屡见报端,2012年信用卡逾期半年未偿信贷总额146.59亿元,较上年末增长32.9%。因此,识别信用卡违约行为的影响因素,并据此对信用卡持有者的违约风险进行衡量与预测,有利于商业银行防范和化解信用卡风险,完善信用卡违约风险管理工作。
根据国际学术界和金融实业界研究信用风险的主流方法,我们选取了信用评分模型中常用的Logistic模型对信用卡违约行为的影响因素进行识别,并利用所建立的Logistic模型对信用卡持有者的违约风险进行衡量与预测。
案例数据来源于某大型商业银行信用卡部的数据库,共收集131068笔的原始数据,包含24个变量,其中包括客户基本信息(性别*、年龄*、城镇或农村*、学历*、职业*、婚姻*、家庭人数*、户籍所在地、宗教、血型、星座) ,经济状况(家庭月收入*、家庭经济等级*、个人月收入*、个人月开销*),信用卡使用状况(信用卡张数*、使用频率*、月刷卡金额*),信用记录(逾期超过30天*、呆账记录*、借款余额大于800万元*、退票记录、拒往记录、强制停卡记录)。由于变量众多,在经验信息的前提下删除了其中7个变量,选入最初模型的17个变量在上文用星号(*)表示。
删除了含有缺失值的数据记录后,在剩下的数据中随机抽取了4000条违约数据,12000条非违约数据,共16000条记录作为训练集(见:sample16000.csv[y1] )。通过控制违约数与非违约数1:3的样本配比以提高模型的效率(石晓军,2006)。并随机抽取了1000个数据作为预测集(见: test.csv)来测试模型的预测效果,其中包含57条违约记录,943条非违约记录。
(一)描述性统计
为了解各类人群违约率情况, 现将以往研究中比较受关注的几个变量与违约情况做描述性统计, 这些变量主要包括: 性别、受教育程度、家庭月收入和信用卡使用频率, 分析结果下图所示。
> sample16000<-read.csv("sample16000.csv",header=T) #读取16000个随机样本 >attach(sample16000) > par(mfrow=c(2,2)) > barplot(prop.table(table(default,sex),2)[2,],names.arg=c("女","男"),main="性别vs违约行为") >barplot(prop.table(table(default,education),2)[2,],names.arg=c("小学及以下","初中","高中/职高","专科","本科及以上"),main="学历vs违约行为") >barplot(prop.table(table(default,familys),2)[2,],names.arg=c("<20000","20001~30000","30001~40000","40001~50000","50001~60000",">60000"),main="家庭月收入(台币)vs违约行为") >barplot(prop.table(table(default,frequency),2)[2,],names.arg=c("天天用","经常用","偶尔用","很少用"),main="使用频率vs违约行为") |
从图13-2可知,信用卡违约率的性别差异不大,女性违约率略高于男性,这与Schreiner(2004)研究的结果不一致,Schreiner认为女性的信用违约风险常常低于男性, 但前提是性别效应没有被其它变量的效应所干扰。学历对信用卡违约率的影响较大,专科与本科及以上学历的客户信用违约率要高于其他较低学历客户,这和Din(2007)的研究结果比较一致。家庭月收入划分的群体中, 违约率最高的是家庭月收入在 50001-60000台币的客户,大大高于家庭月收入为40000-50000元的客户,这与 Edward(1998)的研究结果不一致,Edward认为低收入家庭很易陷入违约困境。使用频率对违约率的影响较为显著。
(二)模型建立与参数估计
接下来进入模型建立环节。由于数据库中基于信用卡持有者相关信息的变量众多,即使在经过经验删选后,仍旧有17个变量,我们通过向后的逐步回归法来寻找合适的logistic模型指标。结果显示,剔除家庭收入客观等级和年龄变量后,模型的AIC达到最小。
> ###### 将voction简化归类为11个大类 > for(i in 1:16000){ + if(vocation[i]>1&vocation[i]<8){vocation[i]=1} + if(vocation[i]==8|vocation[i]==11){vocation[i]=2} + if(vocation[i]==9|vocation[i]==10){vocation[i]=3} + if(vocation[i]==12){vocation[i]=4} + if(vocation[i]==13|vocation[i]==14){vocation[i]=5} + if(vocation[i]==15){vocation[i]=6} + if(vocation[i]==16){vocation[i]=7} + if(vocation[i]==17){vocation[i]=8} + if(vocation[i]==18){vocation[i]=9} + if(vocation[i]==19|vocation[i]==20){vocation[i]=10} + if(vocation[i]==20|vocation[i]==21){vocation[i]=11} + } > vocation<-as.factor(vocation) > ###### 将city分为二变量 > for(i in 1:16000){ + if(city[i]==2){city[i]=1} + if(city[i]==3){city[i]=0} + } > city<-as.factor(city) > ###### 将不同变量转化为相应的数据类型 > ###### 逐步回归 ###### > default.logit<-glm(default~X30days+baddebt+loan800+ number+ frequency +city +sex+ age+ marriage+ education +vocation +salary+ expense+familys+ payment +population +economy,family=binomial(link="logit")) > summary(default.logit) > library(MASS) > step(default.logit,direction="backward") Start: AIC=3390.46 default ~ X30days + baddebt + loan800 + number + frequency + city + sex + age + marriage + education + vocation + salary + expense + familys + payment + population + economy Df Deviance AIC - economy 1 3336.5 3388.5 - age 1 3337.2 3389.2 <none> 3336.5 3390.5 - city 1 3350.8 3402.8 - population 1 3379.8 3431.8 - marriage 1 3391.7 3443.7 - sex 1 3410.9 3462.9 - expense 1 3422.5 3474.5 - baddebt 1 3428.1 3480.1 - salary 1 3440.4 3492.4 - number 1 3454.8 3506.8 - payment 1 3467.0 3519.0 - familys 1 3476.7 3528.7 - education 1 3498.2 3550.2 - frequency 1 3529.1 3581.1 - vocation 10 3686.2 3720.2 - loan800 1 4042.4 4094.4 - X30days 1 5080.7 5132.7 ###篇幅限制,部分省略 Call: glm(formula = default ~ X30days + baddebt + loan800 + number + frequency + city + sex + marriage + education + vocation + salary + expense + familys + payment + population, family = binomial(link = "logit")) ##篇幅限制,部分省略 Degrees of Freedom: 15999 Total (i.e. Null); 15975 Residual Null Deviance: 17990 Residual Deviance: 3337 AIC: 3387 |
通过经验删选以及逐步回归剔除部分变量后,现有15个解释变量入选模型。
接下来进行参数估计和检验。根据最大似然估计的多次迭代,我们可以估计出各参数值。
> ###### 经逐步回归选择的最优模型 ###### > default.logit1<-glm( default ~ X30days + baddebt + loan800 + number + + frequency + city + sex + marriage + education + vocation + + salary + expense + familys + payment + population,family=binomial()) > summary(default.logit1) Call: glm(formula = default ~ X30days + baddebt + loan800 + number + frequency + city + sex + marriage + education + vocation + salary + expense + familys + payment + population, family = binomial())
Deviance Residuals: Min 1Q Median 3Q Max -3.3543 -0.0771 -0.0295 0.0053 1.2853 Coefficients: Estimate Std. Error z value Pr(>|z|) (Intercept) -5.35088 0.50671 -10.560 < 2e-16 *** X30days1 6.46868 0.20862 31.007 < 2e-16 *** baddebt1 -2.35697 0.25032 -9.416 < 2e-16 *** loan8001 5.85612 0.25426 23.032 < 2e-16 *** number -0.82052 0.07658 -10.714 < 2e-16 *** frequency -1.19959 0.09081 -13.210 < 2e-16 *** city1 -0.89356 0.23517 -3.800 0.000145 *** sex1 0.98712 0.11752 8.399 < 2e-16 *** marriage -0.74895 0.10363 -7.227 4.92e-13 *** education 0.62596 0.05031 12.443 < 2e-16 *** vocation2 0.39902 0.17401 2.293 0.021843 * vocation3 2.03267 0.24115 8.429 < 2e-16 *** vocation4 -1.48343 0.24162 -6.139 8.28e-10 *** vocation5 -2.25891 0.24116 -9.367 < 2e-16 *** vocation6 0.37037 0.18738 1.977 0.048086 * vocation7 1.78247 0.24005 7.426 1.12e-13 *** vocation8 1.65432 0.28446 5.816 6.04e-09 *** vocation9 -11.63027 262.54698 -0.044 0.964667 vocation10 0.04542 0.19931 0.228 0.819719 vocation11 1.23115 0.48101 2.560 0.010482 * salary -1.22972 0.11698 -10.513 < 2e-16 *** expense -0.47621 0.05172 -9.207 < 2e-16 *** familys 1.53390 0.12465 12.306 < 2e-16 *** payment 0.36652 0.03308 11.079 < 2e-16 *** population 0.24095 0.03705 6.504 7.84e-11 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 17994.7 on 15999 degrees of freedom Residual deviance: 3337.3 on 15975 degrees of freedom AIC: 3387.3
Number of Fisher Scoring iterations: 16 |
可以看出,以上参数的t检验基本都在0.001的显著性下能够通过。
除此之外,为检验模型的整体显著性,我们计算了拟合优度MacFadden R square以及进行了似然比检验(LR test)。
> ###### LR检验 ###### > library(lmtest) > lrtest(default.logit1) Likelihood ratio test Model 1: default ~ X30days + baddebt + loan800 + number + frequency + city + sex + marriage + education + vocation + salary + expense + familys + payment + population Model 2: default ~ 1 #Df LogLik Df Chisq Pr(>Chisq) 1 25 -1668.7 2 1 -8997.4 -24 14657 < 2.2e-16 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 > ###### macfadden R2 ###### > McFa.Rsquare=function(default.logit1){ #glm()估计结果作为函数的输入变量 + deviance=default.logit1$deviance + null.deviance=default.logit1$null.deviance + McFa.Rsquare=1-(deviance/null.deviance) + list(McFadden.Rsquare=McFa.Rsquare) + } > McFa.Rsquare(default.logit1) $McFadden.Rsquare [1] 0.8145387 |
本模型的MacFadden R square=0.8145387,接近1,说明拟合情况良好。LR test中卡分值为14657,p值小于2.2*10-16,在显著性为0.001的情况下拒绝原假设,模型显著性通过。
(三)系数意义与边际分析
在Logistic模型中,系数衡量的是各个变量的对数优势比,不容易解释含义。这里我们先粗略的看一下其符号,有无逾期记录(X30days)、有无借款余额超过800万台币(loan800)的系数都是正的,符号和预期一致。农村户口比城市户口具有更大的违约概率,男性比女性有更大的违约概率,教育程度越高违约概率越大,具有更高的个人收入以及更低的信用卡消费额有利于减小违约概率。以上变量的系数符号都和预期一致。
但是仍然存在个别难以解释的,譬如有无呆账记录(baddebt),倘若一样本有过呆账记录,则一般理解该样本会有更大的违约可能,其符号应为正,但是估计结果为负。个人月平均支出(expense)系数为负,也与通常理解有所偏颇。
接下来我们将控制其余变量不变(取众数),对目标变量进行边际分析。譬如,我们现选取X30days为研究变量,则控制其余14个变量取其众数,而X30days=[0,1]计算两个情况下的概率值:
Prob(default=1丨X30days=0,其余变量取众数)=0.001787
Prob(default=1丨X30days=1,其余变量取众数)=0.535761
X30days从0取到1的边际概率贡献为0.533974。
> ###### 边际分析 ###### > testdata_mar<-data.frame(X30days=0 , baddebt =0, loan800 =0,number =2,frequency =3, city=1, sex=1, marriage=c(1:3), education =3,vocation=1, salary=1, expense=1,familys =2, payment =4,population=4) #以上可以逐一对各个变量进行边际分析(上述是对婚姻变量),其余变量取众数 |
以下选取我们感兴趣的变量整理成下表所示:
K | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
P(X30days=K) | 0.002 | 0.536 | |||||
P(loan800=K) | 0.019 | 0.87 | |||||
P(baddebt=K) | 0.252 | 0.031 | |||||
P(city=K) | 0.022 | 0.009 | |||||
P(sex=K) | 0.003 | 0.009 | |||||
P(number=K) | 0.004 | 0.002 | 0.0008 | 0.0003 | |||
P(frequency=K) | 0.092 | 0.03 | 0.0092 | 0.0028 | |||
P(education=K) | 0.003 | 0.005 | 0.0092 | 0.017 | 0.031 | ||
P(salary=K) | 0.009 | 0.014 | 0.0659 | 0.0021 | 1E-03 | 0.013 | |
P(familys=K) | 0.002 | 0.009 | 0.0411 | 0.1657 | 0.479 | 0.81 | |
P(salary=K) | 0.009 | 0.006 | 0.0036 | 0.0022 | 0.001 |
(四)拟合与预测
我们利用以上建立的Logistic模型,对随机选取的16000个样本进行拟合。在16000个样本中,有4000个为违约户,12000个为非违约户。拟合过程中,我们以概率大于0.5为依据,判断其是否会违约。
> ###### 样本拟合 ###### > i=12001:16000 #改为i=1:12000 则可对无瑕疵用户进行拟合 > testdata<-data.frame(X30days=X30days[i] , baddebt =baddebt[i], loan800 =loan800[i], + number =number[i],frequency =frequency[i], city=city[i], + sex=sex[i], marriage=marriage[i], + education =education[i],vocation=vocation[i], + salary=salary[i], expense=expense[i],familys =familys[i], + payment =payment[i],population=population[i]) > testdata$prob<-predict(default.logit1,newdata=testdata,type="response") > length(testdata$prob[testdata$prob>0.5]) [1] 3929 |
在4000个违约样本中,我们拟合得到的结果为3929,准确率为98.23%;在12000个非违约的样本中,我们预测结果为11614,准确率为96.78%;综合来看,在16000个中,准确预测了15543个,总体准确率达到97.14%。可以看出,拟合能力优异。
继而,我们从总体中又随机抽选了1000个样本,进行事后预测,效果如下:
> ##事后预测 > test<-read.csv("test.csv",header=T) > attach(test) ##将voction变成11个类、将city_test分为二变量、转化变量类型 程序与上文类似,请读者自行编写,注意赋值变量名称改为X_test > i=1:1000 >testdata_shihou<-data.frame(X30days=X30days_test[i] ,baddebt=baddebt_test[i], loan800 =loan800_test[i], number=number_test[i],frequency=frequency_test[i],city=city_test[i],sex=sex_test[i],marriage=marriage_test[i], education=education_test[i],vocation=vocation_test[i], salary=salary_test[i],expense=expense_test[i],familys=familys_test[i], payment =payment_test[i],population=population_test[i]) > testdata_shihou$prob<-predict(default.logit1,newdata=testdata_shihou,type="response") > ###### 以0.5为判断标准,大于0.5记为有瑕疵 > s<-0 > m=0 > xulie<-NULL > jilu<-NULL > for(k in 1:1000){ + if(testdata_shihou$prob[k]>0.5){a<-1} + else{a<-0} + if(a==default_test[k]){s<-s+1} + else{m=m+1 + xulie[m]<-k + } > xulie #记录判断错误的样本序号 [1] 8 20 38 45 113 118 156 254 299 370 381 383 417 428 465 530 531 583 585 592 642 696 731 741 754 768 794 863 868 908 [31] 951 967 969 > s #记录1000个事后预测正确的数目 [1] 967 |
在1000个用作事后预测的随机样本中,有57个违约用户,953个非违约用户。其中预测正确的有967个,准确率高达96.7%。该模型同样具有禀赋的预测能力。
(六)结论与建议
通过Logistic模型研究发现,在影响个人信用违约概率的因子中,个人信用记录(包括逾期还款、呆账历史、大额的贷款额)、信用卡使用行为(包括个人持有信用卡张数、信用卡使用频率)、个人信息(包括性别、婚姻、学历、职业、个人收支情况)以及家庭情况(包括家庭人口数、家庭经济状况)等四大方面起显著作用。
从对数似然比中,我们选取绝对值大于5的因素,逾期还款、大额的贷款额记录、是否职业为企业家,这三个因素在所有因子中影响效果巨大,建议在办理信贷期间可多加关注。
在此建议银行在办理信用卡以及信用额度管理,应关注对客户先验信息的搜集和利用,根据客户信息资料或定性或定量地衡量风险对信用卡瑕疵客户的准确识别有很大的帮助。从本文的建模效果看来,logistic模型是很好的选择。在进行信用卡推广期间,可根据显著因子与相应变量的正负影响关系,更加有针对性地锁定目标群体。
----摘自方匡南等《R数据分析-方法与案例详解》.电子工业出版社.