貸款數據探索風險分析(EDA)

項目介紹

所謂探索性數據分析(Exploratory Data Analysis,以下簡稱EDA),是指對已有的數據(特別是調查或觀察得來的原始數據)在儘量少的先驗假定下進行探索,通過作圖、製表、方程擬合、計算特徵量等手段探索數據的結構和規律的一種數據分析方法。特別是當我們對這些數據中的信息沒有足夠的經驗,不知道該用何種傳統統計方法進行分析時,探索性數據分析就會非常有效。探索性數據分析在上世紀六十年代被提出,其方法由美國著名統計學家約翰·圖基(John Tukey)命名。

本項目需解決的問題

本項目分析P2P平臺Lending Club的貸款數據,探索數據分析過程中,並嘗試回答以下2個問題:

1)利率與風險成正比,風險越高,利率越高,違約的可能線性越大,從P2P平臺的數據來看,影響風險的因素有哪些?(爲後續建模做準備)

2)瞭解P2P平臺的業務特點產品類型資產質量風險定價

分析思路

我們可以將信貸信息分爲信貸硬信息信貸軟信息
任何可以量化客戶的還款能力的信息均可以用作硬信息,可勾勒客戶還款意願的信息則爲軟信息。
信貸硬信息: 站在企業的角度,硬信息主要包括財務三大報表(資產負債表、利潤表和現金流量表)以及信貸記錄;站在個人角度硬信息主要包括:個人年收入 、資產狀況(借款是否擁有房產、車或理財產品)。
信貸軟信息: 過往的信貸記錄比較直接瞭解客戶的還款意願,以往發生違約次數較多的客戶再次發生違約的概率相比其他客戶大。客戶的學歷、年齡、目前工作所在單位的級別和性別等信息也可作爲軟信息。
因此,我們主要圍繞着“客戶是否具有償還能力,是否具有償還意願”展開探索分析。

項目背景

作爲舊金山的一家個人對個人的借貸公司,Lending Club成立於2006年。他們是第一家註冊爲按照美國證券交易委員會SEC(Securities and Exchange Commission)的安全標準向個人提供個人貸款的借貸公司。與傳統借貸機構最大的不同是,Lending Club利用網絡技術打造的這個交易平臺,直接連接了個人投資者和個人借貸者,通過此種方式,縮短了資金流通的環節,尤其是繞過了傳統的大銀行等金融機構,使得投資者和借貸者都能得到更多實惠、更快捷。對於投資者來說可以獲得更好的回報,而對於借貸者來說,則可以獲得相對較低的貸款利率。

數據集

數據集是Lending Club平臺發生借貸的業務數據(2017年第二季),具體數據集可以從Lending Club官網下載

本項目報告分析,我將如何運用Python操作數據和探索分析數據的思考過程均記錄下來。

前期準備

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 
plt.style.use('ggplot')
import seaborn as sns 
sns.set_style('whitegrid')
%matplotlib inline
from pyecharts import Pie
#from missinggo import msno 
import warnings  #忽略彈出的warning
warnings.filterwarnings('ignore')

%matplotlib inline。IPython提供了很多魔法命令,使得在IPython環境中的操作更加得心應手,使用%matplotlib inline在繪圖時,將圖片內嵌在交互窗口,而不是彈出一個圖片窗口。具體請查看Stackoverflow的解釋

獲取數據

第二步,使用Pandas解析數據

Pandas是基於NumPy的一個非常好用的庫,無論是讀取數據、處理數據,用它都非常簡單。學習Pandas最好的方法就是查看官方文檔
數據集的格式是CSV,因此我們用到pandas.read_csv方法,同時也將CSV內容轉化成矩陣的格式。

data = pd.read_csv('C:/Users/Administrator/Desktop/EDA/LoanStats_2017Q2.csv' , encoding='latin-1',skiprows = 1

探索分析數據(EDA)

一旦獲得了數據,下一步就是檢查和探索他們。在這個階段,主要的目標是合理地檢查數據。例如:如果數據有唯一的標記符,是否真的只有一個;數據是什麼類型,檢查最極端的情況。他們是否有意義,有什麼需要刪除的嗎?數據應該怎麼調整才能適用於接下來的分析和挖掘?此外,數據集還有可能存在異常值。同時,我將會通過對數據進行簡單的統計測試,並將其可視化。 檢查和探索數據的過程非常關鍵。因爲下一步需要清洗和準備處理這些數據,只有進入模型的數據質量是好的,才能構建好的模型。(避免Garbage in, Garbage out

首先預覽基本內容,Pandas爲我們提供很多可以方便查看和檢查數數據的方法,有df.head(n)、df.tail(n)、df.shape()df.info() 等 。

df.head(n)查看數據前n行;df.tail(n))查看數最後n行;df.shape查看數據有多少行和列;

處理缺失值

統計每列屬性缺失值的數量。

def not_null_count(column):
    column_null = pd.isnull(column)
    null = column[column_null]
    return len(null)

half_count = len(data)/2 # 設定閥值
loans = data.dropna(thresh = half_count, axis = 1 ) #若某一列數據缺失的數量超過閥值就會被刪除
#(105453, 103)處理的數據
data.to_csv('loans_2017q2.csv', index = False) # 將預處理後的數據轉化爲cs

Pandas的describe()不能統計數據類型爲object的屬性,部分數據int_rate和emp_length數據類型都是object,稍後分析數據時需將它們轉化爲類型爲floate的數字類型。

數據集的屬性較多,我們初步聚焦幾個重要特徵展開分析,特別是我們最關心的屬性貸款狀態。

used_col = ['loan_amnt', 'term', 'int_rate', 'grade', 'issue_d', 'addr_state', 'loan_status','purpose', 'annual_inc', 'emp_length'] # 貸款金額、貸款期限、貸款利率、信用評級、業務發生時間、業務發生所在州、貸款狀態、貸款用途
used_data = loans[used_col]
def not_null_count(column):
    column_null = pd.isnull(column)  #判斷某列屬性是否存在缺失值
    null = column[column_null]
    return len(null)
column_null_count = used_data.apply(not_null_count)  
print (column_null_count)

查看數據缺失值情況,每個列數據均有兩個缺失值,佔總數據比例極小,可直接刪除

所有缺失值都在同一行,因此可直接刪除缺失值所在行。

單變量分析

1)貸款狀態分佈

def coding(col, codeDict):
    colCoded = pd.Series(col, copy=True)
    for key, value in codeDict.items():
        colCoded.replace(key, value, inplace=True)
    return colCoded
#把貸款狀態LoanStatus編碼爲違約=1, 正常=0:
pd.value_counts(used_data["loan_status"])
used_data["Loan_Status_Coded"] = coding(used_data["loan_status"], {'Default':0,'Current':0,'Fully Paid':0,'In Grace Period':1,'Late (31-120 days)':1,'Late (16-30 days)':1,'Charged Off':1})
pieData = pd.value_counts(used_data["Loan_Status_Coded"])
attr = ["normal", "break"]
plt.axes(aspect=1)
plt.pie(x=pieData, labels=attr,autopct='%3.1f %%',labeldistance=1.1, startangle = 90,pctdistance = 0.6)

從圖中可以看出,平臺貸款發生違約的數量佔少數。貸款狀態爲正常的有99286個,貸款正常狀態佔比爲94.2%。貸款狀態將作爲我們建模的標籤,貸款狀態正常和貸款狀態違約兩者數量不平衡,絕大多數常見的機器學習算法對於不平衡數據集都不能很好地工作。

2)帶款金額分佈

plt.figure(figsize=(18, 9))
sns.set()
sns.set_context("notebook", font_scale=1, rc={"lines.linewidth":2 } )
sdisplot_loan = sns.distplot(used_data['loan_amnt'] )
plt.xticks(rotation=90)
plt.xlabel('Loan amount')
plt.title('Loan amount\'s distribution')
sdisplot_loan.figure.savefig("Loan_amount")

 

平臺貸款呈現右偏正態分佈,貸款金額最小值爲1,000美元,最大值爲40,000美元,貸款金額主要集中在10,000美元左右,中位數爲12,000美元,可以看出平臺業務主要以小額貸款爲主。貸款金額越大風險越大。

3)貸款期限分佈

pieData2 = [int(i) for i in used_data['term'].value_counts()]
labels1 = ['36 month', '60 month']
plt.axes(aspect=1)
plt.pie(x=pieData2, labels=labels1,autopct='%3.1f %%',labeldistance=1.1, startangle = 90,pctdistance = 0.6)

平臺貸款產品期限分爲36個月和60個月兩種,其中貸款期限爲60個月的貸款佔比爲26.9%,貸款期限爲36個月的貸款佔比爲73.1%。一般來說貸款期限越長,不確定性越大,違約的可能性更大,期限較長的貸款產品風險越高 。從期限角度看,平颱風險偏小的資產佔大部分。

4)貸款產品用途種類比較

histData = used_data['purpose'].value_counts()
plt.figure(figsize=(18, 9))
sns.set()
sns.set_context("notebook", font_scale=1.5, rc={"lines.linewidth": 2.5})
total = float(len(used_data.index))
ax = sns.countplot(x="purpose", data=used_data, palette="Set2")
ax.set(yscale = "log")
plt.xticks(rotation=90)
plt.title('Purpose')
plt.show()
P2P平臺貸款用途最多的爲債務重組(借新債還舊債),其次是信用卡還款,第三是住房改善。一般來說,貸款用途爲債務重組和信用卡還款的客戶現金流較爲緊張,此類客戶也是在傳統銀行渠道無法貸款才轉來P2P平臺貸款,這部分客戶的償還貸款能力較弱,發生違約的可能性較高。還有部分貸款用途爲Other的貸款,需要通過其他維度來分析其風險。
5)客戶信用等級佔比
pieData3 = loans['grade'].value_counts()
pieData3 = [int(i) for i in pieData3]
labels2 = ['C','B','A','D','E','F','G']
pie = Pie("Grade")
pie.add("", labels2, pieData3,is_label_show=True,is_legend_show=False)
pie.render()#將圖片一
Lending Club平臺對客戶的信用等級分7類,A~G,信用等級爲A的客戶信用評分最高,信用等級爲G的客戶最低,信用等級的客戶發生違約的可能性更低。目前,平臺客戶信用等級佔比較多的客戶爲C類,其次是B類和A類,三者合計佔比爲81.62%。此外信用等級爲E、F、G類的客戶佔比爲6.99%。可以看出Lending Club授信部門對申請人的資信情況把關較嚴。

6)貸款利率種類分佈

used_data['int_rate_num']= used_data['int_rate'].str.rstrip("%").astype("float")
plt.figure(figsize=(18, 9))
sns.set()
sns.set_context("notebook", font_scale=1, rc={"lines.linewidth":2 } )
sdisplot_loan = sns.distplot(used_data['int_rate_num'] )
plt.xticks(rotation=90)
plt.xlabel('Interest Rate')
plt.title('Interest Rate\'s distribution')

Lending Club平臺貸款利率呈現右偏正態分佈,利率中位數12.62%,利率最高值爲31.00%,利率最小值爲5.32%,總體利率水平相對傳統銀行較高。。利率是資金的價格,利率越高,借款人借貸成本越高,借款人違約的可能性越高。Lending Club平臺貸款利率呈現右偏正態分佈,利率中位數12.62%,利率最高值爲31.00%,利率最小值爲5.32%。利率是資金的價格,利率越高,借款人借貸成本越高,借款人違約的可能性越高。

多維變量分析

1)探索貸款與時間的關係

used_data['issue_d2'] = pd.to_datetime(used_data['issue_d'])#時間轉換
used_data['issue_month'] = used_data['issue_d2'].apply(lambda x: x.to_period('M'))#統一轉換爲月份
amount_month = used_data.groupby('issue_month')['loan_amnt'].sum()
amount_month = pd.DataFrame(amount_month).reset_index()
plt.figure(figsize=(15, 9))
sns.set()
sns.set_context("notebook", font_scale=1, rc={"lines.linewidth": 2})
plot1 = sns.barplot(x='issue_month', y= 'loan_amnt', data = amount_month)
plt.xlabel('Month')
plt.ylabel('Loan_amount')
plt.title('Mounth VS Loan_amount')
plot1.figure.savefig("Mounth VS Loan_amount.png")

二季度4月份貸款最低,而5月和6月的貸款金額基本持平。由於本數據集只包含2017Q2的數據,如果數據集能包括橫跨幾年業務數據,可以將數據按年按月做橫向和縱向對比,更能反映公司業務的發展情況。初步看來,L
eding Club 平臺在2017Q2業務持續增長
2)探索信用評級、貸款期限和利率的關係
group1 = used_data.groupby(['grade', 'term'])['int_rate_num'].mean()
group1= pd.DataFrame(group1).reset_index()
#group_pivot = group1.pivot(index='grade',columns='term',values='int_rate_num')
plt.figure(figsize=(15, 9))
sns.set_context("notebook", font_scale=1.2, rc={"lines.linewidth": 2.5})
sboxplot2 = sns.barplot(x="grade", y="int_rate_num",hue='term', data=group1)
sns.despine(top=True)
plt.xticks(rotation=90)
plt.title('Int_rate_num VS Term')

貸款期限長意味着不確定性增加,風險也隨之增加,期限較長的貸款在同信用等級下的借款利率也相對高,但是並不明顯,其中原因有待探索。
3)探索貸款用途與利率的關係

plt.figure(figsize=(15, 9))
sns.set_context("notebook", font_scale=1.5, rc={"lines.linewidth": 2.5})
sboxplot = sns.boxplot(y="purpose", x="int_rate_num", data=used_data)
sns.despine(top=True)
plt.xlabel('Interest_Rate')
plt.ylabel('Purpose')
plt.xticks(rotation=90)
plt.show()
sboxplot.figure.savefig("Purpose VS Rate")

貸款用途分別爲house、small_business以及Other的貸款利率較高。其中貸款用途爲house的貸款利率爲最高,經探索,house帶款中期限爲60month達到30%。
4)探索貸款利率與違約次數之間的關係
plt.figure(figsize=(15, 9))
sns.set_context("notebook", font_scale=1.2, rc={"lines.linewidth": 2.5})
sboxplot2 = sns.boxplot(x="delinq_2yrs", y="int_rate_num", data=used_data)
sns.despine(top=True)
plt.xticks(rotation=90)
plt.title('Interest Rate VS Delinq_2yrs')
sboxplot2.figure.savefig("Interest Rate VS Delinq_2yrs")

違約次數越多的人意味着自身財務狀況較差,償付能力也較低,因此此類客戶貸款風險越高,對該部分客戶應嚴格審查,確定其貸款資質。

5)探索利率、收入、工作年限以及貸款狀態之間的關係

mapping_dict = {'grade':{'A':7,'B':6,'C':5,'D':4,'E':3,'F':2,'G':1}}
used_data = used_data.replace(mapping_dict)
mapping_dict1 = {
    "emp_length": {
        "10+ years": 10,
        "9 years": 9,
        "8 years": 8,
        "7 years": 7,
        "6 years": 6,
        "5 years": 5,
        "4 years": 4,
        "3 years": 3,
        "2 years": 2,
        "1 year": 1,
        "< 1 year": 0,
        "n/a": 0
    }
}
used_data = used_data.replace(mapping_dict1)
group2 = used_data.groupby('emp_length')['grade'].mean()
group3 = pd.DataFrame(group2).reset_index()
sns.set()
plt.figure(figsize=(15, 9))
sns.set_context("notebook", font_scale=1, rc={"lines.linewidth": 5})
sbarplot = sns.barplot(y='grade' , x='emp_length' , data=group3)
plt.xlabel('Emp_length')
plt.ylabel('Grade')
plt.xticks(rotation=90)
plt.title('Grade VS Emp_length')
sbarplot.figure.savefig("State VS Loan_amount")

工作年限越長,客戶的收入也越高,自身現金流比較充足,此類客戶償還債務的能力較強。但是從上圖來看,工作年限的差別而導致的貸款評級並無明顯差別。由此可推測,公司進行了嚴格的客戶篩選,將工作年限短,還款能力差的客戶剔除了,從而導致客戶評分在各個工作年限上分佈無明顯差別。

總結

names = ['loan_amnt', 'annual_inc' ,'emp_length', 'Loan_Status_Coded','int_rate' ] #設置變量名
correlations = used_data.corr()
# plot correlation matrix
plt.figure(figsize=(19, 9))
fig = plt.figure() #調用figure創建一個繪圖對象
ax = fig.add_subplot(111)
cax = ax.matshow(correlations, vmin=-1, vmax=1)  #繪製熱力圖,從-1到1
fig.colorbar(cax)  #將matshow生成熱力圖設置爲顏色漸變條
ticks = np.arange(0,5,1) #生成0-5,步長爲1
ax.set_xticks(ticks)  #生成刻度
ax.set_yticks(ticks)
ax.set_xticklabels(names) #生成x軸標籤
ax.set_yticklabels(names)
plt.xticks(rotation=90)
fig.savefig("Corr")
plt.show()

1.影響風險的因素

分析企業償債能力主要考察企業的資產狀況和經營情況,只有負債結構與企業盈利能力合理匹配,企業才能持續穩定地發展。

個人的資產狀況好比企業的資產負債表,個人收入猶如企業的利潤表或現金流量表。高收入的客戶意味着有良好的現金流,償還債務能力較高,違約的可能性較低,一般來說此類客戶的信用評級也相對較高,平臺對應的貸款資產風險也相對較低;個人過往的信用記錄能夠反映客戶的償還意願,因此應根據個人資產狀況以及個人過往的信用記錄對用戶進行評分,對於評分過低的客戶應不予貸款。

1)平臺業務持續穩定發展:第二季度業務持續增長,平臺業務主要集中於加州、德克薩斯州和紐約州。

2)平臺貸款金額以 小額貸款爲主,貸款金額主要集中在10,000美元左右,小而散的貸款金額能夠很好的分散資金風險。

3)平臺貸款利率較高,貸款利率集中在12.62%,貸款利率相對傳統金融機構較高。

4)平臺二季度違約風險得到良好的控制,平臺貸款發生違約的數量較少,貸款正常狀態佔比爲94.2%

3.個人建議

1)完善客戶畫像和產品設計:信貸業務開展前,首先要明確信貸機構的目標客戶羣、目標客戶的特徵和畫像信息是什麼。例如Lending Club平臺的small business業務,中小企業目標羣體的特徵描述應包括能夠反映企業的資產負債和現金流相關的財務報表信息或表外債務信息等。完整的客戶信息有利於風控人員和系統分析把控違約風險。

2)優化貸款模型:完善客戶信息的同時,藉助機器學習的技術持續優化貸款模型。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章