從大數據角度看你的信用借貸
作者簡介Introduction
貸款消費、投資理財已經是當今司空見慣的事情了。針對與商業銀行,放貸款已經是其運作中不可或缺的一部分了。但是為了減少信貸危機,並且減少不必要的人力物力,大都採用了一套決策系統。今天呢,我們就一起利用貸款數據去簡單地建立一個決策模型。
本文主要涉及到四部分
·讀取數據+簡單探索
·數據預處理
·描述性分析
·分層抽樣
·平衡數據
·建模決策
老樣子,先導入後續分析所需要的程序包:
## 載入程序包
library(Rmisc)
library(caret)
library(VIM)
library(DMwR)
## 讀取數據+簡單探索
LoanData
head(LoanData)
str(LoanData)
table(LoanData$Loan_Status)
首先head函數返回了數據集的前六行,我們就可以對數據集的整體有一個簡單的概念。然後使用str函數返回數據集的簡單結構,很容易發現此數據集是數據框類型,包括614行,13列,並且還可以知道各個變數都是什麼類型的。table函數返回了兩個類別:Y=422,N=192,數據類別有些不平衡。最後就是Loan_ID列是沒有用的變數,需要剔除。
細心的觀察以上幾個因子型的自變數,就會發現有些異常:Gender有三個因子水平、Married有三個因子水平……同時還有缺失值的存在。
## 數據預處理
LoanData
LoanData$Loan_Amount_Term
LoanData$Credit_History
aggr(LoanData, plot = F)
table(LoanData$Loan_Amount_Term)
table(LoanData$Credit_History)
factor_vars
factor_tabs
factor_tabs
使用aggr函數返回數據集中各個變數的缺失情況,發現LoanAmount缺失22個,Loan_Amount_Term缺失14個,Credit_History缺失50個。
上圖是提取了所有的因子型變數,然後統計各個因子水平的個數,為了探索各個因子型變數的內容,順便可以找到對應的最多的因子水平去填充上方的缺失值。
通過對其的探索,發現有一部分變數還有空("")的因子水平,我們均使用最多的因子水平去填補。
LoanData
Loan_Amount_Term[is.na(Loan_Amount_Term) == T]
Credit_History[is.na(Credit_History) == T]
Gender[Gender == ""]
Married[Married == ""]
Dependents[Dependents == ""]
Self_Employed[Self_Employed == ""]
})
LoanData
使用within函數對數據進行重塑,方便快速地填充缺失值和空的因子水平。然後LoanAmount變數並沒有進行缺失值的填補,因為其缺失數量也不多,其次其不如因子型變數填補方便,再此我就發懶直接剔除了。
## 描述性分析
gp_stack
lapply(factor_vars[1:8], function(x) {
ggplot(LoanData, aes(x = eval(parse(text = x)), fill = Loan_Status)) +
geom_bar() +
xlab(x) +
theme_bw() +
ggtitle(paste(x, "Barplot Stack", sep= " ")) +
theme(plot.title = element_text(hjust = 0.5)) +
guides(fill = "none")
})
gp_fill
lapply(factor_vars[1:8], function(x) {
ggplot(LoanData, aes(x = eval(parse(text = x)), fill = Loan_Status)) +
geom_bar(position = "fill") +
xlab(x) +
theme_bw() +
ggtitle(paste(x, "Barplot Fill", sep= " ")) +
theme(plot.title = element_text(hjust = 0.5))
})
multiplot(plotlist = c(gp_stack[1:4], gp_fill[1:4]), cols = 2)
multiplot(plotlist = c(gp_stack[5:8], gp_fill[5:8]), cols = 2)
通過繪製8個因子型變數與因變數的條形圖,發現除了Credit_History變數有比較明顯的區分性(也可能受到了樣本量不足的影響),其他均不明顯。
## 分層抽樣
set.seed(1)
idx
TrainData
TestData
## 交叉驗證+隨機森林
ctrl
set.seed(1)
model_rf
y = TrainData[, 12],
method = "rf",
trControl = ctrl)
pred_rf
confusionMatrix(pred_rf, TestData[, 12])
使用訓練集建立隨機森林模型,然後建立混淆矩陣發現整體精度為83.05%,看起來還挺高,但是這是由於數據不平衡導致的,整體的精度不適合評估此模型。並且模型的Kappa值也只有0.5265,Sensitivity才0.4444,都說明此時的模型不可取。下面進行平衡數據,然後在使用隨機森林模型嘗試對比一下:
## 平衡數據
set.seed(3)
LoanData2
data = LoanData,
perc.over = 200,
perc.under = 150)
numeric_vars
LoanData2[numeric_vars]
table(LoanData2$Loan_Status)
平衡後的數據類別之比為1:1,均為543個樣本。
## 分層抽樣
set.seed(1)
idx
TrainData
TestData
## 交叉驗證+隨機森林
set.seed(1)
model_rf
y = TrainData[, 12],
method = "rf",
trControl = ctrl2)
pred_rf
confusionMatrix(pred_rf, TestData[, 12])
平衡數據之後,模型Sensitivity將近80%,Kappa值達到了0.6481,都比之前有了一定的提升。


※2018年1月R新包推薦
※用circlize包繪製circos-plot
TAG:R語言中文社區 |