爱数课实验 | 金融贷款数据可视化_数据

爱数课:idatacourse.cn


领域:金融




简介:本案例所选的数据集是来自LendingClub中统计的2018年第四季度的借贷数据,随机删除了约40%的贷款记录,并对其进行可视化分析。




数据:

./dataset/lendingclub.csv


爱数课实验 | 金融贷款数据可视化_缺失值_02

1. 数据读取与预处理

本案例主要背景为贷款情况审查。银行可以通过个人贷款状况对个人信用进行分类,从而更好地避免金融诈骗的发生。本案例所选的数据集是来自LendingClub中统计的2018年第四季度的借贷数据,随机删除了约40%的贷款记录。

数据集共有70000行,128列。由于列过多,此处简单列举几个重要列的含义作为参考。

对应的所有特征的具体含义可以查看源数据网页中的DATA DICTIONARY。

列名

含义说明

loan_status

贷款的当前状态

grade

信用证指定贷款等级

emp_title

借款人的职业

annual_inc

借款人自行申报的年收入

addr_state

借款人所处的国家或地区

int_rate

贷款利率

installment

如果贷款发放,借款人每月所需要还款的数额

sub_grade

信用证指定贷款基础

emp_length

就业年限(年)。可能的值介于0和10之间,其中0表示一年以下,10表示十年或十年以上

home_ownership

借款人在登记期间提供的或从信贷报告中获得的房屋所有权状况。其值为:租金、自有、抵押、其他

hardship_payoff_balance_amount

困难计划开始日期的收支差额

hardship_last_payment_amount

截至困难计划开始日期的最后一笔付款金额

disbursement_method

借款人获得贷款的方式。可能的值是:现金,直接支付

avg_cur_bal

所有账户的当前平均余额

installment

如果贷款发放,借款人所欠的每月付款

loan_amnt

借款人申请贷款的金额

1.1 数据导入

使用Pandas中的​​read_csv()​​​函数可以读取csv文件,结果会保存为一个DataFrame或Series对象,调用使用DataFrame或Series对象的​​head()​​方法查看可以查看前n行数据,默认为5。

## 导入基础类库
import pandas as pd
import numpy as np
data = pd.read_csv("./dataset/lendingclub.csv") #读取数据
data.head(5)#查看数据前五行

爱数课实验 | 金融贷款数据可视化_缺失值_03

从数据的前五行可以看出,共有128列数据,其中有很多数据列存在空值等情况,在对数据进行可视化分析之前,先对数据进行简单的清洗。

1.2 数据清洗

查看数据集中缺失值占所在列中的比例。由于数据集列数较多所以我们只显示缺失比例排名前10的列以及对应的比例。

check_null = data.isnull().sum().sort_values(ascending=False)/float(len(data)) 
print(check_null[:10])#输出前10

爱数课实验 | 金融贷款数据可视化_数据集_04

可以看到,数据中很多列的缺失值比例为 100% ,因此删除掉缺失值比例大于 50% 的列。对剩下仍有缺失值的列进行后值向前填补。

thresh_count = len(data)*0.5 
data.dropna(thresh=thresh_count, axis=1, inplace=True) #只保留至少有tresh_count个非NAN值的列
data.fillna(method="bfill",inplace=True)#bfill:后值向前填补
data.isnull().sum().sum()#查看数据有无缺失值

0

填补完毕后查看是否存在缺失值,发现填补完的数据集没有缺失值。

2.数据可视化分析

我们将利用Python中的绘图库如Matplotlib,Seaborn等通过绘图的方式对数据进行可视化分析。

#导入Matplotlib库
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

plt.rcParams['font.sans-serif']=['SimHei']# 正常显示中文
%config InlineBackend.figure_format = 'svg'#让图表变成矢量形式,显示更清晰

2.1 贷款状态柱状图

使用Seaborn库中​​countplot​​​函数绘制贷款状态​​loan_status​​​的柱状图。使用​​figure​​​函数设置图形大小,​​figsize​​​参数设置图形长宽大小,​​dpi​​参数设置图形分辨率。

fig =plt.figure(figsize=(7,5),dpi= 100)
sns.countplot(x='loan_status',data=data,palette='Set2')
plt.xticks(rotation=15)#rotation:旋转度数
plt.title("贷款状态柱状图" ,fontsize=13)#设置标题
plt.xlabel("贷款状态" ,fontsize = 10)#设置x轴标签
plt.ylabel("数量" ,fontsize=10)#设置y轴标签

爱数课实验 | 金融贷款数据可视化_缺失值_05

贷款状态柱状图,可以看出贷款状态为Current占绝大多数,其次是Fully Paid,说明绝大多数的用户的贷款状态为正常状态。

2.2 信用证贷款等级饼图

饼图可以直观的反映不同取值所占比例大小。例如信用证贷款等级​​grade​​​特征,可以通过​​pie​​​函数绘制不同信用证贷款等级​​grade​​​下的样本数量比例。​​explode​​​参数设置饼图中每一块离开中心的距离,​​labels​​​参数为(每一块)饼图外侧显示的说明文字,​​autopct​​​参数控制饼图内百分比数值格式的设置,例如​​%1.1f%%​​​表示仅显示小数点后一位,​​shadow​​参数设置饼图是否存在阴影。

plt.figure(figsize=(7,5), dpi= 100)
plt.pie(data['grade'].value_counts(),labels=data['grade'].value_counts().index,explode=None,autopct='%1.1f%%',shadow=True,startangle=50)
plt.axis('equal')
plt.title("信用证贷款等级饼状图",fontsize = 13) #设置标题

爱数课实验 | 金融贷款数据可视化_缺失值_06

从信用证贷款等级饼状图可以看出,贷款等级共有七个,贷款等级A表示贷款等级高,G表示贷款等级低。大部分借款人的信用等级都比较高,处于A、B等级的借款人比例超过50%。只有极少数人的贷款等级为F和G。

2.3 不同贷款等级下的贷款异常率条形图

我们还可以更进一步的显示离散型特征在另外特征上的样本数量情况。例如绘制不同信用证贷款等级​​grade​​​下的贷款状态​​loan_status​​异常率条形图。

针对​​loan_status​​​的6种取值,将​​Current​​​和​​Fully Paid​​​设置为正常贷款状态True,其余设置为非正常贷款状态False。绘制不同贷款等级下的贷款异常率条形图。利用Seaborn库的​​barplot​​函数绘制,其中坐标轴X轴代表贷款异常率,Y轴代表贷款等级。

data['loan_status_1'] = [(x=='Current' or x =='Fully Paid') for x in data['loan_status']]
print (data['loan_status_1'].value_counts())

爱数课实验 | 金融贷款数据可视化_缺失值_07

grade_rate = data.groupby('grade')['loan_status_1'].apply(lambda x:(len(x)-x.sum())/len(x))
fig = plt.figure(figsize=(7,5))
sns.barplot(x=grade_rate.values, y=grade_rate.index, palette="Set3")
plt.title('不同贷款等级下的贷款异常率条形图',fontsize=13)#设置标题
plt.xlabel('贷款异常率',fontsize=10)#设置X轴标签
plt.ylabel('贷款等级',fontsize=10)#设置Y轴标签
plt.box(False)

爱数课实验 | 金融贷款数据可视化_缺失值_08

可以从上图中看出,贷款等级为A的贷款异常率最低,贷款等级为G的,贷款异常率最高。随着信用证贷款等级​​grade​​​的递减,贷款状态​​loan_status​​的非正常状态所占比例逐渐增大,即允许发放贷款的比例越来越低。说明贷款等级与贷款状态相关,贷款等级越高,贷款异常率就越低,贷款等级越低,贷款异常率就越高。

2.4 平均收入随工作年限折线图

折线图可以很好的反映特征之间的变化趋势,例如不同就业年限​​emp_length​​​的借款人的平均年收入(​​annual_inc​​​)趋势。首先,由于​​emp_title​​​特征值大小写不分明,为了更加准确汇总​​emp_title​​的种类,统一为小写字母。然后,获取不同就业年限对应的平均年收入。

data['emp_title'] = [str(x).lower() for x in data['emp_title']]
emp_len_list = ['< 1 year','1 year','2 years','3 years','4 years','5 years','6 years','7 years','8 years','9 years','10+ years']
avg_inc_list = []
for emp_len in emp_len_list:
avg_inc_list.append(data[data['emp_length'] == emp_len]['annual_inc'].mean())

绘制折线图。利用Seaborn库的​​lineplot​​​函数绘制平均收入随工作年限折线图,其中折线图X、Y轴分别表示​​emp_len_list​​​和​​avg_inc_list​​。

plt.figure(figsize=(7,5))
sns.lineplot(x=emp_len_list, y=avg_inc_list)
plt.xticks(rotation = 20)
plt.title('平均收入随工作年限折线图',fontsize=13)#设置标题
plt.xlabel('工作年限',fontsize=10)#设置X轴标签
plt.ylabel('平均收入',fontsize=10)#设置Y轴标签

爱数课实验 | 金融贷款数据可视化_数据集_09

从上图中,可以看出工作年限为一年的平均收入最低,平均年收入并不绝对随就业年限的增加而增加。但平均收入总体上随着工作年限的增加而成上升的趋势。

2.5 不同贷款状态下当前平均余额点图

点图代表散点图位置的数值变量的中心趋势估计,并使用误差线提供关于该估计的不确定性的一些指示。例如利用​​pointplot​​​函数可以绘制出不同贷款状态​​loan_status_1​​​的当前平均余额​​avg_cur_bal​​的点图。

plt.figure(figsize=(7,5))
sns.pointplot(x="loan_status_1",y="avg_cur_bal",data=data)
plt.title('不同贷款状态下当前平均余额点图',fontsize=13)#设置标题
plt.xlabel('贷款状态',fontsize=10)#设置X轴标签
plt.ylabel('当前平均余额',fontsize=10)#设置Y轴标签

爱数课实验 | 金融贷款数据可视化_数据_10

从上图中看出,处于正常贷款状态下的借款人的平均余额高于贷款异常状态下的平均余额,并且正常贷款状态下的借款人的余额分布更为集中平均。说明贷款状态也与用户当前平均余额有关系。

2.6 不同贷款等级、贷款状态下的平均余额小提琴图

小提琴图用于显示数据分布及其概率密度。这种图表结合了箱形图和密度图的特征,主要用来显示数据的分布形状。例如使用​​violinplot()​​​函数绘制不同信用贷款等级​​grade​​​的人处在不同贷款状态​​loan_status_1​​​下的当前平均余额​​avg_cur_bal​​的分布情况。

plt.figure(figsize=(7,5))
sns.violinplot(x='grade',y='avg_cur_bal',hue='loan_status_1',split=True,data=data)
plt.title('不同贷款等级、贷款状态下的平均余额小提琴图',fontsize=13)#设置标题
plt.xlabel('贷款等级',fontsize=10)#设置X轴标签
plt.ylabel('当前平均余额',fontsize=10)#设置Y轴标签

爱数课实验 | 金融贷款数据可视化_数据集_11

可以看到贷款等级为B的当前平均余额最高,贷款等级为G的当前平均余额最低。总体来说,贷款等级高的当前平均余额要高于贷款等级低的当前平均余额。并且贷款等级高的贷款状态要优于贷款等级低的贷款状态。

2.7 贷款用户每月所需付款直方图

直方图观察特征取值的分布情况。例如​​distplot​​​函数绘制贷款用户所需的每月付款​​installment​​的直方图。

plt.figure(figsize=(7,5))
sns.distplot(data['installment'],bins=10)
plt.title('贷款用户每月所需付款直方图',fontsize=13)#设置标题
plt.xlabel('每月所需付款金额',fontsize=10)#设置X轴标签
plt.ylabel('比例',fontsize=10)#设置Y轴标签

爱数课实验 | 金融贷款数据可视化_数据_12

从上图可以看到贷款用户每月所需付款从0元到1750元,每月所需还款金额集中分布在0-750元之间,每月还款超过1000元的人所占的比例很少。

2.8 热力图

利用热力图可以看数据集里多个特征两两间的相似度。可以使用​​corr​​​函数获得数据的相关性矩阵,利用​​heatmap​​​函数绘制热力图。由于特征过多,故仅显示贷款金额​​loan_amnt​​​、每月所需付款金额​​installment​​​、当前平均余额​​avg_cur_bal​​​、平均收入​​annual_inc​​​特征的相关性热力图。为了更加直观的显示相关性的大小,可以设置​​annot​​​参数为True,直接在方格中显示两两特征的相关性大小,​​fmt​​​参数设置相关性数值的格式,如​​fmt='.2f'​​表示仅显示小数点后两位。

plt.figure(figsize=(7,5))
data_ = data[['loan_amnt', 'installment','avg_cur_bal','annual_inc']]
sns.heatmap(data_.corr(),fmt='.2f',annot=True)
plt.title('热力图',fontsize=13)#设置标题

爱数课实验 | 金融贷款数据可视化_数据集_13

从上图看出,借款人每月还款金额(​​installment​​​)与借款数目(​​loan_amnt​​)成强正相关性,其余特征也都或多或少呈一定程度的正相关性。

爱数课(iDataCourse)是一个面向院校的大数据和人工智能课程和资源平台。平台提供权威的课程资源、数据资源、案例实验资源,助力院校大数据和人工智能专业建设,课程建设和师资能力建设。