一、背景与思路
(一)背景
核心问题:对贷款偿债能力的评估
1. 方法:利用逻辑回归(理解简单,可解释性强)
2. 信用评分卡的构建
金融风控 | |
定性分析 | 逻辑回归 |
定量分析 | 信用评分卡 |
(二)流程
1. 数据获取:包括获取存量客户及潜在客户的数据;
2. 数据预处理:包括数据清洗、缺失值处理;
3. 探索性分析:获取样本总体的大概情况,描述样本总体情况的指标主要包括直方图、箱型图等;
4. 变量选择:主要通过统计学方法,筛选出对违约状态影响最显著的特征;
5. 模型开发:包括变量分段,变量的WOE变换和逻辑回归估计;
6. 模型评估:评估模型的区分能力、预测能力、稳定性,并形成模型评估报告;
7. 信用评分:根据逻辑回归的系数和WOE等确定信用评分方法,将Logistic模型转换为标准评分形式;
8. 建立评分系统:根据信用评分方法,建立自动信用评分系统。
(三)思路
学以致用,解决问题!
第一阶段:基于逻辑回归的贷款违约预测分析(机器学习中的分类学习思路)
第二阶段:基于WOE构建信用评分卡
二、基于逻辑回归的贷款违约预测分析
(一)思路
1. 读取数据,了解数据
2. 数据清洗(缺失、异常、重复值处理)
3. 数据探索分析(变量特征工程)
4. 变量处理与选择
5. 建模分析
(二)案例
1. 读取数据
# 读取数据
import pandas as pd
data = pd.read_csv("cs-training.csv")
data = data.iloc[:,1:] # 去掉第一列,也可以用drop
data.info() # 注意数据类型(int/float)、变量含义
# 简单查看数据
data.head() # 查看数据
data.describe() # 对数据进行简单描述统计
2. 数据清洗
(1)缺失值处理——关键点:跟业务结合;没有统一标准
data.isnull().sum() # 缺失值统计
# 创建数据表,分析数据表
def draw_missing_data_table(df):
tatal = df.isnull().sum().sort_value(ascending = True)
percent = (df.isnull().sum()/df.isnull().count().sort_value(ascending = True))
missing_data = pd.concat([total, percent, axis=1, keys=["Total", "Percent"])
return missing_data
# 调用函数,统计缺失值
draw_missing_data_table(data)
(1)缺失值处理——步骤
第一步:删除(数量比较少;绝对量和相对量,结合业务问题)
第二步:填充:任意值;均值;关系填充(根据业务问题)
例:人口普查age缺失,显然不能填任意值或均值,但可根据该人身份证、社会关系等业务信息进行填充。
# 填充MonthlyInccom,填充中位数
value = data.MonthlyIncome.median()
data.MonthlyIncome = data.MonthlyIncome.fillna(value)
# 填充NumberofDependents,没有家庭,填充0
data.NumberOfDependents = data.NumberOfDependents.fillna(0)
data.isnull().sum()
# 结果为0
(2)重复值处理
data.duplicated().sum()
data = data.drop_duplicates()
data.info()
(3)异常值处理——更多的是业务问题
方法:describe、箱线图
data.describe([0.01, 0.05, 0.10, 0.25, 0.50, 0.75, 0.90, 0.95, 0.99]) # 分别查看1%/5%/...99%分位数
# 作图导入库
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
sns.boxplot(data["age"]) # 查看年龄的箱线图,发现有0岁、100多岁的异常值
# 一个一个变量作图过于繁琐,可利用for循环作图
data.colums # 查看变量
features = ["RevolvingUtilizationOfUnsecuredLines","age"...] # 将变量赋值于features
for i in features:
sns.boxplot(data[i])
plt.show()
# 进行异常值删除
data = data[data["age"]>18]
data = data[data["age"]<100]
data = data[data["RevolvingUtilizationOfUnsecuredLines"]<1.00]
data = data[data["NumberOfOpenCreditLinesAndLoans"]<24.00]
data = data[data["NumberRealEstateLoansOrLines"]<4.00]
data = data[data["DebtRatio"]<5000.00]
data = data[data["NumberOfTime30-59DaysPastDueNotWorse"]<5000.00]
data.info()
# 保存处理后的数据
data.to_csv("processeddata.csv")
3. 数据探索分析
(1)数据分布特征探索
sns.distplot(data["age"]) # 绘制分布图
sns.distplot(data["MonthlyIncome"]<10000) # 分布很离散,可以加个限定条件“<10000”查看分布情况
(2&