【数据挖掘】金融风控 Task02 数据分析
学习地址:https: //github.com/datawhalechina/team-learning-data-mining/tree/master/FinancialRiskControl
天池竞赛地址:https://tianchi.aliyun.com/competition/entrance/531830/introduction
由于之前已经参与过数据分析的入门教程,一些基础的知识点不在重复记录
本次组队内容的优点在于其系统性,通过函数实现代码封装 及整体的处理思路都值得日后去借鉴
1. 探索性数据分析(EDA)概述
1. 1 探索性数据分析概念
探索性数据分析所谓探索性数据分析( Exploratory Data Analysis )以下简称EDA,是指对已有的数据( 特别是调查或观察得来的原始数据 )在尽量少的先验假定下进行探索通过作图、制表、方程拟合、计算特征量等手段探索数据的结构和规律的一种数据分析方法。
1.2 探索性数据分析目的
- 了解整个数据集的基本情况(缺失值,异常值),对数据集进行验证是否可以进行接下来的机器学习或者深度学习建模。
- 了解变量间的相互关系,变量与预测值之间的存在关系。
- 为特征工程做准备
1.3 探索性数据分析(EDA)与传统统计分析(Classical Analysis)的区别
-
传统的统计分析方法通常是
先假设样本服从某种分布,然后把数据套入假设模型再做分析
。但由于多数数据并不能满足假设的分布,因此,传统统计分析结果常常不能让人满意。 -
探索性数据分析方法
注重数据的真实分布,强调数据的可视化
,使分析者能一目了然看出数据中隐含的规律,从而得到启发,以此帮助分析者找到适合数据的模型。“探索性”是指分析者对待解问题的理解会随着研究的深入不断变化。
传统数据分析步骤
2. 金融风控实战
参数表,已根据本节分析所得结果进行描述补充
变量 | 含义 | 数据量及类型 | 类型 |
---|---|---|---|
id | 为贷款清单分配的唯一信用证标识 | 800000 non-null int64 | 连续型数值特征 |
loanAmnt | 贷款金额 | 800000 non-null float64 | 连续型数值特征 |
term | 贷款期限(year) | 800000 non-null int64 | 离散型数值特征 |
interestRate | 贷款利率 | 800000 non-null float64 | 连续型数值特征 |
installment | 分期付款金额 | 800000 non-null float64 | 连续型数值特征 |
grade | 贷款等级 | 800000 non-null object | 类别特征:用A、B、C、D、E、F、G表示的 |
subGrade | 贷款等级之子级 | 800000 non-null object | 类别特征:每类有五个子类用如A1、A2…A5表示 |
employmentTitle | 就业职称 | 799999 non-null float64 | 连续型数值特征 :用一串编码的数字来表示的 |
employmentLength | 就业年限(年) | 753201 non-null object |
类别特征:格式为如2 year |
homeOwnership | 借款人在登记时提供的房屋所有权状况 | 800000 non-null int64 | 有0、1、2、3、4、5六种 |
annualIncome | 年收入 | 800000 non-null float64 | 连续型数值特征 |
verificationStatus | 验证状态 | 800000 non-null int64 | 有0、1、2三种 |
issueDate | 贷款发放的月份 | 800000 non-null object | 非数值特征:2014-07-01形式 |
isDefault | 是否违约 | 0或者1 | |
purpose | 借款人在贷款申请时的贷款用途类别 | 800000 non-null int64 | 离散型数值特征:0~13 |
postCode | 借款人在贷款申请中提供的邮政编码的前3位数字 | 799999 non-null float64 | 连续型数值特征 |
regionCode | 地区编码 | 800000 non-null int64 | 连续型数值特征 |
dti | 债务收入比 | 799761 non-null float64 |
连续型数值特征 |
delinquency_2years | 借款人过去2年信用档案中逾期30天以上的违约事件数 | 800000 non-null float64 | 连续型数值特征 |
ficoRangeLow | 借款人在贷款发放时的fico所属的下限范围 | 800000 non-null float64 | 连续型数值特征 |
ficoRangeHigh | 借款人在贷款发放时的fico所属的上限范围 | 800000 non-null float64 | 连续型数值特征 |
openAcc | 借款人信用档案中未结信用额度的数量 | 800000 non-null float64 | 连续型数值特征 |
pubRec | 贬损公共记录的数量 | 800000 non-null float64 | 连续型数值特征 |
pubRecBankruptcies | 公开记录清除的数量 | 799595 non-null float64 |
连续型数值特征 |
revolBal | 信贷周转余额合计 | 800000 non-null float64 | 连续型数值特征 |
revolUtil | 循环额度利用率,或借款人使用的相对于所有可用循环信贷的信贷金额 | 799469 non-null float64 | 连续型数值特征 |
totalAcc | 借款人信用档案中当前的信用额度总数 | 800000 non-null float64 | 连续型数值特征 |
initialListStatus | 贷款的初始列表状态 | 800000 non-null int64 | 离散型数值特征:0或者1 |
applicationType | 表明贷款是个人申请还是与两个共同借款人的联合申请 | 800000 non-null int64 | 离散型数值特征 |
earliesCreditLine | 借款人最早报告的信用额度开立的月份 | 800000 non-null object | 非数值型特征:Aug-2001 |
title | 借款人提供的贷款名称 | 799999 non-null float64 | 离散型数值特征:0或1 |
policyCode | 公开可用的策略_代码=1新产品不公开可用的策略_代码=2 | 800000 non-null float64 | 离散型数值特征 |
n0 | 759730 non-null float64 |
连续型数值特征 | |
n1 | 759730 non-null float64 |
连续型数值特征 | |
n2 | 759730 non-null float64 |
连续型数值特征 | |
n2.1 | 759730 non-null float64 |
连续型数值特征 | |
n4 | 766761 non-null float64 |
连续型数值特征 | |
n5 | 759730 non-null float64 |
连续型数值特征 | |
n6 | 759730 non-null float64 |
连续型数值特征 | |
n7 | 759730 non-null float64 |
连续型数值特征 | |
n8 | 759729 non-null float64 |
连续型数值特征 | |
n9 | 759730 non-null float64 |
连续型数值特征 | |
n10 | 766761 non-null float64 |
连续型数值特征 | |
n11 | 730248 non-null float64 |
离散型数值特征 | |
n12 | 759730 non-null float64 |
离散型数值特征 | |
n13 | 759730 non-null float64 |
连续型数值特征 | |
n14 | 759730 non-null float64 |
连续型数值特征 |
2.1 导入所需要的库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
"""
python通过调用warnings模块中定义的warn()函数来发出警告。
通过下面两行代码来忽略警告
"""
import warnings
warnings.filterwarnings('ignore')
2.2 文件读取
训练集为47列,测试集为48列,具体包含内容见上面
#导入训练集
data_train=pd.read_csv('./train.csv')
data_train.head()
#导入测试集
data_test_a=pd.read_csv('./testA.csv')
2.2.1 TSV和CSV区别
- TSV是用制表符
(Tab,'\t')
作为字段值的分隔符; - CSV是用半角逗号
(',')
作为字段值的分隔符;
2.2.2 读取大文件
- 对于较大的文件,可以通过nrows来实现部分读取
#通过nrows参数,来设置读取文件的前多少行,nrows是一个大于等于0的整数。
data_train_sample = pd.read_csv("./train.csv",nrows=5)
- 通过chunksize实现分块读取
#设置chunksize参数,来控制每次迭代数据的大小
chunker = pd.read_csv("./train.csv",chunksize=100)
for item in chunker:
print(type(item))
#<class 'pandas.core.frame.DataFrame'>
print(len(item))
#100
2.2.3 通过os.getcwd()查看当前工作目录
pandas读取数据时相对路径载入报错时,可使用os.getcwd()
查看当前工作目录。
2.3 数据总体了解
- 查看数据形状
df.shape
##查看测试集的shape
data_test_a.shape
#(200000, 48)
##查看训练集的shape 可以发现训练集是测试集的四倍
data_train.shape
#(800000, 47)
- 查看列名
df.columns
data_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'],
dtype='object')
- info()查看数据类型
data_train.info()
- 利用
describe()
粗略的查看一些统计性数据
#利用describe()粗略的查看数据集的各个特征的一些基本统计量
data_train.describe()
- 使用
head()
和tail()
查看前n行和后n行数据
data_train.head(3).append(data_train.tail(3))
2.4 查看数据中的缺失值,唯一值等
2.4.1 查看缺失值
【注意】此处用了format的几种表示形式,注意第一种和python的版本有关系,低于3.7版本的无法使用,可以通过import sys sys.version
来查看自己的版本
#字符串前加f作用相当于format
#isnull为空显示true不为空显示false
#any函数用法https://www.cjavapy.com/article/297/ 返回为真的
print(f'共有 {data_train.isnull().any().sum()}列存在缺失')
#字符串前加f作用相当于format
#isnull为空显示true不为空显示false
#any函数用法https://www.cjavapy.com/article/297/ 返回为真的
print('存在缺失的列的个数为:{}'.format(data_train.isnull().any().sum()))
print('存在缺失的列的个数为:%s' % format(data_train.isnull().any().sum()))
经过上面操作可以发现训练集有22列特征存在缺失值,可以进一步的去统计下那些特征的缺失值大于50%,对于缺失大于50%的特征在后续的处理中我们可以考虑直接舍弃
#data_train.isnull().sum()统计每列缺失值的个数
#data_train.isnull().sum()/len(data_train)缺失值个数占总量的多少
have_null_fea_dict=(data_train.isnull().sum()/len(data_train)).to_dict()
#创建一个字典来统计
fea_null_moreThanHalf={
}
#Python 字典(Dictionary) items() 函数以列表返回可遍历的(键, 值) 元组数组
for key,value in have_null_fea_dict.items():
if value>0.5:
fea_null_moreThanHalf[key]=value
fea_null_moreThanHalf
结果为{}
,即在本训练集中没有缺失超过50%的特征
通过可视化直观缺失特征及缺失率
# nan可视化
missing=data_train.isnull().sum()/len(data_train) #计算缺失率
missing=missing[missing>0] #计算缺失率大于0的,即存在缺失的
#重新排序
missing.sort_values(inplace=True)
#绘制条形图
missing.