银行客户信用风险评估综合练习

本文由用户“df02”分享发布 更新时间:2021-11-19 13:10:44 举报文档

以下为《银行客户信用风险评估综合练习》的无排版文字预览,完整格式请下载

下载前请仔细阅读文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。

银行客户信用风险评估项目

要求:

补全并调试每部分代码,在代码后面附输出结果截图。

说明:

4.5-4.10特征分布,做法相同(第一次)

4.11-4.14连续型数据特征分布,做法相同(第一次)

4.15-4.36 离散型数据和连续型数据的缺失值处理(第二次)

4.37-4.38 数字编码和One-Hot编码(第二次)//数据预处理

5.1-5.7 新增评估指标计算(第三次)

6.1-6.12 风控模型:逻辑回归和随机森林(第三次:逻辑回归;第四次:随机森林)

7.1-7.10 风险评估模型效果评估方法(第四次)

数据集描述:





3.2 从data.csv文件中读取客户数据

3.3 对数据进行格式转换

import pandas as pd

data= pd.read_csv('data.csv',encoding='gbk')

data = pd.DataFrame(data)

data.head()

输出结果截图:



4.1 数据探索分析

4.2 查看数据前五行

import pandas as pd

# 使用head()函数查看数据前五行

data_5 =data.head()

print(data_5)

输出结果截图:



4.3 查看数据集的基本情况



data.info()



4.4 查看数据的基本统计信息

import pandas as pd

# 使用describe()函数查看数据整体的基本统计信息

data_des = data.describe()

print(data_des)

输出结果截图:





4.5 是否违约(Default)特征分析

import pandas as pd

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(8,6))

# 绘制柱状图,查看违约关系的取值分布情况

data['Default'].value_counts(dropna=False).plot(kind='bar',rot=40)

# 在柱形上方显示计数

counts = data['Default'].value_counts(dropna=False).values

for index, item in zip([0,1,2], counts):

plt.text(index, item, item, ha="center", va= "bottom", fontsize=12)

# 设置柱形名称

plt.xticks([0,1,2],['未违约','违约','NaN'])

# 设置x、y轴标签

plt.xlabel("是否违约")

plt.ylabel("客户数量")

# 设置标题以及字体大小

plt.title("违约与未违约数量分布图",size=13)

# 设置中文显示

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

plt.rcParams['font.family']=['sans-serif']

plt.show()



4.6 城市级别(CityId)特征分布

import seaborn as sns

import matplotlib.pyplot as plt

#建立画布ax1和ax2,及设置图像大小,设置subplots()函数中参数为(1,2)表示两画图呈一行两列

fig,[ax1,ax2] = plt.subplots(1,2,figsize=(16,6))

# 对CityId列的类别设定顺序

data['CityId'] = data['CityId'].astype('category')

data['CityId'] = data['CityId'].cat.set_categories(['一线城市', '二线城市', '其它'],ordered=True)

# 绘制柱状图,查看不同城市级别在不同是否违约的取值分布情况

sns.countplot(x='CityId', hue='Default', data=data, ax=ax1)

# 将具体的计数值显示在柱形上方

counts=data['Default'].groupby(data['CityId']).value_counts().values

count1 = counts[[0, 2, 4]]

count2 = counts[[1, 3, 5]]

for index, item1, item2 in zip([0,1,2], count1, count2):

ax1.text(index-0.2, item1 + 0.05, '%.0f' % item1, ha="center", va= "bottom",fontsize=12)

ax1.text(index+0.2, item2 + 0.05, '%.0f' % item2, ha="center", va= "bottom",fontsize=12)

# 绘制柱状图查看违约率分布

cityid_rate = data.groupby('CityId')['Default'].sum() / data.groupby('CityId')['Default'].count()

sns.barplot(x=[0, 1, 2], y=cityid_rate, ax=ax2)

# 将具体的计数值显示在柱形上方

for index, item in zip([0,1,2], cityid_rate):

ax2.text(index, item, '%.3f' % item, ha="center", va= "bottom",fontsize=12)

#设置柱形名称

ax1.set_xticklabels(['一线城市', '二线城市', '其它'])

ax2.set_xticklabels(['一线城市', '二线城市', '其它'])

# 设置图例名称

ax1.legend(['未违约','违约'])

# 设置标题以及字体大小

ax1.set_title("不同城市级别下不同违约情况数量分布柱状图",size=13)

ax2.set_title("不同城市级别违约率分布柱状图",size=13)

# 设置x,y轴标签

ax1.set_xlabel("CityId")

ax1.set_ylabel("客户人数")

ax2.set_xlabel("CityId")

ax2.set_ylabel("违约率")

#显示汉语标注

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

plt.rcParams['font.family']=['sans-serif']

plt.show()



4.7 文化程度(education)特征分布

import seaborn as sns

import matplotlib.pyplot as plt

fig,[ax1,ax2] = plt.subplots(1,2,figsize=(16,6))

# 对education列的类别设定顺序

data['education'] = data['education'].astype('category')

data['education'] = data['education'].cat.set_categories(['小学', '初中', '高中', '本科以上'],ordered=True)

# 绘制柱状图,查看不同文化程度(education)在不同是否违约(Default)的取值分布情况

____

# 将具体的计数值显示在柱形上方

counts=data['Default'].groupby(data['education']).value_counts().values

count1 = counts[[0, 2, 4,6]]

count2 = counts[[1, 3, 5,7]]

for index, item1, item2 in zip([0,1,2,3], count1, count2):

ax1.text(index-0.2, item1 + 0.05, '%.0f' % item1, ha="center", va= "bottom",fontsize=12)

ax1.text(index+0.2, item2 + 0.05, '%.0f' % item2, ha="center", va= "bottom",fontsize=12)

# 绘制柱状图查看违约率分布

education_rate = data.groupby('education')['Default'].sum() / data.groupby('education')['Default'].count()

sns.barplot(x=[0,1,2,3],y=education_rate.values,ax=ax2)

# 将具体的计数值显示在柱形上方

for index, item in zip([0,1,2,3], education_rate):

ax2.text(inimport seaborn as sns

import matplotlib.pyplot as plt

fig,[ax1,ax2] = plt.subplots(1,2,figsize=(16,6))

# 对education列的类别设定顺序

data['education'] = data['education'].astype('category')

data['education'] = data['education'].cat.set_categories(['小学', '初中', '高中', '本科以上'],ordered=True)

# 绘制柱状图,查看不同文化程度(education)在不同是否违约(Default)的取值分布情况

sns.countplot(x='education', hue='Default', data=data, ax=ax1)

# 将具体的计数值显示在柱形上方

counts=data['Default'].groupby(data['education']).value_counts().values

count1 = counts[[0, 2, 4,6]]

count2 = counts[[1, 3, 5,7]]

for index, item1, item2 in zip([0,1,2,3], count1, count2):

ax1.text(index-0.2, item1 + 0.05, '%.0f' % item1, ha="center", va= "bottom",fontsize=12)

ax1.text(index+0.2, item2 + 0.05, '%.0f' % item2, ha="center", va= "bottom",fontsize=12)

# 绘制柱状图查看违约率分布

education_rate = data.groupby('education')['Default'].sum() / data.groupby('education')['Default'].count()

sns.barplot(x=[0,1,2,3],y=education_rate.values,ax=ax2)

# 将具体的计数值显示在柱形上方

for index, item in zip([0,1,2,3], education_rate):

ax2.text(index, item, '%.2f' % item, ha="center", va= "bottom",fontsize=12)

# 设置柱形名称

ax1.set_xticklabels(['小学', '初中', '高中','本科以上'])

ax2.set_xticklabels(['小学', '初中', '高中','本科以上'])

# 设置图例名称

ax1.legend(['未违约','违约'])

# 设置标题以及字体大小

ax1.set_title("不同文化程度下不同违约情况数量分布柱状图",size=13)

ax2.set_title("不同文化程度违约率分布柱状图",size=13)

# 设置x,y轴标签

ax1.set_xlabel("education")

ax1.set_ylabel("客户人数")

ax2.set_xlabel("education")

ax2.set_ylabel("违约率")

#显示汉语标注

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

plt.rcParams['font.family']=['sans-serif']

plt.show()



4.8 三要素(threeVerify)特征分布

import seaborn as sns

import matplotlib.pyplot as plt

fig,[ax1,ax2] = plt.subplots(1,2,figsize=(16,6))

# 对threeVerify列的类别设定顺序

data['threeVerify'] = data['threeVerify'].astype('category')

data['threeVerify'] = data['threeVerify'].cat.set_categories(['一致','不一致'],ordered=True)

# 绘制柱状图,查看不同三要素验证情况(threeVerify)在不同是否违约(Default)的取值分布情况

sns.countplot(x='threeVerify', hue='Default', data=data, ax=ax1)

# 将具体的计数值显示在柱形上方

counts=data['Default'].groupby(data['threeVerify']).value_counts().values

count1 = counts[[0, 2]]

count2 = counts[[1, 3]]

for index, item1, item2 in zip([0,1,2,3], count1, count2):

ax1.text(index-0.2, item1 + 0.05, '%.0f' % item1, ha="center", va= "bottom",fontsize=12)

ax1.text(index+0.2, item2 + 0.05, '%.0f' % item2, ha="center", va= "bottom",fontsize=12)

# 绘制柱状图查看违约率分布

threeVerify_rate = data.groupby('threeVerify')['Default'].sum() / data.groupby('threeVerify')['Default'].count()

sns.barplot(x=[0,1],y=threeVerify_rate.values,ax=ax2)

# 将具体的计数值显示在柱形上方

for index, item in zip([0,1], threeVerify_rate):

ax2.text(index, item, '%.2f' % item, ha="center", va= "bottom",fontsize=12)

# 设置柱形名称

ax1.set_xticklabels(['一致','不一致'])

ax2.set_xticklabels(['一致','不一致'])

# 设置图例名称

ax1.legend(['未违约','违约'])

# 设置标题以及字体大小

ax1.set_title("不同三要素验证情况下不同违约情况数量分布柱状图",size=13)

ax2.set_title("不同三要素验证情况违约率分布柱状图",size=13)

# 设置x,y轴标签

ax1.set_xlabel("threeVerify")

ax1.set_ylabel("客户人数")

ax2.set_xlabel("threeVerify")

ax2.set_ylabel("违约率")

#显示汉语标注

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

plt.rcParams['font.family']=['sans-serif']

plt.show()



4.9 婚姻状况(maritalStatus)特征分布

import seaborn as sns

import matplotlib.pyplot as plt

fig,[ax1,ax2] = plt.subplots(1,2,figsize=(16,6))

# 对maritalStatus列的类别设定顺序

data['maritalStatus'] = data['maritalStatus'].astype('category')

data['maritalStatus'] = data['maritalStatus'].cat.set_categories(['未婚','已婚'],ordered=True)

# 绘制柱状图,查看不同婚姻状况在不同违约情况的取值分布

sns.countplot(x='maritalStatus', hue='Default', data=data, ax=ax1)

# 将具体的计数值显示在柱形上方

counts=data['Default'].groupby(data['maritalStatus']).value_counts().values

count1 = counts[[0, 2]]

count2 = counts[[1, 3]]

for index, item1, item2 in zip([0,1,2,3], count1, count2):

ax1.text(index-0.2, item1 + 0.05, '%.0f' % item1, ha="center", va= "bottom",fontsize=12)

ax1.text(index+0.2, item2 + 0.05, '%.0f' % item2, ha="center", va= "bottom",fontsize=12)

# 绘制柱状图查看违约率分布

maritalStatus_rate = data.groupby('maritalStatus')['Default'] 内容过长,仅展示头部和尾部部分文字预览,全文请查看图片预览。 n_estimators = 150, criterion = 'entropy', max_depth = 5, min_samples_split = 2, random_state=12)

rf.fit(x_train, y_train)

# 查看随机森林各项指标系数

importance = ____

# 通过图形的方式直观展现前八名的重要指标

index=data.drop('Default', axis=1).columns

feature_importance = pd.DataFrame(importance.T, index=index).sort_values(by=0, ascending=True)

# # 查看指标重要度

print(feature_importance)

# 水平条形图绘制

feature_importance.tail(8).plot(kind='barh', title='Feature Importances', figsize=(8, 6), legend=False)

plt.show()

7.10 指标重要度综合排序

[文章尾部最后500字内容到此结束,中间部分内容请查看底下的图片预览]

以上为《银行客户信用风险评估综合练习》的无排版文字预览,完整格式请下载

下载前请仔细阅读上面文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。

图片预览