【天池】金融风控-贷款违约预测(二)—— 数据分析

【天池】金融风控-贷款违约预测(二)—— 数据分析

前言

【天池】金融风控-贷款违约预测(赛题链接)。
上一篇赛题理解时已经对赛题背景、数据字段等进行了介绍。 本篇是数据分析部分,进一步了解数据,熟悉数据,为后续的特征工程做准备。一般的数据探索(EDA,Exploratory Data Analysis)目的如下:
1、EDA价值主要在于熟悉了解整个数据集的基本情况(缺失值,异常值),对数据集进行验证是否可以进行接下来的机器学习或者深度学习建模;
2、了解变量间的相互关系、变量与预测值之间的存在关系;
3、为特征工程做准备。

内容介绍

数据总体了解:

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

缺失值和唯一值:

  1. 查看数据缺失值情况;
  2. 查看唯一值特征情况。

深入数据-查看数据类型

  1. 类别型数据
  2. 数值型数据:
    离散数值型数据
    连续数值型数据

数据间相关关系

  1. 特征和特征之间关系
  2. 特征和目标变量之间关系

用pandas_profiling生成数据报告

代码示例

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

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

data_train = pd.read_csv('./data/train.csv')
data_test_a = pd.read_csv('./data/testA.csv')

3. 总体了解

data_train.shape

在这里插入图片描述

data_test_a.shape

在这里插入图片描述

data_train.columns

在这里插入图片描述
通过info()来熟悉数据类型:

data_train.info()

在这里插入图片描述
总体粗略的查看数据集各个特征的一些基本统计量:

data_train.describe()

在这里插入图片描述
查看前三行和后三行数据:

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

在这里插入图片描述
4. 查看数据集中特征缺失值,唯一值等
查看缺失值:

print(f'There are {data_train.isnull().any().sum()} 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

在这里插入图片描述
说明缺失特征中缺失率没有大于50%的特征。
具体的查看缺失特征及缺失率:

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

在这里插入图片描述
注:以上了解哪些列存在 “nan”, 并可以把nan的个数打印,主要的目的在于 nan存在的个数是否真的很大,如果很小一般选择填充,如果使用lgb等树模型可以直接空缺,让树自己去优化,但如果nan存在的过多、可以考虑删掉。
查看训练集测试集中特征属性只有一值的特征:

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]
print(one_value_fea)
print(one_value_fea_test)
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.')

在这里插入图片描述
可见训练集测试集中特征属性只有一值的特征是“policyCode”。

5. 查看特征的数值类型有哪些,对象类型有哪些

  1. 特征一般都是由类别型特征和数值型特征组成;
  2. 类别型特征有时具有非数值关系,有时也具有数值关系。比如‘grade’中的等级A,B,C等,是否只是单纯的
    分类,还是A优于其他要结合业务判断;
  3. 数值型特征本是可以直接入模的,但往往风控人员要对其做分箱,转化为WOE编码进而做标准评分卡等操
    作。从模型效果上来看,特征分箱主要是为了降低变量的复杂性,减少变量噪音对模型的影响,提高自变量
    和因变量的相关度,从而使模型更加稳定。
numerical_fea = list(data_train.select_dtypes(exclude=['object']).columns) 
category_fea = list(filter(lambda x: x not in numerical_fea,list(data_train.columns)))
print("numerical_fea:",numerical_fea)
print("category_fea:",category_fea)

在这里插入图片描述
数值型变量分析,数值型肯定是包括连续型变量和离散型变量:
1.划分数值型变量中的连续变量和分类变量:

#过滤数值型类别特征 
def get_numerical_serial_fea(data,feas): 
    numerical_serial_fea = [] 
    numerical_noserial_fea = [] 
    for fea in feas: 
        temp = data[fea].nunique() 
        if temp <= 10: 
            numerical_noserial_fea.append(fea) 
            continue 
        numerical_serial_fea.append(fea) 
    return numerical_serial_fea,numerical_noserial_fea 
numerical_serial_fea,numerical_noserial_fea = get_numerical_serial_fea(data_train,numerical_fea)
print("numerical_fea中的numerical_serial_fea:",numerical_serial_fea)
print("numerical_fea中的numerical_noserial_fea:",numerical_noserial_fea)

在这里插入图片描述
2.数值类别型变量分析:

print("特征term:\n",data_train['term'].value_counts())    #离散型变量
print("特征homeOwnership:\n",data_train['homeOwnership'].value_counts())    #离散型变量
print("特征verificationStatus:\n", data_train['verificationStatus'].value_counts())    #离散型变量
print("特征initialListStatus:\n", data_train['initialListStatus'].value_counts())    #离散型变量
print("特征applicationType:\n",data_train['applicationType'].value_counts())    #离散型变量
print("特征policyCode:\n", data_train['policyCode'].value_counts())    #离散型变量,无用,全部一个值
print("特征n11:\n", data_train['n11'].value_counts())    #离散型变量,相差悬殊,用不用再分析
print("特征n12:\n",data_train['n12'].value_counts())    #离散型变量,相差悬殊,用不用再分析

在这里插入图片描述
3.数值连续型变量分析:

#每个数字特征得分布可视化 
f = pd.melt(data_train, value_vars=numerical_serial_fea) 
g = sns.FacetGrid(f, col="variable", col_wrap=2, sharex=False, sharey=False) 
g = g.map(sns.distplot, "value")

在这里插入图片描述分析方式:1. 查看某一个数值型变量的分布,查看变量是否符合正态分布,如果不符合正态分布的变量可以log化后再观察下是否符合正态分布;2. 如果想统一处理一批数据变标准化,必须把这些之前已经正态化的数据提出。

4.非数值类别型变量分析:

category_fea

在这里插入图片描述

print("特征grade:\n",data_train['grade'].value_counts())  
print("特征subGrade:\n",data_train['subGrade'].value_counts())  
print("特征employmentLength:\n",data_train['employmentLength'].value_counts())  
print("特征issueDate:\n",data_train['issueDate'].value_counts())  
print("特征earliesCreditLine:\n",data_train['earliesCreditLine'].value_counts())  
print("特征isDefault:\n",data_train['isDefault'].value_counts()) 

总结:

  1. 上面我们用value_counts()等函数看了特征属性的分布,但是图表是概括原始信息最便捷的方式。
  2. 数无形时少直觉。
  3. 同一份数据集,在不同的尺度刻画上显示出来的图形反映的规律是不一样的。python将数据转化成图表,但结论是否正确需要由你保证。

6. 变量分布可视化
1.单一变量分布可视化:

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

在这里插入图片描述
2.根绝y值不同可视化x某个特征的分布:
首先查看类别型变量在不同y值上的分布:

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

在这里插入图片描述
其次查看连续型变量在不同y值上的分布:

subplots(1, 2, figsize=(15, 6)) 
data_train.loc[data_train['isDefault'] == 1]['loanAmnt'].apply(np.log).plot(kind='hist', bins=100, 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', bins=100, title='Log Loan Amt - Not Fraud', color='b', xlim=(-3, 10), ax=ax2)

在这里插入图片描述
7. 时间格式数据处理及查看

#转化成时间格式 
data_train['issueDate'] = pd.to_datetime(data_train['issueDate'],format='%Y-%m-%d') 
startdate = datetime.datetime.strptime('2007-06-01', '%Y-%m-%d') 
data_train['issueDateDT'] = data_train['issueDate'].apply(lambda x: x-startdate).dt.days

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 日期有重叠 所以使用基于时间的分割进行验证是不明智的

在这里插入图片描述
8. 透视图可以更好的了解数据

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

在这里插入图片描述
9. 用pandas_profiling生成数据报告

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

总结

数据探索性分析是初步了解数据,熟悉数据为特征工程做准备的阶段,甚至很多时候EDA阶段提取出来的特征可以直接当作规则来用。可见EDA的重要性,这个阶段的主要工作还是借助于各个简单的统计量来对数据整体的了解,分析各个类型变量相互之间的关系,以及用合适的图形可视化出来直观观察。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页