手把手教你用R語言建立信用評分模型(一)
How to master a skill
Jump into the middle of things, get your hands dirty, fall flat on your face, and then reach for the stars.
—— Ben Stein
語言選擇
一般而言, 諮詢公司為商業銀行搭建統計評分卡模型,採用的語言大多是SAS,這是因為SAS語言背後,有SAS公司 (SAS Institute)提供很完備的產品方案和售後服務。對於程序安全性和穩定性要求較高的銀行, 自然會將SAS作為第首選方案。
而對於個人用戶, 要想搭建一個評分卡模型,會更多考慮搭建開發環境的容易度、統計包或庫的獲取的容易程度(accessablity)、代碼風格等。開源易懂的R語言自然會成為個人用戶小試牛刀的首選。
數據準備
我們將會使用在信用評級建模中非常常用的德國信貸數據(German credit dataset)作為建模的數據集,具體的數據下載源請見文末的引用。
德國信貸數據共有1000條數據,每條數據20個特徵。這些特徵包括AccountBalance(Checking賬戶餘額)、Duration (Duration of Credit in month 借款期限)、Paymentstatus(還款記錄)等。 其中比較難以理解的指標是Instalmentpercent,其代表著 Installment rate in percentage of disposable income (分期付款占可支配收入的百分比)。
模型指標匯總
而數據集中需要預測的指標是(response variable)其中的Creditability變數, 其中 1代表好客戶(會還本付息),0則是代表壞客戶。
以下是載入數據及訓練集劃分部分的R代碼:
library(caret)train1 <-createDataPartition(y=german_credit$Creditability,p=0.75,list=FALSE)train <- german_credit[train1, ]test <- german_credit[-train1, ]建模過程
通常來講,建構一個信用評分卡,要如下幾個步驟:
在本文,因我們使用的數據是現有的數據集,所以不必進行指標選取和一些數據清洗的過程(如缺失值插補)。接下來,我們會根據以上步驟,一步步構建自己的評分卡模型。
探索性數據分析
在建立模型之前,我們一般會對現有的數據進行 探索性數據分析(Exploratory Data Analysis) 。 EDA是指對已有的數據(特別是調查或觀察得來的原始數據)在盡量少的先驗假定下進行探索。常用的探索性數據分析方法有:直方圖、散點圖和箱線圖等。
首先讓我們用直方圖看一下Duration的分布情況:
require(caret)data(GermanCredit)ggplot(GermanCredit, aes(x = duration,y = ..count..,)) + geom_histogram(fill = "blue", colour = "grey60", size = 0.2, alpha = 0.2,binwidth = 5)
從上面的頻率分布直方圖中, 可以看出German Credit Data中的貸款期限,大都在40個月以內。 而申請人數最多的期限,則是6-10個月的短期貸款。
讓我們再看一下CreditAmount的分布情況
ggplot(GermanCredit, aes(x = Amount,y = ..count..,)) + geom_histogram(fill = "blue", colour = "grey60", size = 0.2, alpha = 0.2,binwidth = 1000)
就貸款金額而言,大多數申請人將其控制在5000馬克之內。其中以申請1000-3000馬克的小額貸款最多。
最後再來看一下違約人數在總人數的佔比,也就是Creditability這部分的數據。
ggplot(GermanCredit, aes(x =Creditability,y = ..count..,)) + geom_histogram(fill = "blue", colour = "grey60" , alpha = 0.2,stat="count")
從圖中可以看出,數據集中30%的申請人被劃分為違約的壞用戶。而剩下70%的人則是會還本付息的好用戶。
變數分箱
在評分卡建模中,變數分箱(binning)是對連續變數離散化(discretization)的一種稱呼。要將logistic模型轉換為標準評分卡的形式,這一環節是必須完成的。信用評分卡開發中一般有常用的等距分段、等深分段、最優分段。
其中等距分段(Equval length intervals)是指分段的區間是一致的,比如年齡以十年作為一個分段;等深分段(Equal frequency intervals)是先確定分段數量,然後令每個分段中數據數量大致相等;最優分段(Optimal Binning)又叫監督離散化(supervised discretizaion),使用遞歸劃分(Recursive Partitioning)將連續變數分為分段,背後是一種基於條件推斷查找最佳分組的演算法(Conditional Inference Tree)。
我們將使用最優分段對於數據集中的Duration、age和CreditAmount進行分類。首先,需要在R中安裝smbinning包。
對三者進行最優分箱:
library(smbinning)Durationresult=smbinning(df=train,y="Creditability",x="Duration",p=0.05)CreditAmountresult=smbinning(df=train2,y="Creditability",x="CreditAmount",p=0.05) Ageresult=smbinning(df=train2,y="Creditability",x="Age",p=0.05)
查看分箱後變數各箱的WoE變化:
smbinning.plot(CreditAmountresult,option="WoE",sub="CreditAmount")
smbinning.plot(Durationresult,option="WoE",sub="Duration")
smbinning.plot(Ageresult,option="WoE",sub="Age")
Reference:
德國信貸數據(German credit dataset), https://onlinecourses.science.psu.edu/stat857/sites/onlinecourses.science.psu.edu.stat857/files/german_credit.csv
未完待續,歡迎分享
推薦閱讀: