一、选题的背景

  银行贷款在我们生中面临巨大经济压力时,可以有效的暂时解决方案之一,主要分析用户的还款状态、应还本金、应还利息、剩余本金、还款日期等情况,

此数据集为银行贷款情况训练集进行数据分析。

二、大数据分析设计方案

1.本数据集的数据内容与数据特征分析

1.1   数据集内容如下:

 

银行大数据分析 银行大数据分析报告_数据

 

 

 

1.2 数据分析的课程设计方案概述

   (1)先对数据集的数据进行预处理和清洗,并计算数据集中各种数据与相关性数据分析和特征分布绘制。

三、数据分析步骤

1.数据源

  本次课程设计的数据集来源于和鲸社区平台。

  附上网址:https://www.heywhale.com/mw/dataset/61b31105ccc1f6001729dc78/content

2.数据清洗

#导入数据集
df=pd.read_csv('D:\ludashi\LP.csv',encoding='UTF-8')

#查看数据前5行情况
print(df.head())

#查看数据大小
print("银行贷款数据集大小",df.shape)

显示结果如下:

    

ListingId Number of periods ... recorddate sex
0     126541                  1  ...   2017/2/22  man
1     126541                  2  ...   2017/2/22  man
2     126541                  3  ...   2017/2/22  man
3     126541                  4  ...   2017/2/22  man
4     126541                  5  ...   2017/2/22  man[5 rows x 11 columns]


银行贷款数据集大小 (1048575, 11)

 

3、数据预处理

#查看数据大小
print("银行贷款数据集大小",df.shape)

#查看总体数据
print("银行贷款数据集字段",df.info())

#修改字段名
print("修改前的字段名:",df.columns)
df.columns = ['ID','期数','还款状态','应还本金',
              '应还利息','剩余本金','剩余利息','到期日期',
              '还款日期','记录日期','性别']

print("修改后的字段名:",df.columns)

# 查看各字段类型
df.info()

显示结果如下:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1048575 entries, 0 to 1048574
Data columns (total 11 columns):
 #   Column               Non-Null Count    Dtype  
---  ------               --------------    -----  
 0   ListingId            1048575 non-null  int64  
 1   Number of periods    1048575 non-null  int64  
 2   Repayment status     1048575 non-null  int64  
 3   principal            1048575 non-null  float64
 4   Interest is repaid   1048575 non-null  float64
 5   Remaining principal  1048575 non-null  float64
 6   Residual interest    1048575 non-null  float64
 7   Expiration date      1048575 non-null  object 
 8   Repayment date       1048575 non-null  object 
 9   recorddate           1048575 non-null  object 
 10  sex                  193 non-null      object 
dtypes: float64(4), int64(3), object(4)
memory usage: 88.0+ MB
银行贷款数据集字段 None
修改前的字段名: Index(['ListingId', 'Number of periods', 'Repayment status', 'principal',
       'Interest is repaid', 'Remaining principal', 'Residual interest',
       'Expiration date', 'Repayment date', 'recorddate', 'sex'],
      dtype='object')
修改后的字段名: Index(['ID', '期数', '还款状态', '应还本金', '应还利息', '剩余本金', '剩余利息', '到期日期', '还款日期',
       '记录日期', '性别'],
      dtype='object')
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1048575 entries, 0 to 1048574
Data columns (total 11 columns):
 #   Column  Non-Null Count    Dtype  
---  ------  --------------    -----  
 0   ID      1048575 non-null  int64  
 1   期数      1048575 non-null  int64  
 2   还款状态    1048575 non-null  int64  
 3   应还本金    1048575 non-null  float64
 4   应还利息    1048575 non-null  float64
 5   剩余本金    1048575 non-null  float64
 6   剩余利息    1048575 non-null  float64
 7   到期日期    1048575 non-null  object 
 8   还款日期    1048575 non-null  object 
 9   记录日期    1048575 non-null  object 
 10  性别      193 non-null      object 
dtypes: float64(4), int64(3), object(4)
memory usage: 88.0+ MB

 

# 查看各字段的缺失值数量
print('各字段的缺失值数量\n',df.isna().sum())

# 统计重复值
print('统计重复值\n',df.duplicated().sum())
# 删除重复值
df.drop_duplicates(inplace=True)

显示结果如下:

各字段的缺失值数量
ID 0
期数 0
还款状态 0
应还本金 0
应还利息 0
剩余本金 0
剩余利息 0
到期日期 0
还款日期 0
记录日期 0
性别 1048382
dtype: int64
统计重复值
0

 

print('查看各字段\n',df.columns)
# 查看数据类型
print('查看数据类型\n',df.dtypes)

# 描述性统计
print('描述性统计\n',df.describe())

显示结果如下:

查看各字段
Index(['ID', '期数', '还款状态', '应还本金', '应还利息', '剩余本金', '剩余利息', '到期日期', '还款日期',
'记录日期', '性别'],
dtype='object')
查看数据类型
ID int64
期数 int64
还款状态 int64
应还本金 float64
应还利息 float64
剩余本金 float64
剩余利息 float64
到期日期 object
还款日期 object
记录日期 object
性别 object
dtype: object
描述性统计
ID 期数 ... 剩余本金 剩余利息

count  1.048575e+06  1.048575e+06  ...  1.048575e+06  1.048575e+06
mean   9.503385e+06  5.843962e+00  ...  5.574482e+01  3.073355e+00
std    3.279341e+06  3.506679e+00  ...  2.917230e+02  1.731609e+01
min    1.265410e+05  1.000000e+00  ...  0.000000e+00  0.000000e+00
25%    7.111431e+06  3.000000e+00  ...  0.000000e+00  0.000000e+00
50%    9.948971e+06  5.000000e+00  ...  0.000000e+00  0.000000e+00
75%    1.210059e+07  9.000000e+00  ...  0.000000e+00  0.000000e+00
max    1.490577e+07  2.400000e+01  ...  7.734837e+04  3.199990e+03[8 rows x 7 columns]

 

#修改ID字段类型
df['ID'] = df['ID'].astype('object')
df.info()

print('查看ID是否有重复值\n',df[df.duplicated()].ID.count())
print('描述性统计,并查看异常值\n',df.describe())

显示结果如下:

<class 'pandas.core.frame.DataFrame'>
Int64Index: 1048575 entries, 0 to 1048574
Data columns (total 11 columns):
 #   Column  Non-Null Count    Dtype  
---  ------  --------------    -----  
 0   ID      1048575 non-null  object 
 1   期数      1048575 non-null  int64  
 2   还款状态    1048575 non-null  int64  
 3   应还本金    1048575 non-null  float64
 4   应还利息    1048575 non-null  float64
 5   剩余本金    1048575 non-null  float64
 6   剩余利息    1048575 non-null  float64
 7   到期日期    1048575 non-null  object 
 8   还款日期    1048575 non-null  object 
 9   记录日期    1048575 non-null  object 
 10  性别      193 non-null      object 
dtypes: float64(4), int64(2), object(5)
memory usage: 96.0+ MB
查看ID是否有重复值
 0
描述性统计,并查看异常值
                  期数          还款状态  ...          剩余本金          剩余利息
count  1.048575e+06  1.048575e+06  ...  1.048575e+06  1.048575e+06
mean   5.843962e+00  1.049221e+00  ...  5.574482e+01  3.073355e+00
std    3.506679e+00  5.974522e-01  ...  2.917230e+02  1.731609e+01
min    1.000000e+00  0.000000e+00  ...  0.000000e+00  0.000000e+00
25%    3.000000e+00  1.000000e+00  ...  0.000000e+00  0.000000e+00
50%    5.000000e+00  1.000000e+00  ...  0.000000e+00  0.000000e+00
75%    9.000000e+00  1.000000e+00  ...  0.000000e+00  0.000000e+00
max    2.400000e+01  4.000000e+00  ...  7.734837e+04  3.199990e+03

 

4.大数据分析过程及采用的算法 

 利用统计分析、数据挖掘,对数据进行分析处理,获得分析结果,是数据分析处理流程的重要步骤。 

    ●常规的统计方法
  ●通过使用机器学习的方法,处理采集到的数据。
  ●使用的第三方库
  如 sklearn 等,或其它

数据可视化 

 数据可视化借助于图形化手段,将数据分析结果直观、清晰、有效地展现出来。使得用户可以从不同的维度观察数据,对数据有更深入地理解。说明每个可视化图形表示的意义

 

4.1  特征分布图

def plot_distribution(dataset,
cols=10,
width=25,
height=30,
hspace=0.2,
wspace=0.5):

    fg = plt.figure(figsize=(width,height))
    fg.subplots_adjust(left=None,
    right=None,
    top=None,
    bottom=None,
    wspace=wspace,
    hspace=hspace)
    rows = math.ceil(float(df.shape[1]))
    for i,column in enumerate(dataset.columns):
        ax = fg.add_subplot(rows, cols, i + 1)
        ax.set_title(column)

        g = sns.displot(dataset[column])
        plt.xticks(rotation=25)

plot_distribution(df, cols=5,
width=30,
height=60,
hspace=0.5,
wspace=0.5)
plt.show()

银行大数据分析 银行大数据分析报告_数据_02

银行大数据分析 银行大数据分析报告_5e_03

银行大数据分析 银行大数据分析报告_数据_04

银行大数据分析 银行大数据分析报告_银行大数据分析_05

银行大数据分析 银行大数据分析报告_数据_06

银行大数据分析 银行大数据分析报告_数据集_07

银行大数据分析 银行大数据分析报告_数据_08

银行大数据分析 银行大数据分析报告_数据集_09

银行大数据分析 银行大数据分析报告_数据集_10

银行大数据分析 银行大数据分析报告_数据集_11

银行大数据分析 银行大数据分析报告_数据集_12

 

 

4.2还款情况分布柱形图

plt.figure(figsize=(5, 5))
plt.bar(['欠款'], df['还款状态'].value_counts()[1], width=0.4)
plt.bar(['归还'], df['还款状态'].value_counts()[0], width=0.4)

plt.title('剩余本金', fontsize=11)
plt.ylabel('应还本金', fontsize=11)
plt.grid()
plt.show()

银行大数据分析 银行大数据分析报告_数据_13

 

 

4.3  期数与其他交易统计情况

df3 = df[['剩余本金', '还款状态', '应还利息']].groupby(['还款状态', '剩余本金']).count()
df3.reset_index(inplace=True)

x = df3[df3['还款状态'] == 0]
plt.figure(figsize=(20,8))
plt.bar(range(len(x)), x['应还利息'], tick_label=x['剩余本金'], width=0.5)

plt.xlabel('期数', fontsize=10)  # 设置x轴
plt.ylabel('应还本金', fontsize=10)  # 设置y轴
plt.title('统计情况', fontsize=18)

plt.xticks(fontsize=10) # 设置x轴大小
plt.yticks(fontsize=10) # 设置y轴大小

plt.grid()
plt.show()

银行大数据分析 银行大数据分析报告_数据_14

 

4.4  矩阵散点图

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

sns.pairplot(df.loc[:,['应还本金','应还利息','剩余本金','剩余利息','到期日期']],
             diag_kind='kde',aspect=1.8)
plt.show()

银行大数据分析 银行大数据分析报告_5e_15

 

4.2.1  进行分箱分析

def cutbar(data1,data2,num,xlabel,ylabel,data1label,data2label):

    plt.rcParams['font.sans-serif'] =['SimHei']
    plt.rc('font',size=13)
    fig,axes=plt.subplots(1,1,sharey=True,figsize=(10,6))

    axes.set_xlabel('应还利息区间')
    axes.set_ylabel('人数')
    width=0.4

    x=np.arange(num)
    axes.set_xticks(x)

    axes.bar(x-width/2,data1,width=width,label=data1label)
    axes.bar(x+width/2,data2,width=width,label=data2label)
    axes.legend(loc='best')
    axes.set_xticklabels(data1.index.values,rotation=30)

    for a,b in zip(x-width/2,data1):
        axes.text(a,b,b,ha='center',va='bottom',color='k')
    for a,b in zip(x+width/2,data2):
        axes.text(a,b,b,ha='center',va='bottom',color='k')

# 对应还利息进行分箱分析
a=sorted(list(set(np.concatenate([np.linspace(0,60,6),
np.linspace(60,df.应还利息.max(),6)],
axis=0))))
df['应还利息分箱']=pd.cut(df.应还利息,bins=a,right=False,precision=0)
bardata_cdmor=df[df.应还本金==1].groupby('应还利息分箱').ID.count()
bardata_notcdmor=df[df.应还本金==0].groupby('应还利息分箱').ID.count()
cutbar(bardata_notcdmor,bardata_cdmor,10,'应还利息区间','人数','非存款客户','存款客户')
plt.show()

银行大数据分析 银行大数据分析报告_数据集_16

 

# 对剩余利息进行分箱分析
a=sorted(list(set(np.concatenate([np.linspace(0,60,6),np.linspace(60,df.剩余利息.max(),6)],axis=0))))
df['剩余利息分箱']=pd.cut(df.应还本金,bins=a,right=False,precision=0)
bardata_cdmor=df[df.剩余本金==1].groupby('剩余利息分箱').ID.count()
bardata_notcdmor=df[df.剩余本金==0].groupby('剩余利息分箱').ID.count()
cutbar(bardata_notcdmor,bardata_cdmor,10,'剩余利息区间','人数','非个贷客户','个贷客户')
plt.show()

银行大数据分析 银行大数据分析报告_银行大数据分析_17

 

5、特征工程

df= pd.concat([df,df],ignore_index=True,sort=False)
print(df.head())

df['应还利息小于等于9.8'] = np.where(df.应还利息<=9.8,1,0).astype('int')

df['剩余大于等于2.8'] = np.where(df.剩余利息>=2.8,1,0).astype('int')

df['应还本金大于等于102'] = np.where(df.应还本金>=102,1,0).astype('int')

df['剩余本金大于等于3'] = np.where(df.剩余本金>=3,1,0).astype('int')

df['存款到个贷的转化'] = df['应还本金大于等于102'] +  df['剩余本金大于等于3'] + df['期数']

 

5.1、改善特征分布

fg,axes = plt.subplots(1,3,figsize=(10,6))
for i,index in zip(np.arange(3),['应还本金','应还利息','剩余利息']):
    df[index].plot(kind='box',ax=axes[i])
plt.show()

银行大数据分析 银行大数据分析报告_数据集_18

 

5.2、统计非数值数据

print(df['期数'].unique())
print(df['还款状态'].unique())
print(df['应还本金'].unique())

print(df['应还利息'].nunique())
print(df['剩余本金'].nunique())
print(df['剩余利息'].nunique())

显示结果如下:

[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24]
[1 2 3 0 4]
[1380.23 1400.94 1421.95 ... 785.78 798.88 825.73]
20266
29065
7619

 

5.3、对数转换 创建新的一列

df['应还本金2'] = np.log1p(df['应还本金'])
df['应还利息2'] = np.log1p(df['应还利息'])
df['剩余利息2'] = np.log1p(df['剩余利息'])

5.4、标准化处理

from sklearn.preprocessing import StandardScaler
std = StandardScaler()
for i in ['应还本金2','应还利息2','剩余利息2']:
    std.fit_transform(df[i].values.reshape(-1,1)6、)
5.5、划分输入特征和预测特征,并拆分训练集和测试集
from sklearn.model_selection import train_test_split
X = np.array(df.loc[:,['应还本金2','应还利息2','剩余本金','剩余利息','到期日期',
                     '还款日期','记录日期']])
y = np.array(df['期数'])
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=1)
print('训练集样本量为:',X_train.shape[0],'个')
print('测试集样本量为:',X_test.shape[0],'个')
print('上采样前训练集中正例有%d个,反例有%d个'%((y_train==1).sum(),(y_train==0).sum()))

显示结果如下:

训练集样本量为: 1468005 个
测试集样本量为: 629145 个
上采样前训练集中正例有156973个,反例有0个

 

6、完整代码

1 # 导入第三方相关库
  2 import pandas as pd
  3 import numpy as np
  4 import matplotlib.pyplot as plt
  5 import matplotlib.style as ms
  6 from sklearn.preprocessing import StandardScaler
  7 from sklearn.metrics import mean_squared_error
  8 import math
  9 import seaborn as sns
 10 import warnings
 11 
 12 warnings.filterwarnings("ignore")
 13 
 14 # 切换绘图风格
 15 ms.use("seaborn-dark")
 16 # 显示负号
 17 plt.rcParams['axes.unicode_minus'] = False
 18 
 19 # 显示中文
 20 plt.rcParams['font.sans-serif'] = ['SimHei']
 21 
 22 #导入数据集
 23 df=pd.read_csv('D:\ludashi\LP.csv',encoding='UTF-8')
 24 
 25 #查看数据前5行情况
 26 print(df.head())
 27 
 28 #查看数据大小
 29 print("银行贷款数据集大小",df.shape)
 30 
 31 #查看总体数据
 32 print("银行贷款数据集字段",df.info())
 33 
 34 #修改字段名
 35 print("修改前的字段名:",df.columns)
 36 df.columns = ['ID','期数','还款状态','应还本金',
 37               '应还利息','剩余本金','剩余利息','到期日期',
 38               '还款日期','记录日期','性别']
 39 
 40 print("修改后的字段名:",df.columns)
 41 
 42 # 查看各字段类型
 43 df.info()
 44 
 45 # 查看各字段的缺失值数量
 46 print('各字段的缺失值数量\n',df.isna().sum())
 47 
 48 # 统计重复值
 49 print('统计重复值\n',df.duplicated().sum())
 50 # 删除重复值
 51 df.drop_duplicates(inplace=True)
 52 
 53 print('查看各字段\n',df.columns)
 54 # 查看数据类型
 55 print('查看数据类型\n',df.dtypes)
 56 
 57 # 描述性统计
 58 print('描述性统计\n',df.describe())
 59 
 60 #修改ID字段类型
 61 df['ID'] = df['ID'].astype('object')
 62 df.info()
 63 
 64 print('查看ID是否有重复值\n',df[df.duplicated()].ID.count())
 65 print('描述性统计,并查看异常值\n',df.describe())
 66 
 67 #绘制每个特征的分布
 68 def plot_distribution(dataset,
 69 cols=10,
 70 width=25,
 71 height=30,
 72 hspace=0.2,
 73 wspace=0.5):
 74 
 75     fg = plt.figure(figsize=(width,height))
 76     fg.subplots_adjust(left=None,
 77     right=None,
 78     top=None,
 79     bottom=None,
 80     wspace=wspace,
 81     hspace=hspace)
 82     rows = math.ceil(float(df.shape[1]))
 83     for i,column in enumerate(dataset.columns):
 84         ax = fg.add_subplot(rows, cols, i + 1)
 85         ax.set_title(column)
 86 
 87         g = sns.displot(dataset[column])
 88         plt.xticks(rotation=25)
 89 
 90 plot_distribution(df, cols=5,
 91 width=30,
 92 height=60,
 93 hspace=0.5,
 94 wspace=0.5)
 95 plt.show()
 96 
 97 # 还款情况分布柱形图
 98 plt.figure(figsize=(5, 5))
 99 plt.bar(['欠款'], df['还款状态'].value_counts()[1], width=0.4)
100 plt.bar(['归还'], df['还款状态'].value_counts()[0], width=0.4)
101 
102 plt.title('剩余本金', fontsize=11)
103 plt.ylabel('应还本金', fontsize=11)
104 plt.grid()
105 plt.show()
106 
107 #期数与其他交易统计情况
108 df3 = df[['剩余本金', '还款状态', '应还利息']].groupby(['还款状态', '剩余本金']).count()
109 df3.reset_index(inplace=True)
110 
111 x = df3[df3['还款状态'] == 0]
112 plt.figure(figsize=(20,8))
113 plt.bar(range(len(x)), x['应还利息'], tick_label=x['剩余本金'], width=0.5)
114 
115 plt.xlabel('期数', fontsize=10)  # 设置x轴
116 plt.ylabel('应还本金', fontsize=10)  # 设置y轴
117 plt.title('统计情况', fontsize=18)
118 
119 plt.xticks(fontsize=10) # 设置x轴大小
120 plt.yticks(fontsize=10) # 设置y轴大小
121 
122 plt.grid()
123 plt.show()
124 
125 #矩阵散点图
126 plt.rcParams['font.sans-serif'] = ['SimHei']
127 plt.rcParams['axes.unicode_minus'] = False
128 
129 sns.pairplot(df.loc[:,['应还本金','应还利息','剩余本金','剩余利息','到期日期']],
130              diag_kind='kde',aspect=1.8)
131 plt.show()
132 
133 # 进行分箱分析
134 def cutbar(data1,data2,num,xlabel,ylabel,data1label,data2label):
135 
136     plt.rcParams['font.sans-serif'] =['SimHei']
137     plt.rc('font',size=13)
138     fig,axes=plt.subplots(1,1,sharey=True,figsize=(10,6))
139 
140     axes.set_xlabel('应还利息区间')
141     axes.set_ylabel('人数')
142     width=0.4
143 
144     x=np.arange(num)
145     axes.set_xticks(x)
146 
147     axes.bar(x-width/2,data1,width=width,label=data1label)
148     axes.bar(x+width/2,data2,width=width,label=data2label)
149     axes.legend(loc='best')
150     axes.set_xticklabels(data1.index.values,rotation=30)
151 
152     for a,b in zip(x-width/2,data1):
153         axes.text(a,b,b,ha='center',va='bottom',color='k')
154     for a,b in zip(x+width/2,data2):
155         axes.text(a,b,b,ha='center',va='bottom',color='k')
156 
157 # 对应还利息进行分箱分析
158 a=sorted(list(set(np.concatenate([np.linspace(0,60,6),
159 np.linspace(60,df.应还利息.max(),6)],
160 axis=0))))
161 df['应还利息分箱']=pd.cut(df.应还利息,bins=a,right=False,precision=0)
162 bardata_cdmor=df[df.应还本金==1].groupby('应还利息分箱').ID.count()
163 bardata_notcdmor=df[df.应还本金==0].groupby('应还利息分箱').ID.count()
164 cutbar(bardata_notcdmor,bardata_cdmor,10,'应还利息区间','人数','非存款客户','存款客户')
165 plt.show()
166 #
167 # # # 对剩余利息进行分箱分析
168 a=sorted(list(set(np.concatenate([np.linspace(0,60,6),np.linspace(60,df.剩余利息.max(),6)],axis=0))))
169 df['剩余利息分箱']=pd.cut(df.应还本金,bins=a,right=False,precision=0)
170 bardata_cdmor=df[df.剩余本金==1].groupby('剩余利息分箱').ID.count()
171 bardata_notcdmor=df[df.剩余本金==0].groupby('剩余利息分箱').ID.count()
172 cutbar(bardata_notcdmor,bardata_cdmor,10,'剩余利息区间','人数','非个贷客户','个贷客户')
173 plt.show()
174 
175 def multi_kde(data,pointsnum,unit):
176     plt.rcParams['font.sans-serif'] = ['SimHei']
177     plt.rcParams['axes.unicode_minus'] = False
178     plt.rc('font',size=13)
179     i = data.shape[1]
180     a = data.columns.values[1]
181     fig,axes = plt.subplots(1,i-1,figsize=(20,5))
182     for j,k in zip(np.arange(1,i),np.arange(i-1)):
183         b = data[data[a] == 0]
184         c = data[data[a] == 1]
185         d = data.iloc[:,j]
186         e = np.array(unit)
187         plt.xticks(np.arange(d.min(),
188                              d.max(),
189                              int((d.max()-d.min())/pointsnum)))
190 
191         axes[k].set_xlabel(data.columns.values[j]+e[k])
192         b.iloc[:,j].plot.kde(ax=axes[k])
193         c.iloc[:,j].plot.kde(ax=axes[k])
194         axes[k].legend(labels=['非'+a,a],
195                        loc='best',fontsize=10)
196 
197         plt.subplots_adjust(wspace=0.3)
198 multi_kde(df.loc[:,['期数','还款状态','应还本金','应还利息','剩余本金']])
199 plt.show()
200 
201 df= pd.concat([df,df],ignore_index=True,sort=False)
202 print(df.head())
203 
204 df['应还利息小于等于9.8'] = np.where(df.应还利息<=9.8,1,0).astype('int')
205 
206 df['剩余大于等于2.8'] = np.where(df.剩余利息>=2.8,1,0).astype('int')
207 
208 df['应还本金大于等于102'] = np.where(df.应还本金>=102,1,0).astype('int')
209 
210 df['剩余本金大于等于3'] = np.where(df.剩余本金>=3,1,0).astype('int')
211 
212 df['存款到个贷的转化'] = df['应还本金大于等于102'] +  df['剩余本金大于等于3'] + df['期数']
213 
214 # 改善特征分布
215 fg,axes = plt.subplots(1,3,figsize=(10,6))
216 for i,index in zip(np.arange(3),['应还本金','应还利息','剩余利息']):
217     df[index].plot(kind='box',ax=axes[i])
218 plt.show()
219 
220 # 统计非数值数据
221 print(df['期数'].unique())
222 print(df['还款状态'].unique())
223 print(df['应还本金'].unique())
224 
225 print(df['应还利息'].nunique())
226 print(df['剩余本金'].nunique())
227 print(df['剩余利息'].nunique())
228 
229 # 对数转换 创建新的一列
230 df['应还本金2'] = np.log1p(df['应还本金'])
231 df['应还利息2'] = np.log1p(df['应还利息'])
232 df['剩余利息2'] = np.log1p(df['剩余利息'])
233 
234 # 标准化处理
235 from sklearn.preprocessing import StandardScaler
236 std = StandardScaler()
237 for i in ['应还本金2','应还利息2','剩余利息2']:
238     std.fit_transform(df[i].values.reshape(-1,1))
239 
240 
241 # 划分输入特征和预测特征,并拆分训练集和测试集
242 from sklearn.model_selection import train_test_split
243 X = np.array(df.loc[:,['应还本金2',
244 '应还利息2',
245 '剩余本金',
246 '剩余利息',
247 '到期日期',
248 '还款日期',
249 '记录日期']])
250 
251 y = np.array(df['期数'])
252 X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=1)
253 
254 print('训练集样本量为:',X_train.shape[0],'个')
255 print('测试集样本量为:',X_test.shape[0],'个')
256 print('上采样前训练集中正例有%d个,反例有%d个'%((y_train==1).sum(),(y_train==0).sum()))

 

四、总结

对于本课程设计的整体完成情况做一个总结,包括内容如下:
  通过本次银行贷款测试集,进行了数据处理和预处理、分析图绘制、分箱分析和特征工程进行数据分析,在分析过程当中最困难还是特征工程的训练和分析图,我还得之后继续努力学习这类的数据分析技术。