数据挖掘之金融风控-贷款违约预测 02数据分析

  • 数据挖掘之金融风控-贷款违约预测 02数据分析
    • 1. 学习目标
    • 2. 学习内容
    • 3. 学习过程
      • 3.1 导入库并读取数据集
      • 3.2 数据集基本信息
      • 3.3 查看缺失值、唯一值等
      • 3.4 查看特征数据类型
        • 3.4.1 数值型分析
        • 3.4.2 非数值型分析
      • 3.5 变量分布可视化
        • 3.5.1 单个变量分析
        • 3.5.2 不同变量间分析
      • 3.6 时间格式处理及查看
      • 3.7 透视图查看
      • 3.8 pandas_profiling生成数据报告
    • 4. 总结
    • 5. 参考资料地址

数据挖掘之金融风控-贷款违约预测 02数据分析

1. 学习目标

  • 学习如何对数据集整体概况进行分析,包括数据集的基本情况(缺失值,异常值)
  • 学习了解变量间的相互关系、变量与预测值之间的存在关系
  • 完成相应学习打卡任务

2. 学习内容

  • 数据总体了解:

    • 读取数据集并了解数据集大小,
    • 原始特征维度; 通过info熟悉数据类型;
    • 粗略查看数据集中各特征基本统计量;
  • 缺失值和唯一值:
    • 查看数据缺失值情况
    • 查看唯一值特征情况
  • 深入数据-查看数据类型
    • 类别型数据
    • 数值型数据
      • 离散数值型数据
      • 连续数值型数据
  • 数据间相关关系
    • 特征和特征之间关系
    • 特征和目标变量之间关系
  • 用pandas_profiling生成数据报告

3. 学习过程

3.1 导入库并读取数据集

# 导入所需的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import datetime
import warnings
warnings.filterwarnings('ignore')
plt.rcParams['font.sans-serif'] = 'SimHei'   ## 设置中文显示
plt.rcParams['axes.unicode_minus']=False       #解决负数坐标显示问题
%matplotlib inline
fdata_train = pd.read_csv('train .csv')
# nrows可以设置读取多少行的数,适用于特别大数据的场景,也可以分块读取
fdata_testA = pd.read_csv('testA.csv')
# 分块读取
#设置chunksize参数,来控制每次迭代数据的大小
chunker = pd.read_csv("train .csv",chunksize=5)
for item in chunker:print(type(item))print(len(item))# <class 'pandas.core.frame.DataFrame'># 5

这里读取文件采用相对路径,保存在jupyter上,绝对路径可以如下方式读取:

ndata = pd.read_csv(r'D:\financialpredict\train .csv')

3.2 数据集基本信息

fdata_train.shape,fdata_testA.shape
# ((800000, 47), (200000, 48))
# 查看训练集与测试集的不同列
col_train = fdata_train.columns.tolist()
col_testA = fdata_testA.columns.tolist()
# 找出不同列
differentKey_testA = [x for x in col_testA if x not in col_train]
differentKey_testA
# ['n2.2', 'n2.3'],训练集中没有,测试集中有的变量
differentKey_train = [x for x in col_train if x not in col_testA]
differentKey_train
# ['isDefault'],训练集中有,测试集中没有的变量,此处为目标标签值
fdata_train.columns
'''
Index(['id', 'loanAmnt', 'term', 'interestRate', 'installment', 'grade','subGrade', 'employmentTitle', 'employmentLength', 'homeOwnership','annualIncome', 'verificationStatus', 'issueDate', 'isDefault','purpose', 'postCode', 'regionCode', 'dti', 'delinquency_2years','ficoRangeLow', 'ficoRangeHigh', 'openAcc', 'pubRec','pubRecBankruptcies', 'revolBal', 'revolUtil', 'totalAcc','initialListStatus', 'applicationType', 'earliesCreditLine', 'title','policyCode', 'n0', 'n1', 'n2', 'n2.1', 'n4', 'n5', 'n6', 'n7', 'n8','n9', 'n10', 'n11', 'n12', 'n13', 'n14', 'issueDatedt'],dtype='object')'''

各个变量的含义:

变量 描述 数据类型 备注
id 为贷款清单分配的唯一信用证标识 int64
loanAmnt 贷款金额 float64
term 贷款期限(year) int64
interestRate 贷款利率 float64
installment 分期付款金额 float64
grade 贷款等级 object 'A','B','C','D','E','F','G'风险等级
subGrade 贷款等级之子级 object 贷款等级中每一类各分五个等级
employmentTitle 就业职称 float64
employmentLength 就业年限(年) object
homeOwnership 借款人在登记时提供的房屋所有权状况 int64 0,1,2,3,4,5六种情况
annualIncome 年收入 float64
verificationStatus 验证状态 int64 0,1,2三种状态
issueDate 贷款发放的月份 object
purpose 借款人在贷款申请时的贷款用途类别 int64 14种类别
postCode 借款人在贷款申请中提供的邮政编码的前3位数字 float64
regionCode 地区编码 int64
dti 债务收入比 float64
delinquency_2years 借款人过去2年信用档案中逾期30天以上的违约事件数 float64
ficoRangeLow 借款人在贷款发放时的fico所属的下限范围 float64 美国个人评分系统计算的信用分数的下限
ficoRangeHigh 借款人在贷款发放时的fico所属的上限范围 float64 美国个人评分系统计算的信用分数的下限
openAcc 借款人信用档案中未结信用额度的数量 float64
pubRec 贬损公共记录的数量 float64
pubRecBankruptcies 公开记录清除的数量 float64
revolBal 信贷周转余额合计 float64
revolUtil 循环额度利用率,或借款人使用的相对于所有可用循环信贷的信贷金额 float64
totalAcc 借款人信用档案中当前的信用额度总数 float64
initialListStatus 贷款的初始列表状态 int64
applicationType 表明贷款是个人申请还是与两个共同借款人的联合申请 int64 0,1值表示
earliesCreditLine 借款人最早报告的信用额度开立的月份 object
title 借款人提供的贷款名称 float64
policyCode 公开可用的策略_代码=1新产品不公开可用的策略_代码=2 float64 仅一个值,为1
n系列匿名特征 匿名特征n0-n14,为一些贷款人行为计数特征的处理 float64
isDefault 是否违约 int64 违约=1,未违约=0
fdata_train.info()

以下截取部分结果

fdata_train.describe()

仅显示部分

3.3 查看缺失值、唯一值等

# 查看缺失值
print(f'There are {fdata_train.isnull().any().sum()} columns in train dataset with missing values.')
# There are 22 columns in train dataset with missing values.
print(f'There are {fdata_testA.isnull().any().sum()} columns in train dataset with missing values.')
# There are 21 columns in train dataset with missing values.
# 查看缺失值大于50%的特征
nullrate_fea_dict = (fdata_train.isnull().sum()/len(fdata_train)).to_dict() # 每个特征的空值占比,转换为字典
fea_null_morethanHalf = {} # 缺失值超过50%的特征
for key,value in nullrate_fea_dict.items():if value > 0.5:fea_null_moreThanHalf[key] = value
fea_null_morethanHalf
# result:{} 为空,没有缺失值超过50%的特征
# 可视化
missing = fdata_train.isnull().sum()/len(fdata_train) # 缺失值比例
missing = missing[missing > 0]  # 比例大于0
missing.sort_values(inplace=True) # 排序
missing.plot.bar() # 显示
missing

含缺失值特征可视化:


含缺失值的特征与缺失率:

  • 在横向上,如果某些样本大部分特征缺失,且样本足够的情况下,可以考虑删除
  • 在纵向上,如果某些列的缺失值数量过大,可以考虑删除,这些列对目标标签的影响几乎不起作用。如果缺失值很小可以考虑填充。
# 查看唯一值
onevalue_fea = [col for col in fdata_train.columns if fdata_train[col].nunique() <= 1]
onevalue_fea_testA = [col for col in fdata_testA.columns if fdata_testA[col].nunique() <= 1]
onevalue_fea,onevalue_fea_testA
# (['policyCode'], ['policyCode'])
fdata_train['policyCode'].value_counts()
# 唯一值为1
print(f'There are {len(onevalue_fea)} columns in train dataset with one unique value.')
print(f'There are {len(onevalue_fea_testA)} columns in test dataset with one unique value.')
# There are 1 columns in train dataset with one unique value.
# There are 1 columns in test dataset with one unique value.

总结:在训练集中又22列特征有缺失值。测试集中有21列特征有缺失值,缺失值不超过50%。在训练集与测试集中都有一个唯一值的特征,为policyCode,值为1。

3.4 查看特征数据类型

# 区分数值型与非数值型特征
numerical_fea = list(fdata_train.select_dtypes(exclude=['object']).columns)
category_fea = list(filter(lambda x: x not in numerical_fea,list(fdata_train.columns)))
category_fea # 非数值型特征
# ['grade', 'subGrade', 'employmentLength', 'issueDate', 'earliesCreditLine']

3.4.1 数值型分析

数值型特征另外分为连续型与离散型

# 区别数值型中的连续型与离散型
def get_numerical_serial_fea(data,feas):numerical_serial_fea = []numerical_noserial_fea = []for fea in feas:temp = data[fea].nunique()if temp <= 10:numerical_noserial_fea.append(fea)continuenumerical_serial_fea.append(fea)return numerical_serial_fea,numerical_noserial_fea
numerical_serial_fea,numerical_noserial_fea = get_numerical_serial_fea(fdata_train,numerical_fea)
numerical_noserial_fea # 离散型
# ['term','homeOwnership', 'verificationStatus','isDefault','initialListStatus', 'applicationType','policyCode', 'n11', 'n12']

数值型特征有42列,其中连续型特征有33列,离散型特征有9列。

查看离散型特征:

fdata_train['term'].value_counts() # 贷款期限

3 606902
5 193098
Name: term, dtype: int64

fdata_train['homeOwnership'].value_counts() # 借款人在登记时提供的房屋所有权状况

0 395732
1 317660
2 86309
3 185
5 81
4 33
Name: homeOwnership, dtype: int64

fdata_train['verificationStatus'].value_counts() # 验证状态

1 309810
2 248968
0 241222
Name: verificationStatus, dtype: int64

fdata_train['initialListStatus'].value_counts() # 贷款的初始列表状态

0 466438
1 333562
Name: initialListStatus, dtype: int64

fdata_train['applicationType'].value_counts() # 表明贷款是个人申请还是两个人共同申请

0 784586
1 15414
Name: applicationType, dtype: int64

fdata_train['policyCode'].value_counts()

1.0 800000
Name: policyCode, dtype: int64

fdata_train['n11'].value_counts()

0.0 729682
1.0 540
2.0 24
4.0 1
3.0 1
Name: n11, dtype: int64

fdata_train['n12'].value_counts()

0.0 757315
1.0 2281
2.0 115
3.0 16
4.0 3
Name: n12, dtype: int64

离散型各数值有其对应的含义。

查看连续型特征的分布:

# 连续型
# 每个数据特征分布可视化
f = pd.melt(fdata_train, value_vars=numerical_serial_fea)
g = sns.FacetGrid(f, col="variable",col_wrap=2, sharex=False, sharey=False)
g = g.map(sns.distplot, "value")

注:运行sns.distplot时遇到一个问题,提示’Rectangle’ object has no property ‘normed’(解决办法:在安装目录下找到seaborn/distribution.py文件,大约214行处,修改hist_kws.setdefault(“normed”,norm_hist)为hist_kws.setdefault(“density”,norm_hist))

可视化结果如下:







查看特征是否符合正态分布,如果不符合正态分布,可以进行正态化处理,数值取对数、平方根等。
检验正态分布,可以stats.kstest,或者qqplot,查看qq图等。

# loanAmnt分布图
plt.figure(figsize=(16,12))
plt.suptitle('Transaction Values Distribution', fontsize=22)
plt.subplot(221)
sub_plot_1 = sns.distplot(fdata_train['loanAmnt'])
sub_plot_1.set_title("loanAmnt Distribuition", fontsize=18)
sub_plot_1.set_xlabel("")
sub_plot_1.set_ylabel("Probability", fontsize=15)plt.subplot(222)
sub_plot_2 = sns.distplot(np.log(fdata_train['loanAmnt']))
sub_plot_2.set_title("loanAmnt (Log) Distribuition", fontsize=18)
sub_plot_2.set_xlabel("")
sub_plot_2.set_ylabel("Probability", fontsize=15)

结果:


interestRate分布结果:

3.4.2 非数值型分析

# 非数值
category_fea
# ['grade', 'subGrade', 'employmentLength', 'issueDate', 'earliesCreditLine']
fdata_train['grade'].value_counts() # 贷款等级

B 233690
C 227118
A 139661
D 119453
E 55661
F 19053
G 5364
Name: grade, dtype: int64

fdata_train['subGrade'].value_counts() # 贷款等级之次级
fdata_train['employmentLength'].value_counts() # 就业年限
fdata_train['issueDate'].value_counts() # 贷款发放月份
fdata_train['earliesCreditLine'].value_counts() # 借款人最早报告的信用额度开立月份

3.5 变量分布可视化

3.5.1 单个变量分析

# 变量分布可视化
plt.figure(figsize=(8, 8))
sns.barplot(fdata_train["employmentLength"].value_counts(dropna=False)[:20],fdata_train["employmentLength"].value_counts(dropna=False).keys()[:20])
plt.show()

就业年限各个值分布

# 在违约与非违约顾客中贷款等级、就业年限各个值的分布情况
train_loan_fr = fdata_train.loc[fdata_train['isDefault'] == 1]
train_loan_nofr =fdata_train.loc[fdata_train['isDefault'] == 0]
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(15, 8))
train_loan_fr.groupby('grade')['grade'].count().plot(kind='barh', ax=ax1, title='Count of grade fraud')
train_loan_nofr.groupby('grade')['grade'].count().plot(kind='barh', ax=ax2, title='Count of grade non-fraud')
train_loan_fr.groupby('employmentLength')['employmentLength'].count().plot(kind='barh', ax=ax3, title='Count of employmentLength fraud')
train_loan_nofr.groupby('employmentLength')['employmentLength'].count().plot(kind='barh', ax=ax4, title='Count of employmentLength non-fraud')
plt.show()


从结果可知,在违约的样本中,贷款等级为C的最多,在非违约样本中,贷款等级为B的最多,且等级为A 的比违约中的数量多。违约与非违约样本中,就业年限超过10年的占大多数。

# 连续值在不同y值上的分布
fig, ((ax1, ax2)) = plt.subplots(1, 2, figsize=(15, 6))
fdata_train.loc[fdata_train['isDefault'] == 1] \['loanAmnt'].apply(np.log) \.plot(kind='hist',bins=100,title='Log Loan Amt - Fraud',color='r',xlim=(-3, 10),ax= ax1)
fdata_train.loc[fdata_train['isDefault'] == 0] \['loanAmnt'].apply(np.log) \.plot(kind='hist',bins=100,title='Log Loan Amt - Not Fraud',color='b',xlim=(-3, 10),ax=ax2)

# 违约与非违约贷款金额的比例
total = len(fdata_train)
total_amt = fdata_train.groupby(['isDefault'])['loanAmnt'].sum().sum() # 总贷款金额
plt.figure(figsize=(12,5))
plt.subplot(121)##1代表行,2代表列,所以一共有2个图,1代表此时绘制第一个图。
plot_tr = sns.countplot(x='isDefault',data=fdata_train) # data_train‘isDefault’这个特征每种类别的数量
plot_tr.set_title("Fraud Loan Distribution \n 0: good user | 1: bad user", fontsize=14)
plot_tr.set_xlabel("Is fraud by count", fontsize=16)
plot_tr.set_ylabel('Count', fontsize=16)
for p in plot_tr.patches:height = p.get_height()plot_tr.text(p.get_x()+p.get_width()/2.,height + 3,'{:1.2f}%'.format(height/total*100),ha="center", fontsize=15) percent_amt = (fdata_train.groupby(['isDefault'])['loanAmnt'].sum())
percent_amt
percent_amt = percent_amt.reset_index()
plt.subplot(122)
plot_tr_2 = sns.barplot(x='isDefault', y='loanAmnt',  dodge=True, data=percent_amt)
plot_tr_2.set_title("Total Amount in loanAmnt  \n 0: good user | 1: bad user", fontsize=14)
plot_tr_2.set_xlabel("Is fraud by percent", fontsize=16)
plot_tr_2.set_ylabel('Total Loan Amount Scalar', fontsize=16)
for p in plot_tr_2.patches:height = p.get_height()plot_tr_2.text(p.get_x()+p.get_width()/2.,height + 3,'{:1.2f}%'.format(height/total_amt * 100),ha="center", fontsize=15)

3.5.2 不同变量间分析

3.6 时间格式处理及查看

# 转化成时间格式  issueDateDT特征表示数据日期离数据集中日期最早的日期(2007-06-01)的天数
import datetime
fdata_train['issueDate'] = pd.to_datetime(fdata_train['issueDate'],format='%Y-%m-%d')
startdate = datetime.datetime.strptime('2007-06-01', '%Y-%m-%d')
fdata_train['issueDatedt'] = fdata_train['issueDate'].apply(lambda x: x-startdate).dt.days
fdata_train['issueDatedt'].head()

0 2587
1 1888
2 3044
3 2983
4 3196
Name: issueDatedt, dtype: int64

# 转化成时间格式
fdata_testA['issueDate'] = pd.to_datetime(fdata_testA['issueDate'],format='%Y-%m-%d')
startdate = datetime.datetime.strptime('2007-06-01', '%Y-%m-%d')
fdata_testA['issueDatedt'] = fdata_testA['issueDate'].apply(lambda x: x-startdate).dt.days
fdata_testA['issueDatedt'].head(3)

0 2587
1 2952
2 3410
Name: issueDatedt, dtype: int64

# 查看不同天数所有样本数
plt.hist(fdata_train['issueDatedt'], label='train');
plt.hist(fdata_testA['issueDatedt'], label='testA');
plt.legend();
plt.title('Distribution of issueDatedt dates');


其中训练集与测试集的日期有重叠。

3.7 透视图查看

#透视图 索引可以有多个,“columns(列)”是可选的,聚合函数aggfunc最后是被应用到了变量“values”中你所列举的项目上。
pivot = pd.pivot_table(fdata_train, index=['grade'], columns=['issueDatedt'], values=['loanAmnt'], aggfunc=np.sum)
pivot

3.8 pandas_profiling生成数据报告

import pandas_profiling
pfr = pandas_profiling.ProfileReport(fdata_train)
pfr.to_file("./example.html")

总体预览:


警告信息:


变量描述:

4. 总结

EDA(数据探索性分析)是了解数据的第一步,在熟悉分析过程中,需要先了解数据,熟悉数据的基本特征,了解数据是否有异常值,为特征工程做准备。通过简单的统计分析,可以知道各个特征变量的分布情况,以及各个变量之间的关系,利用工具进行数据可视化,更能直观感受数据的特征。

5. 参考资料地址

项目地址:https://github.com/datawhalechina/team-learning-data-mining/tree/master/FinancialRiskControl

比赛地址:https://tianchi.aliyun.com/competition/entrance/531830/introduction

数据挖掘之金融风控-贷款违约预测 02数据分析相关推荐

  1. 零基础入门数据挖掘之金融风控-贷款违约预测

    零基础入门数据挖掘之金融风控-贷款违约预测 摘要 1.数据概况 2.数据读取 3.分类指标评价计算 摘要 在实践中学,很高兴有这次机会,与志同道合的小伙伴一起学习,本次主要通过天池实际比赛项目学习数据 ...

  2. 零基础入门金融风控-贷款违约预测-机器学习-数据分析

    零基础入门金融风控-贷款违约预测 一.赛题数据 赛题以预测用户贷款是否违约为任务,数据集报名后可见并可下载,该数据来自某信贷平台的贷款记录,总数据量超过120w,包含47列变量信息,其中15列为匿名变 ...

  3. 数据挖掘实践(金融风控-贷款违约预测)(二):数据分析

    数据挖掘实践(金融风控-贷款违约预测)(二):数据分析 目录 数据挖掘实践(金融风控-贷款违约预测)(二):数据分析 1.引言 2.基本知识点 2.1缺失值(Missing data) 2.1.1缺失 ...

  4. 数据挖掘实践(金融风控-贷款违约预测)(三):特征工程

    数据挖掘实践(金融风控-贷款违约预测)(三):特征工程 目录 数据挖掘实践(金融风控-贷款违约预测)(三):特征工程 1.引言 2.特征预处理 2.1缺失值填充 2.2时间格式处理 2.3类别特征处理 ...

  5. 数据挖掘实践(金融风控-贷款违约预测)(五):模型融合

    数据挖掘实践(金融风控-贷款违约预测)(五):模型融合 目录 数据挖掘实践(金融风控-贷款违约预测)(五):模型融合 1.引言 2.模型融合的方式 2.1 Voting/Averaging 2.2 B ...

  6. 基于机器学习与深度学习的金融风控贷款违约预测

    基于机器学习与深度学习的金融风控贷款违约预测 目录 一.赛题分析 1. 任务分析 2. 数据属性 3. 评价指标 4. 问题归类 5. 整体思路 二.数据可视化分析 1. 总体数据分析 2. 数值型数 ...

  7. 「机器学习」天池比赛:金融风控贷款违约预测

    一.前言 1.1 赛题背景 赛题以金融风控中的个人信贷为背景,要求选手根据贷款申请人的数据信息预测其是否有违约的可能,以此判断是否通过此项贷款,这是一个典型的分类问题. 任务:预测用户贷款是否违约 比 ...

  8. 金融风控-贷款违约预测项目记录

    一.项目介绍 阿里天池数据挖掘学习赛:贷款违约预测 学习赛主要为初学者准备的,论坛里有详细的项目建模过程.这里,仅记录一下自己在做这个项目时的一些思路. 二.数据分析 这里的数据分析过程主要参考有: ...

  9. 1.天池金融风控-贷款违约预测新人赛之预备知识

    比赛链接:金融风控-贷款违约预测 因为这是一个金融风控专题的数据挖掘实战,在开始之前先引入一些预备知识. 1.预备知识 1.1预测指标 本次竞赛用AUC作为评价指标,AUC为ROC曲线下与坐标轴围成的 ...

最新文章

  1. CBitmapButton的使用(转)
  2. Oracle CBO 与 RBO
  3. 优惠劵系统库存设计浅谈
  4. mysql事物 总结_Mysql事务总结
  5. Vue会了吗?来认识一下React吧(上)
  6. Centos 搭建activemq
  7. form字体和颜色java安卓开发_Android 修改App中默认TextView的字体和颜色
  8. 双剑合璧————Spring Boot + Mybatis Plus
  9. 数据库连接串你知道多少
  10. 用深度学习来解析梦境中出现的物体
  11. 微软网站提供的8本英文原版书电子版
  12. vba窗体 点击增加减少_EXCEL之VBA-窗体实例多页控件的基础应用
  13. 串口波形显示软件SerialChart的使用
  14. dataset lfw
  15. 计算机网络第七版 部分详细答案
  16. 股权比例的3种黄金分割线
  17. 电商商品爬虫,亚马逊amazon采集源码
  18. 机器学习基础(林軒田)笔记之七
  19. 把握数字经济时代新机遇:银行业加快推进数字化转型
  20. angular RxJs

热门文章

  1. 关于百度地图最大层级聚合点鼠标覆盖弹出对话框需求实现
  2. 国家强制性灯具安全标准GB7000.1-2015
  3. TPM零知识学习八 —— tpm组件联调及API实例解析
  4. Oracle 中实现数据透视表的几种方法
  5. face_recognition配置与安装
  6. html+css完成一个静态网页
  7. 辨别是否中毒 小小总结
  8. 程序员悲催的爱情故事
  9. dnf服务器宕机维护公告,7月29日服务器例行维护更新公告
  10. 研究型论文和综述型论文