金融风控模型案例_电信客户流失数据
1.研究背景
1、做好用户流失预测
可以降低营销成本。老生常谈,新客户开发成本
是老客户维护成本
的5倍。2、获得更好的用户体验。并不是所有的增值服务都可以有效留住客户。3、获得更高的销售回报。价格敏感型客户和非价格敏感性客户。
2.提出问题
1、流失客户有哪些显著性特征?2、当客户在哪些特征下什么条件下比较容易发生流失?
3.数据集描述
该数据是datafountain上的《电信客户流失数据》,这里提供一个下载地址。
数据下载地址:https://www.datafountain.cn/datasets/35guide

该数据集有21个变量,7043个数据点。变量可分为以下三个部分:用户属性、用户行为、研究对象。
用户属性customerID
:用户IDgender
:性别(Female & Male)SeniorCitizen
:老年人(1表示是,0表示不是)Partner
:是否有配偶(Yes or No)Dependents
:是否经济独立(Yes or No)tenure
:客户的职位(0-72,共73个职位)用户行为PhoneService
:是否开通电话服务业务(Yes or No)MultipleLines
:是否开通了多线业务(Yes 、No or No phoneservice 三种)InternetService
:是否开通互联网服务(No, DSL数字网络,fiber optic光纤网络 三种)OnlineSecurity
:是否开通网络安全服务(Yes,No,No internetserive 三种)OnlineBackup
:是否开通在线备份业务(Yes,No,No internetserive 三种)DeviceProtection
:是否开通了设备保护业务(Yes,No,No internetserive 三种)TechSupport
:是否开通了技术支持服务(Yes,No,No internetserive 三种)StreamingTV
:是否开通网络电视(Yes,No,No internetserive 三种)StreamingMovies
:是否开通网络电影(Yes,No,No internetserive 三种)Contract
:签订合同方式 (按月,一年,两年)PaperlessBilling
:是否开通电子账单(Yes or No)PaymentMethod
:付款方式(bank transfer,credit card,electronic check,mailed check)MonthlyCharges
:月费用TotalCharges
:总费用研究对象Churn
:该用户是否流失(Yes or No)

4.分析思路
分析视角
是分析方法
的灵魂。分析方法有上百种,但分析视角
只有四种:
对比视角
分类视角
相关视角
描述视角
一旦将业务需求
拆解成指标,接下来只需要针对每个指标进行分析视角
四选一即可。数据集描述,已经将变量分为三个维度了:用户属性、用户行为、研究对象(是否流失客户),三个维度组合一下就得出了以下解题思路了:
哪些属性的用户比较容易流失?
哪些行为的用户比较容易流失?
以上两个分析思路运用的是【对比视角】,该视角下具体的分析方法有:
数值型数据:均值比较
分类型数据:频数分布比较(交叉分析)
以上的分析方法是统计分析,只能一个维度一个维度地去比较。但实际情况中,并不是每个维度的权重都一样的,那如何去研究各个维度的权重?权重问题
属于分类视角
,故我们可以采用分类模型
,要用哪个分类模型
呢?不知道。可以全部采用,看模型精度得分,然后选得分最高的模型进行进一步预测。
Random Forest 随机森林
SVC 支持向量机
LogisticRegression 逻辑回归
KNN 近邻算法
Naive Bayes 朴素贝叶斯
Decision Tree 决策树
AdaBoost
GradientBoosting
XGB
CatBoost
5.分析结论及运营建议
5.1 分析结论

综合统计分析
和XGB算法输出特征重要性
得出流失客户有以下特征(依特征重要性从大到小排列):
tenure :1-5号职位的用户比较容易流失
PaymentMethod :使用
电子支票
支付的人MonthlyCharges 、TotalCharges : 总费用在2281.92元以下,月费用在64.76元以上的客户比较容易流失
PaperlessBilling : 开通电子账单
Partner : 单身
OnlineBackup : 没开通
在线备份业务
InternetService :开通了
Fiber optic 光纤网络
TechSupport :没开通“技术支持服务”
DeviceProtection :没开通
设备保护业务
OnlineSecurity :没开通
网络安全服务
Contract :
按月
签订合同方式Dependents :无经济独立
SeniorCitizen :青年人
TotalCharges :总费用在2281.92元以下,月费用在64.76元以上的客户比较容易流失
当条件覆盖得越多,人群越精确,但与此同时,覆盖的人群也会越少。业务方可直接在数据库中,通过SQL检索符合要求的客户,然后做针对性的运营工作。
5.2 运营建议
如何留住客户,可以从两方面去思考:
增加用户的沉没成本(损失厌恶)
会员等级
积分制
充值赠送
满减券
其他增值服务
培养用户的条件反射(习惯)
会员日
定期用户召回
签到
每日定时抽奖
小游戏
电子账单解锁新权益
现象
:“开通电子账单”的人反而容易流失。基本假设
:价格敏感型客户。电子账单,让客户理性消费。建议
:让“电子账单”变成一项“福利。跟连锁便利店,联名发"商品满减券",每月的账单时间,就将"商品满减券“和账单一起推送过去。文案:您上月消费了XX元,解锁了xx会员权益。底层规律
:增加沉没成本。
“单身用户”尊享亲情网
现象
:“单身用户”容易流失。基本假设
:社交欲望低。建议
:一个单身用户拥有建立3个人以内的“亲情网”的权益。底层规律
:增加沉没成本。
推广“在线备份、设备保护、技术支持、网络保护”等增值服务。
6.数据清洗
6.1 导入模块
6.1.1 数据处理
6.1.2 可视化
6.1.3 特征工程
6.1.4 分类算法
6.1.5 分类算法--集成学习
6.1.6 模型评估
6.1.7 忽略警告
6.2 读取数据
这里安利一下spyder
编辑器,下图是这个编辑器的界面。编程过程中,有赋值
变量的操作,该编辑器都会在右上角呈现,双击一下,就可以像在Execel上查看数据,非常方便。

查看该数据集的详情。

6.3 数据清洗
6.3.1 缺失值处理
注:缺失值的数据类型是 float 类型。一旦有变量的数据类型转换成float 类型
,需再次查看缺失值。

6.3.2 重复值处理
【输出】

6.3.3 数值类型转换
【输出】

TotalCharages
总费用应该跟MonthlvCharges
是同一个数据类型(float64)。故需将TotalCharages由object转换成float64,且需要再次查看缺失值。
输出如下:

再次查看缺失值:

TotalCharges列有11个缺失值,处理缺失值的原则是尽量填充,最后才是删除。
缺失值填充的原则:
分类型数据:众数填充
数值型数据:正态分布,均值/中位数填充;偏态分布,中位数填充。
TotalCharges列是数值型数据,先画直方图查看数据分布形态。
结果如下:

从三个直方图看,该列数据是偏态分布,故选择中位数
填充。
结果如下:

6.4 查看样本分布
研究对象'Churn'列重新编码“Yes”=1,“No”=0。重新编码有下面两种方法。
方法一:replace
方法二:map函数
预览数据:
结果如下:

绘制饼图,查看流失客户占比。
结果如下:

【分析】:流失客户样本占比26.5%,留存客户样本占比73.5%,明显的“样本不均衡”。解决样本不均衡有以下方法可以选择:
分层抽样
过抽样
欠抽样
7.特征选择
提取特征
feature=df.iloc[:,1:20]
7.1 整数编码
查看变量间的两两相关性
结果如下:

相关性矩阵可视化
结果如下:

【分析】:从热力图来看,互联网服务、网络安全、在线备份、设备维护服务、技术支持服务、开通网络电视服务、开通网络电影之间相关性很强,且是正相关。电话服务和多线业务之间也存在很强的正相关关系。
7.2 独热编码
查看研究对象"Churn"与其他变量下的标签相关性。独热编码,可以将分类变量下的标签转化成列
结果如下:

绘图查看用户流失('Churn')与各个维度之间的关系
结果如下:

【分析】:从图看gender(性别)、PhoneService(电话服务)相关性几乎为0,故两个维度可以忽略。
['SeniorCitizen','Partner','Dependents',
'Contract',MultipleLines,'InternetService', 'OnlineSecurity',
'OnlineBackup', 'DeviceProtection','TechSupport', 'StreamingTV',
'StreamingMovies','PaperlessBilling','PaymentMethod'] 等都有较高的相关性,将以上维度合并成一个列表kf_var,然后进行频数比较。
结果如下:

8.统计分析
8.1 频数分布比较
8.1.1 卡方检验
组间有显著性差异,频数分布比较才有意义,否则可能会做无用功。"卡方检验",就是提高频数比较结论可信度的统计方法。
kf_var的卡方检验结果如下:
Churn by SeniorCitizen 的卡方临界值是0.00,小于0.05,表明SeniorCitizen组间有显著性差异,可进行【交叉分析】
Churn by Partner 的卡方临界值是0.00,小于0.05,表明Partner组间有显著性差异,可进行【交叉分析】
Churn by Dependents 的卡方临界值是0.00,小于0.05,表明Dependents组间有显著性差异,可进行【交叉分析】
Churn by MultipleLines 的卡方临界值是0.99,大于0.05,表明MultipleLines组间无显著性差异,不可进行交叉分析Churn by InternetService 的卡方临界值是0.00,小于0.05,表明InternetService组间有显著性差异,可进行【交叉分析】
Churn by OnlineSecurity 的卡方临界值是0.00,小于0.05,表明OnlineSecurity组间有显著性差异,可进行【交叉分析】
Churn by OnlineBackup 的卡方临界值是0.00,小于0.05,表明OnlineBackup组间有显著性差异,可进行【交叉分析】Churn by DeviceProtection 的卡方临界值是0.00,小于0.05,表明DeviceProtection组间有显著性差异,可进行【交叉分析】
Churn by TechSupport 的卡方临界值是0.00,小于0.05,表明TechSupport组间有显著性差异,可进行【交叉分析】
Churn by StreamingTV 的卡方临界值是0.00,小于0.05,表明StreamingTV组间有显著性差异,可进行【交叉分析】
Churn by StreamingMovies 的卡方临界值是0.00,小于0.05,表明StreamingMovies组间有显著性差异,可进行【交叉分析】
Churn by Contract 的卡方临界值是0.00,小于0.05,表明Contract组间有显著性差异,可进行【交叉分析】
Churn by PaperlessBilling 的卡方临界值是0.00,小于0.05,表明PaperlessBilling组间有显著性差异,可进行【交叉分析】
Churn by PaymentMethod 的卡方临界值是0.00,小于0.05,表明PaymentMethod组间有显著性差异,可进行【交叉分析】
从卡方检验的结果,kf_var包含的特征,组间都有显著性差异,可进行频数比较。
8.1.2 柱形图
频数比较--柱形图
结果如下:


因为PaymentMethod的标签比较长,影响看图,所以单独画。

可以直接从柱形图去判断对哪个维度对流失客户的影响大吗?不能,因为“样本不均衡”(流失客户样本占比26.5%,留存客户样本占比73.5%),基数不一样,故不能直接通过“频数”的柱形图去分析。解决办法:交叉分析,且作同行百分比('Churn'作为“行”)
8.1.3 交叉分析
ka_var列表中的维度与Churn交叉分析结果如下:

【SeniorCitizen 分析】:年轻用户 在流失、留存,两个标签的人数占比都高。

【Parter 分析】:单身用户更容易流失。

【Denpendents 分析】:经济不独立的用户更容易流失。

【MultipleLines 分析】:是否开通MultipleLines,对留存和流失都没有明显的促进作用。

【InternetService 分析】:办理了 “Fiber optic 光纤网络”的客户容易流失。

【OnlineSecurity 分析】:没开通“网络安全服务”的客户容易流失。

【OnlineBackup 分析】:没开通“在线备份服务”的客户容易流失。

【DeviceProtection 分析】:没开通“设备保护业务”的用户比较容易流失

【TechSupport 分析】:没开通“技术支持服务”的用户容易流失。

【StreamingTV 分析】:是否开通“网络电视”服务,对用户留存、流失,没有明显的促进作用。

【StreamingMovies 分析】:是否开通“网络电影”服务,对用户留存、流失,没有明显的促进作用。

【Contract 分析】逐月签订合同的用户最容易流失。

因为"Churn BY PaymentMethod"打印出来显示不全,故我就从临时表将“交叉表”给截图出来了:

【分析】使用“电子支票”支付的人更容易流失。
8.2 均值比较
组间有显著性差异,均值比较才有意义。显著性检验,先通过了齐性检验,再通过方差分析,最后才能做均值比较。
8.2.0 齐性检验,方差分析
对MonthlyCharges、TotalCharges维度分别进行齐性检验和方差分析
【输出】:MonthlyCharges、TotalCharges的齐性检验 和方差分析结果如下:警告:Churn BY MonthlyCharges的P值为0.00,小于0.05,表明齐性检验不通过,不可作方差分析警告:Churn BY TotalCharges的P值为0.00,小于0.05,表明齐性检验不通过,不可作方差分析
8.3 总结
用户出现以下特征比较容易流失:
SeniorCitizen:青年人
Partner :单身
Dependents :无经济独立
InternetService:开通了 “Fiber optic 光纤网络”
OnlineSecurity:没开通“网络安全服务”
OnlineBackup:没开通“在线备份业务”
DeviceProtection:没开通通了“设备保护业务
TechSupport:没开通“技术支持服务”
Contract:“按月”签订合同方式
PaperlessBilling:开通电子账单
PaymentMethod:使用“电子支票”支付的人
我们可以在SQL(数据库)上找有以上特征的客户,进行精准营销,即可以降低用户流失。虽然特征选得越多,越精确,但覆盖的人群也会越少。故,我们还需要计算“特征”的【重要性】,将最为重要的几个特征作为筛选条件。计算特征的【重要性】,是“分类视角”,接下来我们会挑选常见的分类模型,进行批量训练,然后挑出得分最高的模型,进一步计算“特征重要性”。
9.特征工程
9.1 提取特征
有前面的流失率与各个维度的相关系数柱状图可知:流失率与gender(性别)、PhoneService(电话服务)相关性几乎为0,可以筛选掉,而customerID是随机数,不影响建模,故可以筛选掉。最终得到特征 churn_var
结果如下:

9.2 处理“量纲差异大”
“MonthlyCharges"、"TotalCharges"两个特征跟其他特征相比,量纲差异大。

处理量纲差异大,有两种方法:
标准化
离散化
以上两种方法,哪个能让模型精度提高,就选哪个。根据模型的最后得分,我选了“离散化”来处理量纲差异大。
9.2.1 标准化
【输出】

9.2.2 特征离散化
特征离散化后,模型易于快速迭代,且模型更稳定。1、处理'MonthlyCharges':

离散操作 18.25=<churn_var['MonthlyCharges']<=35.5,标记 “1” 35.5<churn_var['MonthlyCharges']<=70.35,标记 “2” 70.35<churn_var['MonthlyCharges']<=89.85,标记 “3” 89.85=<churn_varf['MonthlyCharges']<=118.75,标记“4”
结果如下:

2、处理'TotalCharges':
结果如下:

离散操作:18=<churn_var['TotalCharges']<=402,标记 “1” 402<churn_var['TotalCharges']<=1397,标记 “2” 1397<churn_var['TotalCharges']<=3786,标记 “3” 3786<churn_var['TotalCharges']<=8684,标记 “4”
【输出】

9.3 分类数据转换成“整数编码”
9.3.1 查看churn_var中分类变量的label(标签)
结果如下:


通过同行百分比的“交叉分析”发现,label “No internetserive”的人数占比在以下特征[OnlineSecurity,OnlineBackup,DeviceProtection,TechSupport,StreamingTV,StreamingTV]都是惊人的一致,故我们可以判断label “No internetserive”不影响流失率。因为这6项增值服务,都是需要开通“互联网服务”的基础上才享受得到的。不开通“互联网服务”视为没开通这6项增值服务,故可以将 6个特正中的“No internetserive” 并到 “No”里面。
而特征MultipleLines的“ No phoneservice”在流失客户、留存客户样本中的人数占比几乎接近,且比较少,故可以将“ No phoneservice”并到“No”。
结果如下:

9.3.2 整数编码
整数编码的方法有两种:1、sklearn中的LabelEncoder()2、pandas中的factorize 此处选用 LabelEncoder()
结果如下:

9.4 处理“样本不均衡”
分拆变量
【输出】 抽样前的数据特征 (7043, 17) 抽样前的数据标签 (7043,)处理样本不均衡常用的方式有三种:
分层抽样
过抽样
3.欠抽样
笔者先后尝试了“分层抽样”和“欠抽样”,前者最终得到的模型中精度最高的是0.63,而后者最终得到的模型中精度最低是0.78,最高是0.84。所以说“抽样方式”的选择极为重要,大家要在这里多试错。
分层抽样
“过抽样”让模型精度更高,故我选“过抽样”。
输出数据集大小
【输出】过抽样后数据特征:(10348, 17) 训练数据特征:(7243, 17) 测试数据特征:(3105, 17) 过抽样后数据标签:(10348,) 训练数据标签:(7243,) 测试数据标签:(3105,)
10.数据建模
使用分类算法
训练模型
11.模型评估
【输出】 特征工程,采用“标准化”处理量纲差异,采用“分层抽样”处理样本不均衡。最终模型精度得分,最高分是0.63,是“朴素贝叶斯”模型

特征工程,采用“离散化”处理量纲差异,采用“过抽样”处理样本不均衡。最终模型精度得分,最高分是0.84,是“XGB”模型

12.基于“XGB”模型输出特征重要性
笔者尝试了两个算法分别输出“特征重要性”:CatBoost算法 和 XGB 算法
CatBoost算法
【输出】

-XGB 算法
【输出】

由于 XGB算法精度得分最高,故我们以XGB得到的“特征重要性”进行分析。【分析】1、第一重要特征:tenure
【输出】

【分析】 由图可知,流失客户集中在1-5号职位,运营团队需要重点关注1-5号职位。2、第二重要特征:PaymentMethod【分析】 使用“电子支票”支付的人更容易流失。3、第三重要特征:MonthlyCharges 查看流失用户、留存用户在付费方面的偏好:'MonthlyCharges'、'TotalCharges',离散化后,可进行卡方检验,然后交叉分析。
卡方检验:'MonthlyCharges'、'TotalCharges'
【输出】 kf_var的卡方检验结果如下:Churn by MonthlyCharges 的卡方临界值是0.00,小于0.05,表明MonthlyCharges组间有显著性差异,可进行【交叉分析】Churn by TotalCharges 的卡方临界值是0.00,小于0.05,表明TotalCharges组间有显著性差异,可进行【交叉分析】
交叉分析
【输出】

18.25=<churn_var['MonthlyCharges']<=35.5,标记 “1” 35.5<churn_var['MonthlyCharges']<=70.35,标记 “2” 70.35<churn_var['MonthlyCharges']<=89.85,标记 “3” 89.85=<churn_varf['MonthlyCharges']<=118.75,标记“4” 【分析】 月付费70.35--118.75元的用户更容易流失

18=<churn_var['TotalCharges']<=402,标记 “1” 402<churn_var['TotalCharges']<=1397,标记 “2” 1397<churn_var['TotalCharges']<=3786,标记 “3” 3786<churn_var['TotalCharges']<=8684,标记 “4” 【分析】 总付费18--1397元的用户更容易流失基于"MonthlyCharges"和“TotalCharges”画四分图:求两个维度的均值
流失客户四分图:
【输出】

【分析】 四分图的右下区域,流失客户比较集中,即总费用在2281.92元以下,月费用在64.76元以上的客户比较容易流失。留存客户四分图
【输出】

【结论】 综合“ 统计分析” 和 “XGB算法输出特征重要性” 得出流失客户有以下特征(依特征重要性从大到小排列):
tenure:1-5号职位的用户比较容易流失
PaymentMethod:使用“电子支票”支付的人
MonthlyCharges 、TotalCharges:总费用在2281.92元以下,月费用在64.76元以上的客户比较容易流失
PaperlessBilling:开通电子账单
Partner:单身
OnlineBackup:没开通“在线备份业务”
InternetService:开通了 “Fiber optic 光纤网络”
TechSupport:没开通“技术支持服务”
DeviceProtection:没开通通了“设备保护业务
OnlineSecurity:没开通“网络安全服务”
Contract:“按月”签订合同方式
Dependents:无经济独立
SeniorCitizen :青年人
TotalCharges:总费用在2281.92元以下,月费用在64.76元以上的客户比较容易流失
转载:https://mp.weixin.qq.com/s/z0zFdHNsRCLAF3XNkwhm2A
实际建模流程并没有这么复杂,有些统计学校验方法也不一定需要用,更多实战相关风控建模知识请参考:
