網貸平台Prosper2005~2014貸款數據分析(一)
來自專欄機器學習(入門)1 人贊了文章
一、摘要
本文詳述了如何通過數據預覽,基本數據分析、探索式數據分析,缺失數據填補等方法,實現對kaggle上Prosper借貸平台貸款者還款與否這一分類問題如何進行數據分析的具體探索式實踐。並分別對2009.07.01前後的模型進行建模分析對比,得出兩個模型的預測準確率和變數對模型的重要性對比分析,明確看出2009.07.01前後平台的模型明顯有很大的不同。
二、項目內容介紹
Prosper LoanData是由Joshua Schnessl從Udacity Data Analyst Nanodegree上把數據放到kaggle的上供感興趣的人分析的一個實例項目,這並非一個競賽項目。本人試圖通過訓練數據集分析出什麼類型的借款人更可能不違約,並預測出測試數據集中的每筆貸款是否違約。
三、數據變數
數據集包含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、no use)
- LoanOriginalAmount:借款人在借款時已經向prosper借入的資金,如果沒有歷史記錄則為0,顯然,借入本金越多,其還款壓力越大,但是這項指標大的話也可能說明該客戶對prosper依賴性較強.
- DebtToIncomeRatio:借款人的債務收入比,債務收入比越高說明籌資者財務狀況越差,還款能力較低.其向P2P平台借款時,投資者應要求有更高的回報.
- Occupation:貸款人職業
- IncomeRange:貸款人年收入範圍
- BorrowerState:貸款人所在州
- CustomerClarify:0或NA是未在prosper貸過款的客戶,反之是貸過款的。
四、數據預處理
#導入所需的包import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsimport randomfrom sklearn.cross_validation import train_test_split#使用隨機森林演算法from sklearn.ensemble import RandomForestClassifierfrom sklearn.metrics import roc_curve, auc# 讓結果在notebook中顯示%matplotlib inline# 使輸出的圖像以更高清的方式顯示%config InlineBackend.figure_format = retina #讀取csv文件data = pd.read_csv(prosperLoanData.csv)
1、數據轉化
1)、LoanStatus狀態轉化
#轉化貸款狀態,Current(貸款還款中)、Defaulted(包含Defaulted、Chargedoff)、Completed(包含Completed、FinalPaymentInProgress、Past Due)三組。def loan_status(status): if status==Chargedoff: return Defaulted elif status==Defaulted: return Defaulted elif status==Cancelled: return Cancelled elif status==Current: return Current else: return Completed#LoanStatus數據轉換,因為Cancelles只有5葛,所以去掉,現在的貸款狀態默認為Status這列data[Status]=data[LoanStatus].apply(loan_status)data = data[data[Status] != Cancelled]
2)、BankcardUtilization數據變換
本文將這個數據分成五組(mild use、medium use、heavy use、super use、no use)。
對之前未在prosper的客戶建立庫,即其0或NA是未使用過prosper的客戶,用no use代替。
#BankcardUtilization數據變換
#獲取第1四分位數,第2四分位數
oneFourth=data[BankcardUtilization].quantile(0.25)twoFourth=data[BankcardUtilization].quantile(0.5)
3)、BankcardUse數據變換
#定義一個轉換函數def bank_card_user(a,oneFourth=oneFourth,twoFourth=twoFourth): if a<=oneFourth: return Mild Use elif (a>oneFourth) & (a<=twoFourth): return Medium Use elif (a>twoFourth) & (a<=1): return Heavy Use elif a>1: return Super Use else : return No Usedata[BankcardUse]=data[BankcardUtilization].apply(bank_card_user , args=(oneFourth,twoFourth))
4)、LoanOriginationDate數據轉換
#LoanOriginationDate數據轉換,以2009年7月1日為時間分隔點,將數據分成兩部分
def data_phase(date): if date>=2009-07-01: c=After Jul.2009 else: c=Before Jul.2009 return cdata[Dataphase]=data[LoanOriginationDate].apply(data_phase)
5)、CreditScore數據轉換
#信用卡分數轉換
#用分數兩個變數CreditScoreRangeUpper和CreditScoreRangeLower,可以通過信用分數高低範圍,將這兩個數值取平均值做計算:
data[CreditScore]=((data[CreditScoreRangeUpper]+data[CreditScoreRangeLower])/2).round(0)
6)、TotalProsperLoans數據轉換
#TotalProsperLoans
#對於使用Prosper平台使用貸款的次數變數TotalProsperLoans,我們可以根據數量區分新老用戶,0或NA是未使用過prosper的客戶,反之是使用過的,定義的區分函數如下:
#0或NA是未使用過prosper的客戶,反之是使用過的
def customer_clarify(s): if s>0: d=Previous Borrower else: d=New Borrower return d#TotalProsperLoans的數據轉換data[CustomerClarify]=data[TotalProsperLoans].apply(customer_clarify)
2、缺失值處理
#合併數據集,查看是否存在缺失值、數據的數量missing=pd.concat([data.isnull().any(),data.count()],axis=1)column=[是否缺失,數量]missing=pd.DataFrame(list(missing.values),index=list(missing.index),columns=column)#查看數據最大是擁有多少行max=data.shape[0]missing[缺失數量]=max-missing[數量]missing[缺失率]=missing[缺失數量]/maxmiss=missing[missing[數量]<max]miss
1)、CreditScore缺失值處理
#用中位數替換CreditScore的缺失值
#CreditScore缺失了590條,所佔比例約為0.5%左右,所佔比例不大,考慮模型的精確性,建議暫時用中位數進行替換。
data[CreditScore]=data[CreditScore].fillna(data[CreditScore].median())
2)、DebtToIncomeRatio缺失值處理
#BorrowerState缺失值5512條,所佔比例約5%,缺失比例較大,所以可以考慮將缺失值單獨作為一項因子,暫時設置為「NOTA」。
data[BorrowerState]=data[BorrowerState].fillna(NOTA)
3)、DebtToIncomeRatio缺失值處理
#DebtToIncomeRatio缺失值為8554條,所佔比例很大,且違約比例較大,依據常識債務比例數值越大違約的概率越大,
#所以根據數據集中債務比例分布情況將0.10~0.50隨機賦值給缺失的DebtToIncomeRatio。設置隨機賦值的定義函數:
def rand_missing(s): if s>=0: a=s else: a=random.uniform(0.1,0.5) return adata[DebtToIncomeRatio]=data[DebtToIncomeRatio].apply(rand_missing)
4)、DelinquenciesLast7Years缺失值處理
#DelinquenciesLast7Years缺失值為987條,在平台借款違約比例較大,所以將DelinquenciesLast7Years缺失值全部置為1。
data[DelinquenciesLast7Years] = data[DelinquenciesLast7Years].fillna(1)
5)、EmploymentStatusDuration缺失值處理
#EmploymentStatusDuration缺失值為7621條,所佔比例很不大。猜想,工作越穩定還款能力越強,故將EmploymentStatusDuration的缺失值刪除。
missIndex=data[(data[EmploymentStatusDuration].isnull())]data=data.drop(missIndex.index,axis=0)
6)、InquiriesLast6Months缺失值處理
data[InquiriesLast6Months] = data[InquiriesLast6Months].fillna(2)
7)、CreditGrade缺失值處理
#因為CreditGrade缺失值佔到了74%,但是不能刪除,因為涉及到另外一個ProsperRating (Alpha),所以這裡採取這種的辦法,
data=data.drop(data[(data[CreditGrade].isnull()) & (data[Dataphase]==Before Jul.2009)].index,axis=0)
8)、ProsperRating (Alpha)缺失處理
#2009之後,選出ProsperRating (Alpha)為空的行,然後對行進行刪除
missIndex=data[(data[ProsperRating (Alpha)].isnull()) & (data[Dataphase]==After Jul.2009)]data=data.drop(missIndex.index,axis=0)
3、數據可視化
1)、通過統計出每個年收入段貸款如期還款筆數和違約筆數,並計算出每段貸款如期還款筆數和違約筆數所佔的比例。
incomeRange = data.groupby([Status, IncomeRange])[Status].count().unstack(0)#發現其中存在為NaN的數值,表明不存在,直接賦值為0incomeRange[Current][Not displayed]=0index = [Not displayed, Not employed, $0, $1-24,999, $25,000-49,999, $50,000-74,999, $75,000-99,999, $100,000+]#自定義索引incomeRange = incomeRange.reindex(index)incomeRange
defaultRate = (incomeRange[Defaulted] / (incomeRange[Defaulted] + incomeRange[Completed]+incomeRange[Current]))defaultRate = pd.DataFrame(defaultRate,columns = [Rate])#重置索引defaultRate.reset_index(inplace=True)width_=0.25x=np.arange(len(index))+1#這裡是設置成可以中文顯示標題、坐標軸等plt.rcParams[font.sans-serif]=[SimHei] #用來正常顯示中文標籤plt.rcParams[axes.unicode_minus]=False #用來正常顯示負號# 設置畫布的大小fig1 = plt.figure(figsize=(45,30))# 指明是該畫布是兩行一列,目前選中第一個ax1 = fig1.add_subplot(2,1,1)#畫三個柱形圖# p1 = ax1.bar(x,incomeRange[Completed],width,alpha=0.8)# p2 = ax1.bar(x+width,incomeRange[Current],width,alpha=0.8)# p3 = ax1.bar(x+2*width,incomeRange[Defaulted],width,alpha=0.8)# # 顯示高度# for p in p1+p2+p3:# h=p.get_height()# ax1.text(p.get_x()+p.get_width()/2,h,%d%int (h),ha=center,va=bottom,fontsize=30)incomeRange.plot(kind=bar,ax=ax1)#屬性設置# ax1.set_xticks(x+width)ax1.set_xticklabels(index,rotation=0,fontsize=30)ax1.set_ylabel(數量,fontsize=30)plt.yticks(fontsize=25)ax2 = fig1.add_subplot(2,1,2)ax2.bar(x,defaultRate[Rate],width,alpha=0.8)ax2.set_xticks(x)ax2.set_xticklabels(defaultRate[IncomeRange],rotation=0,fontsize=30)ax2.set_ylabel(違約百分率(%),fontsize=30)plt.yticks(fontsize=25)#顯示高度for a,b in zip(x,defaultRate[Rate]): plt.text(a,b+0.001,%.2f%% % (b*100),ha=center,va=bottom,fontsize=30)plt.show()
結論:隨著年收入的增加,違約率逐漸在下降
2)、按照常識來說債務收入比(DebtToIncomeRatio)低的人更具備還款能力,違約可能性應該低於債務收入比高的人。
DefaultedRatio=data[data[Status]==Defaulted][DebtToIncomeRatio]CompletedRatio=data[data[Status]==Completed][DebtToIncomeRatio]plt.figure(figsize=(20,15))ax=CompletedRatio.hist(bins=1000,color=g,label=Compeleted)ax=DefaultedRatio.hist(bins=1000,color=b,label=Defaulted)ax.set_xlim([0,1])plt.xlabel(DebtToIncomeRatio,fontsize=14)plt.ylabel(數量,fontsize=14)plt.legend(loc=best)plt.show()
結論:在債務收入比<0.5時,違約筆數小於不違約筆數;通過這個圖,在債務收入比比較低的時候,違約的可能性會相對小些。
3)、根據BankCardUse與Status,獲取信用卡使用情況和違約情況的分布情況
bankCardUse = data.groupby([Status,BankcardUse])[Status].count().unstack(0)#空值賦值為0bankCardUse[Current][No Use]=0index=[Mild Use,Medium Use, Heavy Use, Super Use, No Use]bankCardUse=bankCardUse.reindex(index)bankCardUse
default_Rate=(bankCardUse[Defaulted]/(bankCardUse[Defaulted]+bankCardUse[Current]+bankCardUse[Completed]))default_Rate = pd.DataFrame(default_Rate,columns = [Rate])#重置索引default_Rate.reset_index(inplace=True)default_Rate
width_=0.25x=np.arange(len(index))+1#這裡是設置成可以中文顯示標題、坐標軸等plt.rcParams[font.sans-serif]=[SimHei] #用來正常顯示中文標籤plt.rcParams[axes.unicode_minus]=False #用來正常顯示負號# 設置畫布的大小fig1 = plt.figure(figsize=(45,30))# 指明是該畫布是兩行一列,目前選中第一個ax1 = fig1.add_subplot(2,1,1)bankCardUse.plot(kind=bar,ax=ax1)#屬性設置# ax1.set_xticks(x+width)ax1.set_xticklabels(index,rotation=0,fontsize=30)ax1.set_ylabel(數量,fontsize=30)plt.yticks(fontsize=25)ax2 = fig1.add_subplot(2,1,2)ax2.bar(x,default_Rate[Rate],width,alpha=0.8)ax2.set_xticks(x)ax2.set_xticklabels(default_Rate[BankcardUse],rotation=0,fontsize=30)ax2.set_ylabel(違約百分率(%),fontsize=30)plt.yticks(fontsize=25)#顯示高度for a,b in zip(x,default_Rate[Rate]): plt.text(a,b+0.001,%.2f%% % (b*100),ha=center,va=bottom,fontsize=30)plt.show()
結論:通過上圖很明顯可以看出,信用卡使用情況為超大量使用和不適用下,違約率佔到了40%以上,風險高,謹慎進行放款;在Mild User、Medium Use、Heavy User使用情況下,違約率佔比較小,均小於25%
4)、Occupation申請貸款的理由與違約率之間的關係
Occupation_Status=data.groupby([Status,Occupation])[Status].count().unstack(0)Occupation_Status_Rate=Occupation_Status[Defaulted]/(Occupation_Status[Defaulted]+Occupation_Status[Current]+Occupation_Status[Completed])Occupation_Status_Rate=pd.DataFrame(Occupation_Status_Rate,columns=[Rate])Occupation_Status_Rate.reset_index(inplace=True)#進行降序排序,獲取違約率前十的和後面十個的Occupation_Status_Rate=Occupation_Status_Rate.sort_values(by=Rate , ascending=False) Occupation_Status_Rate=(Occupation_Status_Rate.iloc[0:10]).append(Occupation_Status_Rate.iloc[-10:-1])fig2 = plt.figure(figsize=(20,15))ax = sns.barplot(x="Occupation", y="Rate", data=Occupation_Status_Rate,ci=0)ax.set_xticklabels(list(Occupation_Status_Rate[Occupation]),rotation=90,fontsize=14)plt.show()
5)、費信用分(CreditScore)是衡量一個人在消費中的經濟能力,分值高的人交易更活躍、交易活動違約率更低,所以消費信用分高的人更具備還款能力,違約可能性應該低於消費信用分低的人
creditScore=pd.DataFrame(data.groupby([Status, CreditScore])[Status].count().unstack(0))# 缺失值填充creditScore.fillna(0,inplace=True)#提示:從這裡可以看出信用卡分數有一個很明顯的斷層,從10直接跳到370,這裡我們可以採用pd自帶的一個函數cut,但是為了更直觀的數據可視化,我們去掉這部分index=list(creditScore.index)[2:]score=pd.DataFrame(creditScore.values[2:],index=index,columns=list(creditScore.columns))defaultRate_creditScore = (score[Defaulted]/(score[Defaulted]+score[Completed]+score[Current]))defaultRate_creditScore = pd.DataFrame(defaultRate_creditScore,columns=[Rate])defaultRate_creditScore.reset_index(inplace=True)x=np.arange(len(index))+1plt.figure(figsize=(40,30))ax=score.plot(kind=line,grid=True)ax.set_xlabel(CreditScore,fontsize=14)ax.set_ylabel(數量, fontsize=14)plt.legend(loc=best)plt.show()
x=np.arange(len(index))+1fig1=plt.figure(figsize=(20,10))ax1=fig1.add_subplot(2,1,1)score.plot(kind=line,grid=True,ax=ax1)ax1.set_xlabel(CreditScore,fontsize=15)ax1.set_ylabel(數量, fontsize=15)plt.xticks(fontsize=15)plt.yticks(fontsize=15)plt.legend(loc=best)ax2=fig1.add_subplot(2,1,2)ax2.bar(x,defaultRate_creditScore[Rate],width_=0.25,alpha=0.8)ax2.set_xticks(x)ax2.set_xticklabels(index,rotation=0,fontsize=15)ax2.set_xlabel(消費信用分,fontsize=15)ax2.set_ylabel(違約百分率(%),fontsize=15)plt.yticks(fontsize=15)
結論:在信用分大於450分的時候,消費信用分越高,違約率越低在信用卡分數>600分時候,違約數小於不違約數
6)、CreditGrade與違約率之間的關係# 信用評級2009年7月1日之前creditGrade = data.groupby([Status, CreditGrade])[Status].count().unstack(0)index=[ NC,HR,E,D, C,B, A, AA]creditGrade=creditGrade.reindex(index)#發現HC信用評級的數據為空,通過檢查發現是之前在EmploymentStatusDuration缺失值處理刪掉的時候也一起刪除了creditGrade=creditGrade.iloc[1:]defaultRate_creditGrade = (creditGrade[Defaulted] / (creditGrade[Defaulted] + creditGrade[Completed])).reindex(index)defaultRate_creditGrade=pd.DataFrame(defaultRate_creditGrade,columns=[Rate])defaultRate_creditGrade.reset_index(inplace=True)defaultRate_creditGrade
width_=0.25x=np.arange(len(index))+1#這裡是設置成可以中文顯示標題、坐標軸等plt.rcParams[font.sans-serif]=[SimHei] #用來正常顯示中文標籤plt.rcParams[axes.unicode_minus]=False #用來正常顯示負號# 設置畫布的大小fig1 = plt.figure(figsize=(40,25))# 指明是該畫布是兩行一列,目前選中第一個ax1 = fig1.add_subplot(2,1,1)creditGrade.plot(kind=bar,ax=ax1)#屬性設置# ax1.set_xticks(x+width)ax1.set_xlabel(信用評級,fontsize=30)ax1.set_xticklabels(index,rotation=0,fontsize=30)ax1.set_ylabel(數量,fontsize=30)plt.yticks(fontsize=25)ax2 = fig1.add_subplot(2,1,2)ax2.bar(x,defaultRate_creditGrade[Rate],width,alpha=0.8)ax2.set_xticks(x)ax2.set_xticklabels(defaultRate_creditGrade[CreditGrade],rotation=0,fontsize=30)ax2.set_ylabel(違約百分率(%),fontsize=30)plt.yticks(fontsize=25)#顯示高度for a,b in zip(x,defaultRate_creditGrade[Rate]): plt.text(a,b+0.001,%.2f%% % (b*100),ha=center,va=bottom,fontsize=30)plt.show()
結論:信用評級CreditGrade高的人違約率越低,從信用評級E以上,違約數少於不違約數量
7)、ProsperRating (Alpha)是2009年之後的信用等級與違約率的關係prosperRating= data.groupby([Status, ProsperRating (Alpha)])[Status].count().unstack(0)index=[ HR,E,D,C,B, A, AA]prosperRating=prosperRating.reindex(index)defaultRate_prosperRating = (prosperRating[Defaulted] / (prosperRating[Defaulted] + prosperRating[Completed]+prosperRating[Current])).reindex(index)prosperRating
defaultRate_prosperRating=pd.DataFrame(defaultRate_prosperRating,columns=[Rate])defaultRate_prosperRating.reset_index(inplace=True)defaultRate_prosperRating
width_=0.25x=np.arange(len(index))+1#這裡是設置成可以中文顯示標題、坐標軸等plt.rcParams[font.sans-serif]=[SimHei] #用來正常顯示中文標籤plt.rcParams[axes.unicode_minus]=False #用來正常顯示負號# 設置畫布的大小fig1 = plt.figure(figsize=(40,25))# 指明是該畫布是兩行一列,目前選中第一個ax1 = fig1.add_subplot(2,1,1)prosperRating.plot(kind=bar,ax=ax1)#屬性設置# ax1.set_xticks(x+width)ax1.set_xlabel(prosperRating,fontsize=30)ax1.set_xticklabels(index,rotation=0,fontsize=30)ax1.set_ylabel(數量,fontsize=30)plt.yticks(fontsize=25)ax2 = fig1.add_subplot(2,1,2)ax2.bar(x,defaultRate_prosperRating[Rate],width,alpha=0.8)ax2.set_xticks(x)ax2.set_xticklabels(defaultRate_prosperRating[ProsperRating (Alpha)],rotation=0,fontsize=30)ax2.set_ylabel(違約百分率(%),fontsize=30)plt.yticks(fontsize=25)#顯示高度for a,b in zip(x,defaultRate_prosperRating[Rate]): plt.text(a,b+0.001,%.2f%% % (b*100),ha=center,va=bottom,fontsize=30)plt.show()
結論:ProsperRating (Alpha)評級越高的人違約率越低,大部分借款人的評級都在D級以上。與2009.07.01之前的信用評級對比去掉了NC級,且整體違約率比之前更低,說明平台的風控模型進行了非常有成效的調整。
8)、過去七年違約次數(DelinquenciesLast7Years)能夠衡量一個人在過去七年中徵信情況,違約一次或以上的人在借款時違約概率更大。#有違約的數據yesno=pd.DataFrame(data.groupby([Status, CurrentDelinquencies])[Status].count().unstack(0))[1:]yesno=yesno.iloc[:26,:]#全部數據delinQuenciest=pd.DataFrame(data.groupby([Status, DelinquenciesLast7Years])[Status].count().unstack(0))#為什麼只取到前面數據,因為違約次數越多,貸款通過也不批准,後面的數據都是特別小,所以也可以這樣試試rating= pd.DataFrame(delinQuenciest.values[0:26], index=list(delinQuenciest.index)[0:26], columns=list(delinQuenciest.columns))fig1 = plt.figure(figsize=(45,30))ax1 = fig1.add_subplot(2, 1, 1)rating.plot(kind=line,ax=ax1, grid=True)ax1.set_ylabel(數量, fontsize=30)ax1.set_xlabel(7年內的違約次數, fontsize=30)plt.xticks(fontsize=25)plt.yticks(fontsize=25)ax2 = fig1.add_subplot(2, 1, 2)yesno.plot(kind=bar,ax=ax2)ax2.set_xticklabels(list(yesno.index),rotation=0,fontsize=20)ax2.set_xlabel(7年內的違約次數, fontsize=30)ax2.set_ylabel(數量, fontsize=30)plt.xticks(fontsize=25)plt.yticks(fontsize=25)plt.legend(loc=best)plt.show()
結論:大部分借款人在七年內的違約數小於1,風險可控
9)、受僱傭狀態持續時間(EmploymentStatusDuration)可夠衡量一個人工作生活的穩定情況,受僱傭狀態持續時間長的違約的概率小。
employmentStatus = pd.DataFrame(data.groupby([Status, EmploymentStatusDuration])[Status].count().unstack(0))employmentStatus = pd.DataFrame(employmentStatus.values[0:120], index=list(employmentStatus.index)[0:120],columns=list(employmentStatus.columns))defaultRate=employmentStatus[Defaulted] / (employmentStatus[Defaulted] + employmentStatus[Completed])fig1 = plt.figure(figsize=(45,30))ax1 = fig1.add_subplot(2, 1, 1)employmentStatus.plot(kind=line, grid=True,ax=ax1)#ax1.set_xlabel(受僱傭狀態持續時間(月), fontsize=14)ax1.set_ylabel(數量, fontsize=30)plt.xticks(fontsize=25)plt.yticks(fontsize=25)ax2 = fig1.add_subplot(2, 1, 2)ax2.plot(list(defaultRate.index),list(defaultRate.values),ko--)ax2.set_xlabel(受僱傭狀態持續時間(月), fontsize=30)ax2.set_ylabel(違約百分率(%), fontsize=30)plt.xticks(fontsize=25)plt.yticks(fontsize=25)plt.legend(loc=best)plt.show()
結論:隨著僱傭時間的增長,違約概率逐漸減小
推薦閱讀:
※推薦系統遇上深度學習(四)--多值離散特徵的embedding解決方案
※教科書上的LDA為什麼長這個樣子?
※Road To Data Science | 數據科學之路專欄索引目錄
※[Paper Share - 6]Video2Shop: Exact Matching Clothes in Videos to Online Shopping Images