零基础入门金融风控-贷款违约预测
- 探索性数据分析(EDA)
-
- 具体操作
-
- 1.引入库
- 2.读入数据
- 3.查看数据整体情况
- 4.查看缺失值、唯一值、异常值、重复值
- 5.深入数据,查看数据类型
- 6.数据间相关关系
赛题链接地址
进度安排
探索性数据分析(EDA)
探索性数据分析(Exploratory Data Analysis,EDA)主要的工作是:对数据进行清洗,对数据进行描述(描述统计量,图表),查看数据的分布,比较数据之间的关系,培养对数据的直觉,对数据进行总结等。
维度名称及含义:
- 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,为一些贷款人行为计数特征的处理
具体操作
1.引入库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
2.读入数据
#训练集
train_url='D:/tianchi/train.csv'
train=pd.read_csv(train_url)
#测试集
testA_url='D:/tianchi/testA.csv'
test_A=pd.read_csv(testA_url)
train.head()
3.查看数据整体情况
主要包括数据集大小,特征维度,各维度数据类型,缺失值异常值情况,连续变量的描述信息,如基本统计量、分布,分类变量的描述信息,全部变量的描述信息。
#测试集大小
test_A.shape
#训练集大小
train.shapetrain.columns
train.info()
train.describe()
1)所有特征都是正倾斜的,说明由于数据中有些较大的极端值,使得整体平均数被极少数的极端大值拉大了,俗称“被平均”,而中位数受极端值的影响其实很小,因而此时用中位数作为中心趋势的估计比较稳健
2)个别特征如employmentTitle离散系数(coefficient of variation,或变异系数)非常高,接近甚至超过1,说明数据的离散程度很大,波动范围很大
train.describe(include=['O'])
4.查看缺失值、唯一值、异常值、重复值
#查看有缺失值的列
train.isnull().any().sum()
#查看每列缺失值数量,若缺失值过多可以删除该列
missing = train.isnull().sum()
missing = missing[missing > 0]
missing.sort_values(inplace=True)
missing.plot.bar()
#查看唯一值的列
[f for f in train.columns if train[f].nunique <= 1]
#['policyCode']
查看异常值
- 单变量异常值:通过观察单变量的分布情况就能看到
- 多变量异常值:n维空间中的异常值
- 箱线图可以看出数据的集中程度,异常值,平均值等情况,可以将其作为异常值的一种检测手段。
5.深入数据,查看数据类型
- 类别型数据
- 数值型数据
- 离散数值型数据
- 连续数值型数据
#类别型变量(qualitative)和数值型变量(quantiative)
quantitative = [f for f in train.columns if train[f].dtypes != 'object']
qualitative = [f for f in train.columns if train[f].dtypes == 'object']
#分离数值型变量中的离散型变量(numerical_noserial_fea )和连续型变量(numerical_serial_fea)
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)continuenumerical_serial_fea.append(fea)return numerical_serial_fea,numerical_noserial_fea
numerical_serial_fea,numerical_noserial_fea = get_numerical_serial_fea(train,quantitative)#查看离散型变量分布情况
for col in numerical_noserial_fea:print(train[col].value_counts())#f = pd.melt(train, value_vars=quantitative)
#g = sns.FacetGrid(f, col="variable", col_wrap=2, sharex=False, sharey=False)
#g = g.map(sns.distplot, "value")#连续型变量的特征分布可视化
#直方图又称质量分布图,它是表示资料变化情况的一种主要工具。用直方图可以解析出资料的规则性,比较直观地看
#出产品质量特性的分布状态,对于资料分布状况一目了然,便于判断其总体质量分布情况。直方图表示通过沿数据范
#围形成分箱,然后绘制条以显示落入每个分箱的观测次数的数据分布。
for col in numerical_serial_fea:try:sns.distplot(train[col])plt.show()except Exception as re:#print(re)if str(re).startswith("Selected KDE bandwidth is 0"):#Selected KDE bandwidth is 0. Cannot estiamte density.sns.distplot(train[col], kde_kws={
'bw': 0.1}) #设置带宽为0.1plt.show()else:raise re
- 查看某一个数值型变量的分布,查看变量是否符合正态分布,如果不符合正太分布的变量可以log(np.log())化后再观察下是否符合正态分布。
- 如果想统一处理一批数据变标准化 必须把这些之前已经正态化的数据提出
- 正态化的原因:一些情况下正态非正态可以让模型更快的收敛,一些模型要求数据正态(eg. GMM、KNN),保证数据不要过偏态即可,过于偏态可能会影响模型预测结果。
#Ploting Transaction Amount Values Distribution
plt.figure(figsize=(16,12))
plt.suptitle('Transaction Values Distribution', fontsize=22)plt.subplot(221) #第一个数字2代表行,第二个数字2代表列,第三个数字1代表坐标,说明共有4个位置图形,此处为第一坐标图形
sub_plot_1 = sns.distplot(train['loanAmnt'])
sub_plot_1.set_title("loanAmnt Distribuition", fontsize=18)
sub_plot_1.set_xlabel("")
sub_plot_1.set_ylabel("Probability", fontsize=15)plt.subplot(222)
sub_plot_2 = sns.distplot(np.log(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)
#查看类别型数据分布情况
for col in qualitative :print(train[col].value_counts())
6.数据间相关关系
#相关性协方差表,corr()函数,返回结果接近0说明无相关性,大于0说明是正相关,小于0是负相关.
train_corr = train.drop('id',axis=1).corr()
print(train_corr)
a = plt.subplots(figsize = (20,12)) #调整画布大小
a=sns.heatmap(train_corr,vmax=.8,square=True) #画热力图 annot = True 显示系数
a.set_yticklabels(a.get_yticklabels(), rotation=360)
a.set_xticklabels(train_corr.index, rotation='vertical')
plt.show()
#特征比较多,我们只需要观察部分特征,比如那些和目标特征相关系数比较大的前10个
#loanAmnt 相关度特征排序,取出与loanAmnt相关度最高的K列
# 寻找K个最相关的特征信息
k = 10 #number of varables for heatmap
cols = train_corr.nlargest(k,'loanAmnt')['loanAmnt'].index
cm = np.corrcoef(train[cols].values.T)
sns.set(font_scale=1.5)
hm = plt.subplots(figsize = (20,12))
hm = sns.heatmap(cm, cmap='RdBu', linewidths=0.05, cbar=True, annot=True, square=True, fmt='.2f', annot_kws={
'size': 10}, yticklabels=cols.values, xticklabels=cols.values)
hm.set_yticklabels(hm.get_yticklabels(), rotation=360)
hm.set_xticklabels(train_corr.index, rotation='vertical')
plt.show()