数据分析-14-基于Python的信用评分卡数据分析(包含代码数据)

文章目录

    • 0. 数据代码下载
    • 1. 分析思路
    • 2. 理解数据
    • 3. 数据清洗
      • 3.1 选择子集
      • 3.2 列名重命名
      • 3.3 缺失数据处理
      • 3.4 异常值处理
    • 4. 建立模型
      • 4.1 借款逾期超过90天的人数,即借款客户的整体质量情况?
      • 4.2 借款人月收入分布情况及月收入对违约客户数量的影响?
      • 4.3 年龄对违约率的影响?

关注公众号:『AI学习星球
回复:基于Python的信用评分卡数据分析 即可获取数据下载。
算法学习4对1辅导论文辅导核心期刊可以通过公众号CSDN滴滴我
在这里插入图片描述


互联网金融飞速发展,使得个人金融理财变得越来越容易。根据《消费金融创新报告》,中国消费信贷的规模到2020会超过12万亿,以至于网络环境下信用风险管理变得越来越重要。
但本篇的重点为利用python对数据进行清洗及简单的分析,熟悉数据清洗的步骤和思路,数据建模部分放在机器学习中。

0. 数据代码下载

1. 分析思路

数据分析的步骤如下
提出问题 -> 理解数据 -> 数据清洗 -> 构建模型 -> 数据可视化

提出问题:提供后续分析的目标和方向

  1. 借款人数逾期超过90天数目,即借款客户的整体质量情况?
  2. 借款人月收入分布情况?
  3. 年龄对违约率的影响?

2. 理解数据

give me some credit 数据集分为训练集和测试集,目的是开发一个申请的评分卡模型,对未来一段时间内借贷人出现违约的概率进行预测,对客户信用进行评估打分。在前文已说,本篇重点放在数据清洗及简单分析上,评分卡构建后期会写一篇文章。

训练集样本数据一共150000条,10个自变量,1个因变量(SeriousDlqin2yrs)。具体情况如下:

变量名称描述数据类型
SeriousDlqin2yrs是否有超过90天或更长时间逾期未还的不良行为Y/N
RevolvingUtilizationOfUnsecuredLines贷款以及信用卡可用额度与总额度比例。信用卡总余额和个人信用额度(除了房地产和分期付款给债务,比如汽车贷款)除以总信用限制percentage
age借款人年龄integer
NumberOfTime30-59DaysPastDueNotWorse逾期天数在35~59内,但不糟糕次数integer
DebtRatio负债比率:月债务支出、赡养费、生活费除以总收入(毛收入)percentage
MonthlyIncome月收入integer
NumberOfOpenCreditLinesAndLoans开放式贷款(分期付款如汽车贷款或抵押贷款)和信贷(如信用卡)的数量integer
NumberOfTimes90DaysLate90天逾期次数:借款者有90天或更高逾期的次数integer
NumberRealEstateLoansOrLines不动产贷款或额度数量:抵押和房地产数量(包括房屋净值信用额度)integer
NumberOfTime60-89DaysPastDueNotWorse60-89天逾期但不糟糕次数:借款人在在过去两年内有60-89天逾期还款但不糟糕的次数integer
NumberOfDependents家属数量(不包括借款人自己)integer

根据数据集中的变量,可将这些变量进行分类,有助于加深对变量的理解。大致可以分为以下几个维度:

  • 人口统计信息:借款人年龄、家庭成员数量
  • 信用历史纪录:两年内35-59天逾期次数、两年内60-89天逾期次数、两年内90天或高于90天逾期次数
  • 偿债能力:负债比率、月收入、贷款数量、不安全额度循环利用、不动产贷款或额度数量

3. 数据清洗

原始数据信息一般比较冗杂,我们需要把脏东西清洗掉,才能从数据集中挖掘出有用的信息。而数据清洗过程比较繁琐,一般占据了我们整个工作量的60%,所以,需要我们仔细认真的完成这一步骤。

数据清洗过程大致包含:选择子集、列名重命名、缺失数据处理、数据类型转换、数据排序、异常值处理。可以根据你所分析的问题,进行相应的调整。

3.1 选择子集

有时原始数据太大,里面包含很多我们不需要的信息,这时我们可以通过选择子集操作(比如切片)选择其中一部分数据作为分析的对象。本篇数据只有一列为无关数据,删除即可。

import pandas as pd
dat=pd.read_csv("cs-training.csv")
dat.drop(dat.iloc[:,:1],inplace=True,axis=1)

3.2 列名重命名

可以根据自己对数据的理解,对列名重命名。本篇所用数据的变量名就较长,不便分析。

colNameDict=({'SeriousDlqin2yrs':'bad_debt','RevolvingUtilizationOfUnsecuredLines':'bad_cycle_rate','NumberOfTime30-59DaysPastDueNotWorse':'30_59','MonthlyIncome':'m_income','NumberOfOpenCreditLinesAndLoans':'num_open','NumberOfTimes90DaysLate':'90_','NumberRealEstateLoansOrLines':'num_estate','NumberOfTime60-89DaysPastDueNotWorse':'60_89','NumberOfDependents':'dependents'})
dat.rename(columns=colNameDict,inplace=True)

3.3 缺失数据处理

可以查看数据集的基本情况,对缺失值有个初步的判断。

dat.info()

在这里插入图片描述

初步判断,m_income和dependents存在缺失值。

处理缺失值的方法

  • 删除缺失值(缺失值较少);
  • 插值,插值可以用均值、中位数等直接替换或建立模型(缺失值较多);

m_income缺失值处理
m_income这一变量,缺失值较多且对目标变量影响较大,不能暴力删除,故采用插值法填充缺失值。由于月收入这一变量呈正态分布,因此用中位数去填充他的缺失值。

m_median=dat.m_income.median()
dat.m_income.fillna(m_median,inplace=True)

dependents缺失值处理
dependents缺失值较少,删除后对目标变量影响不大,因此采用删除缺失值的办法。缺失值处理后,用drop_duplicates()删除重复项。

dat=dat.dropna()
dat.info()
dat=dat.drop_duplicates()

在这里插入图片描述

3.4 异常值处理

异常值是指明显偏离大多数抽样数据的数值。一般的检测方法有单变量异常值检测,可以通过箱线图来查看;局部异常因子检测;基于聚类方法的异常值检测,通过把数据聚成类,将那些不属于任务一类的数据作为异常值。比如,使用k-means算法来检测异常。

首先我们可以通过describe()获取数据框中每列描述统计信息,从整体上了解到数据集的情况。

dat.describe()

在这里插入图片描述

从上图我们可以看出,age的最小值为0,不符合实情,存在异常值;

age异常值处理

dat=dat[(dat['age']>0]

30_59、90_、60_89 异常值处理

这里我们使用箱线图来查看三个时间值是否存在异常值,

import matplotlib.pyplot as plt
dat_list=dat[['30_59','90_','60_89']]
dat_list.boxplot()
plt.show()

在这里插入图片描述

可以看到这三个变量均有异常值,将高于90的记录删除即可;

dat=dat[dat['30_59']<90]
dat=dat[dat['60_89']<90]
dat=dat[dat['90_']<90]

4. 建立模型

通过数据清洗后,得到了有用的数据。接下来,针对提出的问题,即分析的目的来构建模型。

4.1 借款逾期超过90天的人数,即借款客户的整体质量情况?

grouped=dat['bad_debt'].groupby(dat['bad_debt']).count()
print("坏客户占比:{:.2%}".format(grouped[1]/dat.shape[0]))
grouped.plot(kind='bar')
plt.show()

在这里插入图片描述

其中,1表示借款逾期超过90天,0代表逾期未超过90天。
从结果来看,逾期数目大致占6.7%,此外,该数据集是非平衡的数据集。

4.2 借款人月收入分布情况及月收入对违约客户数量的影响?

#生成频率表
dat_df=dat[['m_income','bad_debt']]#利用cut函数,将连续变量转为分类变量
def dy_zh(col, cut_points, labels=None): min_num = col.min() max_num = col.max() break_points = [min_num] + cut_points + [max_num]if not labels: labels = range(len(cut_points)+1)else: labels=[str(i+1)+":"+labels[i] for i in range(len(cut_points)+1)]         colBin = pd.cut(col,bins=break_points,labels=labels,include_lowest=True)    return colBin cut_points = [5000,10000,15000] 
labels=['below 5000', '5000-10000','1000-15000','above 15000'] 
#调用函数dy_zh,增加新列
dat_df['U_Bin'] = dy_zh(dat_df['m_income'], cut_points, labels) 
#查看标签列,取值范围前面加上了序号,是便于后面生成表格时按顺序排列
dat_df.head()

在这里插入图片描述

#计算各个区间内违约人数所占比例
import numpy as np
total_num=dat_df.shape[0] #使用pandas的pivot_table函数生成汇总表
per_table=pd.pivot_table(dat_df,index=['U_Bin'],aggfunc={"m_income":[len, lambda x:len(x)/total_num *100],"bad_debt":[np.sum] },values=['m_income','bad_debt']) per_table

在这里插入图片描述

#增加percent列,它的值来自另外两列数值之比
per_table['bad_debt','percent']=per_table['bad_debt','sum']/ per_table['m_income','len']*100
per_table

在这里插入图片描述

从结果,我们可以看出借款人大部分集中在月收入10000以内之间,特别是5000~10000这一区间,基数较大。说明这部分人群可支配收入不多,依靠借贷填补支出。
此外,坏账率在月收入在低于5000时最高,收入越高违约的可能性越低。

4.3 年龄对违约率的影响?

依旧跟月收入一样,生成年龄频率表。只需换几行代码就行,原理是一样的。其实,可以直接写一个频率函数,方便直接调用。

dat_df=dat[['age','bad_debt']]
cut_points=[25,35,45,55,65]
labels=['below25', '26-35', '36-45','46-55','56-65','above65']dat_df['U_Bin'] = dy_zh(dat_df['age'], cut_points, labels) 
dat_df.head()

在这里插入图片描述

#计算各个区间内违约人数所占比例
import numpy as np
total_num=dat_df.shape[0] per_table=pd.pivot_table(dat_df,index=['U_Bin'],aggfunc={"age":[len, lambda x:len(x)/total_num *100],"bad_debt":[np.sum] },values=['age','bad_debt']) per_table['bad_debt','percent']=per_table['bad_debt','sum']/per_table['age','len']*100
per_table

在这里插入图片描述

#列名重命名
per_table=per_table.rename(columns={'<lambda>':'percent','len': 'number','sum':'number'})per_table=per_table.reindex((per_table.columns[0],per_table.columns[1],per_table.columns[2],per_table.columns[3]),axis=1)per_table

在这里插入图片描述

从结果来看,借款者 中年人居多。这部分人群生活压力较大,家里有老人和小孩要抚养,借款需求较大。此外,小于25岁的人群和26-35岁的人群,违约率都超过10%。随着年龄增加,违约率在下降。


关注公众号:『AI学习星球
回复:基于Python的信用评分卡数据分析 即可获取数据下载。
算法学习4对1辅导论文辅导核心期刊可以通过公众号CSDN滴滴我
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/229425.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

低代码在制造业的应用前景

引言 数字化转型已经成为制造业的必然趋势&#xff0c;为了应对市场的快速变化、提高效率、降低成本&#xff0c;制造业企业不得不追求更智能、更敏捷的生产方式。在这一转型过程中&#xff0c;低代码技术崭露头角&#xff0c;成为了一种强大的工具&#xff0c;有望加速制造业…

PyCharm community 安装教程

目录 链接cudatoolkit 下载地址&#xff1a;https://www.jetbrains.com/pycharm/download/other.html 双击打开 安装路径&#xff0c;可自行更换到D盘 不导入设置 链接cudatoolkit

设计模式(2)--对象创建(5)--单件

1. 意图 保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点。 2. 一种角色 单件(Singleton) 3. 优点 3.1 对唯一实例的受控访问 3.2 缩小名空间(对全局变量的改进) 3.3 允许对操作和表示精化(可以有子类) 3.4 允许可变数目的实例 3.5 比类操作更灵活 4. 缺点…

【C语言】cache和程序访问的局部性对程序性能的影响

文章目录 1&#xff0e;源程序比较其性能影响2&#xff0e;内存分配&#xff08;1&#xff09;静态存储区&#xff08;static&#xff09;&#xff1a;&#xff08;2&#xff09;栈区&#xff08;stack&#xff09;&#xff1a;&#xff08;3&#xff09;堆区&#xff08;heap&…

msvcp140.dll丢失怎样修复?全面分析msvcp140.dll的修复方法

在执行特定程序时&#xff0c;有可能遭遇msvcp140.dll文件遗失的困扰&#xff0c;此时该如何处理呢&#xff1f;此次将为您讲述面临此类问题的有效解决方案&#xff0c;涉及到多种修复方法&#xff0c;其中包括利用DLL修复工具进行操作。您可依据个人需求选择相应的修复方式&am…

Linux:时间显示(函数介绍)

文章目录 1、sleep&#xff1a;延迟函数2、time/localtime3、示例&#xff1a;sleep time localtime4、Linux时间调整 1、sleep&#xff1a;延迟函数 函数原型&#xff1a;unsigned int sleep(unsigned int seconds); 功 能&#xff1a;延时 参 数&#xff1a;seconds:秒&am…

条款5:了解c++默默编写并调用了哪些函数

如果你不自己声明&#xff0c;编译器会替你声明&#xff08;编译器版本的&#xff09;拷贝构造函数、拷贝赋值运算符和析构函数。此外&#xff0c;如果你没有声明任何构造函数&#xff0c;编译器会为你声明一个默认构造函数。 class Empty{};本质上和写成下面这样是一样的: c…

cpp_03_引用_类型转换_温和强转_面向对象

1 引用的应用 1.1 数据传递--值传递 C语言只要涉及数据传递&#xff08;例如&#xff1a;初始化、赋值、传参、返回值&#xff09;&#xff0c; 都为值传递&#xff08;将数据复制一份给到目标内存&#xff09;。 // value.cpp 值传递&#xff1a;将数据复制一份给别人 #in…

Diva配置——Communication Tests

关联文章:CANoe.Diva生成测试用例 Diva目录 一、CANoe.Diva简介二、Communication Tests配置一、CANoe.Diva简介 CANoe.DiVa 是一种 CANoe 选项,用于对 ECU 中的诊断软件实施进行自动化测试。 可以通过CANdelaStudio制作的CDD或ODX文件,经过Diva配置自动生成测试用例和测试脚…

【日积月累】Mysql性能优化

目录 【日积月累】Mysql性能优化 1.前言2.MySql性能优化的主要方面2.1硬件和操作系统成面优化2.2架构设计层优化&#xff08;表结构&#xff09;2.3程序配置优化2.5表结构及索引优化2.4sql执行优化 3.总结4.参考 文章所属专区 积月累 1.前言 MySQL是一种常用的开源关系型数据…

ACL原理和配置

一.ACL概述 1.介绍 ACL 访问控制列表&#xff0c;可以通过对网络中报文流的精确识别&#xff0c;与其他技术结合&#xff0c;达到控制网络访问行为、防止网络攻击和提高网络带宽利用率的目的&#xff0c;从而切实保障网络环境的安全性和网络服务质量的可靠性。 2.概述 ACL是…

ShenYu网关注册中心之Zookeeper注册原理

文章目录 1、客户端注册流程1.1、读取配置1.1.1、用于注册的 ZookeeperClientRegisterRepository1.1.2、用于扫描构建 元数据 和 URI 的 SpringMvcClientEventListener 1.2、扫描注解&#xff0c;注册元数据和URI1.2.1、构建URI并写入Disruptor1.2.2、构建元数据并写入Disrupto…

[C语言]大小端及整形输出问题

假设在一个32位little endian 的机器上运行下面的程序&#xff0c;结果是多少 ? 1.1先看以下三个程序 #include <stdio.h> int main() {long long a 1, b 2, c 3;printf("%lld %lld %lld\n", a, b, c); // 1 2 3printf("%d %d %d %d %d %d\n&quo…

Learning Semantic-Aware Knowledge Guidance forLow-Light Image Enhancement

微光图像增强&#xff08;LLIE&#xff09;研究如何提高照明并生成正常光图像。现有的大多数方法都是通过全局和统一的方式来改善低光图像&#xff0c;而不考虑不同区域的语义信息。如果没有语义先验&#xff0c;网络可能很容易偏离区域的原始颜色。为了解决这个问题&#xff0…

c语言-全局变量与局部变量

目录 1、&#xff08;作用&#xff09;域的概念 2、全局与局部的相对性 3、生命周期 3、静态变量static 结语&#xff1a; 前言&#xff1a; 在c语言中&#xff0c;全局变量的可见范围是整个工程&#xff0c;而局部变量的可见范围从该变量被定义到该作用域结束&#xff0c…

【JavaEE】多线程(5) -- 阻塞队列

目录 1.阻塞队列是什么? 2.生产者消费者模型 3.标准库中的阻塞队列 4.阻塞队列的实现 1.阻塞队列是什么? 阻塞队列是⼀种特殊的队列. 也遵守 "先进先出" 的原则 阻塞队列能是⼀种线程安全的数据结构, 并且具有以下特性: 当队列满的时候, 继续⼊队列就会阻塞, …

I/O流的相关内容

首先我们了解一下什么是文件&#xff1a; 文件其实就是让我们用来保存数据的地方&#xff0c;它可以用来保存信息&#xff0c;图片&#xff0c;以及音频等各类数据。 文件流&#xff1a; 那我们是如何通过我们的程序来进行对文件的操作呢&#xff1f;这里我们就要提出一个概…

wpf将静态变量绑定到控件属性

有时候需要将后台一个静态属性绑定到xaml前台&#xff0c;经过实践&#xff0c;有如下两种绑定的方式 例如后台声明一个类&#xff0c;类中包含静态变量&#xff1a; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T…

2023年金属非金属矿山(地下矿山)安全管理人员证模拟考试题库及金属非金属矿山(地下矿山)安全管理人员理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年金属非金属矿山&#xff08;地下矿山&#xff09;安全管理人员证模拟考试题库及金属非金属矿山&#xff08;地下矿山&#xff09;安全管理人员理论考试试题是由安全生产模拟考试一点通提供&#xff0c;金属非金…

【linux--进程通信之共享内存】

目录 一、共享内存的原理二、共享内存的数据结构三、共享内存使用的函数2.1ftok函数2.2shmget函数2.3shmctr函数2.4shmat函数2.5shmdt函数 四、实现进程通信 一、共享内存的原理 共享内存实际是操作系统在实际物理内存中开辟的一段内存。 共享内存实现进程间通信&#xff0c;是…