网贷平台Prosper2005~2014数据预测分析

网贷平台Prosper2005~2014数据预测分析

1.摘要

本文详述了如何通过数据预览,基本数据分析、探索式数据分析,缺失数据填补等方法,实现对kaggle上Prosper借贷平台贷款者还款与否这一分类问题如何进行数据分析的具体探索式实践。并分别对2009.07.01前后的模型进行建模分析对比,得出两个模型的预测准确率和变量对模型的重要性对比分析,明确看出2009.07.01前后平台的模型明显有很大的不同。

2.项目内容介绍

Prosper LoanData是由Joshua Schnessl从Udacity Data Analyst Nanodegree上把数据放到kaggle的上供感兴趣的人分析的一个实例项目,这并非一个竞赛项目。本人试图通过训练数据集分析出什么类型的借款人更可能不违约,并预测出测试数据集中的每笔贷款是否违约。

本人将LoanStatus(贷款状态)分成完成和违约两种,所以把该项目定义为一个二元分类问题。

3.如何进行实践分析

3.1加载数据

在加载数据之前,先通过如下代码加载之后会用到的所有R库

#设置工作路径
setwd("D:/RESLIO/workpace/proposer")
library(InformationValue) # IV / WOE calculation
library(ggplot2)
library(GGally)
library(scales)
library(lattice)
library(MASS)
library(memisc)
library(Rcpp)#使用c++语言
library(Amelia)#有缺失值绘图的函数
library(gridExtra)
library(tidyr)
library(mice)
library(dplyr)
library(stringr)
library(splines) #数据差值包
library('randomForest') # 分类算法
library("rpart")
library('ggthemes') # 可视化

通过如下代码读入数据

#读入数据
loandata <-read.csv('prosperLoanData.csv',
stringsAsFactors = FALSE,na.strings = c(""))

3.2数据预览

先观察数据

> str(loandata)'data.frame':         113937 obs. of  81 variables:
$ ListingKey                         : chr  "1021339766868145413AB3B" "10273602499503308B223C1" "0EE9337825851032864889A" "0EF5356002482715299901A" ...
$ ListingNumber                      : int  193129 1209647 81716 658116 909464 1074836 750899 768193 1023355 1023355 ...
$ ListingCreationDate                : chr  "2007-08-26 19:09:29.263000000" "2014-02-27 08:28:07.900000000" "2007-01-05 15:00:47.090000000" "2012-10-22 11:02:35.010000000" ...
$ CreditGrade                        : chr  "C" NA "HR" NA ...
$ Term                               : int  36 36 36 36 36 60 36 36 36 36 ...
$ LoanStatus                         : chr  "Completed" "Current" "Completed" "Current" ...
$ ClosedDate                         : chr  "2009-08-14 00:00:00" NA "2009-12-17 00:00:00" NA ...
$ BorrowerAPR                        : num  0.165 0.12 0.283 0.125 0.246 ...
$ BorrowerRate                       : num  0.158 0.092 0.275 0.0974 0.2085 ...
$ LenderYield                        : num  0.138 0.082 0.24 0.0874 0.1985 ...
$ EstimatedEffectiveYield            : num  NA 0.0796 NA 0.0849 0.1832 ...

从上可见,数据集包含81个变量,113,937条数据,由于数据变量太多,本文只对重要变量作解释说明,若需详细了解变量含义,请点击变量词典


  • ListingCreationDate:表创建时间(可能是交易开始计息时间)
  • LoanStatus:贷款状态(Completed、Current、Defaulted、Chargedoff等)
  • EmploymentStatus:受雇佣状态(Self-employed、Employed等)
  • EmploymentStatusDuration:受雇佣状态持续时间(以月为计算单位)
  • IsBorrowerHomeowner:借款人是否拥有房屋
  • CreditScoreRangeLower/CreditScoreRangeUpper:消费信用最低/最高分
  • InquiriesLast6Months:最近6个月查过多少次征信记录
  • BorrowerRate:借款标利率,作为P2P平台资金借贷价格的代理变量,BorrowerRate不包含其他费用,是筹资者付给投资人的报酬,也是融资最直接和最重要的成本,其体现了资金供求双方在综合考虑各种因素情况下所认可的资金使用成本.
  • Term:期限,筹资者通过网贷平台进行借款时所承诺的最终偿还期限,借款期限体现该资产的流动性,期限较长的资产应存在着流动性溢价(利率上涨).
  • CreditGrade/ProsperRating(Alpha):信用等级,前者反映的是2009年7月1日前客户的信用等级,后者反映的是2009年7月1日后的信用等级.信用等级越高,其偿债能力越强.
  • CreditScore:由消费信用公司提供的消费信用评分,类似于国内的芝麻信用分。
  • StatedMonthlyIncome:客户月收入,月收入越高,投资者对该借款本息按时回流越有信心.
  • DelinquenciesLast7Years:信用资料提交时借款人过去7年违约次数,该指标在一定程度上可以体现借款标的发布者的信用状况
  • BankCarduse:信用资料提交时借款人信用卡使用额度和信用卡总透支额度的百分比,本文将这个数据分成四组(mild use;medium use;heavy use;super use)
  • LoanOriginalAmount:借款人在借款时已经向prosper借入的资金,如果没有历史记录则为0,显然,借入本金越多,其还款压力越大,但是这项指标大的话也可能说明该客户对prosper依赖性较强.
  • DebtToIncomeRatio:借款人的债务收入比,债务收入比越高说明筹资者财务状况越差,还款能力较低.其向P2P平台借款时,投资者应要求有更高的回报.
  • Occupation:贷款人职业
  • IncomeRange:贷款人年收入范围
  • BorrowerState:贷款人所在州
  • Customer_clarify:0或NA是未在prosper贷过款的客户,反之是贷过款的。

3.3探索式数据分析

3.3.1年收入越低,违约率越高

可通过如下方式统计出每个年收入段贷款如期还款笔数和违约笔数,并计算出每段贷款如期还款笔数和违约笔数所占的比例。



从上图可见,随着年收入的增加,违约比例在逐渐下降。

为了更为定量的计算IncomeRange的预测价值,可以算出IncomeRange的WOE和IV如下。从结果可以看出,IncomeRange的IV为0.09341802,且“Somewhat Predictive”。 IV较低,有一定的预测能力,但从常识上来说收入水平会极大的影响还款能力,因此暂时将IncomeRange作为预测模型的特征变量之一。

3.3.2负债水平低的借款人违约率低于负债水平高的人

按照常识来说债务收入比(DebtToIncomeRatio)低的人更具备还款能力,违约可能性应该低于债务收入比高的人。如下图所示,DebtToIncomeRatio < 0.6的借款人中,违约笔数小于未违约的笔数。从下图也可看出大部分借款人的债务收入比低于0.25,说明平台违约的整体风险可控。


3.3.3透支比例非常高的人违约概率大

绘出BankCardUse与LoanStatus人数分布图。


从上图可见,BankCardUse为Mild Use、Medium Use、Heavy Use时违约率在25%左右,而Super Use、NA(可理解后没有信用卡或没有填写这一项)违约率在50%左右,所以,对符合这两种情况的借款人要加强风险管控。可通过计算WOE与IV定量计算BankCardUse对预测的贡献。IV为0.04540431,且”Somewhat Predictive”。


3.3.4消费信用分低的借款人违约概率大

消费信用分(CreditScore)是衡量一个人在消费中的经济能力,分值高的人交易更活跃、交易活动违约率更低,所以消费信用分高的人更具备还款能力,违约可能性应该低于消费信用分低的人。如下图所示,CreditScore < 560的借款人中,违约笔数大于未违约的笔数。从下图也可看出大部分借款人的消费信用分高于600分,说明消费信用分低的人在平台上不容易借到钱。

3.3.5信用评级高(2009.07.01之前)的人违约概率小

绘出CreditGrade与LoanStatus人数分布图。

从上图可见,CreditGrade评级越高的人违约率越低,大部分借款人的评级都在D级以上。可通过计算WOE与IV定量计算CreditGrade对预测的贡献。IV为0.3373696,且” Highly Predictive”。


3.3.6信用评级高(2009.07.01之后)的人违约概率小

绘出CreditGrade与LoanStatus人数分布图。

从上图可见,ProsperRating..Alpha.评级越高的人违约率越低,大部分借款人的评级都在D级以上。与2009.07.01之前的信用评级对比去掉了NC级,且整体违约率比之前更低,说明平台的风控模型进行了非常有成效的调整。可通过计算WOE与IV定量计算CreditGrade对预测的贡献。IV为0. 0.3373623,且” Highly Predictive”。

3.3.7过去七年违约次数多的借款人违约概率大

过去七年违约次数(DelinquenciesLast7Years)能够衡量一个人在过去七年中征信情况,违约一次或以上的人在借款时违约概率更大。如下图所示,DelinquenciesLast7Years < 7的借款人中,违约笔数与未违约的笔数线贴合。从下图也可看出大部分借款人的DelinquenciesLast7Years 在1次以下,说明整个平台的风险可控。

3.3.8受雇佣状态持续时间长的借款人违约概率小

受雇佣状态持续时间(EmploymentStatusDuration)可够衡量一个人工作生活的稳定情况,受雇佣状态持续时间长的违约的概率小。如下图所示,随着EmploymentStatusDuration的增长,违约概率逐渐减小。

3.4缺失值处理

3.4.1列出所有缺失值

#查看数据集缺失数据
missmap(loandata, main = "Missing values vs observed")
#具体缺失参数,空值
sapply(loandata,function(x)sum(is.na(x)))缺失值

变量CreditGrade和ProsperRating..Alpha.缺失值最多,这是由于平台以2009.07.01为分界点使用的平台评级名称不一样而产生。用sapply函数显示loandata数据集各个变量缺失值情况及变量的因子长度.

3.4.2.CreditScore缺失值处理

#1.CreditScore缺失值处理(使用中位数)
loandata$CreditScore <- na.roughfix(loandata$CreditScore)

CreditScore缺失值为590条,所占比例不大,但为了模型的精确性,使用中位数替换。

3.4.3. BankCardUse缺失值处理

#BankCardUse是缺失的数据集
loandata_bcuna<-loandata[is.na(loandata$BankCardUse),]
#缺失的数据集的LoanStatus情况
table(loandata_bcuna$LoanStatus)

BankCardUse缺失值为7600条,所占比例很大,且违约比例很大,所以单独作为一项因子。

#直接置为NOTA
loandata$BankCardUse[is.na(loandata$BankCardUse)]<-"NOTA"

3.4.4. BorrowerState缺失值处理

#3.BorrowerState缺失值处理(直接置为NOTA)
#BorrowerState是缺失的数据集
loandata_brsna<-loandata[is.na(loandata$BorrowerState),]
#缺失的数据集的LoanStatus情况
table(loandata_brsna$LoanStatus)


BorrowerState缺失值为5512条,所占比例很大,且违约比例很大,所以单独作为一项因子。

loandata$BorrowerState[is.na(loandata$BorrowerState)]<-"NOTA"

3.4.5. Occupation缺失值处理

Occupation缺失值为2281条,所占比例很大,且违约比例很大,所以单独作为一项因子。

loandata$Occupation[is.na(loandata_copy$Occupation)]<-"NOTA"

3.4.6. DebtToIncomeRatio缺失值处理


DebtToIncomeRatio缺失值为4456条,所占比例很大,且违约比例较大,依据常识债务比例数值越大违约的概率越大,所以根据数据集中债务比例分布情况将0.20~0.50随机赋值给缺失的DebtToIncomeRatio。

loandata$DebtToIncomeRatio[is.na(loandata$DebtToIncomeRatio)]<-  runif(nrow(loandata_dirna),0.10,0.50)

3.4.7. DelinquenciesLast7Years缺失值处理


DelinquenciesLast7Years缺失值为987条,在平台借款违约比例较大,所以将DelinquenciesLast7Years缺失值全部置为1。

loandata$DelinquenciesLast7Years[is.na(loandata$DelinquenciesLast7Years)]<-1

3.4.8. EmploymentStatus缺失值处理


EmploymentStatus缺失值为2252条,所占比例很大,且违约比例很大,所以单独作为一项因子。

loandata$EmploymentStatus[is.na(loandata$EmploymentStatus)]<-"NOTA"

3.4.9. EmploymentStatusDuration缺失值处理



EmploymentStatusDuration缺失值为7611条,所占比例很大,且违约比例很大。猜想,工作越稳定还款能力越强,故将EmploymentStatusDuration的缺失值置为48.

loandata$EmploymentStatusDuration[is.na(loandata$EmploymentStatusDuration)]<-48

3.4.10.InquiriesLast6Months缺失值处理


InquiriesLast6Months缺失值为696条,所占比例不大,违约比例跟整体数据相近,故将InquiriesLast6Months的缺失值置为2.

loandata$InquiriesLast6Months[is.na(loandata$InquiriesLast6Months)]<-2

3.4.11. CreditGrade缺失值处理

CreditGrade缺失值为131,2009.07.01之前的数据有29079条,所占比重比较小。其中有9笔违约,122笔正常,所以采取直接舍弃的处理方式。

4.建模分析

4.1建模分析(2009.07.01之前)

4.1.1建模

#2009.07.01之前 训练集、测试集选择
set.seed(1234)
train_before.index<-sample(nrow(loandata_before),0.7*nrow(loandata_before))
train_before<-loandata_before[train_before.index,]
test_before<-loandata_before[-train_before.index,]

#使用随机森林预测贷款坏账与否
set.seed(1234)
#训练模型

forest_before<-randomForest(factor(LoanStatus)~CreditGrade+Customer_clarify+
                              IncomeRange+DebtToIncomeRatio+
                              DelinquenciesLast7Years+BorrowerRate+
                              IsBorrowerHomeowner+ListingCategory..numeric.+
                              EmploymentStatusDuration+
                              InquiriesLast6Months+CreditScore+
                              BankCardUse,
                              data =train_before,
                              importance=TRUE)


4.1.2预测

#对测试集样本点分类
predit_before<-predict(forest_before,test_before)
pert_before<-table(test_before$LoanStatus,predit_before,
                  dnn=c("Actual","Predicted"))
pert_before



该模型预测结果的准确率为(1498+4520)/8385=71.77%。

4.1.3变量重要性

对模型预测结果的准确率影响最大的前三个变量为BorrowerRate,DebtToIncomeRatio,EmploymentStatusDuration。

4.2建模分析(2009.07.01之后)

4.2.1建模

#使用随机森林预测贷款坏账与否
set.seed(1234)
#训练模型
forest_after<-randomForest(factor(LoanStatus)~ProsperRating..Alpha.+
   Customer_clarify+IncomeRange+DebtToIncomeRatio+DelinquenciesLast7Years+
   BorrowerRate+IsBorrowerHomeowner+ListingCategory..numeric.+
   EmploymentStatusDuration+InquiriesLast6Months+CreditScore+ BankCardUse,
   data =train_after, importance=TRUE)    

4.2.2预测

#对测试集样本点分类
predit_after<-predict(forest_after,test_after)
pert_after<-table(test_after$LoanStatus,predit_after,
                  dnn=c("Actual","Predicted"))
pert_after


该模型预测结果的准确率为(161+6382)/8484=77.12%。

4.2.3变量重要性

对模型预测结果的准确率影响最大的前三个变量为EmploymentStatusDuration,BorrowerRate,DebtToIncomeRatio。

可以看出,与2009.07.01之前的模型变量重要性相比,EmploymentStatusDuration由第三位变为第一位,说明在2009.07.01之后的模型更加强调雇佣状态持续时间的重要性,从模型预测的准确率来看,这种模型的调整是有效的,使得准确率由71.77%增加到77.12%

5.总结

本文详述了如何通过数据预览,基本数据分析、探索式数据分析,缺失数据填补等方法,实现对kaggle上Prosper借贷平台贷款者还款与否这一分类问题如何进行数据分析的具体探索式实践。并分别对2009.07.01前后的模型进行建模分析对比,得出两个模型的预测准确率和变量对模型的重要性对比分析,明确看出2009.07.01前后平台的模型明显有很大的不同。

A.与2009.07.01之前的模型变量重要性相比,EmploymentStatusDuration由第三位变为第一位

B.2009.07.01之前预测准确率为71.77%,2009.07.01之后预测准确率为77.12%

6.参考文献

prosper贷款数据EDA分析 - 知乎专栏

kaggle.com/jschnessl/pr

7、源代码网盘地址:pan.baidu.com/s/1kV3K0g

编辑于 2017-07-18

文章被以下专栏收录