python数据分析案例-信用卡违约预测分析

一、研究背景和意义

信用卡已经成为现代社会中人们日常生活中不可或缺的支付工具,它不仅为消费者提供了便利,还为商家提供了更广泛的销售渠道。然而,随着信用卡的普及和使用量的增加,信用卡违约问题逐渐成为金融机构面临的重要挑战。信用卡违约不仅给金融机构带来财务损失,还损害了其声誉和信用评级,从而影响其长期可持续发展。因此,有效预测信用卡违约风险对金融机构来说至关重要。。。。。

二、实证分析

这个数据集包含了2005年4月至2005年9月期间台湾信用卡客户的违约支付、人口统计因素、信用数据、支付历史和账单明细的信息。数据集中有25个变量:

ID:每个客户的ID

LIMIT_BAL:给定信用额度(新台币,包含个人和家庭/附属信用额度)

-SEX:性别(1=男性,2=女性)

-EDUCATION:教育程度(1=研究生,2=大学,3=高中,4=其他,5=未知,6=未知)

MARRIAGE**:婚姻状况(1=已婚,2=单身,3=其他)

AGE**:年龄(岁)

PAY_0:2005年9月的还款状态(-1=按时支付,1=延迟一个月,2=延迟两个月,…,8=延迟八个月,9=延迟九个月及以上)

PAY_2:2005年8月的还款状态(同上)

PAY_3:2005年7月的还款状态(同上)

PAY_4:2005年6月的还款状态(同上)

PAY_5:2005年5月的还款状态(同上)

PAY_6:2005年4月的还款状态(同上)

BILL_AMT1:2005年9月的账单金额(新台币)

BILL_AMT2:2005年8月的账单金额(新台币)

BILL_AMT3:2005年7月的账单金额(新台币)

BILL_AMT4:2005年6月的账单金额(新台币)

BILL_AMT5:2005年5月的账单金额(新台币)

BILL_AMT6:2005年4月的账单金额(新台币)

PAY_AMT1:2005年9月的上期还款金额(新台币)

PAY_AMT2:2005年8月的上期还款金额(新台币)

PAY_AMT3:2005年7月的上期还款金额(新台币)

PAY_AMT4:2005年6月的上期还款金额(新台币)

PAY_AMT5:2005年5月的上期还款金额(新台币)

PAY_AMT6:2005年4月的上期还款金额(新台币)

default.payment.next.month:下个月是否违约(1=是,0=否)

首先导入数据分析的包:

from mpl_toolkits.mplot3d import Axes3D
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt # plotting
import numpy as np # linear algebra
import os # accessing directory structure
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression, RidgeClassifier
from sklearn.metrics import accuracy_score,classification_report,confusion_matrix,mean_squared_error
import warnings
warnings.filterwarnings('ignore')
%matplotlib inline

读取数据并且查看前五行

df1 = pd.read_csv('UCI_Credit_Card.csv', delimiter=',')
df1.dataframeName = 'UCI_Credit_Card.csv'
nRow, nCol = df1.shape
print(f'There are {nRow} rows and {nCol} columns')

对数据集特征进行了描述性统计分析:

数据和代码

报告代码数据

这些数据描述了一位信用卡用户和历史信用卡使用情况。总体来说: 用户的ID分布在1到30,000之间,平均值为15,000.5,标准差为8,660.4。信用额度(LIMIT_BAL)的平均值为167484.32,标准差为129747.66,范围从10,000到1,000,000。性别(SEX)的平均值约为1.60,这可能表示1是男性,2是女性。教育程度(EDUCATION)的平均值约为1.85,可能被分类为0到6之间的不同等级。。。。。

接下来查看数据类型:

我们看到所有列都是int64类型,而根据之前的知识,我们知道SEX、EDUCATION、MARRIAGE、PAY_0、PAY_2、PAY_3、PAY_4、PAY_5、PAY_6、default_payment_next_month是分类特征。所以我们将这些特征转换为分类类型。接下来,检查缺失值。 从以上结果可以注意到没有缺失值。

defaulters.isna().sum()    # check for missing values for surity

接下来是可视化部分,在进入可视化之前,我们首先选择一些我们认为与目标变量最相关的特征。

def_cnt = (defaulters.def_pay.value_counts(normalize=True)*100)
def_cnt.plot.bar(figsize=(6,6))
plt.xticks(fontsize=12, rotation=0)
plt.yticks(fontsize=12)
plt.title("Probability Of Defaulting Payment Next Month", fontsize=15)
for x,y in zip([0,1],def_cnt):plt.text(x,y,y,fontsize=12)
plt.show()

我们可以看到数据集中的77.8%客户预计不会违约,而22.3%客户预计会违约。 接下来绘制年龄变量的可视化并继续探索。

通过绘制连续变量的图表,我们观察到数据集包含了倾斜的信用额度和客户年龄数据。我们有更多信用额度在0到200000货币之间的客户。我们有更多20到40岁年龄段的客户,即主要是年轻到中年群体。我们将在下面观察变量对目标变量的影响。

接下来我们将年龄分组,以探索年龄和支付逾期之间的关系:

bins = [20,30,40,50,60,70,80]
names = ['21-30','31-40','41-50','51-60','61-70','71-80']
defaulters['AGE_BIN'] = pd.cut(x=defaulters.AGE, bins=bins, labels=names, right=True)age_cnt = defaulters.AGE_BIN.value_counts()
age_0 = (defaulters.AGE_BIN[defaulters['def_pay'] == 0].value_counts())
age_1 = (defaulters.AGE_BIN[defaulters['def_pay'] == 1].value_counts())plt.subplots(figsize=(8,5))
# sns.barplot(data=defaulters, x='AGE_BIN', y='LIMIT_BAL', hue='def_pay', ci=0)
plt.bar(age_0.index, age_0.values, label='0')
plt.bar(age_1.index, age_1.values, label='1')
for x,y in zip(names,age_0):plt.text(x,y,y,fontsize=12)
for x,y in zip(names,age_1):plt.text(x,y,y,fontsize=12)
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
plt.title("Number of clients in each age group", fontsize=15)
plt.legend(loc='upper right', fontsize=15)
plt.show()

我们的客户主要集中在21-30岁年龄段,其次是31-40岁。因此,随着年龄组的增加,下个月将违约的客户数量正在减少。。。。检查下个月逾期还款的客户百分比:

从图中可以看到,对于当前月份状态,还款越早,这些客户违约的可能性越小。 接下来探索婚姻状况是否对信用卡逾期还款有影响:

 

可以看到,20-30岁年龄段的女性比所有年龄段的男性更容易违约。因此我们可以保留客户的性别列来预测违约的概率。 现在我们将检查过去六个月的账单金额是否会影响下个月的违约情况:

plt.subplots(figsize=(20,10))plt.subplot(231)
plt.scatter(x=defaulters.PAY_AMT1, y=defaulters.BILL_AMT1, c='r', s=1)plt.subplot(232)
plt.scatter(x=defaulters.PAY_AMT2, y=defaulters.BILL_AMT2, c='b', s=1)plt.subplot(233)
plt.scatter(x=defaulters.PAY_AMT3, y=defaulters.BILL_AMT3, c='g', s=1)plt.subplot(234)
plt.scatter(x=defaulters.PAY_AMT4, y=defaulters.BILL_AMT4, c='c', s=1)
plt.ylabel("Bill Amount in past 6 months", fontsize=25)plt.subplot(235)
plt.scatter(x=defaulters.PAY_AMT5, y=defaulters.BILL_AMT5, c='y', s=1)
plt.xlabel("Payment in past 6 months", fontsize=25)plt.subplot(236)
plt.scatter(x=defaulters.PAY_AMT6, y=defaulters.BILL_AMT6, c='m', s=1)plt.show()

上图显示,对于账单金额较高但支付金额很低的客户比例较高。

使用groupby()函数计算不同教育水平的人的数量:

接下来进行了模型预测,这里选择的模型是LogisticRegression和RidgeClassifier模型。 接下来按8:2的比例划分训练集和测试集。


X_train, X_test, y_train, y_test = train_test_split(df_X, df_y, test_size=0.2, random_state=10)
model1 = LogisticRegression()
model1.fit(X_train, y_train)y_pred = model1.predict(X_test)print(classification_report(y_pred, y_test))
print(confusion_matrix(y_pred, y_test))
print('\nAccuracy Score for model1: ', accuracy_score(y_pred,y_test))

 

cm_model1 = [[4681, 1317],[2, 0]]
plt.figure(figsize=(8, 6))
sns.heatmap(cm_model1, annot=True, cmap='Blues', fmt='g', xticklabels=['Predicted 0', 'Predicted 1'], yticklabels=['Actual 0', 'Actual 1'])
plt.title('Confusion Matrix - Model 1')
plt.xlabel('Predicted Labels')
plt.ylabel('True Labels')
plt.show()

这两个模型的结果显示了一些有趣的现象。首先,我们可以看到第一个模型在类别0(未违约)上的准确率(精度)为100%,但在类别1(违约)上的准确率为0%。这表明该模型在预测违约客户时存在严重问题,可能存在严重偏差或无法识别任何违约客户。。。。。

三、结论

本研究通过对台湾信用卡客户数据集的分析,构建了信用卡违约预测模型。研究结果表明,年龄、婚姻状况、性别、教育程度、还款历史和账单金额等因素对信用卡违约有显著影响。在模型选择方面,LogisticRegression 和 RidgeClassifier 模型在预测信用卡违约方面都有一定的表现。。。。。

参考文献

[1] Tian Yuan,Guo Honglie,Ji Qian. Credit card risky customer prediction based on SMOTEENN-XGBoost[J/OL].SoftwareGuide.

[2] LU Rongwei, HUANG Chang'e, XIE Jiuhui. Research on credit card overdue prediction based on machine learning[J]. Science and Technology Innovation,2024,(06):130-133.

创作不易,希望大家多点赞关注评论!!!(类似代码或报告定制可以私信)

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

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

相关文章

摄像头画面显示于unity场景

🐾 个人主页 🐾 🪧阿松爱睡觉,横竖醒不来 🏅你可以不屠龙,但不能不磨剑🗡 目录 一、前言二、UI画面三、显示于场景四、结语 一、前言 由于标题限制,这篇文章主要是讲在unity中调用摄…

深入讲解C++基础知识(一)

目录 一、基本内置类型1. 类型的作用2. 分类3. 整型3.1 内存描述及查询3.2 布尔类型 —— bool3.3 字符类型 —— char3.4 其他整型 4. 有符号类型和无符号类型5. 浮点型6. 如何选择类型7. 类型转换7.1 自动类型转换7.2 强制类型转换7.3 类型转换总结 8. 类型溢出8.1 注意事项 …

机器学习好神奇,来看看Lasso的超参数调整与模型选择

目录 一、什么是机器学习?二、稀疏建模介绍三、Lasso回归简介四、Lasso超参数调整与模型选择 一、什么是机器学习? 机器学习是一种人工智能技术,它使计算机系统能够从数据中学习并做出预测或决策,而无需明确编程。它涉及到使用算…

Android面试题之动画+事件处理篇

1、Android 中的动画有哪几类 帧动画、补间动画、属性动画 2、动画能组合在一起使用么? 可以将动画组合在一起使用AnimatorSet, AnimatorSet.play() 播放当前动画的同时可以 .with() :将现有动画和传入的动画同时执行 .after() &#xff1a…

通过开放解析智能分块提高 RAG 性能

如果要使用大型语言模型 ()LLMs 实现生成式 AI 解决方案,则应考虑使用检索增强生成 (RAG) 的策略来生成上下文感知提示LLM。在启用 LLM RAG 的预生产管道中发生的一个重要过程是删除文档文本,以便仅将文档中…

[数据集][目标检测]药片药丸检测数据集VOC+YOLO格式152张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):152 标注数量(xml文件个数):152 标注数量(txt文件个数):152 标注类别…

听说你还不会用Dagger2?Dagger2 For Android最佳实践教程

Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d(TAG,chef.cook()); } } 可以看到,在使用Dagger2的时候,使用者的代码会变得非常简洁。但是&#…

如何用好swoole/webman/workerman/hyperf呢

Webman框架的依赖 "require": { "php": ">7.2", "workerman/webman-framework": "^1.5.0",// "monolog/monolog": "^2.0" }, 依赖的核心框架也是很久的了 webman-framework的核心依赖 &q…

分布式架构的优势与实现

目录 前言1. 什么是分布式架构1.1 分布式架构的定义1.2 分布式架构的基本原理 2. 分布式架构的优势2.1 可扩展性2.2 容错性和高可用性2.3 性能优化2.4 灵活性和可维护性 3. 分布式架构的实现方法3.1 服务拆分3.1.1 功能拆分3.1.2 垂直拆分3.1.3 水平拆分 3.2 数据分布与存储3.2…

java—Mybatis缓存

缓存的作用 缓存(cache)的作用是为了减轻数据库的压力,提高查询性能。 为什么使用缓存 mysql数据库保存的数据均在硬盘中,CPU是不会直接和硬盘进行交互的,因为硬盘的数据传输率很低,而CPU的数据传输率很高, CPU和内存直…

VBA技术资料MF165:关闭当前打开的所有工作簿

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…

四年Android,终于咸鱼翻身!8K到25K全靠这份高级面试题+解析!

1、哪些情况下的对象会被垃圾回收机制处理掉? 2、讲一下常见编码方式? 3、utf-8 编码中的中文占几个字节;int 型几个字节? 4、静态代理和动态代理的区别,什么场景使用? 5、Java 的异常体系 6、谈谈你对解析…

写一个坏越的个人天地(一)

好久没写什么大点的项目了,今天想着写一个个人博客好了。I did it! 做个人天地。肯定得有个主题色吧。整个下拉界面,先准备三个色系吧 <el-header class="title"><el-dropdown @command="handleCommand"><span class="el-dropdown-…

若依4.7.8版本计划任务rce复现

0x00 背景 最近项目中发现很多单位都使用了若依二开的系统&#xff0c;而最近若依有个后台计划任务rce的漏洞&#xff0c;比较新&#xff0c;我还没复现过&#xff0c;于是本地搭建一个若依环境复现一下这个漏洞。 这个漏洞在4.7.8版本及之前都存在&#xff0c;现在最新版的若…

Golang | Leetcode Golang题解之第179题最大数

题目&#xff1a; 题解&#xff1a; func largestNumber(nums []int) string {sort.Slice(nums, func(i, j int) bool {x, y : nums[i], nums[j]sx, sy : 10, 10for sx < x {sx * 10}for sy < y {sy * 10}return sy*xy > sx*yx})if nums[0] 0 {return "0"…

Android 天气APP(八)城市切换 之 自定义弹窗与使用

然后在模块的utils包中新建一个LiWindow类 代码如下&#xff1a; package com.llw.mvplibrary.utils; import android.app.Activity; import android.content.Context; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; im…

element-ui里message抖动问题

由于element默认屏蔽滚动条&#xff0c;导致取消时弹message时 侧边滚动栏突然回来后引起抖动问题 是由于打开弹窗时出现遮罩层dialog对话框 时引起了元素内容超出自身尺寸 对应的overflow样式内容为hidden&#xff0c;且新建了一个class类内容为增加17 内右边距&#xff0c;当…

某md5魔改-js还原

我们先把js 扣下来看一下 整体扣一下 ,运行后发现结果一致。 到这里就结束了吗,不不,这次我们要看到它里面具体的变动 <-_-> 先看一下md5的初步加密流程 void MD5Init(MD5_CTX *context) {context->count[0] = 0;context->count[1] = 0;context->state[0]…

AI网络爬虫:搜狗图片的时间戳反爬虫应对策略

如何批量爬取下载搜狗图片搜索结果页面的图片&#xff1f;以孙允珠这个关键词的搜索结果为例&#xff1a; https://pic.sogou.com/pics?query%E5%AD%99%E5%85%81%E7%8F%A0&mode2 翻页规律如下&#xff1a; https://pic.sogou.com/napi/pc/searchList?mode2&start38…

Flutter开发环境搭建和调试

[你的Flutter文件夹路径]\flutter\bin 这样我们的Flutter SDK的环境变量就配置完毕了。接下来在命令提示符窗口中输入命令&#xff1a; flutter doctor 它可以帮助我们检查Flutter环境变量是否设置成功&#xff0c;Android SDK是否下载以及配置好环境变量等等。如果有相关的…