R 银行信用卡风控评分数据分析

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: R 银行信用卡风控评分数据分析

1 初始环境准备

读取数据与预览


rm(list=ls())
#setwd("./case")
#install.packages("xlsx")
library(openxlsx)
dat<-read.xlsx("credit.xlsx",1)
View(dat)

在这里插入图片描述

2数据预览与处理

数据预览,发现最大值999的异常值,偏离平均值

class(dat)
#describe data
summary(dat)
sum(is.na(dat))

异常值处理,使用na填充

#Outlier filling
dat[,1:6]<-sapply(dat[,1:6],function(x) {x[x==999]<-NA;return(x)} )
nrow(dat)
ncol(dat)
summary(dat[,11])
#Understand data deletion invalid variables
dat<-dat[,-11]

将字符型变量character转化为因子变量factor

Change string variable type to classification variable

dat1<-dat
sapply(dat1,class)
ch=names(which(sapply(dat1,is.character)))#find the character type variance
dat1[,ch]=as.data.frame(lapply(dat1[,ch], as.factor))

在这里插入图片描述
观察数据发现家庭人口数和家庭孩子数密切相关,存在多重共线性,于是产生标识变量代替这二个变量

dat1[,4]<-dat1[,4]-dat1[,3]

table(dat1[,4])
dat1[,4]<-factor(dat1[,4],levels=c(1,2),labels=c("其他","已婚"))

colnames(dat1)<-c("age","income","child","marital","dur_live",
                  "dur_work","housetype","nation","cardtype","loan")
summary(dat1)

在这里插入图片描述

3 描述性统计

相关包准备

#install.packages("smbinning")
#install.packages("prettyR")
library(smbinning)
library(prettyR)

library(mvtnorm)
library(kernlab)

盖帽法

异常值可以使用盖帽法处理,使用1%和99%分位数替换异常值

盖帽法函数 去除异常用99%和1%点分别代替异常值

block<-function(x,lower=T,upper=T){
  if(lower){
    q1<-quantile(x,0.01)
    x[x<=q1]<-q1
  }
  if(upper){
    q99<-quantile(x,0.99)
    x[x>q99]<-q99
  }
  return(x)
}

数据集中1是不违约,0是违约,进行反转设定,使1变为违约,0为不违约

#Odds ratio conversion for later IV calculation
dat1$loan<-as.numeric(!as.logical(dat1$loan))

描述数据分类统计

违约和不违约的人群的区别

#data classification ,discretization of continuous variables
##age
boxplot(age~loan,data=dat1,horizontal=T, frame=F, 
        col="lightgray",main="Distribution")
age<-smbinning(dat1,"loan","age")
age$ivtable

违约与否的年龄箱线图
在这里插入图片描述
分箱后的IV图

age<-smbinning(dat1,"loan","age")
age$ivtable

在这里插入图片描述

对年龄进行分箱后,查看百分比,weight,good,bad rate,后面的描述性统计大致如此,可以秦楚看出不同年龄层次的区别

par(mfrow=c(2,2))
smbinning.plot(age,option="dist",sub="年龄")
smbinning.plot(age,option="WoE",sub="年龄")
smbinning.plot(age,option="goodrate",sub="年龄")
smbinning.plot(age,option="badrate",sub="年龄"

在这里插入图片描述
将IV结果添加到一个向量中

par(mfrow=c(1,1))
age$iv
#Add Iv value to vector
cred_iv<-c("年龄"=age$iv)

在这里插入图片描述
关于收入,明显存在异常值,使用盖帽法

##income

boxplot(income~loan,data=dat1,horizontal=T, frame=F, 
        col="lightgray",main="Distribution")
   

在这里插入图片描述
盖帽法填充

dat1$income<-block(dat1$income)

填充后明显变正常了

boxplot(income~loan,data=dat1,horizontal=T, frame=F, 
        col="lightgray",main="Distribution")
![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/6cdfe855c6854461b031ec68b48f1f1d.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVEhFIE9SREVS,size_20,color_FFFFFF,t_70,g_se,x_16)

IV值测量,同上age

income<-smbinning(dat1,"loan","income")
income$ivtable
smbinning.plot(income,option="WoE",sub="收入")
income$iv
cred_iv<-c(cred_iv,"收入"=income$iv)


child 统计

child

boxplot(child~loan,data=dat1,horizontal=T, frame=F,

    col="lightgray",main="Distribution")

child<-smbinning(dat1,"loan","child")
child$ivtable
smbinning.plot(child,option="WoE",sub="孩子数量")
child$iv
cred_iv<-c(cred_iv,"孩子数量"=child$iv)

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/19597a8137a84912a2af2a62191f878e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVEhFIE9SREVS,size_19,color_FFFFFF,t_70,g_se,x_16)

marital

xtab(~marital+loan,data=dat1,chisq=T)
marital<-smbinning.factor(dat1,"loan","marital")
marital$ivtable
smbinning.plot(marital,option="WoE",sub="婚姻状态")
marital$iv
cred_iv<-c(cred_iv,"婚姻状态"=marital$iv)


![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/87de8355865743989e19ceb715ee0e2b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVEhFIE9SREVS,size_19,color_FFFFFF,t_70,g_se,x_16)

dur_live

boxplot(dur_live~loan,data=dat1,horizontal=T,

    frame=F, col="lightgray",main="Distribution")

t.test(dur_live~loan,data=dat1)
dur_live<-smbinning(dat1,"loan","dur_live")
dur_live

观察得到dur_live变量对违约分布区别不大,使用t检验,不能拒绝二者同分布

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/172a5a47208b474aa543250141a04436.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVEhFIE9SREVS,size_20,color_FFFFFF,t_70,g_se,x_16)

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/5dc74e63d10a4598aa5e971043699dcd.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVEhFIE9SREVS,size_20,color_FFFFFF,t_70,g_se,x_16)
dur_work变量统计

dur_work

boxplot(dur_work~loan,data=dat1,horizontal=T,

    frame=F, col="lightgray",main="Distribution")

t.test(dur_work~loan,data=dat1)
dur_work<-smbinning(dat1,"loan","dur_work")
dur_work$ivtable
smbinning.plot(dur_work,option="WoE",sub="在现工作时间")
dur_work$iv
cred_iv<-c(cred_iv,"在现工作时间"=dur_work$iv)

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/8a491111dedd40b48a595b872533c1cb.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVEhFIE9SREVS,size_20,color_FFFFFF,t_70,g_se,x_16)
housetype描述统计

housetype

xtab(~housetype+loan,data=dat1,chisq=T)
housetype<-smbinning.factor(dat1,"loan","housetype")
housetype$ivtable
smbinning.plot(housetype,option="WoE",sub="住房类型")
housetype$iv
cred_iv<-c(cred_iv,"住房种类"=housetype$iv)


![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/f284a0bd098645c89cdaae0ec71d69c3.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVEhFIE9SREVS,size_20,color_FFFFFF,t_70,g_se,x_16)

nation

xtab(~nation+loan,data=dat1,chisq=T)
nation<-smbinning.factor(dat1,"loan","nation")
nation$ivtable
smbinning.plot(nation,option="WoE",sub="国籍")
nation$iv
cred_iv<-c(cred_iv,"国籍"=nation$iv)


![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/bc3478127eee49bda8f4b0c953ad028b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVEhFIE9SREVS,size_20,color_FFFFFF,t_70,g_se,x_16)
cardtype描述统计

cardtype

xtab(~cardtype+loan,data=dat1,chisq=T)
cardtype<-smbinning.factor(dat1,"loan","cardtype")
cardtype$ivtable
smbinning.plot(cardtype,option="WoE",sub="信用卡类型")
cardtype$iv
cred_iv<-c(cred_iv,"信用卡类型"=cardtype$iv)

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/0df1006414ac40d185a59b8698c38444.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVEhFIE9SREVS,size_20,color_FFFFFF,t_70,g_se,x_16)
总体变量IV值程度

Drawing shows the amount of information

barplot(cred_iv,main="各变量信息值")

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/6157f8560ac14a37a686b15c0bb5d484.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVEhFIE9SREVS,size_20,color_FFFFFF,t_70,g_se,x_16)

# 4 属性分箱

quantity after adding classification

dat2<-dat1
dat2<-smbinning.gen(dat2,age,"glage")
dat2<-smbinning.gen(dat2,income,"glincome")
dat2<-smbinning.gen(dat2,child,"glchild")
dat2<-smbinning.factor.gen(dat2,marital,"glmarital")
dat2<-smbinning.gen(dat2,dur_work,"gldur_work")
dat2<-smbinning.factor.gen(dat2,housetype,"glhousetype")
dat2<-smbinning.factor.gen(dat2,nation,"glnation")
dat2<-smbinning.factor.gen(dat2,cardtype,"glcardtype")
View(dat2)

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/0909f28157dc4938b210aa36f7232509.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVEhFIE9SREVS,size_20,color_FFFFFF,t_70,g_se,x_16)

dat3<-dat2[,c(11:18,10)]

View(dat3)

生成分箱后的数据级,将用户属性转化为区间数据
![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/a89a80cd659f4a05904095153b28b692.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVEhFIE9SREVS,size_20,color_FFFFFF,t_70,g_se,x_16)

# 5 logistic建模
具体打分理论参考

模型生成

Creat logistic regression

cred_mod<-glm(loan~. ,data=dat3,family=binomial())
summary(cred_mod)


![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/5513bf6a6faa42ceac901a370b35a982.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVEhFIE9SREVS,size_20,color_FFFFFF,t_70,g_se,x_16)

# 6 打分系统
依照打分公式发现,信用最高评分和最低评分分别为797,362

Scoring card system

cre_scal<-smbinning.scaling(cred_mod,pdo=45,score=800,odds=50)
cre_scal$logitscaled
cre_scal$minmaxscore


![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/1ded34e903374bb98e1c218ed0af1899.png)
违约过与否的箱线图

Score each item

dat4<-smbinning.scoring.gen(smbscaled=cre_scal, dataset=dat3)
boxplot(Score~loan,data=dat4,horizontal=T, frame=F,

    col="lightgray",main="Distribution")

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/a36036934da94aa38da20faeb7a9e7f2.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVEhFIE9SREVS,size_20,color_FFFFFF,t_70,g_se,x_16)
生成打分指标

Standardized scoring table

scaledcard<-cre_scal$logitscaled[[1]][-1,c(1,2,6)]
scaledcard[,1]<-c(rep("年龄",5),rep("收入",3),rep("孩子数量",2),

              rep("婚否",2),rep("在现工作时间",5),
              rep("住房类型",3),rep("国籍",8),rep("信用卡类型",7))

scaledcard


# 7 写入csv文件

ncol(dat4)
dat5=dat4[,10:18]

write the results

write.table(scaledcard,"card.csv",row.names = F)
write.table(dat4,"card.csv",row.names = F,append = T)
?write.csv

输出文件给业务人员
![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/3c5fe6ba6cad4e919ba0c34e565d101b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVEhFIE9SREVS,size_20,color_FFFFFF,t_70,g_se,x_16)
相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
目录
相关文章
|
4月前
|
算法 数据挖掘 数据处理
豆瓣评分8.7!Python pandas创始人亲码的数据分析入门手册!
在众多解释型语言中,Python最大的特点是拥有一个巨大而活跃的科学计算社区。进入21世纪以来,在行业应用和学术研究中采用python进行科学计算的势头越来越猛。 近年来,由于Python有不断改良的库(主要是pandas),使其成为数据处理任务的一大代替方案,结合其在通用编程方面的强大实力,完全可以只使用Python这一种语言去构建以数据为中心的应用程序。 作为一个科学计算平台,Python的成功源于能够轻松的集成C、C++以及Fortran代码。大部分现代计算机环境都利用了一些Fortran和C库来是西安线性代数、优选、积分、快速傅里叶变换以及其他诸如此类的算法。
|
4月前
|
算法 数据挖掘 数据处理
豆瓣评分8.7!Python pandas创始人亲码的数据分析入门手册!
在众多解释型语言中,Python最大的特点是拥有一个巨大而活跃的科学计算社区。进入21世纪以来,在行业应用和学术研究中采用python进行科学计算的势头越来越猛。 近年来,由于Python有不断改良的库(主要是pandas),使其成为数据处理任务的一大代替方案,结合其在通用编程方面的强大实力,完全可以只使用Python这一种语言去构建以数据为中心的应用程序。 作为一个科学计算平台,Python的成功源于能够轻松的集成C、C++以及Fortran代码。大部分现代计算机环境都利用了一些Fortran和C库来是西安线性代数、优选、积分、快速傅里叶变换以及其他诸如此类的算法。
|
4月前
|
机器学习/深度学习 数据可视化 算法
【Python支持向量机】Python客户银行贷款支持向量机数据分析可视化SVM(源码+数据集+报告)【独一无二】
【Python支持向量机】Python客户银行贷款支持向量机数据分析可视化SVM(源码+数据集+报告)【独一无二】
|
7月前
|
SQL 分布式计算 数据挖掘
面试官嫌我Sql写的太low?要求我重写还加了三个需求?——二战Spark电影评分数据分析
面试官嫌我Sql写的太low?要求我重写还加了三个需求?——二战Spark电影评分数据分析
81 0
面试官嫌我Sql写的太low?要求我重写还加了三个需求?——二战Spark电影评分数据分析
|
7月前
|
分布式计算 数据挖掘 关系型数据库
Spark综合练习——电影评分数据分析
Spark综合练习——电影评分数据分析
94 0
|
SQL 分布式计算 数据挖掘
大数据Spark电影评分数据分析
大数据Spark电影评分数据分析
175 0
|
数据采集 分布式计算 数据可视化
基于Spark的银行直销电话数据探索性数据分析
基于Spark的银行直销电话数据探索性数据分析
|
SQL 分布式计算 数据可视化
基于Spark技术的银行客户数据分析
基于Spark技术的银行客户数据分析
|
数据挖掘 开发工具
数据分析实例-平安银行股票分析
数据分析实例-平安银行股票分析
311 1
数据分析实例-平安银行股票分析
|
机器学习/深度学习 算法 数据挖掘
Interview:算法岗位面试—10.10下午—上海某银行算法岗位(偏数据分析,四大行之一)的技术面—关于项目的考察
Interview:算法岗位面试—10.10下午—上海某银行算法岗位(偏数据分析,四大行之一)的技术面—关于项目的考察