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

2023年 8月 7日 91.4k 0

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

客户流失是指客户或顾客的流失。公司通常将其作为关键业务指标之一,因为恢复的长期客户对公司的价值远远高于新招募的客户。

客户流失有两种类型:自愿流失和非自愿流失。自愿流失是由于客户决定转向其他公司或服务提供商,而非自愿流失则是由于客户搬迁到长期护理机构、死亡或搬迁到较远的地方等情况造成的。

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

【来源】:

https://en.wikipedia.org/wiki/Customer_attrition

数据集解释

【网址】:

https://www.kaggle.com/datasets/radheshyamkollipara/bank-customer-churn

图片图片

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

  • RowNumber:对应记录(行)编号
  • CustomerId:客户的ID编号
  • Surname:客户的姓氏
  • CreditScore:客户信用行为预测值
  • Geography:客户所在地
  • Gender:客户的性别信息
  • Age:客户的年龄信息
  • Tenure:客户在银行的使用年限
  • Balance:客户账户中的余额信息
  • NumOfProducts:客户购买的产品数量
  • HasCrCard:客户是否拥有信用卡
  • IsActiveMember:客户是否处于活跃状态
  • EstimatedSalary(估计工资):客户的估计工资金额
  • Exited:客户是否离开银行
  • Complain:客户是否有投诉
  • Satisfaction Score:客户对银行的满意度评分
  • Card Type:客户持有的银行卡类型
  • Points Earned:客户使用信用卡获得的积分
  • # 显示表中的列 = customer_churn_records
    
    q='''
      
      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 STATUS
        from customer_churn_records
        )
      
      SELECT STATUS,
      COUNT(exited) as Total
      FROM temp_churn
      GROUP 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 isactivemember
        from 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_Churn
      FROM temp_isactivemember
      GROUP 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_churn
      FROM customer_churn_records
      GROUP 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_Churn
      FROM customer_churn_records
      GROUP BY 1
    
    '''
    
    df = pd.read_sql(q,engine_postgresql)
    df

    图片图片

    #根据年龄组计算流失客户的数量

    q='''

    SELECT
    CASE
    WHEN age = 21 AND age = 41 AND age

    相关文章

    Oracle如何使用授予和撤销权限的语法和示例
    Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
    下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
    社区版oceanbase安装
    Oracle 导出CSV工具-sqluldr2
    ETL数据集成丨快速将MySQL数据迁移至Doris数据库

    发布评论