信用卡客户特征分析

news2024/11/27 9:57:48

分析思路

信用卡服务提供了一种方便的贷款方式,允许用户事先消费,之后再支付费用。对银行而言,这种服务既有较高的利润潜力,同时也伴随着用户可能不履行还款义务的风险。本⽂是基于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.coloradmin.cn/o/1579766.html

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

相关文章

如何区别进化和演化

在生物学中,"进化"和"演化"这两个词通常可以互换使用,它们都指的是生物种群随时间推移而发生的遗传变化。然而,在某些语境中,这两个词可能会有细微的差别: 进化(Evolution)…

C#.net手术麻醉信息系统源码,集成HIS、EMR、LIS、PACS系统

手术麻醉信息系统可以实现手术室监护仪、麻醉机、呼吸机、输液泵等设备输出数据的自动采集,采集的数据能据如实准确地反映患者生命体征参数的变化,并实现信息高度共享,根据采集结果,综合其他患者数据,自动生成手术麻醉…

MySQL数据库基础--索引

索引概述 索引是帮助MySQL高效获取数据的数据结构(有序) 优缺点 优势劣势提高数据检索的效率,降低数据库的IO成本索引列也是要占用空间的通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗索引大大提高了查…

xss.pwnfunction-Ah That‘s Hawt

<svg/onloadalert%26%2340%3B1%26%2341%3B> <svg/>是一个自闭合形式 &#xff0c;当页面或元素加载完成时&#xff0c;onload 事件会被触发&#xff0c;从而可以执行相应的 JavaScript 函数

649.Dota2 参议院

题目&#xff1a;Dota2 的世界里有两个阵营&#xff1a;Radiant&#xff08;天辉&#xff09;和 Dire&#xff08;夜魇&#xff09; Dota2 参议院由来自两派的参议员组成。现在参议院希望对一个 Dota2 游戏里的改变作出决定。他们以一个基于轮为过程的投票进行。在每一轮中&am…

abap 增强查找

初代增强 查找&#xff1a;se38 Z_FIND_USEREXIT ZENHANCE_FIND 没有的话可以复制下面查找增强代码 REPORT z_find_userexit NO STANDARD PAGE HEADING.*&---------------------------------------------------------------------**& Enter the transaction code…

机器学习 —— MNIST手写体识别

本文使用工具 Anaconda下载安装与使用 Jupyter Notebook的使用 pytorch配置 Jupyter notebook Pycharm 本文使用数据集 机器学习实验所需内容.zip 点击跳转至正文部分 pytorch配置 Jupyter notebook 1、打开 Anaconda…

Unity MySql安装部署与Unity连接 上篇

1.前言 最近项目用到MySql&#xff0c;记录一下安装部署过程。 数据量过大或者需要管理用户数据的时候用mysql的话数据结构比较清晰明了&#xff0c;便于管理。 2.安装MySql Unity版本&#xff1a;2019.4.16 MySql版本&#xff1a;8.2.0 下载地址&#xff1a;MySql 下载…

全新AI天空任意生成解决方案,颠覆传统换天效果

在数字化时代&#xff0c;影像创作已经成为企业展示品牌形象、传递信息的重要手段。特别是在汽车拍摄和旅行拍摄等场景中&#xff0c;天空作为画面中不可或缺的元素&#xff0c;其表现往往直接关系到作品的质感和吸引力。然而&#xff0c;传统的天空替换技术往往操作繁琐、效果…

Docker内更新Jenkins详细讲解

很多小伙伴在Docker中使用Jenkins时更新遇到困难&#xff0c;本次结合自己的实际经验&#xff0c;详细讲解。根据官网Jenkins了解以下内容&#xff1a; 一、Jenkins 是什么? Jenkins是一款开源 CI&CD 软件&#xff0c;用于自动化各种任务&#xff0c;包括构建、测…

Linux中磁盘管理

一.磁盘管理的概括和简要说明 磁盘空间的管理&#xff0c;使用硬盘三步&#xff1a; &#xff08;1&#xff09;分区&#xff1a; &#xff08;2&#xff09;安装文件系统格式化 &#xff08;3&#xff09;挂载&#xff1a; 硬盘的分类&#xff1a; &#xff08;1&#x…

Spring Cloud 和 Dubbo 区别及应用

探索 Spring Cloud 的能力 Spring Cloud 为开发者们构筑健全的云端应用提供了一套全面的工具。这一框架支援创建微服务架构的应用&#xff0c;如配置管理、服务发现和断路等功能。开发人员借助Spring Cloud&#xff0c;能迅速打造和部署符合设计模式的服务与应用。这套框架适用…

配置交换机 SSH 管理和端口安全——实验1:配置交换机基本安全和 SSH管理

实验目的 通过本实验可以掌握&#xff1a; 交换机基本安全配置。SSH 的工作原理和 SSH服务端和客户端的配置。 实验拓扑 交换机基本安全和 SSH管理实验拓扑如图所示。 交换机基本安全和 SSH管理实验拓扑 实验步骤 &#xff08;1&#xff09;配置交换机S1 Switch>enab…

关于gpu模拟器任务发布

首先&#xff0c;grid拿到用户指定的形状 那么发布任务&#xff0c;就每次增长block的size&#xff0c;如下 那么这个threadblock就直到自己在哪个位置 也就是grid任务拆成block&#xff0c;是依赖形状 关于block如何分成warp&#xff0c;发现是blocksize来拆&#xff0c;bloc…

AWS云为何会成为出海企业的首选

AWS云对出海企业来说究竟有什么魅力&#xff1f;本文&#xff0c;AWS合作伙伴九河云会带你了解&#xff0c;在企业出海过程中为什么首先想到的就是AWS云&#xff1f; 广泛而深入的云服务 亚马逊云科技目前提供超过 200 项全功能的服务&#xff0c;涵盖计算、存储、数据库、网…

二建考试搜题软件哪个好?分享8个可以搜答案的软件 #知识分享#笔记#学习方法

积极参加社团活动和实践项目&#xff0c;可以帮助大学生拓宽人脉圈和锻炼实际操作能力。 1.白鸽搜题 这是个微信公众号 多语言查询支持&#xff0c;满足国际用户需求。全球通用&#xff0c;无障碍搜题。 下方附上一些测试的试题及答案 1、等渗性脱水时&#xff0c;体液变化…

竞赛 卷积神经网络手写字符识别 - 深度学习

文章目录 0 前言1 简介2 LeNet-5 模型的介绍2.1 结构解析2.2 C1层2.3 S2层S2层和C3层连接 2.4 F6与C5层 3 写数字识别算法模型的构建3.1 输入层设计3.2 激活函数的选取3.3 卷积层设计3.4 降采样层3.5 输出层设计 4 网络模型的总体结构5 部分实现代码6 在线手写识别7 最后 0 前言…

DS-Net:可落地的动态网络,实际加速1.62倍,快改造起来 | CVPR 2021 Oral

论文提出能够适配硬件加速的动态网络DS-Net&#xff0c;通过提出的double-headed动态门控来实现动态路由。基于论文提出的高性能网络设计和IEB、SGS训练策略&#xff0c;仅用1/2-1/4的计算量就能达到静态SOTA网络性能&#xff0c;实际加速也有1.62倍   来源&#xff1a;晓飞的…

Gradle 依赖管理-ApiHug准备-工具篇-004

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace ApiHug …

比特币革命:刚刚开始

作者&#xff1a;Marius Farashi Tasooji 编译&#xff1a;秦晋 要充分理解比特币及其含义&#xff0c;首先必须理解什么是价值&#xff0c;什么是货币。以及是什么赋予资产价值&#xff1f; 这个问题看似愚蠢&#xff0c;但实际上非常有趣。我们的生活是由我们消费或出售的物品…