一、选题的背景
银行贷款在我们生中面临巨大经济压力时,可以有效的暂时解决方案之一,主要分析用户的还款状态、应还本金、应还利息、剩余本金、还款日期等情况,
此数据集为银行贷款情况训练集进行数据分析。
二、大数据分析设计方案
1.本数据集的数据内容与数据特征分析
1.1 数据集内容如下:
1.2 数据分析的课程设计方案概述
(1)先对数据集的数据进行预处理和清洗,并计算数据集中各种数据与相关性数据分析和特征分布绘制。
三、数据分析步骤
1.数据源
本次课程设计的数据集来源于和鲸社区平台。
附上网址:https://www.heywhale.com/mw/dataset/62207fb27e72dd001763eb3f/file
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()
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()
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()
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()
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()
# 对剩余利息进行分箱分析
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()
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()
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()))
四、总结
对于本课程设计的整体完成情况做一个总结,包括内容如下:
通过本次银行贷款测试集,进行了数据处理和预处理、分析图绘制、分箱分析和特征工程进行数据分析,在分析过程当中最困难还是特征工程的训练和分析图,我还得之后继续努力学习这类的数据分析技术。
标签:数据分析,剩余,plt,--,银行贷款,df,利息,本金,print From: https://www.cnblogs.com/tangzhiquan/p/16995825.html