数据分析-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. 缺点…

轻松学会使用 SCP 命令在 Linux 中传输文件

前言 在 Linux 系统中&#xff0c;如果你想要轻松地将文件或目录从一个地方传输到另一个地方&#xff0c;scp 命令是你的好帮手。它让文件传输变得简单快捷&#xff0c;就像拷贝和粘贴一样容易。 什么是 SCP&#xff1f; SCP&#xff08;Secure Copy Protocol&#xff09;是…

RFC4861 中文版下

10. 协议常量 路由器常量: MAX_INITIAL_RTR_ADVERT_INTERVAL 16 秒MAX_INITIAL_RTR_ADVERTISEMENTS 3 次发送MAX_FINAL_RTR_ADVERTISEMENTS 3 次发送MIN_DELAY_BETWEEN_RAS 3 秒MAX_RA_DELAY_TIME .5 秒主机常量: MAX_RTR_SOLICITATION_…

python c++ summary pdb gdb frame registers 调试器,栈帧,寄存器的查看

pdb import pdbpdb.set_trace() # 设置追踪断点 命令说明p a打印aq退出n下一行s执行下一行&#xff08;能够进入函数体&#xff09;r执行下一行&#xff08;在函数中时会直接执行到函数返回处&#xff09;w打印堆栈信息unt N执行到第N行disasdisplay assembler code 打印所有…

c++程序设计编写一个程序,输入N个学生数据,包括学号、姓名、成绩,要求输出这些学生数据并计算平均分

编写一个程序&#xff0c;输入N个学生数据&#xff0c;包括学号、姓名、成绩&#xff0c;要求输出这些学生数据并计算平均分。要求&#xff1a; &#xff08;1&#xff09;设计一个学生类Stud&#xff0c;除了包括no(学号)、name(姓名)和deg(成绩)数据成员外&#xff0c;有两个…

【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…

LeetCode100123执行操作使频率分数最大(相关话题:滑动窗口,二分法,前缀和)

题目描述 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。你可以对数组执行 至多 k 次操作&#xff1a; 从数组中选择一个下标 i &#xff0c;将 nums[i] 增加 或者 减少 1 。最终数组的频率分数定义为数组中众数的 频率 。请你返回你可以得到的 最大 频率分数。 众数…

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

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

力扣第13题-罗马数字转整数[简单]

题目描述 罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例…

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

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

删除远端消息, 重进会话仍然取回已删除的消息

用户调用删除函数, 服务器不会判断 对应的 sentTime 是否存在, 仅仅是使用sentTime 直接进行消息删除, 然后返回操作成功; 用户删除远端消息时, 需要保证sentTime的合法性 - (void)deleteRemoteMessage:(RCConversationType)conversationType targetId:(NSString *)targetId me…

Diva配置——Communication Tests

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

用XPath爬取Crossin教室的文章列表页信息示例

一、背景&#xff1a; 2023.12.12,经过本人的多日权衡比较&#xff0c;我决定购买了crossin老师的Python服务。主要实现了能够通过其编程教室提供的答疑群平台答疑解惑。基于其答疑服务感觉还是不错的。同时能够逐步扎实Python基础与爬虫等相关的技术。今日用xpath完成了一个爬…

jetson nano 编译出现/usr/bin/ld: cannot find -lcudart

问题描述 jetson nano 编译出现/usr/bin/ld: cannot find -lcudart 问题分析 在 Jetson Nano 上编译时遇到 /usr/bin/ld: cannot find -lcudart 错误&#xff0c;表示编译器无法找到名为 libcudart 的 CUDA 运行时库。 CMakeLists.txt 里面添加库路径。 解决办法 要解决这…

【日积月累】Mysql性能优化

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

33 动态规划和递归求解不同路径II

问题描述&#xff1a;一个机器人位于一个mn网格的左上角(起始点在下图中标记为Start)&#xff0c;机器人每次只能向下或者向右移动一步&#xff0c;机器人试图到达网格的右下角&#xff0c;机器人试图到达网格的右下角&#xff0c;现在考虑网格中有障碍物&#xff0c;那么从左上…