python贷款_Python贷款逾期分析
感谢猴子的分析案例:贷款逾期分析,但原文是采用Excel分析,本文用Python实现,发现几个问题:
原作者使用Excel进行数据分析,处理的数据量为1048576条,但数据集的实际数据量有2875146条,使用Excel处理无法处理完整数据集,不仅慢而且很卡
因此,我尝试使用Python处理,并且发现Python处理的结果与Excel处理结果有部分出入
这是必然,因为Excel处理并非完整的数据集
一、前言
本文对逾期用户的行为特征进行分析,给出逾期用户的行为特征画像,为降低逾期,风险前置提出有建设性的意见。数据是某平台2016年的贷款数据,来自kaggle平台https://www.kaggle.com/skihikingkevin/online-p2p-lending。
二、提出问题
用户画像的核心工作是给用户贴“标签”,而“标签”是能表示用户某一维度特征的标识,主要用于业务的运营和数据分析。结合业务,根据人口统计、社会属性、用户消费画像、用户行为画像,用户兴趣画像等特征来构建,如下图,这些是各行业通用的特征。但用户画像包含的内容并不完全固定,像金融领域,还会有风险画像,包括征信、违约、洗钱、还款能力、保险黑名单等。
根据用户画像的基本含义和数据集内各字段维度构建逾期用户画像的相关问题和数据维度进行确定,提出以下问题:整体贷款逾期情况如何?
金额类型、借款期限、贷款利率、评级、借款用途五个维度的逾期情况
逾期率高的用户画像是怎样的?
根据用户画像并结合数据集字段,画出下面的用户特征的思维导图
图片中标为红色的就是本次用来分析的用户信息。通过分析各行为特征维度中的逾期占比,进而得出逾期客户的整体特征,来帮助企业及时调整,改善经营。
三、数据分析
1 数据说明
数据字段及中文含义:
2 数据导入及查看
# 加载包
import pandas as pd
import warnings
warnings.filterwarnings('ignore')
# 导入数据并查看基本信息
data = pd.read_csv('Master_Loan_Summary.csv')
data.info()
RangeIndex: 2875146 entries, 0 to 2875145
Data columns (total 18 columns):
loan_number int64
amount_borrowed float64
term int64
borrower_rate float64
installment float64
grade object
origination_date object
listing_title object
principal_balance float64
principal_paid float64
interest_paid float64
late_fees_paid float64
debt_sale_proceeds_received float64
last_payment_date object
next_payment_due_date object
days_past_due int64
loan_status_description object
data_source object
dtypes: float64(8), int64(3), object(7)
memory usage: 394.8+ MB
看不出有无缺失数据
3 数据清洗
(1)删除重复项
# 查看不重复数据
print(data.shape)
print(len(data.loan_number.unique()))
data_duplicates = data.drop_duplicates(subset = 'loan_number',keep = 'first')
(2875146, 18)
2874088
原始数据量为2875146条,而loan_number的唯一值为2874088,说明有重复项
drop_duplicates删除重复项
(2)缺失值处理
数据的缺失值很大程度上影响分析结果,如果某一字段缺失数据较多(超过50%),分析过程中要考虑是否删除该字段,因为缺失过多就没有业务意义了
# 查看缺失值,缺失率达到30%,删除字段
print(data.isnull().any())
print(data_duplicates['listing_title'].isnull().sum() / len(data_duplicates))
loan_number False
amount_borrowed False
term False
borrower_rate False
installment False
grade False
origination_date False
listing_title True
principal_balance False
principal_paid False
interest_paid False
late_fees_paid False
debt_sale_proceeds_received False
last_payment_date False
next_payment_due_date False
days_past_due False
loan_status_description False
data_source False
dtype: bool
0.29997480940040805
所有字段中listing_title有缺失值,并且缺失率约为30%,删掉缺失样本
# 删除缺失样本
data_duplicates = data_duplicates.dropna()
print(data_duplicates.isnull().any())
loan_number False
amount_borrowed False
term False
borrower_rate False
installment False
grade False
origination_date False
listing_title False
principal_balance False
principal_paid False
interest_paid False
late_fees_paid False
debt_sale_proceeds_received False
last_payment_date False
next_payment_due_date False
days_past_due False
loan_status_description False
data_source False
dtype: bool
(3)一致化处理
为方便分析逾期情况,按逾期天数区分是否逾期,逾期天数大于0为逾期,用“1”表示,逾期天数等于0为正常还款,用“0”表示
# 逾期一致化处理
def over_Due(x):
if x == 0:
return 0
else:
return 1
data_duplicates['over_due'] = data_duplicates['days_past_due'].apply(over_Due)
为了分析逾期与贷款金额、贷款利率之间的关系,需要将零散的贷款金额分布划分几个层级,最低是1000元,最高是40000元,因此以5000为一个梯度划分,贷款利率分布划分几个层级,最低为0.05,最高位0.35,以0.05为一个梯度划分
# 贷款金额分箱
bins = [0,5000,10000,15000,20000,25000,30000,35000,40000]
level = ['5K以内','5K-1W','1W-1.5W','1.5W-2W','2W-2.5W','2.5W-3W','3W-3.5W','3.5W-4W']
data_duplicates['amount_type'] = pd.cut(data_duplicates['amount_borrowed'],bins = bins,labels = level)
# 贷款利率分箱
binsr = [0.05,0.1,0.15,0.2,0.25,0.3,0.35]
levelr = ['0.05-0.1','0.1-0.15','0.15-0.2','0.2-0.25','0.25-0.3','0.3-0.35']
data_duplicates['rate_type'] = pd.cut(data_duplicates['borrower_rate'],bins = binsr,labels = levelr)
print(data_duplicates[['amount_borrowed','amount_type','borrower_rate','rate_type']])
amount_borrowed amount_type borrower_rate rate_type
0 27050.0 2.5W-3W 0.1099 0.1-0.15
1 4800.0 5K以内 0.1099 0.1-0.15
2 12000.0 1W-1.5W 0.0762 0.05-0.1
3 12000.0 1W-1.5W 0.1199 0.1-0.15
4 12000.0 1W-1.5W 0.0662 0.05-0.1
5 11500.0 1W-1.5W 0.2290 0.2-0.25
6 15000.0 1W-1.5W 0.0890 0.05-0.1
7 24000.0 2W-2.5W 0.1353 0.1-0.15
8 12000.0 1W-1.5W 0.1353 0.1-0.15
9 14000.0 1W-1.5W 0.1285 0.1-0.15
10 20800.0 2W-2.5W 0.1353 0.1-0.15
11 10000.0 5K-1W 0.0967 0.05-0.1
12 11100.0 1W-1.5W 0.1498 0.1-0.15
13 12000.0 1W-1.5W 0.1099 0.1-0.15
14 3000.0 5K以内 0.1285 0.1-0.15
15 7550.0 5K-1W 0.1624 0.15-0.2
16 28000.0 2.5W-3W 0.0762 0.05-0.1
17 27600.0 2.5W-3W 0.1997 0.15-0.2
18 8000.0 5K-1W 0.1099 0.1-0.15
19 15000.0 1W-1.5W 0.1447 0.1-0.15
20 9750.0 5K-1W 0.1398 0.1-0.15
21 10075.0 1W-1.5W 0.2050 0.2-0.25
22 30000.0 2.5W-3W 0.1825 0.15-0.2
23 6000.0 5K-1W 0.1099 0.1-0.15
24 6000.0 5K-1W 0.0603 0.05-0.1
25 4500.0 5K以内 0.1922 0.15-0.2
26 10000.0 5K-1W 0.1398 0.1-0.15
27 20000.0 1.5W-2W 0.1199 0.1-0.15
28 31825.0 3W-3.5W 0.2050 0.2-0.25
29 7200.0 5K-1W 0.1099 0.1-0.15
... ... ... ... ...
2013462 10000.0 5K-1W 0.0531 0.05-0.1
2013463 20000.0 1.5W-2W 0.2109 0.2-0.25
2013464 15000.0 1W-1.5W 0.1080 0.1-0.15
2013465 2100.0 5K以内 0.1878 0.15-0.2
2013466 7000.0 5K-1W 0.1544 0.15-0.2
2013467 4500.0 5K以内 0.1344 0.1-0.15
2013468 9000.0 5K-1W 0.0839 0.05-0.1
2013469 8000.0 5K-1W 0.2884 0.25-0.3
2013470 3800.0 5K以内 0.2784 0.25-0.3
2013471 25000.0 2W-2.5W 0.1520 0.15-0.2
2013473 25000.0 2W-2.5W 0.2544 0.25-0.3
2013474 13000.0 1W-1.5W 0.2965 0.25-0.3
2013476 6000.0 5K-1W 0.0694 0.05-0.1
2013477 10000.0 5K-1W 0.2544 0.25-0.3
2013478 7000.0 5K-1W 0.1214 0.1-0.15
2013479 8500.0 5K-1W 0.1444 0.1-0.15
2013480 23000.0 2W-2.5W 0.2544 0.25-0.3
2013481 15000.0 1W-1.5W 0.2965 0.25-0.3
2013482 10000.0 5K-1W 0.0814 0.05-0.1
2013483 6000.0 5K-1W 0.1314 0.1-0.15
2013484 7000.0 5K-1W 0.3182 0.3-0.35
2013485 17000.0 1.5W-2W 0.1608 0.15-0.2
2013486 11000.0 1W-1.5W 0.2000 0.15-0.2
2013487 39901.0 3.5W-4W 0.1144 0.1-0.15
2013488 25000.0 2W-2.5W 0.2644 0.25-0.3
2013489 15000.0 1W-1.5W 0.0784 0.05-0.1
2013490 18500.0 1.5W-2W 0.1080 0.1-0.15
2013491 25000.0 2W-2.5W 0.2244 0.2-0.25
2013492 4000.0 5K以内 0.0754 0.05-0.1
2013493 5000.0 5K以内 0.0964 0.05-0.1
[2011934 rows x 4 columns]
(4)异常值处理
异常值是指明显偏离大多数抽样数据的数值,利用箱型图能很明显的观察到,这里主要查看1,3,9,12,15的异常值情况
# 异常值处理
import matplotlib.pyplot as plt
import matplotlib
plt.style.use('ggplot')
matplotlib.rcParams['font.sans-serif'] = ['FangSong']
matplotlib.rcParams['axes.unicode_minus'] = False
data_box = data_duplicates.iloc[:,[1,3,9,12,15]]
data_box.boxplot()
plt.show()
无异常值
四、数据可视化分析
1 整体贷款情况
total = data_duplicates['over_due'].count()
bad = data_duplicates['over_due'].sum()
good = total - bad
values = [good,bad]
plt.figure(figsize=(6,6))
label = ['正常还款','逾期']
explode = [0.01,0.01]
plt.pie(values,explode = explode,labels = label,autopct='%1.1f%%')
plt.show()
通过饼图可以看出,该公司逾期率为58.4%,虽然不知整体行业平均是多少,但想想10个客户中有6个逾期,这还是非常严重的。
2 逾期原因分析
根据字段,构建模型需要解决这些问题:逾期用户的借款金额类型、借款期限、贷款利率、评级、借款用途各自如何分布。这些维度之间的关联性如何?
over_due_fre_am = data_duplicates.groupby('amount_type').agg({'over_due': lambda x: x.sum()/total}) # 注意分母是total,而非x.sum(),否则求出来的是该组里的逾期率
over_due_fre_te = data_duplicates.groupby('term').agg({'over_due': lambda x: x.sum()/total})
over_due_fre_gr = data_duplicates.groupby('grade').agg({'over_due': lambda x: x.sum()/total})
over_due_fre_ra = data_duplicates.groupby('rate_type').agg({'over_due': lambda x: x.sum()/total})
over_due_fre_li = data_duplicates.groupby('listing_title').agg({'over_due': lambda x: x.sum()/total}).sort_values(by = 'over_due',ascending=False)
ax1 = plt.subplot(221)
over_due_fre_am.plot(kind = 'bar',ax = ax1)
plt.title('贷款金额逾期率')
ax2 = plt.subplot(222)
over_due_fre_te.plot(kind = 'bar',ax = ax2)
plt.title('分期期别逾期率')
ax3 = plt.subplot(223)
over_due_fre_gr.plot(kind = 'bar',ax = ax3)
plt.title('各等级逾期率')
ax4 = plt.subplot(224)
over_due_fre_ra.plot(kind = 'bar',ax = ax4)
plt.title('分期利率逾期率')
plt.xticks(rotation = 360)
over_due_fre_li.plot(kind = 'bar')
plt.title('贷款用途逾期率')
plt.show()
逾期率高的用户普遍特征为:贷款金额:5K-1W
分期期别:36期
等级:C级
分期利率:0.1-0.15
贷款用途:debt_consolidation(债务合并)
建议和方案:设定评分准入,将上述五个特征赋予确定的评分标准,根据借款人相关的属性特征,自动计算对应的分值,根据分值设置不同的风险对策,分数低于标准线将直接拒贷,从而规避风险。
但不足的是,该数据集中缺少很多客户的个人信息,如性别,年龄,教育,工作等,不能全方位地分析用户特征
对刚才的用户特征进行深入研究,上面的各项特征只是简单的把各维度中逾期率最高的特征进行平面展示,以此说明各维度中的整体情况,没有细化到逾期率与用户关联的这五个维度特性间的相关性。
由于债务合并逾期率远远大于其他类型,因此设想逾期类型为债务合并人群中,是不是5K-1W区间贷款金额最高?
data = data_duplicates[data_duplicates['listing_title'] == 'debt_consolidation']
data = data[data['over_due'] == 1]
total = data['over_due'].sum()
con_fre = data.groupby('amount_type').agg({'over_due':lambda x:x.count()/total}).sort_values(by = 'over_due',ascending=True).plot(kind = 'barh')
plt.show()
在债务合并中,贷款金额区间在5K-1W逾期率最高,其次是1W-1.5W
所以,这个结论符合上述提到的猜想问题(逾期类型为债务合并人群中,是不是5K-1 W区间贷款金额最高)
根据前面的结果,再提出另一个问题:为什么结论中的贷款金额区间在5K-1W逾期率最高?基于现有的数据维度进行分析,是借款利率的原因?分期期别的原因?还是等级的原因?
python贷款_Python贷款逾期分析相关推荐
- python 月报_python实践--月报分析之获取jira缺陷数据
首先安装jira,同其他第三方库,直接可以 easy_install jira. 判断jira是否按转成功输入:from jira import JIRA,如果没有报错则说明安装成功: #连接jira ...
- 前锋python怎么样_Python 带你分析,英超是否已经大结局
引子 随着本轮英超战罢,领头羊利物浦已经领先第二名曼城8分之多,新赛季的8连胜,不仅彰显着红军将士誓夺英超首冠的决心,也似乎在提醒着英超诸强,利物浦的复兴已然来临. 而曼城意外的输给狼队,不仅被拉大了 ...
- 层次分析法python代码_Python 实现层次分析法
import csv import numpy as np import tensorflow as tf #大概的思路是: #1.首先输入每个指标下面对应的对比矩阵,每个这个矩阵是由专家比较每两个 ...
- 用python计算贷款_python for android : 贷款月月还款额计算
python for android : 贷款每月还款额计算 功能: 1.等额本息 每月还款额计算 2.等额本金 每月还款额计算 dkjs3.py # -*- coding: utf-8 -*- im ...
- 预测贷款用户是否逾期-数据预处理
1.本项目为预测贷款用户是否逾期的数据预处理部分,主要包括特征处理.数据类型分析.数据类型转换以及缺失值处理. 一.数据查看 选择的IDE为pycharm,首先导入pandas库与numpy库,查看数 ...
- python歌词图表分析_Python可视化图分析毛不易的《入海》,看看听歌的人都在想些什么...
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 欢迎关注小编,除了分享技术文章之外还有很多福利,私信学习资料可以领取包括不 ...
- 二维正态分布图python代码_Python数据可视化正态分布简单分析及实现代码
Python说来简单也简单,但是也不简单,尤其是再跟高数结合起来的时候... 正态分布(Normaldistribution),也称"常态分布",又名高斯分布(Gaussiandi ...
- python中文文本分析和提取_python str(使用python对txt文本进行分析和提取)
python 文本文件数据处理 #/usr/bin/env python3 # -*- coding: utf-8 -*- def zhidao_560604345(infile, outfile): ...
- 信贷产品年终总结之贷后逾期分析
自本月月初疫情全面放开后,身边的朋友基本都阳了一遍,希望正在浏览本篇文章的读者您是还没阳过的幸运儿.另外,今天也是冬至了,祝各位读者身边健康,远离羊群! 最近我们分享了信贷业务年终总结系列的前2篇文章 ...
- python实现简单的情感分析
python实现简单的情感分析 1 数据导入及预处理 1.1 数据导入 # 数据导入 import pandas as pd data = pd.read_csv('../data/京东评论数据.cs ...
最新文章
- 登录mysql报错2059,navicat连接mysql报错2059如何解决
- python 爬虫系统_实战干货:从零快速搭建自己的爬虫系统
- boost::hana::values用法的测试程序
- 三星I9000挖煤模式和R模式进入方法
- linux给文件加可执行权限
- Java学习笔记:BlockingQueue接口
- PHP str_replace() 函数详解
- 文章学习_基于HowNet 的词汇语义倾向计算
- speedoffice(word)字体如何设置为斜体
- C#-WPF实现抽屉效果抽屉式风格主题框架源码-使用MaterialDesignThemes实现WPF炫酷漂亮的效果-提供Demo下载
- 计算机创业计划书800字大全,2017创业计划书范文800字
- IDEA设置字体随鼠标滚动放大缩小
- 如何查看 Codeigniter 版本号?
- python终端命令行输入一条语句后出现三个点是什么?
- Alice and the List of Presents CodeForces - 1236B 数学推导
- nodebb部署开发记录
- 一着不慎被蛇咬,最近半月终出坑
- flink ui含义图解
- 数据处理笔记11 类别不平衡处理-抽样方法
- 未明学院活动:领跑新年活动!寒假1个月,掌握券商/互联网/机器学习等七大热门行业实战技能!