Python语言实现信用评分卡建模分析

  • 背景介绍
    信用评分技术是一种应用统计模型,其作用是为信用卡申请人计算一个风险评估分值的方法。 而这种用途的统计模型就称为信用评分卡。信用评分卡可以根据客户提供的资料、客户的历史数据以及第三方平台(支付宝蚂蚁信用、京东小白信用、苏宁分等)的数据,对客户的信用进行评估。信用评分卡的建立是以对大量数据的统计结果为基础,具有相当之高的准确性可靠性
    本文通过对kaggle上的Give Me Some Credit数据的挖掘分析,结合信用评分卡的建立原理,从数据的预处理建模分析创建信用评分卡建立自动评分系统,创建了一个简单的信用评分系统。并对建立基于AI 的机器学习评分卡系统的路径进行推测。
  • 1.工作原理
    客户申请评分卡是一种统计模型,它可基于对当前申请人的各项资料进行评估并给出一个分数,该评分能定量对申请人的偿债能力作出预判
    客户申请评分卡由一系列特征项组成,每个特征项相当于申请表上的一个问题(例如,年龄、银行流水、收入等)。每一个特征项都有一系列可能的属性,相当于每一个问题的一系列可能答案(例如,对于年龄这个问题,答案可能就有30岁以下、30到45等)。在开发评分卡系统模型中,先确定属性申请人未来信用表现之间的相互关系,然后给属性分配适当的分数权重,分配的分数权重要反映这种相互关系。分数权重越大,说明该属性表示的信用表现越好。一个申请的得分是其属性分值的简单求和。如果申请人的信用评分大于等于金融放款机构所设定的界限分数,此申请处于可接受的风险水平并将被批准;低于界限分数的申请人将被拒绝或给予标示以便进一步审查。
  • 流程:
    导入数据
    数据预处理
    探索分析
    特征选择
    模型训练
    模型评估
    模型结果转评分
    计算用户总分
  • 2.数据处理
  • 2.1数据导入
    在anaconda下打开jupyter notebook处理数据,把一些必要的数据导入。
import numpy as np
import pandas as pd
data = pd.read_csv('./cs-training.csv')
data = data.iloc[:,1:]
data.head()  #默认显示前五行数据

Python语言实现信用评分卡建模分析_第1张图片
预览数据
Python语言实现信用评分卡建模分析_第2张图片
Python语言实现信用评分卡建模分析_第3张图片
可见,特征量MonthlyIncome有29731个缺失值,NumberOfDependents有3924个缺失值。
为方便理解,将英文字段转换成中文字段

states={'SeriousDlqin2yrs':'好坏客户',
        'RevolvingUtilizationOfUnsecuredLines':'可用额度比值',
        'age':'年龄',
        'NumberOfTime30-59DaysPastDueNotWorse':'逾期30-59天笔数',
        'DebtRatio':'负债率',
        'MonthlyIncome':'月收入',
        'NumberOfOpenCreditLinesAndLoans':'信贷数量',
        'NumberOfTimes90DaysLate':'逾期90天笔数',
        'NumberRealEstateLoansOrLines':'固定资产贷款量',
        'NumberOfTime60-89DaysPastDueNotWorse':'逾期60-89天笔数',
        'NumberOfDependents':'家属数量'}
df.rename(columns=states,inplace=True)
df.head()    #修改英文字段名为中文字段名
# 0对应好客户,1对应坏客户
  • 2.2数据预处理
  • 2.2.1去除重复值
print("重复值的数量:", data.shape[0] - data.drop_duplicates().shape[0])
data = data.drop_duplicates()

在这里插入图片描述

  • 2.2.2缺失值处理
    数据缺失会导致一些不能处理缺失值的分析方法无法应用,因此在信用风险评级模型开发的第一步就需要进行缺失值处理。
for var in data.columns:
    print("%s缺失值的占比为%.2f%%" % (var, 100*(df[var].isnull().sum()/df.shape[0]))) 

SeriousDlqin2yrs缺失值的占比为0.00%
RevolvingUtilizationOfUnsecuredLines缺失值的占比为0.00%
age缺失值的占比为0.00%
NumberOfTime30-59DaysPastDueNotWorse缺失值的占比为0.00%
DebtRatio缺失值的占比为0.00%
MonthlyIncome缺失值的占比为19.56%
NumberOfOpenCreditLinesAndLoans缺失值的占比为0.00%
NumberOfTimes90DaysLate缺失值的占比为0.00%
NumberRealEstateLoansOrLines缺失值的占比为0.00%
NumberOfTime60-89DaysPastDueNotWorse缺失值的占比为0.00%
NumberOfDependents缺失值的占比为2.56%

月收入MonthlyIncome的缺失率比较大,所以采用随机森林法进行填补。

def set_missing(df):
    # 把已有的数值型特征取出来
    process_df = df.ix[:,[5,0,1,2,3,4,6,7,8,9]]
    # 分成已知该特征和未知该特征两部分
    known = process_df[process_df.MonthlyIncome.notnull()].as_matrix()
    unknown = process_df[process_df.MonthlyIncome.isnull()].as_matrix()
    # X为特征属性值
    X = known[:, 1:]
    # y为结果标签值
    y = known[:, 0]
    # fit到RandomForestRegressor之中
    rfr = RandomForestRegressor(random_state=0, 
    n_estimators=200,max_depth=3,n_jobs=-1)
    rfr.fit(X,y)
    # 用得到的模型进行未知特征值预测
    predicted = rfr.predict(unknown[:, 1:]).round(0)
    print(predicted)
    # 用得到的预测结果填补原缺失数据
    df.loc[(df.MonthlyIncome.isnull()), 'MonthlyIncome'] = predicted
    return df

家庭成员NumberOfDependents变量缺失值比较少,可以直接删除,对总体模型不会造成太大影响。

# 缺失值删除
data=data.dropna()
  • 2.2.3异常值处理
    异常值是指明显偏离大多数抽样数据的数值,比如个人客户的年龄大于100或小于0时,通常认为该值为异常值。找出样本总体中的异常值,通常采用离群值检测的方法。 离群值检测的方法有单变量离群值检测、局部离群值因子检测、基于聚类方法的离群值检测等方法。
    在本数据集中,采用单变量离群值检测来判断异常值,采用箱线图。
    对于age变量而言,我们认为大于100岁小于等于0岁的为异常值,由箱线图可知,异常值样本不多,故直接删除。
# 选出 3,7,9做箱线图,选出年龄来做图观察
import matplotlib.pyplot as plt#导入图像库
%matplotlib inline
data_box = data.iloc[:,[3,7,9]]
data_box.boxplot()

你可能感兴趣的:(数据分析)