个人贷款违约预测模型
VIP 文章 2018 年 10 月 08 日 15:10:26 xjpcsdn 阅读数 6160
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xjpcsdn/article/details/82966630
1 项目介绍
本项目通利用 Kaggle 平台 predict-loan-defaulters (网盘下载提取码: tkup)贷款数据,通过逻辑回归模型来对这些数据进行预测
判断,构建贷款违约预测模型,建立预测模型,预测正处于贷款期间的人的违约的概率 。
业务理解
在贷款管理方面,如果可以通过构建量化模型对客户的信用等级进行一定的区分。得知了每个账户的违约概率后,可以预估一下未来
的坏账比例,及时做好资金安排。也可以对违约概可能性较高的客户进行更加频繁的“关怀”,及时发现问题,以避免损失。
在这个量化模型中,被解释变量为二分类变量,因此需要构建一个排序类分类模型。而排序类分类模型中常使用的算法是逻辑回归。
1.2 数据介绍
实际业务中的一个人可以拥有多个账户号(account_id),一个账户号(account_id)可以对应有多个顾客(client_id),即多个顾
客共享一个账户号(account_id),但是每个帐户号(account_id)的所有者(即最高权限者)只能是一人。
账户号(account_id)与客户号(client_id)的对应关系,在表“disposition”中进行列示;
表“Loan”为银行提供给账户号(account_id)的服务;
表“Credit card”为银行提供给的顾客(client_id)的服务,每个客户可以申请一张信用卡;
贷款为基于账户的服务,一个账户(account_id)在一个时点最多只能有一笔贷款。
本次数据建模分析共用了八个数据表:
2 数据处理
2.1 导入数据
import pandas as pd
import os
os.chdir("data")
loanfile = os.listdir()
createVar = locals()
for i in loanfile:
# 数据文件存放在"data"文件夹里
if i.endswith("txt"):
createVar[i.split('.')[0]] = pd.read_csv(i, encoding = 'gbk',sep=';')
print(i.split('.')[0])
1
2
3
4
5
6
7
8
9
accounts
card
clients
disp
district
loans
order
trans
1
2
3
4
5
6
7
8
预览数据
loans.head()
1
loans.info()
1
2.2 生成被解释变量 bad_good
贷款表(loans)中的还款的状态可分为 A:代表合同终止,没问题 B:代表合同终止,贷款没支付 C:代表合同处于执行期,至今正常;
D:代表合同处于执行期,欠债状态。对数据进行转换,使 A=0,B、D=1,C=2
bad_good = {'B':1, 'D':1, 'A':0, 'C': 2}
loans['bad_good'] = loans.status.map(bad_good)
loans.head()
1
2
3
2.3 数据整理
借款人的年龄、性别
data2 = pd.merge(loans, disp, on = 'account_id', how = 'left')
data2 = pd.merge(data2, clients, on = 'client_id', how = 'left')
data2=data2[data2.type=='所有者']
data2.head()
1
2
3
4
借款人居住地的经济状况
data3 = pd.merge(data2, district, left_on = 'district_id', right_on = 'A1', how = 'left')
data3.head()
1
2
变异系数的计算:先计算每个账户余额的平均值和标准差,然后用标准差/均值。
data_4temp1 = pd.merge(loans[['account_id', 'date']],
trans[['account_id','type','amount','balance','date']],
on = 'account_id')
data_4temp1.columns = ['account_id', 'date', 'type', 'amount', 'balance', 't_date']
data_4temp1 = data_4temp1.sort_values(by = ['account_id','t_date'])