信用卡客户特征分析

分析思路

信用卡服务提供了一种方便的贷款方式,允许用户事先消费,之后再支付费用。对银行而言,这种服务既有较高的利润潜力,同时也伴随着用户可能不履行还款义务的风险。本⽂是基于2005年台湾信⽤卡客户数据,探究信⽤卡客户有哪些信贷特征?违约客户有哪些特征?
在这里插入图片描述

数据说明

  • BILL_AMT账单金额:表示使用信用卡的消费金额。
  • PAY_AMT支付金额:给信用卡的还款金额。
  • 如果账单金额 > 支付金额则表示该用户延迟还款了,产生了逾期。
    在这里插入图片描述

数据加载

#导入需要的库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#忽略警告
import warnings
warnings.filterwarnings('ignore')
#中文乱码的处理
#plt.rcParams['font.sans-serif']=['PingFang HK'] #mac系统使用
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']# windows使用设置微软雅黑字体
plt.rcParams['axes.unicode_minus'] = False # 避免坐标轴不能正常的显示负号#加载数据UCI_Credit_Card.csv
data = pd.read_csv('UCI_Credit_Card.csv')
data.head()

在这里插入图片描述

data.shape

(30000, 25)

数据预处理

  • 选择子集
    • BILL_AMT1 ~ BILL_AMT6为各⽉账单⾦额(即每⽉消费记录)、PAY_AMT1 ~ PAY_AMT6为各⽉⽀付⾦额⽀付,⽀付⾦额>上个⽉消费记录,则视为该⽉及时还款,反之则视为延迟还款
    • 直接根据pay_0 ~ pay_6去计算/表示客户在4⽉-9⽉正常还款或者违约情况,所以【BILL_AMT1 ~ BILL_AMT6】和【PAY_AMT1 ~ PAY_AMT6】这些字段可视为⽆⽤信息,删除即可。
#批量生成要删除列的名字
list_pay = []
list_bill = []
for i in range(1,7):s = 'PAY_AMT'+str(i)list_pay.append(s)
for i in range(1,7):s = 'BILL_AMT'+str(i)list_bill.append(s)list_pay.extend(list_bill)data.drop(columns=['PAY_AMT1','PAY_AMT2','PAY_AMT3','PAY_AMT4','PAY_AMT5','PAY_AMT6','BILL_AMT1','BILL_AMT2','BILL_AMT3','BILL_AMT4','BILL_AMT5','BILL_AMT6'],inplace=True)#将default.payment.next.month的名字修改为is_pay
data.rename(columns={'default.payment.next.month':'is_pay'},inplace=True)
  • 查看是否存在重复的行数据
data.duplicated().sum()

0

  • 查看是否存在缺失值
data.isnull().any(axis=0)

在这里插入图片描述

  • 异常值检测
#将EDUCATION的0,4,5都替换成6,6就表示其他这种学历
data['EDUCATION'].replace(to_replace={0:6,4:6,5:6},inplace=True)
data['MARRIAGE'].replace(to_replace={0:3},inplace=True)

数据分析

总体违约情况分析
  • 求违约客户的占比
df1 = data['is_pay'].value_counts().reset_index().rename(columns={'index':'类型','is_pay':'人数'})
df1

在这里插入图片描述

df1['类型'] = df1['类型'].map({0:'未违约',1:'违约'})
df1

在这里插入图片描述

#求解整体的违约率
def func(x):return format(x/df1['人数'].sum(),'.2%')
df1['占比'] = df1['人数'].map(func)
df1

在这里插入图片描述
整体持卡用户的违约率高达22.12%

违约客户的特征分析
  • 不同贷款额度分布
x = plt.hist(data['LIMIT_BAL'],bins=60)

在这里插入图片描述

data['LIMIT_BAL'].describe([.1,.2,.3,.4,.5,.6,.7,.8,.9])

在这里插入图片描述

有70%的客户贷款额度大约在20万以内,有80%的客户贷款额度在30万以内,客户贷款额度还是以中低额度为主。

  • 不同贷款额度的违约客户分布
bal_s = pd.cut(data['LIMIT_BAL'],bins=[10000,50000,100000,200000,300000,400000,500000,600000,700000,800000,900000,1000000],right=False)
data['LIMIT_BAL_bt'] = bal_s
#不同借款区间对应的违约和未违约用户的数量
is_pay_df = pd.crosstab(data['is_pay'],data['LIMIT_BAL_bt']).T.rename(columns={0:'未违约',1:'违约'})
is_pay_df

在这里插入图片描述

#计算不同借款区间对应的违约率
def func(x):return format(x['违约'] / x.sum(),'.2%')
is_pay_df['违约率'] = is_pay_df.apply(func,axis=1)
is_pay_df

在这里插入图片描述

plt.figure(figsize=(12,6))
plt.plot(is_pay_df.index.astype('str'),is_pay_df['未违约'],label='未违约')
plt.plot(is_pay_df.index.astype('str'),is_pay_df['违约'],label='违约')
plt.xlabel('借款区间')
plt.ylabel('人数')
plt.legend()
x = plt.xticks(rotation=30)

在这里插入图片描述

可以看出,贷款额度越⾼,违约率逐渐降低,违约率较⾼的贷款额度主要集中在20万以内,所以对低于20万的贷款,⼀定要加强审核度,防⽌违约。

  • 不同性别的违约情况
is_pay_sex = pd.crosstab(data['SEX'],data['is_pay']).rename(columns={0:'未违约',1:'违约'},index={1:'男',2:'女'})
is_pay_sex['总计'] = is_pay_sex['未违约'] + is_pay_sex['违约']
def func(x):return format(x['违约']/x['总计'],'.2%')
is_pay_sex['违约率'] = is_pay_sex.apply(func,axis=1)
is_pay_sex

在这里插入图片描述

⼥性贷款的⼈数会远⾼于男性,但男性的违约率更⾼

  • 不同受教育程度的违约情况
is_pay_edu = pd.crosstab(data['EDUCATION'],data['is_pay']).rename(columns={0:'未违约',1:'违约'},index={1:'硕士',2:'大学',3:'高中',6:'其他'})
is_pay_edu['总计'] = is_pay_edu['未违约'] + is_pay_edu['违约']
def func(x):return format(x['违约']/x['总计'],'.2%')
is_pay_edu['违约率'] = is_pay_edu.apply(func,axis=1)
is_pay_edu

在这里插入图片描述

  • 不同婚姻状况的违约率
is_pay_mar = pd.crosstab(data['MARRIAGE'],data['is_pay']).rename(columns={0:'未违约',1:'违约'},index={1:'已婚',2:'单身',3:'其他'})
is_pay_mar['总计'] = is_pay_mar['未违约'] + is_pay_mar['违约']
def func(x):return format(x['违约']/x['总计'],'.2%')
is_pay_mar['违约率'] = is_pay_mar.apply(func,axis=1)
is_pay_mar

在这里插入图片描述

已婚的违约率略⾼于未婚的违约率,但是差异性并不是很⼤,相对来说都偏⾼

  • 不同年龄段的违约率
age_s = pd.cut(data['AGE'],bins=[21,30,40,50,60,70,80],right=False)
age_s

在这里插入图片描述

is_pay_age = pd.crosstab(age_s,data['is_pay']).rename(columns={0:'未违约',1:'违约'})
is_pay_age

is_pay_age[‘总计’] = is_pay_age[‘未违约’] + is_pay_age[‘违约’]
def func(x):
return format(x[‘违约’]/x[‘总计’],‘.2%’)
is_pay_age[‘违约率’] = is_pay_age.apply(func,axis=1)
is_pay_age
在这里插入图片描述

各个年龄段的违约率随着年龄的增⻓,有上升趋势,60岁以上的违约率最⾼;21-30和30-40的贷款⼈数
最多,说明贷款⼈员偏年轻。

  • 各⽉还款情况的违约客户分析
pay_df = data[['PAY_0','PAY_2','PAY_3','PAY_4','PAY_5','PAY_6']]
pay_df

在这里插入图片描述

#计算不同月份逾期还款的用户数
def func(x):return (x > 0).sum()
month_df = pay_df.apply(func,axis=0).rename(index={'PAY_0':'九月','PAY_2':'八月','PAY_3':'七月','PAY_4':'六月','PAY_5':'五月','PAY_6':'四月'}).reset_index().rename(columns={'index':'月份',0:'逾期用户数'})
month_df

#计算每个月的逾期率:逾期用户数 / 总用户数
def func(x):
return format(x,‘.2%’)
month_df[‘逾期率’] = (month_df[‘逾期用户数’]/data[‘ID’].count()).map(func)
month_df
在这里插入图片描述

从数据来看,逾期还款的⽤户数从4⽉到9⽉,呈现递增的趋势,说明当时的违约情况越演愈烈。

如何避免客户违约

#相关性分析:探究两组数据之间是否存在相关关系
#相关关系: 正相关 负相关
#如何表示相关性:相关系数(皮尔森系数)

df = data[['SEX','EDUCATION','MARRIAGE','AGE','is_pay']]
df

在这里插入图片描述

df.corr().abs()['is_pay'][:-1].sort_values(ascending=False)

在这里插入图片描述

分析结论

  • 1.总体违约率⾼达22.12%,当时违约情况⾮常严重,05年4⽉-9⽉还款逾期率逐渐上升,违约情况愈演愈烈。
  • 2.贷款额度越⾼,违约率越低,违约率较⾼的贷款额度主要集中在20万以内,所以对于低于20万的贷款,⼀定要加强审核度,降低违约⻛险。
  • 3.教育⽔平在⾼中的违约率较⾼,随着教育⽔平的提⾼,违约率呈下降趋势,⼀定程度说明教育⽔平越⾼,违约率越低,建议教育⽔平可作为信⽤卡审核的标准之⼀。
  • 4.各个年龄段的违约率随着年龄的增⻓,有上升趋势,60岁以上的违约率最⾼;建议对于年龄⾼于60岁以上的⼈员办理信⽤卡增加审核强度,降低申请贷款额度。
  • 5.⼥性贷款的⼈数会远⾼于男性,但男性的违约率更⾼。
  • 6.已婚的违约率略⾼于未婚的违约率,但是差异性并不是很⼤,相对来说都偏⾼。

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

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

相关文章

内含教程丨最高可降低 16 倍成本,ComfyUI Stable Cascade 教程已上线,一键部署!

2024 年 2 月,OpenAI 又一次站在了镁光灯下,Sora 横空出世并引发热烈讨论,「文生视频」的热潮被那段 60 秒的展示视频再度推高,也使得很多人忽视了其图片生成能力。 更加值得一提的是,其实就在 Sora 发布前不久&#…

vue3 +Taro 页面实现scroll-view 分页功能

需求 现在分页列表 后端只给你一个分页的数据列表 没有总页数 没有当前的分页 页数 只有这么一个list 、、、 如何去分页 我这使用的是scroll-view 组件 滑动到底部的事件 根据你当前设定的每页的数据数量和后端返回给你的数据列表数量 当某一次分页 两个数量不相等了以后 就…

SpringBoot第一个hello world项目

文章目录 前言一、Spring Boot是什么?二、使用步骤1. 创建项目2.书写测试 总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了…

javaWeb车辆管理系统设计与实现

摘 要 随着经济的日益增长,车辆作为最重要的交通工具,在企事业单位中得以普及,单位的车辆数目已经远远不止简单的几辆,与此同时就产生了车辆资源的合理分配使用问题。 企业车辆管理系统运用现代化的计算机管理手段,不但可以对车辆的使用进行合理的管理,…

几种常用代码比较工具分析

代码比较工具是软件开发中不可或缺的辅助工具,它们帮助开发者识别代码之间的差异,合并代码变更,提高代码审查的效率。以下是一些常用代码比较工具的优缺点及适用性分析: 1.WinMerge: 优点:WinMerge是一款…

多模态检索增强生成的简单介绍

多模态检索增强生成的简单介绍 文章目录 多模态检索增强生成的简单介绍为什么多模态很难?每种模式都有其自身的挑战您如何跨模式管理信息? 多模态检索方法将所有模态嵌入到同一向量空间中将所有模式归结为一种主要模式对于不同的方式有单独的备用 多模式…

Redis的高可用和持久化

目录 一、Redis高可用 二、Redis持久化 2.1 持久化的功能 2.2 Redis提供两种方式进行持久化 三、RDB持久化 3.1 触发条件 3.1.1 手动触发 3.1.2 自动触发 3.1.3 其他自动触发机制 四、AOF持久化 4.1 开启AOF 4.2 执行流程 4.2.1 命令追加 (append) 4.2.2 文件写入…

Android Binder——Kernel层介绍(七)

一、简介 Android Binder 的 Kernel 层也就是 Binder 的驱动层,位于 Binder 结构的最底层,这部分用于实现 Binder 的设备驱动。 主要功能 进程间通信 。Binder 机制是 Android 系统提供的一种跨进程通信机制,它允许在不同进程之间进行数据传输和方法调用,实现了进程间的解…

[echarts] y轴不显示0

main.js 全局引入 import * as echarts from echarts import Vue from vueVue.prototype.$echarts echarts使用: this.myChart echarts.init(document.getElementById(main))改为 this.myChart this.$echarts.init(document.getElementById(main))

JavaScript PAT乙级题解 1058 选择题

批改多选题是比较麻烦的事情,本题就请你写个程序帮助老师批改多选题,并且指出哪道题错的人最多。 输入格式: 输入在第一行给出两个正整数 N(≤ 1000)和 M(≤ 100),分别是学生人数和…

vue3-element-admin实现同一个菜单多标签

原框架代码: 赵志江/huzhushan-vue3-element-admin 目录 TagsBar实现 实现同一个菜单多标签 device/detail/:id&#xff0c;不同参数时页面缓存删不掉的问题 TagsBar实现 在src/layout/components/下新建目录Tagsbar&#xff0c;新建index.vue <template><div c…

生产车间图纸无纸化,生产车间图纸无纸化解决方案

生产车间图纸无纸化是指通过采用数字化设备和技术&#xff0c;将传统的纸质图纸转化为电子文档&#xff0c;并在生产过程中实现图纸的电子化、网络化和自动化管理。这一转变旨在提高工作效率、降低成本、提高安全性&#xff0c;并推动生产车间的现代化和智能化。 实现生产车间图…

Java中的锁机制,包括可重入锁、读写锁等。

Java中的锁机制是一种用于控制多个线程对共享资源的访问&#xff0c;以避免数据不一致和其他并发问题的技术。Java提供了多种锁机制&#xff0c;每种都有其特定的用途和优势。 1. 内置锁&#xff08;synchronized&#xff09; Java语言本身提供了内置锁机制&#xff0c;通过s…

蓝桥杯算法题:最大比例

题目描述&#xff1a; X星球的某个大奖赛设了 M 级奖励。 每个级别的奖金是一个正整数。 并且&#xff0c;相邻的两个级别间的比例是个固定值。 也就是说&#xff1a;所有级别的奖金数构成了一个等比数列。 比如&#xff1a;16,24,36,54&#xff0c;其等比值为&#xff1a;3/2。…

SpringBoot 定时任务实践、定时任务按指定时间执行

Q1. springboot怎样创建定时任务&#xff1f; 很显然&#xff0c;人人都知道&#xff0c;Scheduled(cron ".....") Q2. 如上所示创建了定时任务却未能执行是为什么&#xff1f; 如果你的cron确定没写错的话 cron表达式是否合法&#xff0c;可参考此处&#xff0c…

Android集成微信支付

官方api&#xff1a;Android接入指南 | 微信开放文档 打开微信开放平台登录账户后点击创建应用 根据提示填写完相应的内容提交审核通过后&#xff0c;需要开通支付权限。 1.接着在你的项目工程build.gradle文件中添加微信支付依赖库 ​api com.tencent.mm.opensdk:wechat-sdk…

python代码使用过程中使用快捷键注释时报错

1.代码 2.代码报错 3.代码注释后的结果 4. 原因

sql注入方式之联合注入

1.1 靶场环境 系统centos7 IP地址192.168.1.24 1.2 联合注入原理 联合查询注入是联合两个表进行注入攻击&#xff0c;使用关键词 union select 对两个表进行联合查询。两个表的字段要数要相同&#xff0c;不然会出现报错。 1.3 找注入点 找注入点&#xff0c;当输入id1 an…

C语言——文件管理

文件&#xff1a;即磁盘上的文件&#xff0c;使用文件可以将数据直接存放在电脑的硬盘上&#xff0c;做到数据持久化。 在程序设计中&#xff0c;按文件的功能划分&#xff0c;将文件分为程序文件与数据文件 程序文件 程序文件包括源文件&#xff08;.c&#xff09;&#xff0…

Centos7搭建 Skywalking 单机版

介绍 Skywalking是应用性能监控平台&#xff0c;可用于分布式系统&#xff0c;支持微服务、云原生、Docker、Kubernetes 等多种架构场景。 整体架构如图 Agent &#xff1a;在应用中&#xff0c;收集 Trace、Log、Metrics 等监控数据&#xff0c;使用 RPC、RESTful API、Kafk…