目录
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 # 返回每一列特征的名称
列举一下特征含义:
- 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,为一些贷款人行为计数特征的处理
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()
# 如下图所示
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()
![](https://i-blog.csdnimg.cn/blog_migrate/66919ee0d430abead33f57082330084c.png#pic_center)