天池-贷款违约挑战赛(二)-数据分析

Task2-数据分析

1 主要内容

了解数据集的统计信息,如数据完整性、是否存在奇异数据、数据类型(离散/连续)、特征关联


2 程序示例

2.1 使用平台

使用google colab,这个平台需要科学上网,你懂的。
本次比赛提供本地数据集,在colab中导入本地数据集的传送门在此
链接: 【嗖!传送门】.

2.2 导入包

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

colab平台一般会把常用的包安装好,但是像catboost这种就木得安装,需要自己来安装,开头起一段代码段执行一下就好啦

!pip install catboost

2.3 读数据

传送门中讲的很详细了,按步骤做就可以。在本地写程序的同学可以参考注释的代码

#  data_train = pd.read_csv('./data/train.csv')
data_train = pd.read_csv('drive/My Drive/tianchi/train.csv')
# data_test_a = pd.read_csv('./data/testA.csv')
data_test_a = pd.read_csv('drive/My Drive/tianchi/testA.csv')

2.4 样本数量&特征数量

data_test_a.shape # (200000, 48)
data_train.shape # (800000, 47)
data_train.columns # 返回每一列特征的名称

列举一下特征含义:

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

2.5 数据完整性(缺失值nan)

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
# {} 无

再将存在nan的特征画出缺失率

missing = data_train.isnull().sum()/len(data_train)
missing = missing[missing > 0]
missing.sort_values(inplace=True)
missing.plot.bar()
# 如下图所示

Alt



2.6 数据类型(离散/连续)

这里贴一张局部数据图。显然,离散的特征比如grade ,取值∈{A,B,C,D,…},属于有限类别。连续的特征比如installment,取值空间无限。在这里插入图片描述

我们看一下grade 的具体类别有哪些

data = pd.concat([data_train, data_test_a ], axis=0, ignore_index=True)
print(sorted(data['grade'].unique()))
# ['A', 'B', 'C', 'D', 'E', 'F', 'G']

对于离散的特征,尤其是非数值特征,需要将其转为连续型数值特征


2.6.1(离散数+字符)

再比如employmentLength这种混合型(离散数+字符)数据,也是先看一下具体的类别。

data['employmentLength'].value_counts(dropna=False).sort_index()
"""
1 year        65671
10+ years    328525
2 years       90565
3 years       80163
4 years       59818
5 years       62645
6 years       46582
7 years       44230
8 years       45168
9 years       37866
< 1 year      80226
NaN           58541
Name: employmentLength, dtype: int64
"""

employmentLength的处理就是先将“10+ years”和“<1 years”去掉数字前后的运算符,将(离散数+字符)转换为(离散数)

data['employmentLength'].replace(to_replace='10+ years', value='10 years', inplace=True)
data['employmentLength'].replace('< 1 year', '0 years', inplace=True)
def employmentLength_to_int(s):
	"""将该特征转为离散数"""
    if pd.isnull(s):
        return s
    else:
        return np.int8(s.split()[0])
    
data['employmentLength'] = data['employmentLength'].apply(employmentLength_to_int)

2.7 变量分布可视化

初步查看变量的分布区间

plt.figure(figsize=(8, 8))
sns.barplot(data_train["employmentLength"].value_counts(dropna=False)[:20],
data_train["employmentLength"].value_counts(dropna=False).keys()[:20])
plt.show()
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页