一、背景介绍
某通信公司是通信界的巨头,其用户流失率若降低5%,那么公司利润将提升25%-85%。如今随着市场饱和度上升,高居不下的获客成本让公司遭遇了“天花板”,甚至陷入获客难的窘境。增加用户黏性和延长用户生命周期成了该通信亟待解决的问题。
数据来源:https://www.kaggle.com/blastchar/telco-customer-churn
二、分析目的
1、分析流失用户特征,生成易流失用户标签;
2、预测用户留存率随时间的变化,并提出合理化召回建议。
三、分析思路
分析工具:Tableau、Mysql、python、excel
四、可视化分析用户流失
1、用户属性特征
用户的基本特征有:性别(Gender)、年龄(Senior,1:年长,2:年轻)、有无伴侣(Partner)、有无家属(Dependents),各特征用户的流失率如下图所示:
从图中看出,年长用户、有伴侣和有家属的用户流失率明显较高,用户性别对流失率的影响不大。
2、用户服务属性
用户服务属性有:电话服务(PhoneService)、多条线路(MultipleLines)、网络服务(InternetService)、网络安全服务(OnlineSecurity),各特征用户的流失率如下图所示:
从图中可以看出,网络服务为Fiber optic、没有网络安全服务的客户流失率最高,其次是网络服务为DSL、有网络安全服务的客户,没有网络服务和网络安全服务的用户流失率最低。
3、用户交易属性
用户交易属性有:合同期限(Contract)、付款方式(PaymentMethod)、每月付费金额(MonthlyCharges)、总付费金额(TotalCharges),各特征用户的流失率如下图所示:
从上图看出,合同期限为Month-to-month、付款方式为Electronic check、每月消费金额为70至100元、总消费300元以内的客户流失率最高。
4、小结
以下特征的用户最易流失:
1)年长用户、有伴侣、有家属;
2)网络服务为Fiber optic、没有网络安全服务;
3)同期限为Month-to-month、付款方式为Electronic check、每月消费金额为70至100元、总消费300元以内。
五、生成易流失等级标签
1、量化流失风险系数
各属性对用户流失的影响越大,则流失风险系数越高,具体划分如下:
用Mysql取出未流失客户,并计算风险系数:
SELECT customerID, IF(SeniorCitizen=1,2,0) as senior, IF(Partner='Yes',2,0) as partner, IF(Dependents='Yes',2,0) as dependents,
CASE
WHEN InternetService='Fiber optic' THEN
2
WHEN InternetService='DSL' THEN
1
ELSE
0
END as internetservice,
CASE
WHEN OnlineSecurity='No' THEN
2
WHEN OnlineSecurity='Yes' THEN
1
ELSE
0
END as onlinesecurity,
CASE
WHEN Contract='Month-to-month' THEN
2
WHEN Contract='One year' THEN
1
ELSE
0
END as contract,
CASE
WHEN PaymentMethod='Electronic check' THEN
2
ELSE
0
END as paymentMethod,
IF(MonthlyCharges>=70 and MonthlyCharges <=100,1,0) as monthlycharges,
IF(TotalCharges<300,1,0) as totalcharges
from ha.wa_fn;
查询结果如下:
2、汇总风险系数,求出最终用户流失风险等级
将查询结果导入Excel中,求出最终的流失分析等级(churn_level):
流失风险等级分布如下:
接下来,运营部同事就可以根据流失风险等级,分层运营客户。
3、添加高流失风险标签
比如,风险等级大于9的定义为高流失风险客户:
六、基于生存分析预测用户流失
1、导入模块
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
# 生存分析模块
from lifelines import NelsonAalenFitter, CoxPHFitter, KaplanMeierFitter
from lifelines.statistics import logrank_test
# cox
from lifelines import CoxPHFitter
from sklearn.metrics import brier_score_loss
from sklearn.calibration import calibration_curve
# matplotlib与pandas初始设置
plt.rcParams['font.sans-serif'] = ['SimHei'] #设置中文字体为黑体
plt.rcParams['axes.unicode_minus'] = False #正常显示负号
pd.set_option('display.max_columns', 30)
plt.rcParams.update({
"font.family":"SimHei","font.size":14})
plt.style.use("tableau-colorblind10")
pd