当前位置: 首页 > news >正文

SQL项目实战:银行客户分析

大家好,本文将与大家分享一个SQL项目,即根据从数据集收集到的信息分析银行客户流失的可能性。这些洞察来自个人信息,如年龄、性别、收入和人口统计信息、银行卡类型、产品、客户信用评分以及客户在银行的服务时间长短等。对于银行而言,了解如何留住客户比寻找其他客户更有利。

客户流失是指客户或顾客的流失。公司通常将其作为关键业务指标之一,因为恢复的长期客户对公司的价值远远高于新招募的客户。客户流失有两种类型:自愿流失和非自愿流失。自愿流失是由于客户决定转向其他公司或服务提供商,而非自愿流失则是由于客户搬迁到长期护理机构、死亡或搬迁到较远的地方等情况造成的。

本文将集中讨论自愿流失,因为它可能是由于公司与客户关系中公司可以控制的因素造成的,例如如何处理账单互动或如何提供售后帮助。

数据集

本文使用的是customer_churn_records表,该表包含多列,customerid是表的主键。

  1. RowNumber:对应记录(行)编号

  2. CustomerId:客户的ID编号

  3. Surname:客户的姓氏

  4. CreditScore:客户信用行为预测值

  5. Geography:客户所在地

  6. Gender:客户的性别信息

  7. Age:客户的年龄信息

  8. Tenure:客户在银行的使用年限

  9. Balance:客户账户中的余额信息

  10. NumOfProducts:客户购买的产品数量

  11. HasCrCard:客户是否拥有信用卡

  12. IsActiveMember:客户是否处于活跃状态

  13. EstimatedSalary(估计工资):客户的估计工资金额

  14. Exited:客户是否离开银行

  15. Complain:客户是否有投诉

  16. Satisfaction Score:客户对银行的满意度评分

  17. Card Type:客户持有的银行卡类型

  18. Points Earned:客户使用信用卡获得的积分

# 显示表中的列 = customer_churn_recordsq='''SELECT * FROM customer_churn_records'''df = pd.read_sql(q,engine_postgresql)
df.head()

 查询客户流失率

导入软件包:

import psycopg2 # PostgreSQL数据库适配器
import pandas as pd # 用于分析数据
from sqlalchemy import create_engine # 促进Python程序与数据库之间的通信

首先,本文根据已退出的列计算有多少客户流失。

# 统计是否流失/退出的客户总数q='''WITH temp_churn AS(SELECT exited,CASE WHEN exited = 1 THEN 'Churn'ELSE 'Not Churn'END AS STATUSfrom customer_churn_records)SELECT STATUS,COUNT(exited) as TotalFROM temp_churnGROUP BY 1'''df = pd.read_sql(q,engine_postgresql)
df.head()

可以发现在10000名客户中,有近20%从银行退出或流失。尽管这个数字并不算很大,但如果现在还不能解决这个问题,它可能会增长得更多。

现在,本文将从活跃客户、性别、人口统计、年龄、临时工龄、信用分数、产品数量、满意度分数、投诉、是否有信用卡、卡类型、已获积分、预估薪资和余额等多个方面来检查客户流失状况的类型。

# 统计有多少活跃客户流失q=''' WITH temp_isactivemember AS(SELECT exited,CASE WHEN isactivemember = 1 THEN 'Active'ELSE 'Not Active'END AS isactivememberfrom customer_churn_records)SELECT isactivemember,COUNT (CASE WHEN exited = 1 THEN 1 END) AS Churn,COUNT (CASE WHEN exited = 0 THEN 1 END) AS Not_ChurnFROM temp_isactivememberGROUP BY 1'''df = pd.read_sql(q,engine_postgresql)
df

# 根据性别计算是否流失/退出的客户总数q='''SELECT gender,COUNT(gender) as Total,COUNT(case when exited = 1 then 1 end) as Churn,COUNT(case when exited = 0 then 1 end) as Not_churnFROM customer_churn_recordsGROUP BY 1'''df = pd.read_sql(q,engine_postgresql)
df.head()

# 根据人口统计数据计算流失客户的数量q=''' SELECT geography,COUNT (CASE WHEN exited = 1 THEN 1 END) AS Churn,COUNT (CASE WHEN exited = 0 THEN 1 END) AS Not_ChurnFROM customer_churn_recordsGROUP BY 1'''df = pd.read_sql(q,engine_postgresql)
df

 

#根据年龄组计算流失客户的数量q=''' SELECT CASE WHEN age <= 20 THEN 'Group <= 20'WHEN age >= 21 AND age <= 40 THEN 'Group 21-40'WHEN age >= 41 AND age <= 60 THEN 'Group 41-60'ELSE 'Group > 60'END AS age_category,COUNT(CASE WHEN exited = 1 then 1 end) as Churn,COUNT(CASE WHEN exited = 0 then 1 end) as Not_ChurnFROM customer_churn_recordsGROUP BY 1ORDER BY 1'''df = pd.read_sql(q,engine_postgresql)
df

 

# 根据他们成为客户的时间计算是否流失/退出的客户总数q='''WITH temp_tenure AS(SELECT tenure,CASE WHEN exited = 1 THEN 'Churn'ELSE 'Not Churn'END AS STATUSfrom customer_churn_records)SELECT STATUS,AVG(tenure) as Average_tenureFROM temp_tenureGROUP BY 1'''df = pd.read_sql(q,engine_postgresql)
df.head()

 

# 根据客户使用银行产品的数量,计算有多少客户流失q='''WITH temp_bankprod AS(SELECT numofproducts,CASE WHEN exited = 1 THEN 'Churn'ELSE 'Not Churn'END AS STATUSfrom customer_churn_records)SELECT STATUS,AVG(numofproducts) as avg_numofproductsFROM temp_bankprodGROUP BY 1'''df = pd.read_sql(q,engine_postgresql)
df.head()

 

# 根据客户 对银行的满意度得分的平均得分,计算有多少客户流失q='''WITH temp_satisfaction AS(SELECT satisfaction_score,CASE WHEN exited = 1 THEN 'Churn'ELSE 'Not Churn'END AS STATUSfrom customer_churn_records)SELECT STATUS,AVG(satisfaction_score) as satisfaction_levelFROM temp_satisfactionGROUP BY 1'''df = pd.read_sql(q,engine_postgresql)
df.head()

 

# 根据客户的投诉量,统计有多少客户流失q='''WITH temp_complain AS(SELECT complain,CASE WHEN exited = 1 THEN 'Churn'ELSE 'Not Churn'END AS STATUSfrom customer_churn_records)SELECT STATUS,COUNT(complain) as complainFROM temp_complainGROUP BY 1'''df = pd.read_sql(q,engine_postgresql)
df.head()

 

# 根据客户是否拥有信用卡计算有多少客户流失q=''' WITH temp_hascrcard AS(SELECT hascrcard,CASE WHEN exited = 1 THEN 'Churn'ELSE 'Not Churn'END AS STATUSfrom customer_churn_records)SELECT STATUS,COUNT (CASE WHEN hascrcard = 1 THEN 1 END) AS has_creditcard,COUNT (CASE WHEN hascrcard = 0 THEN 1 END) AS no_creditcardFROM temp_hascrcardGROUP BY 1'''df = pd.read_sql(q,engine_postgresql)
df

 

# 根据客户的预估工资计算有多少客户流失q='''WITH temp_salary AS(SELECT estimatedsalary,CASE WHEN exited = 1 THEN 'Churn'ELSE 'Not Churn'END AS STATUSfrom customer_churn_records)SELECT STATUS,AVG(estimatedsalary) as avg_salary,MAX(estimatedsalary) as max_salary,MIN(estimatedsalary) as min_salaryFROM temp_salaryGROUP BY 1'''df = pd.read_sql(q,engine_postgresql)
df.head()

 

# 根据客户的银行存款余额计算有多少客户流失
#(平均、最高、最低)q='''WITH temp_balance AS(SELECT balance,CASE WHEN exited = 1 THEN 'Churn'ELSE 'Not Churn'END AS STATUSfrom customer_churn_records)SELECT STATUS,AVG(balance) as avg_balance,MAX(balance) as max_balance,MIN(balance) as min_balanceFROM temp_balanceGROUP BY 1'''df = pd.read_sql(q,engine_postgresql)
df.head()

 结论

根据上述问题,有一些类别可以帮助确定哪些方面会真正影响客户流失。不管客户在银行停留了多长时间,他们仍然有可能流失,或者说,客户的银行账户上有相当数量的存款,他们仍然有可能流失。

通过分析发现,41至60岁年龄段的客户比其他年龄段的客户更容易流失。为了解决这个问题,银行可以集中精力创造或提升产品和服务,以帮助吸引和维护特定年龄段的客户,比如为年龄较大的客户提供更流畅的服务和最短的排队时间。

持有信用卡的客户往往不会流失,而是会继续留在银行。银行最好通过各种促销活动说服更多的客户申请信用卡,这取决于客户细分,可根据客户的卡种(钻石卡、白金卡、金卡、银卡)、性别、年龄、支出和人口分布进行细分。

留存客户和流失客户的满意度得分有点令人担忧 [ 3.017960 / 2.997547 ],银行需要进行评估,以保持流失客户和留存客户之间的满意度得分差距,并保持活跃客户,因为活跃客户流失的可能性较低。

相关文章:

SQL项目实战:银行客户分析

大家好&#xff0c;本文将与大家分享一个SQL项目&#xff0c;即根据从数据集收集到的信息分析银行客户流失的可能性。这些洞察来自个人信息&#xff0c;如年龄、性别、收入和人口统计信息、银行卡类型、产品、客户信用评分以及客户在银行的服务时间长短等。对于银行而言&#x…...

【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(集群指令分析—实战篇)

探究Redis服务启动的过程机制的技术原理和流程分析的指南&#xff08;集群指令分析—下篇&#xff09; Cluster XX的集群指令&#xff08;扩展&#xff09;写入记录主节点和备节点切换-CLUSTER FAILOVER新加入master节点新加入slave节点为slave节点重新分配master分配哈希槽删除…...

ubuntu

安装 sudo apt-get update sudo apt-get install mysql-server mysql-client 设置root密码 cat /etc/mysql/debian.cnf 查看默认密码 mysql -u debian-sys-maint -p 连接输入密码 use mysql; select user,plugin from user; update user set pluginmysql_native_passwor…...

【芯片设计- RTL 数字逻辑设计入门 3- Verdi 常用使用命令】

文章目录 Verdi 全局显示Verdi 前导 0 的显示Verdi 数据笔数统计Verdi 波形数据dump Verdi 全局显示 bsubi -n 16 -J sam visualizer -tracedir ./veloce.wave/debug_waveform.stw 打开波形后&#xff0c;如果想要看到所有信号的数据&#xff0c;可以点击下图中红框中的按钮&a…...

python-pytorch基础之cifar10数据集使用图片分类

这里写目录标题 总体思路获取数据集下载cifar10数据解压包文件介绍加载图片数字化信息查看数据信息数据读取自定义dataset使用loader加载建模训练测试建测试数据的loader测试准确性测试一张图片读取一张图片加载模型预测图片类型创建一个预测函数随便来张马的图片结果其他打开一…...

华纳云:linux下磁盘管理与挂载硬盘方法是什么

在Linux下进行磁盘管理和挂载硬盘的方法如下&#xff1a; 磁盘管理&#xff1a; a. 查看已连接的磁盘&#xff1a;可以使用命令 fdisk -l 或 lsblk 查看系统中已连接的磁盘信息&#xff0c;包括硬盘和分区。 b. 创建分区&#xff1a;如果磁盘是全新的&#xff0c;需要使用 f…...

ChatGPT + Stable Diffusion + 百度AI + MoviePy 实现文字生成视频,小说转视频,自媒体神器!(一)

ChatGPT Stable Diffusion 百度AI MoviePy 实现文字生成视频&#xff0c;小说转视频&#xff0c;自媒体神器&#xff01;(一) 前言 最近大模型频出&#xff0c;但是对于我们普通人来说&#xff0c;如何使用这些AI工具来辅助我们的工作呢&#xff0c;或者参与进入我们的生活…...

linux strcpy/strncpy/sprintf内存溢出问题

本文主要介绍strcpy/strncpy/sprintf都是不安全的&#xff0c;可能存在内存溢出的问题。下来进行实例分析。 strcpy代码&#xff1a; #include <stdio.h> #include <string.h> #include <stdlib.h> #include <stdbool.h>void test_func(char *str) {b…...

Jmeter如何添加插件

一、前言 ​ 在我们的工作中&#xff0c;我们可以利用一些插件来帮助我们更好的进行性能测试。今天我们来介绍下Jmeter怎么添加插件&#xff1f; 2023最新Jmeter接口测试从入门到精通&#xff08;全套项目实战教程&#xff09; 二、插件管理器 ​ 首先我们需要下载插件管理器j…...

flask---CBV使用和源码分析

1 cbv写法 -1 写个类&#xff0c;继承MethodView-2 在类中写跟请求方式同名的方法-3 注册路由&#xff1a;app.add_url_rule(/home, view_funcHome.as_view(home))#home是endpoint&#xff0c;就是路由别名#例子 class add(MethodView):def get(self):return holleapp.add_url…...

Qt 实现压缩文件、文件夹和解压缩操作zip

一、实现方式 通过Qt自带的库来实现&#xff0c;使用多线程方式&#xff0c;通过信号和槽来触发压缩与解压缩&#xff0c;并将压缩和解压缩结果回传过来。 使用的类&#xff1a; #include "QtGui/private/qzipreader_p.h" #include "QtGui/private/qzipwriter…...

简单工厂模式VS策略模式

简单工厂模式VS策略模式 今天复习设计模式&#xff0c;由于简单工厂模式和策略模式太像了&#xff0c;重新整理梳理一下 简单工厂模式MUL图&#xff1a; 策略模式UML图&#xff1a; 1、简单工厂模式中只管创建实例&#xff0c;具体怎么使用工厂实例由调用方决定&#xff0c…...

【MySQL】触发器 (十二)

🚗MySQL学习第十二站~ 🚩本文已收录至专栏:MySQL通关路 ❤️文末附全文思维导图,感谢各位点赞收藏支持~ 一.引入 触发器是与表有关的数据库对象,作用在insert/update/delete语句执行之前(BEFORE)或之后(AFTER),自动触发并执行触发器中定义的SQL语句集合。它可以协助应…...

听说 Spring Bean 的创建还有一条捷径?

文章目录 1. resolveBeforeInstantiation1.1 applyBeanPostProcessorsBeforeInstantiation1.2 applyBeanPostProcessorsAfterInitialization1.3 案例 2. 源码实践2.1 切面 Bean2.2 普通 Bean 在 Spring Bean 的创建方法中&#xff0c;有如下一段代码&#xff1a; AbstractAutow…...

大数据课程E6——Flume的Processor

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解Processor的概念和配置参数; ⚪ 掌握Processor的使用方法; ⚪ 掌握Processor的Default Processo; ⚪ 掌握Processor的Load Balance Processo; 一、Failover Sink Processor 1. …...

实现邮箱管理之gmail邮箱、office365(Azure)邮箱之披荆斩棘问题一览

要进行Office365邮箱的授权对接&#xff0c;你需要先申请一个应用&#xff0c;并获取授权访问令牌。 以下是一个简单的步骤&#xff1a; 登录 Azure 门户&#xff1a;https://portal.azure.com/创建一个新的应用程序&#xff0c;或者使用现有的应用程序。要创建新的应用程序&…...

(AcWing)多重背包问题 I,II

有 N 种物品和一个容量是 V 的背包。 第 i 种物品最多有 si 件&#xff0c;每件体积是 vi&#xff0c;价值是 wi。 求解将哪些物品装入背包&#xff0c;可使物品体积总和不超过背包容量&#xff0c;且价值总和最大。 输出最大价值。 输入格式 第一行两个整数 N&#xff0c;…...

如何把几个视频合并在一起?视频合并方法分享

当我们需要制作一个比较长的视频时&#xff0c;将多个视频进行合并可以使得整个过程更加高效。此外&#xff0c;合并视频还可以避免出现“剪辑断层”的情况&#xff0c;使得视频内容更加连贯&#xff0c;更加容易被观众理解和接受。再有&#xff0c;合并视频还可以减少视频文件…...

【MyBatis】初学MyBatis

目录 MyBatis 是什么&#xff1f;MyBatis框架搭建1.添加MyBatis框架2.设置MyBatis配置数据库的相关链接信息xml 保存路径和命名格式 根据MyBatis写法完成数据库的操作MyBatis插件MyBatis传递参数查询${} 和 #{} 有什么区别&#xff1f;SQL注入问题 MyBatis like查询MyBatis多表…...

深度学习训练营之DCGAN网络学习

深度学习训练营之DCGAN网络学习 原文链接环境介绍DCGAN简单介绍生成器&#xff08;Generator&#xff09;判别器&#xff08;Discriminator&#xff09;对抗训练 前置工作导入第三方库导入数据数据查看 定义模型初始化权重定义生成器generator定义判别器 模型训练定义参数模型训…...

自定义MVC增删改查

目录 mymvcdemo是自定义mvc框架的使用示例 1.1 实体类 1.2 dao方法 1.3 写Service / biz 三层架构 1.4 建action 相当于selvert 1.5 con连接MySQL 8.0 版本 1.6 配置文件 XML 1.7 主界面布局 1.8 增加界面布局 1.9 写tld配置文件 2.0 注意架包 我是已经打包好的 mymv…...

RabbitMQ 教程 | 第2章 RabbitMQ 入门

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是 DevO…...

双网卡如何配置DNS?我是一个仅主机模式配置静态(static)IP、一个NET或桥接(dhcp获取)

目录 一、所有主机初始化 二、135、136服务器&#xff0c;部署DNS调度服务器 1、更改主机主从DNS服务器的主机名称 2、安装bind软件、修改主配置文件 3、修改区域配置文件 4、修改数据文件 5、启动named服务、修改网卡信息 6、解析 7、双网卡的话记得注释以下内容、注…...

Android10: 动态隐藏导航栏和状态栏总结

&#xff08;1&#xff09;全屏相关设置 //&#xff08;1&#xff09;主题添加 <item name"android:windowFullscreen">true</item>//&#xff08;2&#xff09;setContentView之前添加 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCRE…...

roop 视频换脸

roop: one click face swap. 只用一张人脸图片&#xff0c;就能完成视频换脸。 项目地址&#xff1a; https://github.com/s0md3v/roopColab 部署&#xff1a; https://github.com/dream80/roop_colab 本文是本地部署的实践记录。 环境基础 OS: Ubuntu 22.04.2 LTSKernel: 5…...

Java类集框架(一)

目录 1.Collection集合接口 2.List 接口 (常用子类 ArrayList ,LinkedList,Vector) 3.Set 集合 接口(常用子类 HashSet LinkedHashSet,TreeSet) 4.集合输出(iterator , Enumeration) 1.Collection集合接口 Collection是集合中最大父接口&#xff0c;在接口中定义了核心的…...

Jsp+Ssh+Mysql实现的简单的企业物资信息管理系统项目源码附带视频指导运行教程

由jspssh&#xff08;springstruts2mysql&#xff09;实现的企业物资信息管理系统&#xff0c;系统功能比较简单&#xff0c;实现了基本的管理员、操作员等用户管理、物品分类管理、物品管理、入库管理、出库管理、库存预警、客户管理、供应商管理等基本功能需要的可以联系我分…...

【Spring】深究SpringBoot自动装配原理

文章目录 前言1、main入口2、SpringBootApplication3、EnableAutoConfiguration4、AutoConfigurationImportSelector4.1、selectImports()4.2、getAutoConfigurationEntry()4.3、getCandidateConfigurations()4.4、loadFactoryNames() 5、META-INF/spring.factories6、总结 前言…...

阿里云负载均衡SLB网络型NLB负载均衡架构性能详解

阿里云网络型负载均衡NLB是阿里云推出的新一代四层负载均衡&#xff0c;支持超高性能和自动弹性能力&#xff0c;单实例可以达到1亿并发连接&#xff0c;帮您轻松应对高并发业务。网络型负载均衡NLB具有超强性能、自动弹性伸缩、高可用、TCPSSL卸载、多场景流量分发和丰富的高级…...

JavaScript学习 -- SM4算法应用实例

SM4算法&#xff0c;也被称为国密算法&#xff0c;是中国公布的一种高效且安全的对称加密算法。在JavaScript中&#xff0c;我们可以通过使用CryptoJS库来实现SM4算法的加密和解密。本篇博客将为您介绍如何在JavaScript中使用SM4算法&#xff0c;并提供一个实际的案例。 首先&…...