首页 > 其他分享 >贷款违约预测分析

贷款违约预测分析

时间:2022-12-23 20:26:22浏览次数:54  
标签:plt 预测 nums 欠款 违约 rcParams print 贷款 data

(一)选题背景:随着社会发展,社会上越来越多人为了提前获得房子车子等一些价值比较高的商品,选择了向银行和各种借款平台贷款,而那些平台为降低借贷风险,希望通过有效的信用评估体系筛选优质借款人、保留一般借款人、拒绝风险较高借款人,并根据不同信用等级划分,实现借款利率差异化定价。因此,制定了严格、严谨、有效的信用评估系统,结合外部评分和内部评级,在最大程度上规避坏账风险。

参考来源:kaggle关于标签学习的讨论区

数据集来源:kaggle,网址:http://idatascience.cn/dataset-detail?table_id=100398

 

(二)大数据分析的实现步骤:

 

1.下载数据集

 

2.本数据集的数据内容与数据特征

 

 

 3,开始进行分析

1.加载数据
#使用pandas函数读取"基于用户行为的贷款预测训练集.csv"文件,去除默认序号列
data = pd.read_csv("D:/python/data/基于用户行为的贷款预测训练集.csv",index_col=0)
#print(data.shape)
#结果:(252000,12)
#如结果所示,数据共计252000条,共有12列,也就是每条数据有12个特征值
#接下来,我们列出5条数据
#print(data.head)

2.数据清洗
#查看每列的数据是否有空值
#print(data.isnull().sum())
#如结果所示,12列的空值均为0
#接下来检查数据与否存在重复值
#print(data.duplicated().sum())
#如结果所示,共计208810条数据为重复值

#通过drop_duplicates()函数,清除掉多余的重复值
data.drop_duplicates(inplace=True)

#这时候我们再次查看数据的形状
#print(data.shape)
#结果:(43190,12)
#可以看到,现在数据只剩下43190条了,检查一下重复值是否去除完毕了
#print(data.duplicated().sum())
#结果:0
#如结果所示,当前的数据中不再存在重复值

#总体输出看一下数据的基础数值特性
#print(data.describe())

3 数据可视化分析
# 抽取100人查看收入情况

x_data = data['Income'].tolist()
x_data = x_data[0:100]
print(len(x_data))

y_data = list(range(0, 100))
print(len(y_data))

# 正确显示中文和负号
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 画图,plt.bar()可以画柱状图
for i in range(len(y_data)):
plt.bar(y_data[i], x_data[i])
# 设置图片名称
plt.title("大体收入分析")
# 设置x轴标签名
#plt.xlabel("年份")
# 设置y轴标签名
plt.ylabel("Income")
# 显示
plt.show()

 

 


#拖欠贷款情况
x_data = data[['CITY','Risk_Flag']]
nums = data[['CITY','Risk_Flag']].groupby(['Risk_Flag']).count()
x_data = nums.values.tolist()
#x_data.drop_duplicates(inplace=True)
#print(x_data)
print(nums)
y_data = ['未欠款','欠款']

# 正确显示中文和负号
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 画图,plt.bar()可以画柱状图
for i in range(len(y_data)):
plt.bar(y_data[i], x_data[i])
# 设置图片名称
plt.title("贷款拖欠人数分析")
# 设置x轴标签名
plt.xlabel("拖欠情况")
# 设置y轴标签名
plt.ylabel("人数")
# 显示
plt.show()


 

 # 房屋情况

nums = data[['CITY','House_Ownership']].groupby(['House_Ownership']).count()

x_data = nums.values.tolist()
#x_data.drop_duplicates(inplace=True)
print(x_data)
print("============")
x1_data=[1267,2244,39679]
y1_data=[0,1,2]

y_data = ['未知','拥有','租来的']

# 正确显示中文和负号
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
plt.figure(figsize=(8,5))
# 画图,plt.bar()可以画柱状图
# print(len(y_data))
for x in range(len(y_data)):
plt.bar(y_data[x], x_data[x])
for i,z in zip(y1_data,x1_data):
plt.text(i,z,z,ha="center",va='bottom',fontsize="7")
# 设置图片名称
plt.title("房屋情况分析")
# 设置x轴标签名
plt.xlabel("情况统计")
# 设置y轴标签名
plt.ylabel("人数统计")
# 显示
plt.show()
 

 

# 职业情况
nums = data[['CITY','Profession']].groupby(['Profession']).count()
print(nums)
x_data = nums.values.tolist()
#x_data.drop_duplicates(inplace=True)
# print(x_data)
x1_data=[]
for i in x_data:
x1_data.append(i[0])
# print(x1_data)

y_data = nums.index.tolist()
# print(y_data)
# 正确显示中文和负号
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 画图,plt.bar()可以画柱状图
plt.figure(figsize=(10,10))
for i in range(len(y_data)):
plt.bar(y_data[i], x_data[i])
#为柱状图添加数字
for a, b in zip(y_data,x1_data):
plt.text(a,b,b,ha="center",va="bottom",fontsize='5')
# 设置图片名称
plt.title("职业人数 分析")
plt.xticks(range(0,51,8))
# 设置x轴标签名
plt.xlabel("不同职业")
# 设置y轴标签名
plt.ylabel("人数")
# 显示
plt.show()
# exit()
     

 

 

 #婚姻情况
nums = data[['CITY','Married/Single']].groupby(['Married/Single']).count()
print(nums)
x_data = nums.values.tolist()
#x_data.drop_duplicates(inplace=True)
# print(x_data)
x1_data=[]
for i in x_data:
x1_data.append(i[0])
print(x1_data)
# y_data = nums.index.tolist()
y_data = ['已婚','未婚']
# 正确显示中文和负号
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 画图,plt.bar()可以画柱状图
for i in range(len(y_data)):
plt.bar(y_data[i], x_data[i])
#为柱状图添加数字
for a, b in zip(y_data,x1_data):
plt.text(a,b,b,ha="center",va="bottom",fontsize='5')
# 设置图片名称
plt.title("婚烟状况分析")
# 设置x轴标签名
plt.xlabel("是否结婚")
# 设置y轴标签名
plt.ylabel("人数")
# 显示
plt.show()

     

 

#年龄情况
nums = data[['CITY','Age']].groupby(['Age']).count()

x_data = nums.values.reshape(-1).tolist()

#x_data.drop_duplicates(inplace=True)
#print(x_data)

y_data = nums.index.tolist()

# 正确显示中文和负号
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 画图,plt.bar()可以画饼状图
plt.figure(figsize=(15,15))
expodes = (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
plt.pie(x_data, explode=expodes, labels = y_data,autopct='%.1f%%')
# 设置图片名称
plt.title("年龄分析")
plt.show()
   

 

 

 # 居住年数情况
nums = data[['CITY','CURRENT_HOUSE_YRS']].groupby(['CURRENT_HOUSE_YRS']).count()

x_data = nums.values.reshape(-1).tolist()

#x_data.drop_duplicates(inplace=True)
#print(x_data)

y_data = nums.index.tolist()

# 正确显示中文和负号
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 画图,plt.bar()可以画柱状图
expodes = (0,0,0,0,0)

plt.pie(x_data, explode=expodes, labels = y_data,autopct='%.1f%%')
# 设置图片名称
plt.title("居住年数分析")
plt.show()
   

 

 

 #不同情况欠款占比分析
plt.figure(figsize=[15,5])
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# plt.suptitle("趋势图")
nums= data[['CITY','Married/Single','Risk_Flag']].groupby(['Married/Single', 'Risk_Flag']).count().reset_index()
y_data=nums['CITY']
# print(y_data)
# print(nums)
nums['Married/Single']=["已婚未欠款","已婚欠款","未婚未欠款","未婚欠款"]
plt.subplot(131)
plt.title("婚烟情况与欠款占比")
plt.pie(y_data,labels=nums['Married/Single'],autopct='%.1f%%')
plt.legend()
# ======================================================
nums1= data[['CITY','House_Ownership','Risk_Flag']].groupby(['House_Ownership', 'Risk_Flag']).count().reset_index()
plt.subplot(132)
y2_data=nums1['CITY']
# print(nums1)
# print(y2_data)
plt.title("房子情况与欠款占比")
nums1['House_Ownership']=["norent_noown未欠款","norent_noown欠款","owned未欠款","owned欠款","rented 未欠款","rented 欠款"]
plt.pie(y2_data,labels=nums1['House_Ownership'],autopct='%.1f%%')
plt.legend()
# ======================================================
nums2= data[['CITY','Car_Ownership','Risk_Flag']].groupby(['Car_Ownership', 'Risk_Flag']).count().reset_index()
# print(nums2)
y3_data=nums2['CITY']
plt.subplot(133)
plt.title("汽车情况与欠款占比")
nums2['Car_Ownership']=["未拥有汽车未欠款","未拥有汽车未欠款","拥有汽车未欠款","拥有汽车欠款",]
plt.pie(y3_data,labels=nums2['Car_Ownership'],autopct='%.1f%%')
plt.legend()
plt.show()
   

 

 

 全部代码如下:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import random
import seaborn as sns


#Step1 加载数据
#使用pandas函数读取"基于用户行为的贷款预测训练集.csv"文件,去除默认序号列
data = pd.read_csv("D:/python/data/基于用户行为的贷款预测训练集.csv",index_col=0)
#print(data.shape)
#结果:(252000,12)
#如结果所示,数据共计252000条,共有12列,也就是每条数据有12个特征值
#接下来,我们列出5条数据
#print(data.head)

#Step2 数据清洗
#查看每列的数据是否有空值
#print(data.isnull().sum())
#如结果所示,12列的空值均为0
#接下来检查数据与否存在重复值
#print(data.duplicated().sum())
#如结果所示,共计208810条数据为重复值

#通过drop_duplicates()函数,清除掉多余的重复值
data.drop_duplicates(inplace=True)

#这时候我们再次查看数据的形状
#print(data.shape)
#结果:(43190,12)
#可以看到,现在数据只剩下43190条了,检查一下重复值是否去除完毕了
#print(data.duplicated().sum())
#结果:0
#如结果所示,当前的数据中不再存在重复值

#总体输出看一下数据的基础数值特性
#print(data.describe())

#Step3 数据可视化分析

# 抽取100人查看收入情况

x_data = data['Income'].tolist()
x_data = x_data[0:100]
print(len(x_data))

y_data = list(range(0, 100))
print(len(y_data))

# 正确显示中文和负号
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 画图,plt.bar()可以画柱状图
for i in range(len(y_data)):
plt.bar(y_data[i], x_data[i])
# 设置图片名称
plt.title("大体收入分析")
# 设置x轴标签名
#plt.xlabel("年份")
# 设置y轴标签名
plt.ylabel("Income")
# 显示
plt.show()



#拖欠贷款情况
x_data = data[['CITY','Risk_Flag']]
nums = data[['CITY','Risk_Flag']].groupby(['Risk_Flag']).count()
x_data = nums.values.tolist()
#x_data.drop_duplicates(inplace=True)
#print(x_data)
print(nums)
y_data = ['未欠款','欠款']

# 正确显示中文和负号
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 画图,plt.bar()可以画柱状图
for i in range(len(y_data)):
plt.bar(y_data[i], x_data[i])
# 设置图片名称
plt.title("贷款拖欠人数分析")
# 设置x轴标签名
plt.xlabel("拖欠情况")
# 设置y轴标签名
plt.ylabel("人数")
# 显示
plt.show()




# 房屋情况
nums = data[['CITY','House_Ownership']].groupby(['House_Ownership']).count()

x_data = nums.values.tolist()
#x_data.drop_duplicates(inplace=True)
print(x_data)
print("============")
x1_data=[1267,2244,39679]
y1_data=[0,1,2]

y_data = ['未知','拥有','租来的']

# 正确显示中文和负号
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
plt.figure(figsize=(8,5))
# 画图,plt.bar()可以画柱状图
# print(len(y_data))
for x in range(len(y_data)):
plt.bar(y_data[x], x_data[x])
for i,z in zip(y1_data,x1_data):
plt.text(i,z,z,ha="center",va='bottom',fontsize="7")
# 设置图片名称
plt.title("房屋情况分析")
# 设置x轴标签名
plt.xlabel("情况统计")
# 设置y轴标签名
plt.ylabel("人数统计")
# 显示
plt.show()



# 职业情况
nums = data[['CITY','Profession']].groupby(['Profession']).count()
print(nums)
x_data = nums.values.tolist()
#x_data.drop_duplicates(inplace=True)
# print(x_data)
x1_data=[]
for i in x_data:
x1_data.append(i[0])
# print(x1_data)

y_data = nums.index.tolist()
# print(y_data)
# 正确显示中文和负号
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 画图,plt.bar()可以画柱状图
plt.figure(figsize=(10,10))
for i in range(len(y_data)):
plt.bar(y_data[i], x_data[i])
#为柱状图添加数字
for a, b in zip(y_data,x1_data):
plt.text(a,b,b,ha="center",va="bottom",fontsize='5')
# 设置图片名称
plt.title("职业人数 分析")
plt.xticks(range(0,51,8))
# 设置x轴标签名
plt.xlabel("不同职业")
# 设置y轴标签名
plt.ylabel("人数")
# 显示
plt.show()
# exit()



#婚姻情况
nums = data[['CITY','Married/Single']].groupby(['Married/Single']).count()
print(nums)
x_data = nums.values.tolist()
#x_data.drop_duplicates(inplace=True)
# print(x_data)
x1_data=[]
for i in x_data:
x1_data.append(i[0])
# print(x1_data)
# y_data = nums.index.tolist()
y_data = ['已婚','未婚']
# 正确显示中文和负号
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 画图,plt.bar()可以画柱状图
for i in range(len(y_data)):
plt.bar(y_data[i], x_data[i])
#为柱状图添加数字
for a, b in zip(y_data,x1_data):
plt.text(a,b,b,ha="center",va="bottom",fontsize='5')
# 设置图片名称
plt.title("婚烟状况分析")
# 设置x轴标签名
plt.xlabel("是否结婚")
# 设置y轴标签名
plt.ylabel("人数")
# 显示
plt.show()



#年龄情况
nums = data[['CITY','Age']].groupby(['Age']).count()

x_data = nums.values.reshape(-1).tolist()

#x_data.drop_duplicates(inplace=True)
#print(x_data)

y_data = nums.index.tolist()

# 正确显示中文和负号
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 画图,plt.bar()可以画饼状图
plt.figure(figsize=(15,15))
expodes = (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
plt.pie(x_data, explode=expodes, labels = y_data,autopct='%.1f%%')
# 设置图片名称
plt.title("年龄分析")
plt.show()

# 居住年数情况
nums = data[['CITY','CURRENT_HOUSE_YRS']].groupby(['CURRENT_HOUSE_YRS']).count()

x_data = nums.values.reshape(-1).tolist()

#x_data.drop_duplicates(inplace=True)
#print(x_data)

y_data = nums.index.tolist()

# 正确显示中文和负号
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 画图,plt.bar()可以画柱状图
expodes = (0,0,0,0,0)

plt.pie(x_data, explode=expodes, labels = y_data,autopct='%.1f%%')
# 设置图片名称
plt.title("居住年数分析")
plt.show()

#不同情况欠款占比分析
plt.figure(figsize=[15,5])
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# plt.suptitle("趋势图")
nums= data[['CITY','Married/Single','Risk_Flag']].groupby(['Married/Single', 'Risk_Flag']).count().reset_index()
y_data=nums['CITY']
# print(y_data)
# print(nums)
nums['Married/Single']=["已婚未欠款","已婚欠款","未婚未欠款","未婚欠款"]
plt.subplot(131)
plt.title("婚烟情况与欠款占比")
plt.pie(y_data,labels=nums['Married/Single'],autopct='%.1f%%')
plt.legend()
# ======================================================
nums1= data[['CITY','House_Ownership','Risk_Flag']].groupby(['House_Ownership', 'Risk_Flag']).count().reset_index()
plt.subplot(132)
y2_data=nums1['CITY']
# print(nums1)
# print(y2_data)
plt.title("房子情况与欠款占比")
nums1['House_Ownership']=["norent_noown未欠款","norent_noown欠款","owned未欠款","owned欠款","rented 未欠款","rented 欠款"]
plt.pie(y2_data,labels=nums1['House_Ownership'],autopct='%.1f%%')
plt.legend()
# ======================================================
nums2= data[['CITY','Car_Ownership','Risk_Flag']].groupby(['Car_Ownership', 'Risk_Flag']).count().reset_index()
# print(nums2)
y3_data=nums2['CITY']
plt.subplot(133)
plt.title("汽车情况与欠款占比")
nums2['Car_Ownership']=["未拥有汽车未欠款","未拥有汽车未欠款","拥有汽车未欠款","拥有汽车欠款",]
plt.pie(y3_data,labels=nums2['Car_Ownership'],autopct='%.1f%%')
plt.legend()
plt.show()
                       

 

标签:plt,预测,nums,欠款,违约,rcParams,print,贷款,data
From: https://www.cnblogs.com/yangyao123/p/16998377.html

相关文章