一 摘要
本文详述了如何通过数据预览,基本数据分析、探索式数据分析,缺失数据填补等方法,实现对 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
由于数据变量太多,一些对分析的结果,即贷款状态影响变化不大的变量不予考虑,在此就不做名词解释了,若需详细了解变量含义,请点击变量词典。
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()
数据可视化部分待更新。。。