银行还款情况预测 数据预处理部分(EDA) 特征工程前

设计语法点:

nuinque()这个函数分别统计每一列属性各自有多少个不同值。

在这里插入图片描述
在这里插入图片描述

4.1.1 数据分析库工具

import numpy as np
import pandas as pd 
from sklearn.preprocessing import LabelEncoder
import os
import warnings
warnings.filterwarnings('ignore')
import matplotlib.pyplot as plt
import seaborn as sns
# 加载数据集
app_train = pd.read_csv('application_train.csv')
app_train.shape # 数据规模

# 训练数据有307511个观察数据(每一个单独的贷款)和122个特征(变量),包括目标(我们想预测的标签)

在这里插入图片描述

app_train['TARGET'].value_counts()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

检测缺失值.

查看一下每列的缺失值个数以及每列的占比
缺失值模板:

def missing_value_table(df):
    #计算所有的缺失值
    mis_val = df.isnull().sum()
    # %比
    mis_val_percent = 100*df.isnull().sum()/len(df)
    #concat:合并                                         列
    mis_val_table = pd.concat([mis_val,mis_val_percent],axis=1)
    #                             重命名:0第一列  1第二列
    mis_val_rename = mis_val_table.rename(columns = {0:'Missing valyes',1:'% of total values'})
    #剔除完整的并排序:当前的第一列(缺失值个数)不等于0就代表有缺失值的,然后单独拿出来,按照”降序“从大到小排序
    mis_val_rename = mis_val_rename[mis_val_rename.iloc[:,1]!=0].sort_values('% of total values',ascending=False)
    return mis_val_rename

missing_value_table(app_train)[:10]

在这里插入图片描述

4.1.3 格式转换:Object类型处理

每个数据类型的列数。int64和float64是数值变量(可以是离散的,也可以是连续的)。对象列包含字符串,是类特征

app_train.dtypes.value_counts() # 查看不同的数据类型dtype个数

在这里插入图片描述
重点处理object类型,float64和int64先不用管,最后归一化就完事了

在这里插入图片描述

one_hot_encoding用法:特征的属性用3个以上,建议用one_hot_enconding ,比如说星期
**labelconding标准化:**如果特征用3个以内的属性,建议用标准化,比如说性别、是否抽烟

# 针对有”object“所有的特征进行去重 ,比如说Y N 有多少个 ,然后用labelencoding标准化
app_train.select_dtypes('object').apply(pd.Series.nunique,axis=0)

在这里插入图片描述
在这里插入图片描述
如果是object类型而且又是属性个数小于2

le = LabelEncoder() # 初始化标准化
for col in app_train:
    # 如果当前的列是”object“类型
    if app_train[col].dtype == 'object':
        # 如果每列特征中的属性个数小于等于2的话用LabelEnconder:0和1 
        if len(list(app_train[col].unique()))<=2:
            le.fit(app_train[col]) # 训练
            app_train[col]=le.transform(app_train[col]) # 转换
# 剩下的特征中大于2的属性,用读热编码来做
app_train = pd.get_dummies(app_train)
app_train.shape

在这里插入图片描述
EDA 分析

4.2.1 数据异常

#数据异常
#DAYS_BIRTH 是负值 
train_labels = app_train['TARGET']
app_train['DAYS_BIRTH'][:5]

在这里插入图片描述

#发现是负值 这个人从出生到贷款,一工活了多少天,负值
(app_train['DAYS_BIRTH']/-365).describe() # 除以-365,为年龄 , 平均年龄为43岁,比较大,贷款的是中年人

在这里插入图片描述

# DAYS_EMPLOYED: 工作年龄的时长 ,工龄 , 平均值为63815,有点扯了
(app_train['DAYS_EMPLOYED']).describe()

在这里插入图片描述
直方图分布图 plt.hist()
数据.plot(kind = ‘hist’)

#app_train['DAYS_EMPLOYED'].value_counts() 
plt.hist(app_train['DAYS_EMPLOYED'].dropna(), edgecolor = 'black')
# 右边350000是有问题的,说明是离群点, 左边不是0 ,而是接近0而已,只是右边有大值给影响的
app_train['DAYS_EMPLOYED'].plot.hist()
plt.show()

在这里插入图片描述
新增一列标志列:表示异常。。

# 创建一个异常的标志列
app_train['DAYS_EMPLOYED_ANOM'] = app_train['DAYS_EMPLOYED'] == 365243 # 最大值
#                             最大值替换为nan,后面再填充
app_train['DAYS_EMPLOYED'].replace({365243:np.nan},inplace=True)
app_train['DAYS_EMPLOYED'].plot.hist()
plt.show()

在这里插入图片描述
在这里插入图片描述
相关系数

在这里插入图片描述

# 相关系数:corr(),查看一下”TARGET“跟那个特征最相关吧,如果不sort_values,是乱序的,很难看
correlations = app_train.corr()['TARGET'].sort_values() # 默认为升序,从小到大
correlations.head() # 前5个

在这里插入图片描述

correlations.tail() # 后5个

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

考虑年龄对还款的影响:

# 年龄对还款的影响
#                      因为是负值有点绕,用   abs:绝对值
app_train['DAYS_BIRTH'] = abs(app_train['DAYS_BIRTH'])
app_train['TARGET'].corr(app_train['DAYS_BIRTH']) # 计算当前TARGET和DAYS_BIRTH的相关系数

# 说明工龄越小,客户不及时还款的可能性越小

在这里插入图片描述

# 查看年龄的分布情况
plt.style.use('fivethirtyeight') # 指定背景色的风格

plt.hist(app_train['DAYS_BIRTH']/365,edgecolor='k',bins=25)
plt.show()

在这里插入图片描述
在这里插入图片描述
核密度图更能反映 单个变量的分布情况:

plt.figure(figsize=(10,8))
#KDEPLOT:核密度估计图,更好的反映出趋势 
# TARGET=0 代表还钱的 TARGET=1 代表没按时还钱的        DAYS_BIRTH:年龄
sns.kdeplot(app_train.loc[app_train['TARGET']==0,'DAYS_BIRTH']/365,label='target==0')
sns.kdeplot(app_train.loc[app_train['TARGET']==1,'DAYS_BIRTH']/365,label='target==1')
plt.show()

# 分情况展示吧:橙色的代表不还钱的年龄分布 , 蓝色的代表还钱的年龄分布
# 说明30岁的人,不能还款的可能性是最大的,上有老下有小

在这里插入图片描述
在这里插入图片描述
这样话核密度图也可以:

plt.figure(figsize=(10,8))
app_train['DAYS_BIRTH'] = abs(app_train['DAYS_BIRTH'])/365
#KDEPLOT:核密度估计图,更好的反映出趋势
subset = app_train['DAYS_BIRTH'][ app_train['TARGET']  == 0].dropna()
sns.kdeplot(subset,label = 'TARGET==0', shade = False, alpha = 0.8)

subset = app_train['DAYS_BIRTH'][ app_train['TARGET']  == 1].dropna()
sns.kdeplot(subset,label = 'TARGET==1', shade = False, alpha = 0.8)

在这里插入图片描述
在这里插入图片描述

对年龄进行切分

# 目标和年龄的数据拿过来
age_data = app_train[['TARGET','DAYS_BIRTH']]
# 转换为工龄
age_data['YEARS_BIRTH'] = age_data['DAYS_BIRTH']/365
# 统计一下不同年龄段
# 设置一下年龄从20到70,切成11刀
age_data['YEARS_BINNED'] = pd.cut(age_data['YEARS_BIRTH'],bins=np.linspace(20,70,num=11))
age_data.head()

在这里插入图片描述

# 统计不同年龄段的信息指标
age_groups = age_data.groupby('YEARS_BINNED').mean()
age_groups

# 左边是年龄分成了11刀 , TARGET = 0.123036是该列中是最高的,代表最不可能还钱的,55岁以上的还钱的几率是最好的人

在这里插入图片描述
绘图展示:注意:
因为这里输入要么是字符串或者数字
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

根据相关系数进行研究:

在这里插入图片描述

# 相关系数
ext_data = app_train[['TARGET','EXT_SOURCE_1','EXT_SOURCE_2','EXT_SOURCE_3','DAYS_BIRTH']]
ext_data_corrs = ext_data.corr()
ext_data_corrs

在这里插入图片描述

# 相关系数的可视化
plt.figure(figsize=(10,8))
sns.heatmap(ext_data_corrs,cmap = plt.cm.RdYlBu_r,annot=True)
plt.show()

在这里插入图片描述
在这里插入图片描述
对这个三个指标绘制KDE图 针对最终的结果:

# 每个指标的变化趋势
plt.figure(figsize=(10,10))
# 索引 图        枚举里
for i,source in enumerate(['EXT_SOURCE_3','EXT_SOURCE_2','EXT_SOURCE_1']):
    # 3 行 1 列 第几个子图
    plt.subplot(3,1,i+1)
    #kdeplot
    sns.kdeplot(app_train.loc[app_train['TARGET']==0,source]/365,label='target==0')
    sns.kdeplot(app_train.loc[app_train['TARGET']==1,source]/365,label='target==1')
    plt.title('D of %s' % source) # 当前的子图名字
    # 设置布局和间隙
plt.tight_layout(h_pad=2.5) # 在H方向竖着方向,pad间隙的范围
plt.show()

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值