R语言-来自Prosper的贷款数据探索
案例分析:Prosper是美国的一家P2P在线借贷平台,网站撮合了一些有闲钱的人和一些急用钱的人。用户若有贷款需求,可在网站上列出期望数额和可承受的最大利率。潜在贷方则为数额和利率展开竞价。
本项目拟通过该数据集的探索,结合自己的理解进行分析,最终目的的是初步预测哪些人贷款后会还款、哪些人会赖账。
1.探索数据集
复制代码
1 loandata = read.csv("prosperLoanData.csv")
2 str(loandata)
复制代码
结论:一共有81个变量,113937个对象
2.选择分析的变量
复制代码
由于有81个变量,为简化分析,仅选取其中有代表性的13个变量。变量选取如下:
1. **ListingCreation**: 列表创建时间。
2. **Term**: 贷款期限,期限越长的,利率应当越高
3. **LoanStatus**: 贷款状态(Completed、Current、Defaulted、Chargedoff等)
4. **BorrowerBorrowerRate**: 借款利率。
5. **DelinquenciesLast7Years**: 信用资料提交时借款人过去7年违约次数。
6. **StatedMonthlyIncome**: 客户自己声称的月收入。
7. **IsBorrowerHomeowner**: 借款人是否拥有住房。
8. **InquiriesLast6Months**: 最近6个月的征信记录查询次数。一般来说,征信查询次数越多,该主体的贷款申请就越多。
9. **DebtToIncomeRatio**: 借款人的债务收入比,债务收入比越高说明筹资者财务状况越差,还款能力越低。
10. **Occupation**: 贷款人职业
11. **CreditGrade/ProsperRating(Alpha)**: 信用等级,前者反映的是2009年7月1日前客户的信用等级,后者反映的是2009年7月1日后的信用等级。信用等级越高,其偿债能力越强。
12. **CreditScore**: 由消费信用公司提供的消费信用评分,同信用评级作用。
13. **BankCardUse**: 信用资料提交时借款人信用卡使用额度和信用卡总透支额度的百分比,本文将这个数据分成四组(mild use; medium use; heavy use; super use)
复制代码
3.数据预处理
3.1贷款状态
复制代码
# 查看贷款状态
1 table(loandata$LoanStatus)
复制代码
复制代码
# 2.整合数据
# 针对LoanStatus进行重构
# 1.将所有含有"Past Due"字段的值统一为"PastDue"
# 2.将"Cancelled"归类到"Current"中
# 3.将"defaulted"归类到"Chargedoff"中
# 4.将"FinalPaymentInProgress"归类到"Completed"中
1 PastDue <- c("Past Due (>120 days)",
2 "Past Due (1-15 days)",
3 "Past Due (16-30 days)",
4 "Past Due (31-60 days)",
5 "Past Due (61-90 days)",
6 "Past Due (91-120 days)")
7 loandata$LoanStatus <- as.character(loandata$LoanStatus)
8 loandata$LoanStatus[loandata$LoanStatus %in% PastDue] <- "PastDue"
9 loandata$LoanStatus[loandata$LoanStatus == "Cancelled"] <- "Current"
10 loandata$LoanStatus[loandata$LoanStatus == "Defaulted"] <- "Chargedoff"
11 loandata$LoanStatus[loandata$LoanStatus == "FinalPaymentInProgress"] <- "Completed"
复制代码
复制代码
1 # 3.再次整合数据
2 # 1.然后将"PastDue"与"Chargedoff"合并,表示未按时还款
3 # 2.将"Current"和"Completed"合并,表示按时还款未出现不良记录的
4 loandata$LoanStatus[loandata$LoanStatus == "PastDue"] <- "Chargedoff"
5 loandata$LoanStatus[loandata$LoanStatus == "Current"] <- "Completed"
6 table(loandata$LoanStatus)
复制代码
3.2消费信用评分
复制代码
1 # 对借款人的消费信用评级,数据中有高低范围,将这两个数值取平均值做计算
2 loandata$CreditScore <- (loandata$CreditScoreRangeLower + loandata$CreditScoreRangeUpper) / 2
复制代码
3.3信用评级
复制代码
1 # 因2009年7月1日,Prosper的信用评级模型发生了改变,所以需要进行分段处理
2
3 # 先处理2009年7月1日前的数据
4 loandata$CreditGrade <- ordered(loandata$CreditGrade,
5 levels = c("NC", "HR", "E", "D", "C", "B", "A", "AA"))
6 # 再处理2009年7月1日后的数据
7 loandata$ProsperRating..Alpha. <- ordered(loandata$ProsperRating..Alpha.,
8 levels = c("HR", "E", "D", "C", "B", "A", "AA"))
9 # 因为2009年7月1日是一个数据节点,因此将数据分成两段处理
10 loandata$LoanOriginationDate <- as.Date(loandata$LoanOriginationDate)
11 loandata$Phase[loandata$LoanOriginationDate > "2009-07-01"] <- "After 2009"
12 loandata$Phase[loandata$LoanOriginationDate < "2009-07-01"] <- "Before 2009"
13 table(loandata$Phase)
复制代码
3.4信用卡使用程度
复制代码
1 #定义"Mild Use"
2 loandata$BankCardUse[
3 loandata$BankcardUtilization < quantile(loandata$BankcardUtilization,
4 probs = 0.25, "na.rm" = TRUE)
5 ] <- "Mild Use"
6
7 #定义“Medium Use”
8 loandata$BankCardUse[
9 loandata$BankcardUtilization >= quantile(loandata$BankcardUtilization,
10 probs = 0.25, "na.rm" = TRUE)
11 &
12 loandata$BankcardUtilization < quantile(loandata$BankcardUtilization,
13 probs = 0.5, "na.rm"= TRUE)
14 ] <- "Medium Use"
15
16 #定义“Heavy Use”
17 loandata$BankCardUse[
18 loandata$BankcardUtilization >= quantile(loandata$BankcardUtilization,
19 probs = 0.5, "na.rm" = TRUE)
20 &
21 loandata$BankcardUtilization < quantile(loandata$BankcardUtilization,
22 probs = 0.75, "na.rm" = TRUE)
23 ] <- "Heavy Use"
24
25 #定义“Super Use”
26 loandata$BankCardUse[loandata$BankcardUtilization >= 0.75] <- "Super Use"
27
28 loandata$BankCardUse <- factor(loandata$BankCardUse,
29 levels = c("Mild Use",
30 "Medium Use",
31 "Heavy Use",
32 "Super Use"))
33
34 table(loandata$BankCardUse)
复制代码
4.探索数据集
4.1单变量探索
4.1.1贷款期限
复制代码
1 ggplot(aes(x = as.factor(Term)), data = loandata) +
2 geom_histogram(stat = "count") +
3 xlab("Term")
4 table(loandata$Term, dnn = ("Term"))
复制代码
结论:一年期(12个月)的有1614笔,三年期(36个月)的有87778笔,五年期(60个月)的有24545笔。由此,平台上的贷款以中长期为主,且三年期占绝大多数。经查阅资料发现,Prosper平台是 2009年以后才开始提供一年期和五年期贷款品种。
4.1.2贷款利率
复制代码
ggplot(aes(x = BorrowerRate), data = loandata) +
geom_histogram(binwidth = 0.01) +
scale_x_continuous(breaks = seq(0, 0.5, 0.05)) +
facet_wrap(~ Term, ncol = 3)
复制代码
结论:平台上的借款利率多集中在0.08至0.2这个区间,另外,利率0.32附近也拥有大量的观测值。并且贷款利率似乎与贷款期限关系并不明显,未如经验判断的“期限越长、利率越高”。
4.1.3过去7年的违约次数
复制代码
1 ggplot(aes(x = DelinquenciesLast7Years), data = loandata) +
2 geom_density(aes(fill = I("grey"))) +
3 coord_cartesian(xlim = c(0, quantile(loandata$DelinquenciesLast7Years,
4 probs = 0.95, "na.rm" = TRUE)))
复制代码
结论:大部分借款人在过去7年内的违约次数均为0,这说明整个平台借款人的信用状况较好
4.1.4月收入,月收入很大情况下能够反映借贷人的还款能力
复制代码
1 ggplot(aes(x = StatedMonthlyIncome),
2 data = subset(loandata, loandata$StatedMonthlyIncome <
3 quantile(loandata$StatedMonthlyIncome,
4 probs = 0.95, "na.rm" = TRUE))) +
5 geom_histogram(binwidth = 500) +
6 scale_x_continuous(breaks = seq(0, 21000, 500)) +
7 geom_vline(xintercept = 2500, color = "red") +
8 geom_vline(xintercept = 6000, color = "red")
复制代码
结论:大部分借贷人的月薪在2500~6000美金之间
4.1.5是否拥有房屋(有房子的要比没有房屋的人偿还能力强)
复制代码
1 ggplot(aes(x = IsBorrowerHomeowner), data = loandata) +
2 geom_bar()
复制代码
结论:有房屋的借贷人略微大于没房屋的借贷人
4.1.6借款人征信查询的次数,征信查询的次数越多表示借款人近期的申请的贷款越多,资金越紧张
复制代码
ggplot(aes(x = InquiriesLast6Months, fill = I("grey")), data = loandata) +
geom_density(binwidth = 1) +
geom_vline(xintercept = quantile(loandata$InquiriesLast6Months,
probs = 0.95, "na.rm" = TRUE),
linetype = "dashed", color = "red") +
coord_cartesian(xlim = c(0, quantile(loandata$InquiriesLast6Months,
probs = 0.95, "na.rm" = TRUE)))
复制代码
结论:95%的借款人征信查询次数在5次及以下
4.1.7负债收益比(反映了借款人的杠杆率,如果大于1表示很难偿还贷款,极易引发坏账)
复制代码
1 ggplot(aes(x = DebtToIncomeRatio), data = loandata) +
2 geom_histogram(binwidth = 0.05) +
3 scale_x_continuous(breaks = seq(0, 10, 0.5)) +
4 geom_vline(xintercept = quantile(loandata$DebtToIncomeRatio,
5 probs = 0.95, "na.rm" = TRUE),
6 linetype = "dashed", color = "red")
复制代码
结论:95%的借款人负债收入比小于0.5,另外注意到,极少数人的负债收入比达到甚至超过10,总体来说平台的负债收益比较低,资质较好
4.1.8借款人职业
复制代码
data_count <- loandata %>%
group_by(Occupation) %>%
summarise(n = n())
ggplot(aes(x = reorder(Occupation, -n), y = n),
data = data_count) +
geom_bar(stat = "identity") +
theme(axis.text.x = element_text(angle = 90,
vjust = 0.5,
hjust = 1))
复制代码
结论:职业中,选择“other”的人数最多,说明很多人在申请贷款时出于隐私或者其他原因不选择职业,该数据的真实性存疑
4.1.9贷款状态
复制代码
ggplot(aes(x = LoanStatus), data = loandata) +
geom_bar()
table(loandata$LoanStatus)
复制代码
结论:Prosper平台整体贷款的违约率约为16.74%
4.1.10贷款日期
复制代码
1 loandata$ListingCreationDate <- as.Date(loandata$ListingCreationDate)
2
3 ggplot(aes(x = ListingCreationDate), data = loandata) +
4 geom_histogram()
复制代码
结论:09年前后,平台贷款成交量几乎为0,通过查阅相关资料发现,Prosper平台因涉诉被迫于2008年11月24日暂停运营,并于2009年7月1日重新开始营运。
4.1.11客户信用评价
复制代码
1 p1 <- ggplot(aes(x = CreditScore), data = loandata) +
2 geom_histogram()+
3 coord_cartesian(xlim = c(400, 900)) +
4 scale_x_continuous(breaks = seq(400, 900, 50)) +
5 ggtitle("The Histogram of Borrowers' CreditScore")
6
7 p2 <- ggplot(aes(x = CreditGrade),
8 data = subset(loandata, LoanOriginationDate < "2009-07-01")) +
9 geom_bar() +
10 scale_x_discrete(limits = c("HR","E","D","C","B","A","AA")) +
11 ggtitle("CreditGrade Before 2009")
12
13 p3 <- ggplot(aes(x = ProsperRating..Alpha.),
14 data = subset(loandata, LoanOriginationDate > "2009-07-01")) +
15 geom_bar() +
16 scale_x_discrete(limits = c("HR","E","D","C","B","A","AA")) +
17 ggtitle("CreditGrade After 2009")
18
19 grid.arrange(p1, p2, p3, ncol = 1)
复制代码
结论:大部分借款人的消费信用评分都高于600分,集中于700分左右,而2009年前后的信用评级也显示出较为优秀的信用资质B级。
4.1.12信用卡使用情况
复制代码
1 ggplot(aes(BankCardUse),
2 data = subset(loandata, !is.na(BankcardUtilization))) +
3 geom_bar()
复制代码
结论:大部分人都处于Super Use状态,借款人的还款能力会因此而打折扣
单变量分析总结论:
复制代码
数据集中共含有113937笔贷款记录,每笔记录均有12个特征描述,分别是:贷款日期(ListingCreationDate)、贷款期限(Term)、贷款状态(LoanStatus)、贷款利率(BorrowerRate)、借款人过去7年违约次数(DelinquenciesLast7Years)、借款人月收入(StatedMonthlyIncome)、借款人是否拥有房屋(IsBorrowerHomeowner)、借款人最近6个月的征信查询次数(InquiriesLast6Months)、借款人负债收入比(DebtToIncomeRatio)、借款人职业(Occupation)、借款人信用评价(CreditScore / CreditGrade / ProsperRating(Alpha))及借款人的信用卡使用情况(BankCardUse)。
这12个特征中,有4个特征用于描述贷款的特点,包括贷款日期、贷款期限、贷款状态和贷款利率。
有8个特征用于描述借款人主体的特点,包括过去7年违约次数、月收入、是否拥有房屋、最近6个月的征信查询次数、负债收入比、职业、信用评价及信用卡使用情况。
通过上一部分的初步探索,发现以下特点:
1. 大部分贷款的期限为三年期。
2. 整个平台贷款的违约率为16.74%。
3. 大部分贷款利率集中在0.08至0.2这个区间,0.32附近也有较大的成交量。
4. 平台上的借款人整体信用资质较好。
5. 从信用卡使用角度来看,借款人的还款压力较大。
6. 大部分借款人的月收入集中在2500至6000美元之间。
7. 拥有房屋的借款人与未拥有房屋的借款人数量大致相当。
8. 出于隐私或者其他原因,借款人申请贷款时职业一项选择“other”的极多。
复制代码
4.2双变量探索
4.2.1贷款利率随着时间变化的趋势
复制代码
ggplot(aes(x = ListingCreationDate, y = BorrowerRate), data = loandata) +
geom_point(alpha = 0.05) +
facet_wrap(~Term)
复制代码
结论:一年期与五年期贷款是在2011年前后才上线的产品。三年期是整个平台最主要的贷款,
2008年以前,贷款利率主要分布在0.08至0.2这个区间,随着美国次贷危机的持续发酵2010年利率逐渐分化,优质借款人依旧可以拿到0.1甚至更低的利率,而更多的借款人则需要以0.2以上甚至 0.35的利率方可筹到资金。为了救市美联储实行了量化宽松政策,持续向市场中注入大量流动性,利率承压下行。至2014年,可以看到各个利率层面均有大量的成交记录信贷市场逐渐恢复元气。
4.2.2贷款利率与贷款状态
复制代码
1 ggplot(aes(x = LoanStatus, y = BorrowerRate), data = loandata) +
2 geom_boxplot()
复制代码
结论:违约贷款组的利率明显高于正常还款组。一方面,贷款定价高是由于借款人自身资质差;另一方面,高利率又使得借款人更加难以承受进而违约
4.2.3贷款利率与过去7年违约次数
复制代码
1 ggplot(aes(x = DelinquenciesLast7Years, y = BorrowerRate),
2 data = subset(loandata,
3 loandata$DelinquenciesLast7Years <
4 quantile(loandata$DelinquenciesLast7Years,
5 probs = 0.95, "na.rm" = TRUE))) +
6 geom_point(alpha = 0.05, position = "jitter") +
7 geom_smooth()
复制代码
结论:95%的借款人过去7年违约次数低于23次,违约次数低于3次时,违约次数与贷款利率呈现出弱正相关性;而3次以后两者关系就趋于平稳。
4.2.4贷款利率和借款人月收入的关系
复制代码
1 ggplot(aes(x = StatedMonthlyIncome, y = BorrowerRate),
2 data = subset(loandata, !is.na(loandata$StatedMonthlyIncome))) +
3 stat_density2d(aes(alpha = ..density..), geom = "tile", contour = FALSE) +
4 scale_x_continuous(limits = c(0, 30000))
复制代码
结论:平台的借贷人月收入在10000美金以下,未发现贷款利率和月收入存在关系
4.2.5贷款利率与借款人是否拥有房屋之间的关系
复制代码
1 ggplot(aes(x = BorrowerRate), data = loandata) +
2 geom_histogram() +
3 geom_hline(yintercept = 3000, linetype = "dashed", color = "red") +
4 facet_wrap(~IsBorrowerHomeowner, ncol = 1)
复制代码
结论:拥有房屋的人比没有房屋的人贷款的利息更低
4.2.6贷款利率与过去6个月征信查询次数的关系
复制代码
1 ggplot(aes(x = as.factor(InquiriesLast6Months), y = BorrowerRate),
2 data = subset(loandata, loandata$InquiriesLast6Months <
3 quantile(loandata$InquiriesLast6Months,
4 probs = 0.95, "na.rm" = TRUE))) +
5 geom_boxplot() +
6 xlab("InquiriesLast6Months")
复制代码
结论:征信查询的次数越多,贷款的利率越高
4.2.7贷款利率和负债收益比的关系
复制代码
1 ggplot(aes(x = DebtToIncomeRatio, y = BorrowerRate),
2 data = subset(loandata, loandata$DebtToIncomeRatio <
3 quantile(loandata$DebtToIncomeRatio,
4 probs = 0.95, "na.rm" = TRUE))) +
5 geom_point(alpha = 0.05, position = "jitter") +
6 stat_smooth(color = "red")
复制代码
结论:借款人的收入负债比越高,贷款利率也越高
4.2.8贷款利率和信用评分的关系
复制代码
1 ggplot(aes(x = CreditScore, y = BorrowerRate), data = loandata) +
2 geom_point(alpha = 0.05) +
3 facet_wrap(~Phase, ncol = 1) +
4 coord_cartesian(xlim = c(400, 900), ylim = c(0, 0.4)) +
5 geom_line(stat = "summary", fun.y = mean) +
6 geom_line(stat = "summary", fun.y = median, linetype = 2, color = "red") +
7 geom_vline(xintercept = 600, color = "red")
复制代码
结论:在2009年之前,Prosper还会为消费信用评级低于600分的借款人提供服务,在2009年重新上线之后,不再为评分低于600分的客户服务
4.2.9贷款利率和信用等级的关系
复制代码
# 2009年7月1日以前
ggplot(aes(x = CreditGrade, y = BorrowerRate),
data = subset(loandata, LoanOriginationDate < "2009-07-01")) +
scale_x_discrete(limits = c("HR", "E", "D", "C", "B", "A", "AA")) +
geom_boxplot() +
stat_summary(fun.y = mean,