利用python进行prosper贷款数据EDA分析(一)

一 摘要

本文详述了如何通过数据预览,基本数据分析、探索式数据分析,缺失数据填补等方法,实现对 kaggle上Prosper借贷平台贷款者还款与否这一分类问题如何进行数据分析的具体探索式实践。

二 项目介绍

Prosper LoanData 是由Joshua Schnessl从Udacity Data Analyst Nanodegree上把数据放到kaggle的上供感兴趣的人分析的一个实例项目,这并非一个竞赛项目。本文选取了Prosper自2005年至2014年总共11W的贷款数据,试图通过训练数据集分析出什么类型的借款人更可能不违约,本次分析将LoanStatus(贷款状态)分成完成和违约两种。

三 实践分析

1 数据导入

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
df = pd.read_csv(r'D:\Users\Desktop\prosperLoanData.csv')
df

由于数据变量太多,一些对分析的结果,即贷款状态影响变化不大的变量不予考虑,在此就不做名词解释了,若需详细了解变量含义,请点击变量词典

  • 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日后的信用等级.信用等级越高,其偿债能力越强.
  • StatedMonthlyIncome:客户月收入,月收入越高,投资者对该借款本息按时回流越有信心.
  • DelinquenciesLast7Years:信用资料提交时借款人过去7年违约次数,该指标在一定程度上可以体现借款标的发布者的信用状况
  • LoanOriginalAmount:借款人在借款时已经向prosper借入的资金,如果没有历史记录则为0,显然,借入本金越多,其还款压力越大,但是这项指标大的话也可能说明该客户对prosper依赖性较强.
  • DebtToIncomeRatio:借款人的债务收入比,债务收入比越高说明筹资者财务状况越差,还款能力较低.其向P2P平台借款时,投资者应要求有更高的回报.
  • Occupation:贷款人职业
  • IncomeRange:贷款人年收入范围
  • BorrowerState:贷款人所在州

2 数据预处理

由于变量较大,筛选部分有需要的变量,重新建立一个新数据集,然后浏览,发现有缺失值,进行填充处理

df = df[['ListingCreationDate','LoanStatus','EmploymentStatus','EmploymentStatusDuration','IsBorrowerHomeowner','CreditScoreRangeLower','CreditScoreRangeUpper','InquiriesLast6Months','BorrowerRate','Term','CreditGrade','ProsperRating (Alpha)','MonthlyLoanPayment','StatedMonthlyIncome','DelinquenciesLast7Years','LoanOriginalAmount','DebtToIncomeRatio','Occupation','IncomeRange','BorrowerState']]
df
df.info()

从分类数据开始,现在让我们用“未知”填充NaN值。

categorical = df.select_dtypes(include=["object"]).columns.values
df[categorical] = df[categorical].fillna("Unknown")
df.select_dtypes(exclude=[np.number]).isnull().sum()

用0来填充受雇佣状态持续时间中的空值,当非空之和为0时,即空值全部被填充,后续其他的同理

df['EmploymentStatusDuration'] = df['EmploymentStatusDuration'].fillna(0)
df['EmploymentStatusDuration'].isnull().sum()

用中位数填充 CreditScoreRangeLower,CreditScoreRangeUpper的空值

df['CreditScoreRangeLower'] = df['CreditScoreRangeLower'].fillna(df['CreditScoreRangeLower'].median())
df['CreditScoreRangeLower'].isnull().sum()

df['CreditScoreRangeUpper'] = df['CreditScoreRangeUpper'].fillna(df['CreditScoreRangeUpper'].median())
df['CreditScoreRangeUpper'].isnull().sum()

根据规定的月收入计算债务收入比率来填充DebtToIncomeRatio的空值

df["DebtToIncomeRatio"].fillna(df["MonthlyLoanPayment"] / (df["StatedMonthlyIncome"] + 1), inplace = True)
df["DebtToIncomeRatio"].isnull().sum()

用中位数填充InquiriesLast6Months,DelinquenciesLast7Years填充空值

df['InquiriesLast6Months'] = df['InquiriesLast6Months'].median()
df['InquiriesLast6Months'].isnull().sum()

df['DelinquenciesLast7Years'] = df['DelinquenciesLast7Years'].median()
df['DelinquenciesLast7Years'].isnull().sum()

df.info()

至此,全部缺失值都处理好了。

3 数据重编码

我们要将已完成的贷款与违约贷款区分开来。 由于无法判断“当前”贷款是否最终会违约,因此我们不能将其用于分析。 由于贷款尚未偿还,近一半的数据集对我们无用。 为了在我们的最终估计中保守,为了简化问题并保留数据,我们假设所有“逾期”和“抵债”贷款(以及1次取消)都将违约。 因此,我们将留下两个类:“完成”和“违约”。 我们将这些二进制结果分别编码为1和0。

df['LoanStatus'].value_counts()

df_historical = df[df["LoanStatus"] != "Current"]
df_historical["LoanStatus"].value_counts()

df_historical["LoanStatus"] = (df_historical["LoanStatus"] == "Completed").astype(int)
df_historical["LoanStatus"][:10]

df_historical["LoanStatus"].value_counts()

df_historical["LoanStatus"].value_counts().plot.bar()

数据可视化部分待更新。。。









阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页