贷款违约预测-Task2 数据分析(上)

简介: 贷款违约预测-Task2 数据分析(上)

Task2 数据分析


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


赛题:零基础入门数据挖掘 - 零基础入门金融风控之贷款违约


目的:

  • 1.EDA价值主要在于熟悉了解整个数据集的基本情况(缺失值,异常值),对数据集进行验证是否可以进行接下来的机器学习或者深度学习建模.
  • 2.了解变量间的相互关系、变量与预测值之间的存在关系。
  • 3.为特征工程做准备


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


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


2.1 学习目标


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


2.2 内容介绍


  • 数据总体了解:
  • 读取数据集并了解数据集大小,原始特征维度;
  • 通过info熟悉数据类型;
  • 粗略查看数据集中各特征基本统计量;


  • 缺失值和唯一值:
  • 查看数据缺失值情况
  • 查看唯一值特征情况


  • 深入数据-查看数据类型
  • 类别型数据
  • 数值型数据
  • 离散数值型数据
  • 连续数值型数据


  • 数据间相关关系
  • 特征和特征之间关系
  • 特征和目标变量之间关系


  • 用pandas_profiling生成数据报告


2.3 代码示例

2.3.1 导入数据分析及可视化过程需要的库


import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import datetime
import warnings
warnings.filterwarnings('ignore')


/Users/exudingtao/opt/anaconda3/lib/python3.7/site-packages/statsmodels/tools/_testing.py:19: FutureWarning: pandas.util.testing is deprecated. Use the functions in the public API at pandas.testing instead.
  import pandas.util.testing as tm


以上库都是pip install 安装就好,如果本机有python2,python3两个python环境傻傻分不清哪个的话,可以pip3 install 。或者直接在notebook中'!pip3 install ****'安装。


说明:


本次数据分析探索,尤其可视化部分均选取某些特定变量进行了举例,所以它只是一个方法的展示而不是整个赛题数据分析的解决方案。


2.3.2 读取文件


data_train = pd.read_csv('./train.csv')


data_test_a = pd.read_csv('./testA.csv')


2.3.2.1读取文件的拓展知识


  • pandas读取数据时相对路径载入报错时,尝试使用os.getcwd()查看当前工作目录。
  • TSV与CSV的区别:
  • 从名称上即可知道,TSV是用制表符(Tab,'\t')作为字段值的分隔符;CSV是用半角逗号(',')作为字段值的分隔符;
  • Python对TSV文件的支持:
    Python的csv模块准确的讲应该叫做dsv模块,因为它实际上是支持范式的分隔符分隔值文件(DSV,delimiter-separated values)的。
    delimiter参数值默认为半角逗号,即默认将被处理文件视为CSV。当delimiter='\t'时,被处理文件就是TSV。


  • 读取文件的部分(适用于文件特别大的场景)
  • 通过nrows参数,来设置读取文件的前多少行,nrows是一个大于等于0的整数。
  • 分块读取


data_train_sample = pd.read_csv("./train.csv",nrows=5)


#设置chunksize参数,来控制每次迭代数据的大小
chunker = pd.read_csv("./train.csv",chunksize=5)
for item in chunker:
    print(type(item))
    #<class 'pandas.core.frame.DataFrame'>
    print(len(item))
    #5


2.3.3总体了解

查看数据集的样本个数和原始特征维度


data_test_a.shape


(200000, 48)


data_train.shape


(800000, 47)


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')


查看一下具体的列名,赛题理解部分已经给出具体的特征含义,这里方便阅读再给一下:

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


通过info()来熟悉数据类型


data_train.info()


<class 'pandas.core.frame.DataFrame'>
RangeIndex: 800000 entries, 0 to 799999
Data columns (total 47 columns):
 #   Column              Non-Null Count   Dtype  
---  ------              --------------   -----  
 0   id                  800000 non-null  int64  
 1   loanAmnt            800000 non-null  float64
 2   term                800000 non-null  int64  
 3   interestRate        800000 non-null  float64
 4   installment         800000 non-null  float64
 5   grade               800000 non-null  object 
 6   subGrade            800000 non-null  object 
 7   employmentTitle     799999 non-null  float64
 8   employmentLength    753201 non-null  object 
 9   homeOwnership       800000 non-null  int64  
 10  annualIncome        800000 non-null  float64
 11  verificationStatus  800000 non-null  int64  
 12  issueDate           800000 non-null  object 
 13  isDefault           800000 non-null  int64  
 14  purpose             800000 non-null  int64  
 15  postCode            799999 non-null  float64
 16  regionCode          800000 non-null  int64  
 17  dti                 799761 non-null  float64
 18  delinquency_2years  800000 non-null  float64
 19  ficoRangeLow        800000 non-null  float64
 20  ficoRangeHigh       800000 non-null  float64
 21  openAcc             800000 non-null  float64
 22  pubRec              800000 non-null  float64
 23  pubRecBankruptcies  799595 non-null  float64
 24  revolBal            800000 non-null  float64
 25  revolUtil           799469 non-null  float64
 26  totalAcc            800000 non-null  float64
 27  initialListStatus   800000 non-null  int64  
 28  applicationType     800000 non-null  int64  
 29  earliesCreditLine   800000 non-null  object 
 30  title               799999 non-null  float64
 31  policyCode          800000 non-null  float64
 32  n0                  759730 non-null  float64
 33  n1                  759730 non-null  float64
 34  n2                  759730 non-null  float64
 35  n2.1                759730 non-null  float64
 36  n4                  766761 non-null  float64
 37  n5                  759730 non-null  float64
 38  n6                  759730 non-null  float64
 39  n7                  759730 non-null  float64
 40  n8                  759729 non-null  float64
 41  n9                  759730 non-null  float64
 42  n10                 766761 non-null  float64
 43  n11                 730248 non-null  float64
 44  n12                 759730 non-null  float64
 45  n13                 759730 non-null  float64
 46  n14                 759730 non-null  float64
dtypes: float64(33), int64(9), object(5)
memory usage: 286.9+ MB


总体粗略的查看数据集各个特征的一些基本统计量


data_train.describe()


</div><div>.dataframe tbody tr th:only-of-type {</div><div>vertical-align: middle;</div><div>}</div><div><em></em></div><div data-card-type="block" data-ready-card="codeblock" data-card-value="data:%7B%22mode%22%3A%22plain%22%2C%22code%22%3A%22.dataframe%20tbody%20tr%20th%20%7B%5Cn%20%20%20%20vertical-align%3A%20top%3B%5Cn%7D%5Cn.dataframe%20thead%20th%20%7B%5Cn%20%20%20%20text-align%3A%20right%3B%5Cn%7D%22%2C%22id%22%3A%22GsTcs%22%7D"></div><div>

id loanAmnt term interestRate installment employmentTitle homeOwnership annualIncome verificationStatus isDefault ... n5 n6 n7 n8 n9 n10 n11 n12 n13 n14
count 800000.000000 800000.000000 800000.000000 800000.000000 800000.000000 799999.000000 800000.000000 8.000000e+05 800000.000000 800000.000000 ... 759730.000000 759730.000000 759730.000000 759729.000000 759730.000000 766761.000000 730248.000000 759730.000000 759730.000000 759730.000000
mean 399999.500000 14416.818875 3.482745 13.238391 437.947723 72005.351714 0.614213 7.613391e+04 1.009683 0.199513 ... 8.107937 8.575994 8.282953 14.622488 5.592345 11.643896 0.000815 0.003384 0.089366 2.178606
std 230940.252015 8716.086178 0.855832 4.765757 261.460393 106585.640204 0.675749 6.894751e+04 0.782716 0.399634 ... 4.799210 7.400536 4.561689 8.124610 3.216184 5.484104 0.030075 0.062041 0.509069 1.844377
min 0.000000 500.000000 3.000000 5.310000 15.690000 0.000000 0.000000 0.000000e+00 0.000000 0.000000 ... 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
25% 199999.750000 8000.000000 3.000000 9.750000 248.450000 427.000000 0.000000 4.560000e+04 0.000000 0.000000 ... 5.000000 4.000000 5.000000 9.000000 3.000000 8.000000 0.000000 0.000000 0.000000 1.000000
50% 399999.500000 12000.000000 3.000000 12.740000 375.135000 7755.000000 1.000000 6.500000e+04 1.000000 0.000000 ... 7.000000 7.000000 7.000000 13.000000 5.000000 11.000000 0.000000 0.000000 0.000000 2.000000
75% 599999.250000 20000.000000 3.000000 15.990000 580.710000 117663.500000 1.000000 9.000000e+04 2.000000 0.000000 ... 11.000000 11.000000 10.000000 19.000000 7.000000 14.000000 0.000000 0.000000 0.000000 3.000000
max 799999.000000 40000.000000 5.000000 30.990000 1715.420000 378351.000000 5.000000 1.099920e+07 2.000000 1.000000 ... 70.000000 132.000000 79.000000 128.000000 45.000000 82.000000 4.000000 4.000000 39.000000 30.000000

8 rows × 42 columns


data_train.head(3).append(data_train.tail(3))

</div><div>.dataframe tbody tr th:only-of-type {</div><div>vertical-align: middle;</div><div>}</div><div><em></em></div><div data-card-type="block" data-ready-card="codeblock" data-card-value="data:%7B%22mode%22%3A%22plain%22%2C%22code%22%3A%22.dataframe%20tbody%20tr%20th%20%7B%5Cn%20%20%20%20vertical-align%3A%20top%3B%5Cn%7D%5Cn.dataframe%20thead%20th%20%7B%5Cn%20%20%20%20text-align%3A%20right%3B%5Cn%7D%22%2C%22id%22%3A%22y6y23%22%7D"></div><div>

id loanAmnt term interestRate installment grade subGrade employmentTitle employmentLength homeOwnership ... n5 n6 n7 n8 n9 n10 n11 n12 n13 n14
0 0 35000.0 5 19.52 917.97 E E2 320.0 2 years 2 ... 9.0 8.0 4.0 12.0 2.0 7.0 0.0 0.0 0.0 2.0
1 1 18000.0 5 18.49 461.90 D D2 219843.0 5 years 0 ... NaN NaN NaN NaN NaN 13.0 NaN NaN NaN NaN
2 2 12000.0 5 16.99 298.17 D D3 31698.0 8 years 0 ... 0.0 21.0 4.0 5.0 3.0 11.0 0.0 0.0 0.0 4.0
799997 799997 6000.0 3 13.33 203.12 C C3 2582.0 10+ years 1 ... 4.0 26.0 4.0 10.0 4.0 5.0 0.0 0.0 1.0 4.0
799998 799998 19200.0 3 6.92 592.14 A A4 151.0 10+ years 0 ... 10.0 6.0 12.0 22.0 8.0 16.0 0.0 0.0 0.0 5.0
799999 799999 9000.0 3 11.06 294.91 B B3 13.0 5 years 0 ... 3.0 4.0 4.0 8.0 3.0 7.0 0.0 0.0 0.0 2.0

6 rows × 47 columns


2.3.4查看数据集中特征缺失值,唯一值等


查看缺失值


print(f'There are {data_train.isnull().any().sum()} columns in train dataset with missing values.')


There are 22 columns in train dataset with missing values.


上面得到训练集有22列特征有缺失值,进一步查看缺失特征中缺失率大于50%的特征


have_null_fea_dict = (data_train.isnull().sum()/len(data_train)).to_dict()
fea_null_moreThanHalf = {}
for key,value in have_null_fea_dict.items():
    if value > 0.5:
        fea_null_moreThanHalf[key] = value


fea_null_moreThanHalf


{}


具体的查看缺失特征及缺失率


# nan可视化
missing = data_train.isnull().sum()/len(data_train)
missing = missing[missing > 0]
missing.sort_values(inplace=True)
missing.plot.bar()


<matplotlib.axes._subplots.AxesSubplot at 0x1229ab890>


106.png

png


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


Tips:

比赛大杀器lgb模型可以自动处理缺失值,Task4模型会具体学习模型了解模型哦!

查看训练集测试集中特征属性只有一值的特征


one_value_fea = [col for col in data_train.columns if data_train[col].nunique() <= 1]


one_value_fea_test = [col for col in data_test_a.columns if data_test_a[col].nunique() <= 1]


one_value_fea


['policyCode']


one_value_fea_test


['policyCode']


print(f'There are {len(one_value_fea)} columns in train dataset with one unique value.')
print(f'There are {len(one_value_fea_test)} 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.


总结:

47列数据中有22列都缺少数据,这在现实世界中很正常。‘policyCode’具有一个唯一值(或全部缺失)。有很多连续变量和一些分类变量。

相关文章
|
机器学习/深度学习 存储 数据采集
数据分析案例-基于多元线性回归算法预测学生期末成绩
数据分析案例-基于多元线性回归算法预测学生期末成绩
1390 0
数据分析案例-基于多元线性回归算法预测学生期末成绩
|
2月前
|
数据可视化 数据挖掘 数据处理
零基础入门金融风控之贷款违约预测的Task2:数据分析
零基础入门金融风控之贷款违约预测的Task2:数据分析
53 1
|
4月前
|
机器学习/深度学习 数据可视化 算法
【Python支持向量机】Python客户银行贷款支持向量机数据分析可视化SVM(源码+数据集+报告)【独一无二】
【Python支持向量机】Python客户银行贷款支持向量机数据分析可视化SVM(源码+数据集+报告)【独一无二】
|
机器学习/深度学习 数据采集 数据可视化
【DSW Gallery】数据分析经典案例:Kaggle竞赛之房价预测
Python是目前当之无愧的数据分析第一语言,大量的数据科学家使用Python来完成各种各样的数据科学任务。本文以Kaggle竞赛中的房价预测为例,结合JupyterLab Notebook,完成数据加载、数据探索、数据可视化、数据清洗、特征分析、特征处理、机器学习、回归预测等步骤,主要Python工具是Pandas和SKLearn。本文中仅仅使用了线性回归这一最基本的机器学习模型,读者可以自行尝试其他更加复杂模型,比如随机森林、支持向量机、XGBoost等。
【DSW Gallery】数据分析经典案例:Kaggle竞赛之房价预测
|
机器学习/深度学习 算法 数据挖掘
数据分析案例-基于随机森林算法探索影响人类预期寿命的因素并预测人类预期寿命(二)
数据分析案例-基于随机森林算法探索影响人类预期寿命的因素并预测人类预期寿命
1195 2
数据分析案例-基于随机森林算法探索影响人类预期寿命的因素并预测人类预期寿命(二)
|
机器学习/深度学习 数据采集 存储
数据分析案例-基于随机森林算法探索影响人类预期寿命的因素并预测人类预期寿命(一)
数据分析案例-基于随机森林算法探索影响人类预期寿命的因素并预测人类预期寿命
1853 0
数据分析案例-基于随机森林算法探索影响人类预期寿命的因素并预测人类预期寿命(一)
|
数据采集 数据可视化 数据挖掘
数据分析案例-旅游景点票价预测
数据分析案例-旅游景点票价预测
328 0
数据分析案例-旅游景点票价预测
|
数据采集 机器学习/深度学习 数据可视化
数据分析案例-二手车价格预测
数据分析案例-二手车价格预测
282 0
数据分析案例-二手车价格预测
|
数据挖掘 定位技术 Python
用对线阶段数据分析和预测《英雄联盟》的游戏结果
用对线阶段数据分析和预测《英雄联盟》的游戏结果
534 0
用对线阶段数据分析和预测《英雄联盟》的游戏结果
|
存储 机器学习/深度学习 SQL
见微知著,带你认认数据分析的大门,站在门口感受一下预测的魅力
预就是预先、事先,测就是度量、推测。预测通常被理解为对某些事物进行事先推测的过程。其实预测这个概念并不是我们第一次接触到,而是它从古至今都和我们的生活息息相关.而且在计算机技术飞速发展的DT时代,它一直伴随着我们,充斥着生活的方方面面,我们每个人都想更准确地预见未来,来掌握甚至改变事态的发展轨迹.所以用一句简单的话来概括就是:预测是一门研究未来的学问。从古至今都有人不断在研究它,应用它,而且研究的方法和理论也在不断地发展和完善,从古代的占卜术到如今的大数据和人工智能,预测的形式,方法,理论,技术,意义和作用发生了极大的变化.而且在数据科学的加持下,它建立于数据分析的基础上,预测不再是神秘的,而
854 3