【数据挖掘】金融风控 Task02 数据分析

    1. 探索性数据分析(EDA)概述
      1. 1 探索性数据分析概念
    • 1.2 探索性数据分析目的
    • 1.3 探索性数据分析(EDA)与传统统计分析(Classical Analysis)的区别
    1. 金融风控实战
    • 2.1 导入所需要的库
    • 2.2 文件读取
      • 2.2.1 TSV和CSV区别
      • 2.2.2 读取大文件
      • 2.2.3 通过os.getcwd()查看当前工作目录
    • 2.3 数据总体了解
    • 2.4 查看数据中的缺失值,唯一值等
      • 2.4.1 查看缺失值
      • 2.4.2 查看唯一值
    • 2.5 查看数值特征与对象类型
      • 2.5.1 数值特征
      • 2.5.1.1 查看数值特征(是数值型还是类别型)
      • 2.5.1.2 划分数值型变量中的连续变量和离散型变量
      • 2.5.1.3 离散型变量分析
      • 2.5.1.4 连续型变量分析
      • 2.5.1.5 非数值型类别变量分析
    • 2.6 变量分布可视化
      • 2.6.1 单一变量分布可视化
      • 2.6.2 根据y值不同可视化x某个特征的分布
    • 2.7 时间数据处理及查看
    • 2.7 透视图
    • 2.8 使用pandas_profiling生成数据报告

学习地址: [ https: //github.com/datawhalechina/team-learning-data-
mining/tree/master/FinancialRiskControl

](https://github.com/datawhalechina/team-learning-data-
mining/tree/master/FinancialRiskControl)
天池竞赛地址: [ https://tianchi.aliyun.com/competition/entrance/531830/introduction

](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 npimport matplotlib.pyplot as plt%matplotlib inlineimport seaborn as sns"""python通过调用warnings模块中定义的warn()函数来发出警告。通过下面两行代码来忽略警告"""import warningswarnings.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
    ##查看测试集的shapedata_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()

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200918191713253.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2E4Njg5NzU2,size_16,color_FFFFFF,t_70#pic_center)

  • 利用 describe() 粗略的查看一些统计性数据
    #利用describe()粗略的查看数据集的各个特征的一些基本统计量data_train.describe()

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200918191835646.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2E4Njg5NzU2,size_16,color_FFFFFF,t_70#pic_center)

  • 使用 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]=valuefea_null_moreThanHalf

结果为 {} ,即在本训练集中没有缺失超过50%的特征

通过可视化直观缺失特征及缺失率

    # nan可视化missing=data_train.isnull().sum()/len(data_train) #计算缺失率missing=missing[missing>0]  #计算缺失率大于0的,即存在缺失的#重新排序missing.sort_values(inplace=True)#绘制条形图missing.plot.bar()

![在这里插入图片描述](https://img-blog.csdnimg.cn/2020091820051239.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2E4Njg5NzU2,size_16,color_FFFFFF,t_70#pic_center)
通过条形图我们可以明显的看出缺失率最高的是n11,最高的缺失率在0.08左右
【注意】

  • 纵向了解哪些列存在 “nan”, 并可以把nan的个数打印,主要的目的在于查看某一列nan存在的个数是否真的很大,如果nan存在的过多,说明这一列对label的影响几乎不起作用了,可以考虑删掉。如果缺失值很小一般可以选择填充。
  • 可以横向比较,如果在数据集中,某些样本数据的大部分列都是缺失的且样本足够的情况下可以考虑删除。

2.4.2 查看唯一值

通过 df.nunique()<=1 可以提取出唯一值

    #查看训练集中只有一个值的特征##此处用到了一行for循环'''一行for循环外面加上[ ],可以让这一行语句作为一个迭代器使用,返回的是一个list类型。需要注意的是只是将本来属于最后一行的内容提前'''one_value_fea=[col for col in data_train.columns if data_train[col].nunique()<=1]

结果为 ['policyCode']

    #查看测试集中只有一个值的特征one_value_fea_test = [col for col in data_test_a.columns if data_test_a[col].nunique() <= 1]

结果为 ['policyCode']
经过上面结果可以看出不管训练集还是测试集 ['policyCode'] 的值都是唯一的,所以在后续训练中我们可以直接舍弃这个属性

【总结】

  • 训练集中47列数据中有22列有缺失值,但是没有缺失超过一半以上的(最多为0.08),
  • policyCode 公开可用的策略_代码=1新产品不公开可用的策略_代码=2 这个属性在测试集和训练集中都只有一个值为1

2.5 查看数值特征与对象类型

2.5.1 数值特征

  • 特征一般都是由 类别型特征数值型特征 组成,而数值型特征又分为 连续型和离散型
  • 类别型特征有时具有非数值关系,有时也具有数值关系。比如‘grade’中的等级A,B,C等,是否只是单纯的分类,还是A优于其他要结合业务判断。
  • 数值型特征本是可以直接入模的,但往往风控人员要对其做分箱,转化为WOE编码进而做标准评分卡等操作。从模型效果上来看,特征分箱主要是为了降低变量的复杂性,减少变量噪音对模型的影响,提高自变量和因变量的相关度。从而使模型更加稳定。

2.5.1.1 查看数值特征(是数值型还是类别型)

  • 查看数值型
    #查看数值类特征(即选择所有特征排除掉object的)#根据数据类型选择特征 select_dtypes(include=['']/exclude=[])numerical_fea=list(data_train.select_dtypes(exclude=['object']).columns)numerical_fea

结果为

    ['id','loanAmnt','term','interestRate','installment','employmentTitle','homeOwnership','annualIncome','verificationStatus','isDefault','purpose','postCode','regionCode','dti','delinquency_2years','ficoRangeLow','ficoRangeHigh','openAcc','pubRec','pubRecBankruptcies','revolBal','revolUtil','totalAcc','initialListStatus','applicationType','title','policyCode','n0','n1','n2','n2.1','n4','n5','n6','n7','n8','n9','n10','n11','n12','n13','n14']
  • 查看类别型
    #方法一 利用select选择类型为object的category_fea=list(data_train.select_dtypes(include=['object']).columns)category_fea
    #方法二使用lambda函数#filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换。#该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。category_fea = list(filter(lambda x: x not in numerical_fea,list(data_train.columns)))category_fea

结果为

    ['grade', 'subGrade', 'employmentLength', 'issueDate', 'earliesCreditLine']

可以用 df.属性名 或者 df['属性名'] 进一步查看属性中的各个取值

2.5.1.2 划分数值型变量中的连续变量和离散型变量

    def get_numerical_serial_fea(data,feas):#data是原始数据,feas是前面已经提取的数值型变量numerical_serical_fea=[]#连续型数值变量numerical_noserial_fea=[]#no serial 离散型数值变量for fea in feas:  temp=data[fea].nunique()if temp<=10: #如果类别小于等于10便认为是离散型,否则是连续型numerical_noserial_fea.append(fea)continuenumerical_serical_fea.append(fea)return numerical_serical_fea,numerical_noserial_feanumerical_serical_fea,numerical_noserial_fea=get_numerical_serial_fea(data_train,numerical_fea)

连续型变量 numerical_serial_fea

    ['id','loanAmnt','interestRate','installment','employmentTitle','annualIncome','purpose','postCode','regionCode','dti','delinquency_2years','ficoRangeLow','ficoRangeHigh','openAcc','pubRec','pubRecBankruptcies','revolBal','revolUtil','totalAcc','title','n0','n1','n2','n2.1','n4','n5','n6','n7','n8','n9','n10','n13','n14']

离散型变量 numerical_noserial_fea

    ['term','homeOwnership','verificationStatus','isDefault','initialListStatus','applicationType','policyCode','n11','n12']

2.5.1.3 离散型变量分析

    for i in numerical_noserial_fea:print('==查看离散型变量【{}】属性的分布=='.format(i))print(data_train[i].value_counts(),'\n')

结果为

    ==查看离散型变量【term】属性的分布==3    6069025    193098Name: term, dtype: int64 ==查看离散型变量【homeOwnership】属性的分布==0    3957321    3176602     863093       1855        814        33Name: homeOwnership, dtype: int64 ==查看离散型变量【verificationStatus】属性的分布==1    3098102    2489680    241222Name: verificationStatus, dtype: int64 ==查看离散型变量【isDefault】属性的分布==0    6403901    159610Name: isDefault, dtype: int64 ==查看离散型变量【initialListStatus】属性的分布==0    4664381    333562Name: initialListStatus, dtype: int64 ==查看离散型变量【applicationType】属性的分布==0    7845861     15414Name: applicationType, dtype: int64 ==查看离散型变量【policyCode】属性的分布==1.0    800000Name: policyCode, dtype: int64 ==查看离散型变量【n11】属性的分布==0.0    7296821.0       5402.0        244.0         13.0         1Name: n11, dtype: int64 ==查看离散型变量【n12】属性的分布==0.0    7573151.0      22812.0       1153.0        164.0         3Name: n12, dtype: int64 

【总结】通过上面查看可以看出

  • policyCode 属性无用,因为全是一个值
  • n11,n12 属性相差过大,不用再分析(其中一类占到了近90%)

2.5.1.4 连续型变量分析

这里使用了 pandas.melt 来实现数据的逆透视,以及 season.FaceGrid 实现可视化

  • pandas.melt

【基本格式】

    pandas.melt(frame, id_vars=None, value_vars=None, var_name=None, value_name='value', col_level=None)

【参数解释】

参数 含义
frame 要处理的数据集。
id_vars 不需要被转换的列名。
value_vars 需要转换的列名,如果剩下的列全部都要转换,就不用写了。
var_name、value_name 是自定义设置对应的列名。
col_level 如果列是MultiIndex,则使用此级别。

相关用法可参考: [ https://blog.csdn.net/maymay_/article/details/80039677

](https://blog.csdn.net/maymay_/article/details/80039677)

  • season.FaceGrid
    FacetGrid当您想要在数据集的子集中分别可视化变量的分布或多个变量之间的关系时,该类非常有用。
    基本工作流程是FacetGrid使用数据集和用于构造网格的变量初始化对象。然后,可以通过调用FacetGrid.map()或将一个或多个绘图函数应用于每个子集
    FacetGrid.map_dataframe()。最后,可以使用其他方法调整绘图,以执行更改轴标签,使用不同刻度或添加图例等操作
    【基本格式】
    class seaborn.FacetGrid(data, row=None, col=None, hue=None, col_wrap=None, sharex=True, sharey=True, height=3, aspect=1, palette=None, row_order=None, col_order=None, hue_order=None, hue_kws=None, dropna=True, legend_out=True, despine=True, margin_titles=False, xlim=None, ylim=None, subplot_kws=None, gridspec_kws=None, size=None)

【参数解释】

参数 含义
data DataFrame处理后的(“长格式”)dataframe数据,其中每一列都是一个变量(特征),每一行都是一个样本
row, col, hue strings 定义数据子集的变量,这些变量将在网格的不同方面绘制。
col_wrap nt, optional这个意思是图网格列维度限制,比如col_wrap

=3,那么在这个画布里最多只能画3列。行不限制,这样就限制了列的个数。
sharex=True, sharey=False | 是否共享x轴或者y轴

相关用法参考: [ Seaborn学习(一)------- 构建结构化多绘图网格(FacetGrid()、map())详解

](https://blog.csdn.net/weixin_42398658/article/details/82960379?biz_id=102&utm_term=FacetGrid&utm_medium=distribute.pc_search_result.none-
task-blog-2allsobaiduweb~default-1-82960379&spm=1018.2118.3001.4187)

下面通过上面介绍的两个库实现连续型数值数据的可视化

    #每个数字特征得分布可视化,查看了连续性数据的分布f = pd.melt(data_train, value_vars=numerical_serical_fea)g = sns.FacetGrid(f, col="variable",  col_wrap=2, sharex=False, sharey=False) #先给图占位置g = g.map(sns.distplot, "value") #作图,得到的是每个值的概率#字符串self.data中的列名,用于标识具有要绘制的数据的变量。 每个变量的数据按照调用中指定的顺序传递给`func`。

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200918204801741.jpg?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2E4Njg5NzU2,size_16,color_FFFFFF,t_70#pic_center)

【扩展】

  • 查看某一个数值型变量的分布,查看变量是否符合正态分布,如果不符合正太分布的变量可以log化后再观察下是否符合正态分布。
  • 如果想统一处理一批数据变标准化 必须把这些之前已经正态化的数据提出
  • 正态化的原因:一些情况下正态非正态可以让模型更快的收敛,一些模型要求数据正态(eg.
    GMM、KNN),保证数据不要过偏态即可,过于偏态可能会影响模型预测结果。

绘制贷款金额分布

    #Ploting Transaction Amount Values Distribution#设置图像大小plt.figure(figsize=(16,12))plt.suptitle('Transaction Values Distribution', fontsize=22)plt.subplot(221)sub_plot_1 = sns.distplot(data_train['loanAmnt'])sub_plot_1.set_title("loanAmnt Distribuition", fontsize=18)sub_plot_1.set_xlabel("")sub_plot_1.set_ylabel("Probability", fontsize=15)#log后的图像plt.subplot(222)sub_plot_2 = sns.distplot(np.log(data_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)

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200918205611170.jpg?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2E4Njg5NzU2,size_16,color_FFFFFF,t_70#pic_center)

2.5.1.5 非数值型类别变量分析

在前面的代码中已经获得了类别变量名并将其保存到了 category_fea

    for i in category_fea:print('==查看非数值类别变量【{}】属性的分布=='.format(i))print(data_train[i].value_counts(),'\n')

结果为

    ==查看非数值类别变量【grade】属性的分布==B    233690C    227118A    139661D    119453E     55661F     19053G      5364Name: grade, dtype: int64 ==查看非数值类别变量【subGrade】属性的分布==C1    50763B4    49516B5    48965B3    48600C2    47068C3    44751C4    44272B2    44227B1    42382C5    40264A5    38045A4    30928D1    30538D2    26528A1    25909D3    23410A3    22655A2    22124D4    21139D5    17838E1    14064E2    12746E3    10925E4     9273E5     8653F1     5925F2     4340F3     3577F4     2859F5     2352G1     1759G2     1231G3      978G4      751G5      645Name: subGrade, dtype: int64 ==查看非数值类别变量【employmentLength】属性的分布==10+ years    2627532 years       72358< 1 year      642373 years       641521 year        524895 years       501024 years       479856 years       372548 years       361927 years       354079 years       30272Name: employmentLength, dtype: int64 ==查看非数值类别变量【issueDate】属性的分布==2016-03-01    290662015-10-01    255252015-07-01    244962015-12-01    232452014-10-01    214612016-02-01    205712015-11-01    194532015-01-01    192542015-04-01    189292015-08-01    187502015-05-01    171192016-01-01    167922014-07-01    163552015-06-01    152362015-09-01    149502016-04-01    142482014-11-01    137932015-03-01    135492016-08-01    133012015-02-01    128812016-07-01    128352016-06-01    122702016-12-01    115622016-10-01    112452016-11-01    111722014-05-01    108862014-04-01    108302016-05-01    106802014-08-01    106482016-09-01    10165...  2010-01-01      3552009-10-01      3052009-09-01      2702009-08-01      2312009-07-01      2232009-06-01      1912009-05-01      1902009-04-01      1662009-03-01      1622009-02-01      1602009-01-01      1452008-12-01      1342008-03-01      1302008-11-01      1132008-02-01      1052008-04-01       922008-01-01       912008-10-01       622007-12-01       552008-07-01       522008-08-01       382008-05-01       382008-06-01       332007-10-01       262007-11-01       242007-08-01       232007-07-01       212008-09-01       192007-09-01        72007-06-01        1Name: issueDate, Length: 139, dtype: int64 ==查看非数值类别变量【earliesCreditLine】属性的分布==Aug-2001    5567Aug-2002    5403Sep-2003    5403Oct-2001    5258Aug-2000    5246Sep-2004    5219Sep-2002    5170Aug-2003    5116Oct-2000    5034Oct-2002    5034Oct-2003    4969Aug-2004    4904Nov-2000    4798Sep-2001    4787Sep-2000    4780Nov-1999    4773Oct-1999    4678Oct-2004    4647Sep-2005    4608Jul-2003    4586Nov-2001    4514Aug-2005    4494Jul-2001    4480Aug-1999    4446Sep-1999    4441Dec-2001    4379Jul-2002    4342Aug-2006    4283Mar-2001    4268May-2001    4223... Jun-1952       2Aug-1950       2Oct-1958       2Jul-1959       2Nov-1962       2Sep-1960       2Apr-1955       2Oct-1954       1Nov-1953       1Jun-1958       1Dec-1951       1Oct-1957       1Oct-2015       1Mar-1957       1Mar-1958       1Aug-1958       1Aug-1946       1Sep-1953       1Dec-1960       1May-1957       1Apr-1958       1Nov-1954       1Jul-1955       1Mar-1962       1Aug-1955       1Sep-1957       1Feb-1960       1May-1960       1Jan-1944       1Jan-1946       1Name: earliesCreditLine, Length: 720, dtype: int64 

【总结】
上面通过 value_counts() 等函数看了特征属性的分布,但是图表是概括原始信息最便捷的方式。

同一份数据集,在不同的尺度刻画上显示出来的图形反映的规律是不一样的。


2.6 变量分布可视化

2.6.1 单一变量分布可视化

此处对就业年限进行可视化

    plt.figure(figsize=(8,8))#dropna该函数主要用于滤除缺失数据。#如果是Series,则返回一个仅含非空数据和索引值的Series,默认丢弃含有缺失值的行sns.barplot(data_train['employmentLength'].value_counts(dropna=False)[:20],data_train['employmentLength'].value_counts(dropna=False).keys()[:20])

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200918205941814.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2E4Njg5NzU2,size_16,color_FFFFFF,t_70#pic_center)

2.6.2 根据y值不同可视化x某个特征的分布

  • 查看类别型变量在不同值上的分布
    #违约train_loan_fr = data_train.loc[data_train['isDefault'] == 1]#没有违约train_loan_nofr = data_train.loc[data_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()

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200918210231910.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2E4Njg5NzU2,size_16,color_FFFFFF,t_70#pic_center)
左上图示违约的人,可以看出带看等级为C的人违约最多
右上图是没有违约的人,可以看出B等级人最多
左下图示违约的人,可以看出工作19年以上的人违约的最多
右下角是没有违约的人,工作十年的人没有违约的最多

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

![在这里插入图片描述](https://img-blog.csdnimg.cn/2020091821034614.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2E4Njg5NzU2,size_16,color_FFFFFF,t_70#pic_center)

    total = len(data_train)total_amt = data_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=data_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 = (data_train.groupby(['isDefault'])['loanAmnt'].sum())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)     

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200918210519868.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2E4Njg5NzU2,size_16,color_FFFFFF,t_70#pic_center)

2.7 时间数据处理及查看

  • 转化为datetime格式
    #训练集转化为时间格式 issueDate特征表示数据日期离集中日期最早的日期data_train['issueDate'] = pd.to_datetime(data_train['issueDate'],format='%Y-%m-%d')data_train['issueDate']
  • 计算离数据集中最早日期的日期(2007-06-01)的天数
    #计算离数据集中最早日期的日期(2007-06-01)的天数import datetimestartdate = datetime.datetime.strptime('2007-06-01', '%Y-%m-%d')from IPython.core.interactiveshell import InteractiveShellInteractiveShell.ast_node_interactivity = "all"startdatedata_train['issueDateDT'] = data_train['issueDate'].apply(lambda x: x-startdate).dt.daysdata_train['issueDateDT']

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200918210703187.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2E4Njg5NzU2,size_16,color_FFFFFF,t_70#pic_center)

    测试集转化成时间格式data_test_a['issueDate'] = pd.to_datetime(data_train['issueDate'],format='%Y-%m-%d')startdate = datetime.datetime.strptime('2007-06-01', '%Y-%m-%d')data_test_a['issueDateDT'] = data_test_a['issueDate'].apply(lambda x: x-startdate).dt.days
  • 查看训练集和测试集的时间分布
    plt.hist(data_train['issueDateDT'],label='train')plt.hist(data_test_a['issueDateDT'],label='test')plt.legend()plt.title('Distribution of issueDateDT dates');#train 和 test issueDateDT 日期有重叠 所以使用基于时间的分割进行验证是不明智的

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200918210753296.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2E4Njg5NzU2,size_16,color_FFFFFF,t_70#pic_center)
由于train 和 test issueDateDT 日期有重叠 所以使用基于时间的分割进行验证是不明智的


2.7 透视图

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

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200918210840148.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2E4Njg5NzU2,size_16,color_FFFFFF,t_70#pic_center)

2.8 使用pandas_profiling生成数据报告

安装失败orz 具体跑出来的结果等我安好了再放上

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

金融风控 Task02 数据分析相关推荐

  1. 【数据挖掘】金融风控 Task02 数据分析

    [数据挖掘]金融风控 Task02 数据分析 1. 探索性数据分析(EDA)概述 1. 1 探索性数据分析概念 1.2 探索性数据分析目的 1.3 探索性数据分析(EDA)与传统统计分析(Classi ...

  2. 金融风控 Task02

    查看数据集中特征缺失值,唯一值 具体的查看缺失特征及缺失率 查看训练集测试集中特征属性只有一值的特征 查看特征的数值类型有哪些,对象类型有哪些 特征一般都是由类别型特征和数值型特征组成,而数值型特征又 ...

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

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

  4. 数据挖掘实践(金融风控)——task02:数据分析

    文章目录 1.读入数据 2.总体了解 3.查看数据集中特征缺失值,唯一值等 1.缺失值 2.唯一值 4.查看特征的数值类型和对象类型 5.变量分布可视化 单一变量分布可视化 根据y值不同可视化x某个特 ...

  5. 【算法竞赛学习】金融风控之贷款违约预测-数据分析

    Task2 数据分析 此部分为零基础入门金融风控的 Task2 数据分析部分,带你来了解数据,熟悉数据,为后续的特征工程做准备,欢迎大家后续多多交流. 赛题:零基础入门数据挖掘 - 零基础入门金融风控 ...

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

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

  7. 【数据分析与挖掘实战】金融风控之贷款违约预测详解2(有代码和数据集)

    本文接着上一篇博客,如果您未阅读上篇博客,请点击[数据分析与挖掘实战]金融风控之贷款违约预测详解1(有代码和数据集) 七.建模和调参 7.1模型相关原理介绍 由于相关算法原理篇幅较长,本文推荐了一些博 ...

  8. python金融风控评分卡模型和数据分析

    python金融风控评分卡模型和数据分析微专业课(博主录制):http://dwz.date/b9vv 作者Toby:持牌照消费金融模型专家,和中科院,中科大教授保持长期项目合作:和同盾,聚信立等外部 ...

  9. 金融风控场景下:数据分析、模型与策略。

    来源:DataFunk 导读:众所周知,信息时代下的数据就是能源,就是生产力.但是面对海量.纷繁的数据,特别是在金融领域,如何充分地利用数据是核心问题.本次分享主要想和大家一起探讨下,在金融风控场景下 ...

最新文章

  1. NAACL | 通过对抗性修改,探究链接预测的鲁棒性和可解释性
  2. 奇妙的Base64编码
  3. NYOJ 203 三国志(Dijkstra+贪心)
  4. Eureka-eureka原理分析
  5. uboot烧录到SD卡
  6. java中的tcp与多线程_Java5 多线程与TCP编程实践
  7. 清除Eclipse中保存的github密码
  8. GridView 合并列、行类
  9. 【NOIP2004】【Luogu1086】花生采摘(枚举,给定顺序的模拟)
  10. C语言——指针篇(三)数组的下标引用和指针访问
  11. 批处理程序文件夹加密
  12. 高三计算机教学计划,精选高三教学计划三篇
  13. 重心法选址 matlab程序,Excel重心法选址计算题的详细步骤
  14. 编译原理个人作业--第五章——基于 编译原理 国防工业出版社 第三版
  15. 测肤API+应用开发,自助打开线上AI测肤
  16. 如何改善客户体验和用户体验
  17. 将canvas转化为图片
  18. 知乎上48个神回复,真心值得一看!
  19. 两个字母组成的拼音,域名注册备用
  20. Hyper-v 添加外部虚拟交换机失败显示 以太网端口绑定失败:灾难性故障 问题解决方案

热门文章

  1. 因跨域,post请求变options请求(vue)
  2. 推荐这几个前端公众号,助力学习前端
  3. 通讯工程有必要考计算机二级吗,通信工程专业学生注意 你需要考这些证书!...
  4. ubuntu下通过FreeTDS访问SqlServer(c++示例)
  5. android的照片恢复,安卓手机删除的照片如何恢复呢
  6. 【小程序】微信小程序中实现【关注公众号】弹窗
  7. 教育知识与能力(1)
  8. Fully Convolutional Networks for Semantic Segmentation全文翻译和阅读
  9. 做外贸用什么邮箱,外贸邮箱用哪个好
  10. Ubuntu下安装adobe reader