Lending Club贷款数据分析

python信用评分卡(附代码,博主录制)

 

https://www.jianshu.com/p/a8037a38e219(原文连接)html

https://www.jianshu.com/p/4b4e0c343d3e(原文连接)python

  • 背景
  • 目的
  • 数据集获取
  • 数据处理

1、背景

公司背景算法

Lending Club 创立于2006年,主营业务是为市场提供P2P贷款的平台中介服务,公司总部位于旧金山。segmentfault

公司在运营初期仅提供我的贷款服务,至2012年平台贷款总额达10亿美圆规模。bash

2014年12月,Lending Club在纽交所上市,成为当年最大的科技股IPO。app

2014年后公司开始为小企业提供商业贷款服务。机器学习

2015年整年Lending Club平台新设贷款金额达到了83.6亿美圆。ide

2016年上半年Lending club爆出违规放贷丑闻,创始人离职,股价持续下跌,整年亏损额达1.46亿美圆。学习

做为P2P界的鼻祖,Lending club跌宕起伏的发展历史仍是挺吸引人的。

此处再顺便介绍一下什么是P2P。归纳起来能够这样理解,“全部不涉及传统银行作媒介的信贷行为都是P2P”。简单点来讲,P2P公司不会出借自有资金,而是充当“中间人”的角色,让借款人与出借人相亲相爱。

借款人高兴的是拿到了贷款,并且过程快速便利,免遭传统银行手续众多的折磨;出借人高兴的是借出资金的投资回报远高于存款利率;那么中间人高兴的是用服务换到了流水(拿的即是事成以后的抽成) 最后实现三赢。

贷款标准

借款人提交申请后,Lending Club 会根据贷款标准进行初步审查。贷款人须要知足如下标准才能借款:

1.FICO 分数在660 分以上

 
FICO分数等级划分

2.债务收入比例低于40%

3.信用报告反应如下状况:至少有两个循环帐户正在使用,最近6 个月不超过5 次被调查,至少36 个月的信用记录

贷款等级

贷款分为A、B、C、D、E、F、G 7 个等级,每一个等级又包含了一、二、三、四、5 五个子级。

2、目的

研究影响贷款等级的相关因素,并探寻潜藏在数据背后的一些规律

3、数据集获取

选取2016年第一季度、第二季度的数据集以及特征变量的说明文档。

 
官网上下载数据集
 
已翻译的特征说明文档

说明:部分重要的特征变量彷佛缺失,屡次下载的数据集中缺乏fico分数、fico_range_low、fico_range_high等与fico相关的特征,因此在造成结论进行总结的时候,这些特征的结论将从相关的报告中获取。

4、数据处理

在对数据进行处理前,咱们须要对数据有一个总体的认识

lendData.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 133891 entries, 0 to 133890 Columns: 110 entries, id to total_il_high_credit_limit dtypes: float64(86), object(24) memory usage: 100.1+ MB 

从上述的信息中能够看出:

1.133891行数据,110个特征变量

2.110个特征变量中有86个是浮点数类型,24个是Object对象。

获取到的信息仍是太少,接下来能够经过下面的方法,获得数值型数据和Object基类的数据分布。

lendData.select_dtypes(include=['O']).describe().T\ .assign(missing_pct=lendData.apply(lambda x : (len(x)-x.count())/len(x))) 

筛选出object对象的对应信息,可分别获得非空值数量、unique数量,最大频数变量,最大频数,以及新添加一列特征变量missing_pct,表示值缺失的比重。

 
Object基类对象的数据分布状况

从图表中能够获得部分信息:

1.贷款共7个等级,占比最多的是B级

2.还款的形式有两种,占比最多的是36个月

3.贷款人中大多数人工龄10+年

4.贷款人的房屋情况大可能是抵押贷款

5.大多数人贷款的目的是债务整合

6.id与desc特征的数据缺失率高达0.99,间接代表这两个特征能够删除掉。

一样能够按照这种方式对浮点型的数据进行数据预览,获得均值、标准差、四分位数以及数据的缺失比重等信息。

空值、异常值处理

获得上述的信息后,咱们能够根据缺失比重进行数据的清洗。在这里按照60%的阈值删除数据。最后获得100个特征变量。

原始数据集存在异常值状况,如特征变量emp_length(工龄)数据中包含‘n/a’的数据,产生缘由为公式应用的错误没法找到原值,并且占比较小,清除后剩余124947行数据。

除去异常值,还包括对空值的处理,对于较为重要的特征来讲,若是缺失值占比较小,能够经过填补均值进行处理。

application_joint['il_util'] = application_joint['il_util'].replace('NaN',application_joint['il_util'].mean()) 

特征筛选

特征筛选在数据预处理中是很关键的一步,这一步对后序的分析、挖掘有很大的影响。

通过初步的数据清洗后,咱们获得了100个特征变量,这其中包括一些与最终研究目的彻底无关的变量,一部分方差值很小、没法获得更多信息的变量。虽然100个特征变量不算多,但若是去掉一些无用的特征减小数据维度,且有必定的降噪效果,那么这一步是必需要作的。

这里的筛选标准以下:

1.与最终研究目的无关的特征

2.方差值过小,没法获取有用信息的特征

3.不可解释的特征

咱们的研究目的是探讨影响贷款等级的众多因素,关键特征grade表明的就是不一样的贷款等级,若是想剔除与grade无关的特征,那么能够用相关系数来处理。

相关系数:研究变量之间线性相关程度的量

具体要如何处理呢?特征grade中包含A、B、C、D等七个贷款等级,作数值计算以前,须要将Object类型转换为数值类型。

#贷款等级Object类型转为数值类型 grade = lendData['grade'].replace('A',1) grade = grade.replace('B',2) grade = grade.replace('C',3) grade = grade.replace('D',4) grade = grade.replace('E',5) grade = grade.replace('F',6) grade = grade.replace('G',7) 

转换事后,咱们能够将特征中全部的数值类型的数据与贷款等级进行相关系数计算。

dicti = {}  #计算两组数的相关系数 for i in range(0,len(lendData.select_dtypes(include=['float64']).columns)): try: dicti[lendData.columns[i]] = np.corrcoef(lendData[lendData.columns[i]].dropna(),grade)[0,1] print(lendData.columns[i],np.corrcoef(lendData[lendData.columns[i]].dropna(),grade)[0,1]) except Exception as e: continue 

通过数据可视化获得下面的相关系数分布图。

 
数值型特征与贷款等级的相关系数分布

通过筛选后,获得54个特征(不包括未转换数据类型的其余Object类型特征),其中total_rec_int(目前为止收到的利息)、bc_util(银行卡流动余额与信贷限额比率)、acc_open_past_24mths(过去24个月内的交易量)、open_il_12m(过去12个月内开设的分期付款账户数)等特征与贷款等级呈正相关关系。total_rev_hi_lim(总的周转信用额度)、total_rec_prncp(迄今收到的本金)、mths_since_recent_bc(自最近银行卡账户开立以来的几个月)等特征与贷款等级呈明显的负相关关系。

同时,咱们注意到这样的一个问题,在相关系数的分布中,有一部分相关系数较高的特征是由贷款等级来肯定的(好比说贷款总金额、未偿还的本金、迄今收到的本金、利息等等,都是肯定贷款等级以后才有的信息),而不是决定贷款等级的因素,因果关系不成立。这样的特征即便于贷款等级相关性高,也与最终的目的无关。

相关系数只是筛选的一种标准,具体的特征留存还须要根据对贷款业务的理解,有所保留的删减特征。

以后咱们对上述的54个特征进行方差筛选,对于方差值较小、变化幅度较小的特征进行剔除,固然要综合考虑。

from sklearn.feature_selection import VarianceThreshold #方差选择法,返回值为特征选择后的数据 #参数threshold为方差的阈值 lend = VarianceThreshold(threshold=2).fit_transform(lendData.select_dtypes(include=['float64'])) 
 
特征、相关系数、方差信息一览图

针对上述的特征进行进一步的方差筛选。其中特征collections_12_mths_ex_med没法解释/与研究目标无关,delinq_2yrs、acc_now_delinq很重要,其他特征没法判断,先保留看看。

特征重要性

通过初步特征筛选后,咱们发现相关系数因素有些单一,并不能肯定哪一个特征更为重要,更须要进行深度探索。通过搜索得知GBDT算法能够算出变量的重要性。由于lending club贷款数据中并不包含“分类”变量target,因此GBDT通用的特征选择方法没法使用。

通过搜索找到了造好的轮子(取个巧),直接获得了算法计算后的结果,以下图所示。

 
引自文章https://zhuanlan.zhihu.com/p/21550547

其中dti(借款人每个月已还债务总额占总债务计算的比率)、bc_util(全部银行卡帐户的总流动余额与信贷限额/信用额度的比率)、mo_sin_old_rec_ti_op(自最先的周转账户开立以来的月份)等特征较为重要。

Tip: 综上结合相关系数与特征重要性,去掉无因果关系的、重要性较低的特征,咱们获得以下的筛选后的特征。

 
最终特征筛选结果(按特征重要性排序)

可能你们会注意到在筛选特征的过程当中只针对数值型特征进行筛选,那么Object类型的特征呢?

根据前面获得的信息,共有24个Object类型的特征,其中有大部分特征是贷款后的才有的信息,并不能决定贷款等级。并且,在查看特征重要性中已包括Object类型的特征,如home_ownership(房屋全部权状态,包括租赁、拥有、贷款抵押三种类型的值),其他特征并不在考虑范围内。


数据的前期处理部分就到这里了,下一篇文章将主要对数据进行可视化分析、结论总结等。其实大部分的工做都在数据处理部分,可视化占较少的一部分时间。处理好了数据对后续的工做有很大的影响。

附上在数据分析的过程当中遇到的很好的参考资料,包括特征工程(包括对特征的处理、筛选等)、已有的成型的数据分析文章等。

1.机器学习特征选择

2.使用sklearn作特征工程

3.利用LendingClub数据建模

4.相关性分析



  • 数据可视化
  • 结论

上一篇文章中,咱们说到了如何处理数据,而且最后筛选出比较重要的一些特征。按道理来讲,接下来咱们应该对数据进行去重、归一化、进行建模了。然而时间、精力有限,且与最终要研究的目的没多大关系,因此这一部分并无进行深层研究。

接下来咱们从数据可视化开始提及,探究潜藏在数据背后的信息。

5、数据可视化

首先咱们来看一下2016年第一季度业务开展状况,主要是放款笔数,金额,期限等状况

perform_data = analysis_data.groupby('month')['loan_amnt'].agg(['count','sum'])#贷款笔数与放贷金额 f, (ax1, ax2) = plt.subplots(2, 1, sharex=True) x = perform_data.index #月份month y1 = perform_data['count']#贷款笔数 sns.barplot(x, y1, ax=ax1) y2 = perform_data['sum']#贷款金额 ax1.set_xlabel("") ax1.set_ylabel("loan_count") sns.barplot(x, y2,ax=ax2) ax2.set_ylabel("loan_amount") sns.despine(bottom=True) 
 
第一季度贷款笔数、金额分布图

能够看出,1月份至3月份的贷款笔数、贷款金额都在提高。

 
第一季度贷款等级变化趋势

在同时,第一季度中不一样等级的贷款数量都有所增加,其中F、G等级贷款继续维持在必定的、较低的成交数量,而其余等级贷款的数量和涨幅都较为明显。

经过两个图表咱们对第一季度总体的业绩有了一些了解,接下来咱们将更具体的了解业务的内容,好比说贷款金额、贷款期限以及利率等。

from scipy.stats import norm #贷款金额分布 sns.distplot(analysis_data.loan_amnt,fit=norm,kde=False,color='blue') sns.despine(top=True) 
 
贷款金额分布图

单笔贷款金额在1万~2万美圆范围内占比较多,较高金额的贷款数量较少,也间接证实了lending club 主营小额度的贷款项目。

analysis_data.term.value_counts().plot.pie(autopct='%.2f',figsize=(10, 10),colors = ['yellowgreen','lightblue']) #借款周期分布比例 
 
贷款周期占比

贷款周期分为36个月与60个月,主要以36个月为主,不过60个月的比重也不小。在p2p平台上以短时间贷款为主,长期贷款也有,利率较高,但周期较长。借出人收获利息,承担风险,而借入人到期要偿还本金。贷款周期越长,对借出人来讲风险越高。

在国内的环境下,借出人不只要承担推迟还款的风险,还要担忧平台跑路、本息全无的高风险;对借入人来讲,由于国内缺乏健全的征信体系,借款方违约及重复违约成本低。

对国内的状况再也不多说,话题绕回来。国外的部分国家已有健全的征信体系,一旦违约还款,违约率不断上涨,我的征信也会保留记录,对后序的贷款、买房有很大的影响。因此若是贷款周期较长,且若是没有固定的工做和固定的收入的话(即便有未定收入也不必定如期偿还),偿还本金充满变数,颇有可能违约。

因此经过上图能够看出几个信息:

1.短时间贷款占比重较大,长期贷款占比也不低

2.Lending club平台有较强的风控能力,部分借出方比较信任平台(不怕平台跑路),而借入方对自身的还款能力有必定的信心。

接下来咱们再试着对贷款人进行分析,造成一下用户画像吧。

 
贷款人工龄分布图

从图中能够看出,贷款人中有37%的比例的人工龄为10年以上。那么,咱们能够考虑一下,为何工龄超过10年的人有贷款需求呢?且占比这么高?

那么能够猜想一下(我的意见),首先多是工龄越长,贷款经过率越高(筛选后占比较高),其次可能有部分是工做超过10年可是被裁人的(经济很差),有部分是还有工做可是须要还房贷的(不知道国外的形式),有部分是我的家庭有大笔支出的(个例,占比不大),固然不排除谎报工龄的可能。

至于猜想是否准确我的不能保证,还须要结合当年的经济形势,以及职业变更等状况进行综合判断,在此再也不深究。

#贷款人收入水平 sns.factorplot(x="grade", y="annual_inc", hue="verification_status", data=lendData,order=list('ABCDEFG'),size=15,palette="Paired") 
 
贷款人收入水平

再来看看收入水平的状况。贷款人的收入水平信息分为三种状况:已通过LC验证,收入来源已验证,未验证。这三种状况目前从图中看不出有什么不一样。总之,贷款等级与收入水平在总体上呈正相关的趋势。

analysis_data.home_ownership.value_counts().plot.pie(autopct='%.2f',figsize=(10, 10),colors= ['red','yellowgreen','lightskyblue']) #借款人住房情况分布 
 
借款人住房情况分布图

大多数人的房屋状态是抵押贷款(大部分人是房奴),只有少部分人有彻底的产权。

#贷款等级与住房状况 analysis_data_home = lendData.groupby(['grade','home_ownership'])[['issue_d']].count().apply(lambda x : x/x.sum(level=0)).unstack(level=1)\ .reset_index().set_index('grade')\ .stack(level=0).reset_index(level=1, drop=True) analysis_data_home.plot.barh(stacked=True,figsize=(15,8)).legend(loc='center left', bbox_to_anchor=(1, 0.5)) 
 
贷款等级与住房状况

意外的发现,贷款等级越高的人群,他们的住房状况是抵押贷款的概率越高,而租房的概率越低。而拥有彻底产权的人群在各个贷款等级的人群中占比差很少。

再来看看他们贷款都干什么了。

sns.countplot(y=analysis_data.purpose) #贷款用途分布 sns.despine(top=True) 
 
贷款用途分布

能够很明显的看出debt_consolidation(能够理解为债务整合,借新还旧)占比最高,占比第二高的credit_card也归属为同一类。

 
贷款目的与人均收入水平

综合收入水平与贷款用途获得上图,咱们能够发如今第一季度中,人均收入水平较高的人群贷款用于小生意,家庭生活改善,房子等。而贷款为了债务整合(占比最高)的人群的人均收入水平在总体的中下。

对贷款人群了解的也差很少了,接下来咱们看一下资产质量

如何定义资产质量呢?在这里能够狭义地理解为在必定时期、利率、期限结构下资产所能来带的收益高低或损失可能,对于贷款来讲,借款人偿还本息的及时足额程度、借款人的信用等级、贷款的利率期限等等都影响到资产的质量。

不过要注意,一般咱们认为借款人的还款观察期最好是在6个月到12个月,由于在这个期限内,借款人还款的表现状况才逐渐趋于稳定。而计算第一季度的delinquent rate(拖欠率)是不具有表明性的,因此在这里就不对第一季度的总体Bad Rate(坏帐率)作进一步的分析了,而是着重观察不一样信用等级下的资产质量。

说实话,关于资产质量的这部分并无分析经验,也是参考了一下大牛的文章引用过来的。文末会给出连接,对金融、p2p感兴趣的能够自行学习。

回归正题,既然资产质量与偿还利息是否及时、借款人信用等级等等相关,那么就把这些信息整合起来,查看一下不一样贷款等级的贷款质量。

在众多特征中,有个特征变量loan_status(贷款状态)来描述当前贷款处于什么状态,其中包括Current、Fully Paid、Charged Off(注销)、Default、In Grace Period(在宽限期)、Late (16-30 days)(延期16-30天) 、Late (31-120 days)(延期31-120天)这几种状态。

#将贷款状态分为好与坏,好的贷款状态就是current(在还款期),fully paid(所有偿还),剩下的认为是坏的状态 past_due = ['In Grace Period','Late (16-30 days)', 'Late (31-120 days)', 'Default','Charged Off'] delinquent = ['Late (16-30 days)', 'Late (31-120 days)', 'Default'] lost = ['Default'] charged_off = ['Charged Off'] analysis_data_1 = analysis_data.copy() analysis_data_1['loan_status'] = analysis_data_1['loan_status'].map(lambda x :'Past Due' if x in past_due else x) groupd_grade = analysis_data_1.groupby(['grade','loan_status']) pay_data_2 = groupd_grade.agg({'loan_amnt':'sum','out_prncp':'sum','total_rec_prncp':'sum','total_rec_int':'sum'}) \ .assign(loan_amnt_pct=lambda x : x['loan_amnt']/x.groupby(level=0)['loan_amnt'].sum(), out_prncp_pct=lambda x : x['out_prncp']/x.groupby(level=0)['out_prncp'].sum()) pay_data_2 
 
贷款等级与贷款状态的分布

接下来分别解释一下特征的含义。total_rec_prncp(迄今收到的本金),
total_rec_int (迄今收到的利息),out_prncp (总资金中剩余的未偿还本金),后两列原数据集中没有,分别表明当前贷款金额占该等级全部贷款金额的比例, 未偿还本金金额占该等级全部未偿还本金金额的比例。

咱们能够看到,贷款状态分红了三类,Past Due中包括的都是很差的贷款状态,用来衡量贷款质量。

以后咱们将Past Due(坏的状态)单独提取出来

 
 
f, (ax1, ax2) = plt.subplots(2, 1, sharex=True) x = past_due_data.index y1 = past_due_data['loan_amnt_pct'] sns.barplot(x, y1, ax=ax1) y2 = past_due_data['out_prncp_pct'] ax1.set_xlabel("") ax1.set_ylabel("loan_amnt_pct") #坏的状态的贷款所占比例 sns.barplot(x, y2,ax=ax2) ax2.set_ylabel("past_due_rate") #未偿还本金的贷款所占比例 sns.despine(bottom=True) 
 
贷款等级与坏的贷款所占比例

从图中咱们看出,贷款等级越高,贷款质量越高。A等级最好,G等级最差,也从侧面看出Lending club的风控水平。

6、结论

经过数据可视化咱们对2016年第一季度的数据已经有了一个总体的认识。那么咱们最终要研究的问题是否已经找到答案了呢?回答是确定的。在调查Lending club背景时,咱们获得了模糊的线索。在进行数据预处理过程当中,咱们经过相关系数获得与贷款等级关系密切的特征,后续又经过数据可视化直观的看到与贷款等级相关的因素。下面就作一下总结。

影响贷款等级的相关因素

1.首先经过背景了解到FICO分数,分数越高,贷款经过的可能性与等级也越高。

 
FICO特征在原数据集中缺失,该图片源自其余文章

2.征信记录。包括征信查询、贷款人的不良信用记录等。征信记录很重要,而且占据较大的权重。由于过去的信用记录反映的是这我的潜在的坏帐率,原本嘛LC必需要保障借出人与自身的利益。


 
特征分类

3.资产实力。包括收入水平、住房状况、dti等。住房状况在重要性筛选过程当中出现,收入水平在数据可视化过程当中观察到明显的相关性。然而这些特征并非主要的影响因素,权重较低。

经过上述的总结概括,咱们得知Lending club平台已经有了一个完整的筛选、评级体系,且有足够的风控水平,经过对信息来源进行核实,以及控制低等级贷款的数量来维持总体贷款的水平,下降坏帐率。虽然如今Lending club的形势不太乐观,但在丑闻事件的打击中它仍是挺过来了。不论以后该公司如何发展,至少它成型的风控水平值得国内绝大多数p2p平台学习。

 

https://study.163.com/course/courseMain.htm?courseId=1005988013&share=2&shareId=400000000398149

参考

1.数据分析之python大法

2.用seaborn画出好看的分布图

3.10分钟python图表绘制 seaborn入门

4.Lending club股价大跌

5.Lending club透彻分析

相关文章
相关标签/搜索