利用R语言对贷款客户作风险评估(上)——数据分析
前言
风险控制能力越来越成为互联网金融行业的隐形门槛,为风控人员提供显著地风险评估依据变得非常重要。本文以银行客户的信用卡信息为案例数据,对数据进行分析为信贷管理的风控人员提供风险评估依据。本文做以下几方面的工作:
- 处理原始数据,进行数据探索
- 好坏客户为因变量,处理不平衡数据的二分类问题
- 将逾期还款次数作为新的因变量做零膨胀回归问题,旨在为信贷管理的风控人员提供风险评估依据
一、数据分析
数据来源
本文采用的案例数据来自UCI机器学习数据库,为台湾某银行信用卡客户信息表。该数据一共有30000个观测样本,23个自变量,1个二元目标变量,无缺失值。
数据处理
部分数据需要进行预处理,因为婚姻状况本身只有三种:1=married;2=single; 3=others,而在原数据中却出现了数据值为0的婚姻状况。同样的,在 教育程度的变量中,1=graduate school ; 2=university ; 3=high school ; 4=others ,但也出现的意义不明的值,我们需要将这些值以及others统统转换成unkown 。具体的变量情况如表1.1:
数据探索
对数据进行一个基本 面的分析,查看数据变量的分布情况,以便更好地理解数据。首先,通过图1.1的分布可以看到:使用信用卡的单身人数多于已婚人士;使用信用卡的本科学历最多;女性使用者大于男性。
从因变量的分布可以看出好客户远多于坏客户;将年龄按好坏客户分成两组数据, 用KS检验来看这两组数据是否有显著性差异,结果P值小于0.05,说明两组数据的分布差异不显著。同样的方法也可验证信用卡额度在好坏客户之间没有显著性差异。
R语言代码如下:
rm(list=ls(all=TRUE))
card=read.csv("card2.csv")
card$sex<-as.factor(card$sex)
card$mar<-as.factor(card$mar)
card$edu<-as.factor(card$edu)
card$pre<-as.factor(card$pre)
card$a<-as.factor(card$a)
card$b<-as.factor(card$b)
card$c<-as.factor(card$c)
card$d<-as.factor(card$d)
card$e<-as.factor(card$e)
card$f<-as.factor(card$f)
summary(card) #计算数据的主要描述统计量
library(ggplot2)
library(plyr)
library(dplyr)
library(Rmisc)
#因子类型变量
bar1<-ggplot(card)+geom_bar(width=1, aes(x=factor(1),fill=card$mar))+
coord_polar(theta="y")
bar2<-ggplot(card)+geom_bar(width=1, aes(x=factor(1),fill=card$sex))+
coord_polar(theta="y")
bar3<-ggplot(card)+geom_bar(width=1, aes(x=factor(1),fill=card$edu))+
coord_polar(theta="y")
bar4<-ggplot(card)+geom_bar(width=1, aes(x=factor(1),fill=card$pre))+
coord_polar(theta="y")
multiplot(bar1, bar2, bar3,bar4,cols=2)
#数值型变量
box1<-ggplot(card,aes(x=pre,y=age,fill=pre)) +
geom_boxplot() +
theme_bw() + # 一种ggplot的主题
labs(x = '好坏客户', y = '年龄') # 设置横纵坐标标签
box2<-ggplot(card,aes(x=pre,y=carde,fill=pre)) +
geom_boxplot() +
theme_bw() + # 一种ggplot的主题
labs(x = '好坏客户', y = '信用卡额度') # 设置横纵坐标标签
multiplot(box1,box2,cols=2)
#####KS检验:检验好坏客户在年龄,信用卡额度上是否有显著差异
table(card$pre)
pre0=card[which(card$pre==0),]
pre1=card[which(card$pre==1),]
age0<-pre0$age
age1<-pre1$age
ks.test(age0,age1)#P值小于005,说明两组数据没有显著差异
carde0<-pre0$carde
carde1<-pre1$carde
ks.test(t(carde0),t(carde1))