数据挖掘之金融风控-贷款违约预测 02数据分析
数据挖掘之金融风控-贷款违约预测 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 >