金融评分卡项目—2.银行客户流失预警模型介绍(单因子与多因子分析)

引言

  下面使用的是jupyter notebook,完整代码解析见Github:https://github.com/Libra-1023/data-mining/blob/master/Bank_customer_churn/Bank_customer_churn_EDA.ipynb

一、银行业客户群体与产品的类别

  银行的客户总体上可分为个人客户与公司客户。
  银行对个人客户的业务主要是以合理安排客户的个人财务为手段,为之提供存取款、小额贷款、代理投资理财、信息咨询以及其他各类中介服务,由此为客户取得收益,并帮助其防范风险,同时提高银行自身效益。
  公司客户指与银行发生业务关系的各企事业单位及政府机关,其中以企业单位为主体。公司客户能为银行带来大量的存款,贷款和收费业务,并成为银行利润的重要来源。
  零售客户一般分为以下5种:
在这里插入图片描述
  银行的业务一般分为资产类业务与负债类业务。
银行信贷类资产业务:

  1. 信用贷款
  2. 抵押贷款—分为存货抵押贷款与不动产抵押贷款
  3. 保证书担保贷款
  4. 贷款证券化

银行负债类业务:

  1. 活期存款
  2. 定期存款
  3. 储蓄存款
  4. 可转让定期存单
  5. 其他种类

二、客户流失预警模型的业务意义

  严格来讲,客户流失指的是客户在该行所有业务终止并销号。但是具体业务部门可单独定义在该部门的全部业务或某些业务上,客户的终止行为。
  研究结果表明:商业银行客户流失比较严重,国内商业银行,客户流失率可达到20%甚至更高。而获得新客户的成本,可达维护现有客户的5倍。因此,从海量的客户交易记录中挖掘出对流失有影响的信息,建立高效的客户流失预警体系尤为重要。
客户流失的主要原因包括:

  1. 价格流失
  2. 产品流失
  3. 服务流失
  4. 市场流失
  5. 促销流失
  6. 技术流失
  7. 政治流失

维护客户关系的基本方法:

  1. 追踪制度
  2. 产品跟进
  3. 扩大销售
  4. 维护访问
  5. 机制维护

建立量化模型,合理预测客群的潜在流失风险

  • 常用的风险因子
  • 客户持有的产品数量、种类
  • 客户的年龄、性别
  • 受地理区域的影响
  • 受产品类别的影响
  • 交易的间隔时间
  • 营销、促销手段
  • 银行的服务方式和态度

三、数据介绍与描述

  该数据集共17241例客户数据,其中有1741例流失样本,总流失率达到10.10%
  数据分为两部分:银行自有字段、外部第三方数据
银行自有字段:

  • 账户类信息
  • 个人类信息
  • 存款类信息
  • 消费、交易类信息
  • 理财、基金类信息
  • 柜台服务、网银类信息

外部第三方数据:

  • 外呼客户数据
  • 资产类数据
  • 其他消费类数据

1.单因子分析之连续变量

  • 有效记录的占比—缺失率

    # 提取出不含空值的包含自变量和因变量的数据集, np.nan != np.nan
        validDf = df.loc[df[col] == df[col]][[col,target]]
        # 非缺失度的百分比
        validRcd = validDf.shape[0]*1.0/df.shape[0]
        # 格式化非缺失度
        validRcdFmt = "%.2f%%"%(validRcd*100)
    
  • 整体分布
    初始分布与截断分布

    # 截断
    if truncation == True:
        # 截断分布
        pcnt95 = np.percentile(validDf[col],95)
        # 将流失客户与非流失客户的存款额大于截断值的赋值于截断值
        x = x.map(lambda x: min(x,pcnt95))
        y = y.map(lambda x: min(x,pcnt95))
    
  • 按目标变量分布的差异

方差分析:维基百科—方差分析
在这里插入图片描述

2.单因子分析之类别变量

  • 有效记录的占比

    validDf = df.loc[df[col] == df[col]][[col, target]]
    validRcd = validDf.shape[0]*1.0/df.shape[0]
    recdNum = validDf.shape[0]
    validRcdFmt = "%.2f%%"%(validRcd*100)
    
  • 种类

  • 整体分布

    # 对类别型变量进行单因子分析
    filepath = path+r'/单因子分析/类别型变量/'
    for val in stringCols:
        CharVarPerf(Alldata,val,'CHURN_CUST_IND',filepath)
    
  • 按目标变量分布的差异

卡方检验:维基百科—卡方检验
在这里插入图片描述

chisqDf = Alldata[['GENDER_CD','CHURN_CUST_IND']]
grouped = chisqDf['CHURN_CUST_IND'].groupby(chisqDf['GENDER_CD'])   # 分组
count = list(grouped.count())
churn = list(grouped.sum())
chisqTable = pd.DataFrame({
    
    'total':count,'churn':churn})
# 0.101为期望流失率,相乘即为期望流失人数
chisqTable['expected'] = chisqTable['total'].map(lambda x: round(x*0.101))
chisqValList = chisqTable[['churn','expected']].apply(lambda x: (x[0]-x[1])**2/x[1], axis=1)
# chisqVal即为卡方
chisqVal = sum(chisqValList)

3.多因子分析

   变量之间由于业务关系、计算逻辑等业务存在一定的两两共线性,需要研究这种共线性并做适当的处理

  • 信息的冗余
  • 维护数据的成本
  • 对某些模型存在一定的影响
# 使用短名称代替原始名称,因为原始名称太长而无法显示
col_to_index = {
    
    numericCols[i] : 'var'+str(i) for i in range(len(numericCols))}
# 在columns列表中取样,因为单个图无法显示太多的列
corrCols = random.sample(numericCols,15)
sampleDf = Alldata[corrCols]
for col in corrCols:
    sampleDf.rename(columns = {
    
    col : col_to_index[col]},inplace = True)
# 画散点矩阵图
# diagonal = 'hist' or 'kde',当diagonal = 'hist'时,为对角线直方图,当diagonal='kde'时,为核密度估计函数
# alpha=0.2为透明度
scatter_matrix(sampleDf, alpha=0.2, figsize=(6, 6), diagonal='kde')

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_46649052/article/details/114310105