數據分析工具之Python大法(三)

任何一個分析的前提是設定分析的目的,而大部分時候這些目的出自於具體業務的需求。因為是首次接觸Lending Club的數據,所以先花了兩篇的篇幅去一窺這些公開數據的概貌。現在所以回到分析的出發點,通過本文我們來了解一下Lending Club 2016年第一季度的業務發展、產品類型、用戶畫像、資產質量及風險的定價等。為了讓分析報告更為直觀友好,我將盡量使用matplotlib和seaborn進行可視化分析。

傳送門:數據分析工具之Python大法(一), 數據分析工具之Python大法(二)

第四部,基於業務層面的分析

4.1 選擇用於分析的變數 經過前面兩篇文章的分析,我對數據中的一些信息進行了介紹,原始數據有115個變數,從分析目的出發,我將從原始數據中挑選出個變數進行分析,.loc()是pandas重要的切片方法,逗號前面是對行進行切片,我這裡把issue_d這個變數為空的去掉(只分析放了款的);逗號後的為列切片,也就是挑選要分析的變數。因為LC的原始數據較為規整,所以在切片的同時做了一部分數據預處理, 比如把字元串的借款月份解析成date,把包含百分號的字元串利率轉換成整型等。

analysis_columns=[issue_d,term,int_rate,grade,home_ownership,verification_status,purpose,loan_amnt,total_pymnt,out_prncp,n total_rec_int,total_rec_prncp,installment,annual_inc,dti,fico_range_low,fico_range_high,last_fico_range_low,n last_fico_range_high, open_acc,loan_status,delinq_amnt,acc_now_delinq,tot_coll_amt]nanalysis_data = (data.loc[data.issue_d.notnull(),analysis_columns])n .assign(month=lambda x: pd.to_datetime(x[issue_d]).dt.month,n interest_rate = lambda x:x[int_rate].str.strip(%),n fico_change = lambda x : (x[last_fico_range_high]-x[fico_range_high]))nanalysis_data.head()n

4.2 先讓我們看看其2016年第一季度業務開展情況,主要是放款筆數,金額,期限等情況,在Python里可以按月份groupby後通過agg()方法直接算出來

perform_data = analysis_data.groupby(month)[loan_amnt].agg([count,sum])nf, (ax1, ax2) = plt.subplots(2, 1, sharex=True)nx = perform_data.indexny1 = perform_data[count]nsns.barplot(x, y1, ax=ax1)ny2 = perform_data[sum]nax1.set_xlabel("")nax1.set_ylabel("loan_count")nsns.barplot(x, y2,ax=ax2)nax2.set_ylabel("loan_amount")nsns.despine(bottom=True)n

沒有特別啥可以分析的,很明顯LC1到3月的業務,不管是貸款筆數還是放貸金額是在加速增長的過程

4.3 對於任何一個金融產品,金額、期限和利率都是必須了解的屬性,就像去專賣店買衣服關心衣服的款式和價格

from scipy.stats import normnsns.distplot(analysis_data.loan_amnt,fit=norm,kde=False)nsns.despine(top=True)n

上圖是借款金額分布,一看就清楚不多說

analysis_data.term.value_counts().plot.pie(autopct=%.2f,figsize=(10, 10))n

上圖是借款期限分布,主要以36期為主,不過我感嘆的是60期的比重這麼高。在信貸領域,借款期限是一個很好玩的東西,期限長的好處是:利率高,收益高,借款人每期還款壓力要小,壞處也很明顯啊:收益高的前提是借款人按期履約,不過夜長夢多,隨著時間變長,尤其是當借款期限跨一個經濟周期,很多人還款能力都隨著經濟周期在變動,經濟一下行,有可能收益沒實現,違約率蹭蹭往上漲。所以我在知乎風控群經常說,我們是靠天吃飯的人。

sns.distplot(analysis_data.interest_rate.astype(float),fit=norm,kde=False)nsns.despine(top=True)n

上圖是借款人年收入分布,這都是借款人自己填寫的,LC驗證了其中一部分,看看就好,不多說

analysis_data.home_ownership.value_counts().plot.pie(autopct=%.2f,figsize=(10, 10))n

上圖是借款人住房情況,有完全產權的只有12.1%,房奴佔了接近一半,把知乎的住房情況統計下,估計也差不多了多少,房奴飄過~

sns.countplot(y=analysis_data.purpose)nsns.despine(top=True)n

上圖是貸款用途,關於debt_consolidation,我還特意請教過在美帝做評分卡的大牛,理解為債務整合,然後我很粗俗地理解為,借新還舊並做個展期,然後比重第二的信用卡也可以歸為這一類。那些每月信用卡套現還款另一張信用卡的自覺歸隊哈。都是為了生活,都不容易啊。

4.5 資產質量,在這裡我狹義地理解為在一定時期、利率、期限結構下資產所能來帶的收益高低或損失可能,對於貸款來說,借款人償還本息的及時和足額程度、借款人的信用等級、貸款的利率和期限等等都影響到資產的質量。不過要注意,由於借款時間是2016年1季度,而從LC的數據上看,觀測點應該是6月初,也就是最短的觀測期才2個月,通常我們認為借款人的還款觀察期最好是在6月到12個月,因為在這個期限內,借款人還款的表現情況才逐漸趨於穩定。

groupd_mth = analysis_data.groupby([month,loan_status])npay_data = groupd_mth.agg({loan_amnt:sum,out_prncp:sum,total_rec_prncp:sum,total_rec_int:sum}) n .assign(loan_amnt_pct=lambda x : x[loan_amnt]/x.groupby(level=0)[loan_amnt].sum(),n out_prncp_pct=lambda x : x[out_prncp]/x.groupby(level=0)[out_prncp].sum()) npay_datan

從月份上看1到3月的delinquent和past_due都是在下降的,但是這並不能作於結論,甚至說是錯的結論。原因開始說了,整體表現都還不充分,現在算出來的一季度delinquent rate是不具備代表性的,所以這也是統計陷阱之一。所以本文不對2016年一季度的整體Bad Rate做進一步的分析,而是著重觀察不同信用等級下的資產質量。

past_due = [In Grace Period,Late (16-30 days), Late (31-120 days), Default,Charged Off]ndelinquent = [Late (16-30 days), Late (31-120 days), Default] nlost = [Default]nchaeged_off = [Charged Off]nanalysis_data_1 = analysis_data.copy()nanalysis_data_1[loan_status] = analysis_data_1[loan_status].map(lambda x :Past Due if x in past_due else x)ngroupd_grade = analysis_data_1.groupby([grade,loan_status])npay_data_2 = groupd_grade.agg({loan_amnt:sum,out_prncp:sum,total_rec_prncp:sum,total_rec_int:sum}) n .assign(loan_amnt_pct=lambda x : x[loan_amnt]/x.groupby(level=0)[loan_amnt].sum(),n out_prncp_pct=lambda x : x[out_prncp]/x.groupby(level=0)[out_prncp].sum())npay_data_2n

在這裡我們把觀測點選擇為Past Due,原因也不用再強調了,LC設了15天的Grace Period,長期看也許這部分後後面能近入「Current」,但是短期內把「In Grace Period」借款人定義為Bad是沒有問題的,實際上在分析中,我們常常要面對這個問題,就是在分析好人壞人在樣本極度不均衡的情況下,我們可以適當放寬對好人壞人的定義。

past_due_data = pay_data_2.xs(Past Due, level=1)npast_due_datan

其實通過圖表看已經很明顯了,考慮受眾畫個絢爛點的圖

f, (ax1, ax2) = plt.subplots(2, 1, sharex=True)nx = past_due_data.indexny1 = past_due_data[loan_amnt_pct]nsns.barplot(x, y1, ax=ax1)ny2 = past_due_data[out_prncp_pct]nax1.set_xlabel("")nax1.set_ylabel("loan_amnt_pct")nsns.barplot(x, y2,ax=ax2)nax2.set_ylabel("past_due_rate")nsns.despine(bottom=True)n

上面這張圖代表什麼?對於一個風險從業人員來講,代表著風控水平。LC將借款人劃分了A到G七個不同的等級,A最好G最差,比G還差的應該是直接拒絕了。從貸後的表現看,LC的信用等級區分能力是不錯的。

4.6 風險定價,看了上面關於不同信用等級的借款人的表現,我們至少會有兩個方面的思考:首先是LC如何給借款人評級的,其次LC對不同等級借款人的風控策略。到這裡基本上是直面風控的核心了,知乎上那麼多風控的文章,這麼多內行的外行的在討論這個話題,其實就是兩個問題嘛:如何識別和量化風險,如何最優化進行風險定價。

今天就寫到這裡吧,窗外陽光明媚,是該出去走走了,給路上的妹紙打Grade比寫代碼舒服

今天的內容其實還是以描述性分析居多,下篇大結局啦,盡量寫之前多吃幾個烤腰子,給大家點乾貨,哪怕是一點點


推薦閱讀:

換工作這件事也可以量化
哪裡下載各種行業數據報告?

TAG:数据分析 | 风险控制 | Python |