数据挖掘之金融风控-贷款违约预测 02数据分析
数据挖掘之金融风控-贷款违约预测 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.数据概况 2.数据读取 3.分类指标评价计算 摘要 在实践中学,很高兴有这次机会,与志同道合的小伙伴一起学习,本次主要通过天池实际比赛项目学习数据 ...
- 零基础入门金融风控-贷款违约预测-机器学习-数据分析
零基础入门金融风控-贷款违约预测 一.赛题数据 赛题以预测用户贷款是否违约为任务,数据集报名后可见并可下载,该数据来自某信贷平台的贷款记录,总数据量超过120w,包含47列变量信息,其中15列为匿名变 ...
- 数据挖掘实践(金融风控-贷款违约预测)(二):数据分析
数据挖掘实践(金融风控-贷款违约预测)(二):数据分析 目录 数据挖掘实践(金融风控-贷款违约预测)(二):数据分析 1.引言 2.基本知识点 2.1缺失值(Missing data) 2.1.1缺失 ...
- 数据挖掘实践(金融风控-贷款违约预测)(三):特征工程
数据挖掘实践(金融风控-贷款违约预测)(三):特征工程 目录 数据挖掘实践(金融风控-贷款违约预测)(三):特征工程 1.引言 2.特征预处理 2.1缺失值填充 2.2时间格式处理 2.3类别特征处理 ...
- 数据挖掘实践(金融风控-贷款违约预测)(五):模型融合
数据挖掘实践(金融风控-贷款违约预测)(五):模型融合 目录 数据挖掘实践(金融风控-贷款违约预测)(五):模型融合 1.引言 2.模型融合的方式 2.1 Voting/Averaging 2.2 B ...
- 基于机器学习与深度学习的金融风控贷款违约预测
基于机器学习与深度学习的金融风控贷款违约预测 目录 一.赛题分析 1. 任务分析 2. 数据属性 3. 评价指标 4. 问题归类 5. 整体思路 二.数据可视化分析 1. 总体数据分析 2. 数值型数 ...
- 「机器学习」天池比赛:金融风控贷款违约预测
一.前言 1.1 赛题背景 赛题以金融风控中的个人信贷为背景,要求选手根据贷款申请人的数据信息预测其是否有违约的可能,以此判断是否通过此项贷款,这是一个典型的分类问题. 任务:预测用户贷款是否违约 比 ...
- 金融风控-贷款违约预测项目记录
一.项目介绍 阿里天池数据挖掘学习赛:贷款违约预测 学习赛主要为初学者准备的,论坛里有详细的项目建模过程.这里,仅记录一下自己在做这个项目时的一些思路. 二.数据分析 这里的数据分析过程主要参考有: ...
- 1.天池金融风控-贷款违约预测新人赛之预备知识
比赛链接:金融风控-贷款违约预测 因为这是一个金融风控专题的数据挖掘实战,在开始之前先引入一些预备知识. 1.预备知识 1.1预测指标 本次竞赛用AUC作为评价指标,AUC为ROC曲线下与坐标轴围成的 ...
最新文章
- CBitmapButton的使用(转)
- Oracle CBO 与 RBO
- 优惠劵系统库存设计浅谈
- mysql事物 总结_Mysql事务总结
- Vue会了吗?来认识一下React吧(上)
- Centos 搭建activemq
- form字体和颜色java安卓开发_Android 修改App中默认TextView的字体和颜色
- 双剑合璧————Spring Boot + Mybatis Plus
- 数据库连接串你知道多少
- 用深度学习来解析梦境中出现的物体
- 微软网站提供的8本英文原版书电子版
- vba窗体 点击增加减少_EXCEL之VBA-窗体实例多页控件的基础应用
- 串口波形显示软件SerialChart的使用
- dataset lfw
- 计算机网络第七版 部分详细答案
- 股权比例的3种黄金分割线
- 电商商品爬虫,亚马逊amazon采集源码
- 机器学习基础(林軒田)笔记之七
- 把握数字经济时代新机遇:银行业加快推进数字化转型
- angular RxJs