2
头图

公众号:DS数说

作者:xihuishaw

客户流失-生存分析

客户流失

不同行业、处于不同的客户生命周期,对客户流失的定义均有差异。但总的来说,客户流失指的就是在一定时期内不再使用公司产品和服务的客户。

针对客户流失的预测,有许多机器学习模型可以预测客户是否会流失。预测客户流失有几个好处:

  • 提前对有流失可能性的客户进行干预,将留客措施前置;
  • 针对可能会流失的客户,进行数据分析,找出流失客户与留存客户最大的差异特征;
  • 可根据流失情况,形成及时有效的预警机制;

我们知道了哪些客户会流失,以及客户流失的概率,还必须下发某些策略来留住处于流失边缘的客户。但,还是有些问题,通过流失预测模型知道了某些客户会流失,也知道特征重要性,但仍然抓不住挽留客户的“钩子”,数据分析师只能针对这些流失客户,以及重要影响特征进行拆解,得到一些蛛丝马迹。

生存分析

COX比例风险模型(cox proportional-hazards model)

简称COX模型,是英国统计学家D.R.COX(1972)提出的一种半参数回归模型。该模型通常是用于医学研究中,分析一个或多个前定变量对患者生存时间的影响。

这种生存建模最有趣的方面是它能够检查生存时间和预测变量之间的关系

例如,如果我们正在检查患者的存活率,那么预测变量可以是年龄、血压、性别、吸烟习惯等。这些预测变量通常被称为协变量。

<img src="https://p.pstatp.com/origin/pgc-image/229d9f5f7a2e43d5b94e8dbe5fc10b22" style="zoom: 67%;" />

模型参数解释:

  • 风险函数 Hazard function λ(t):给出在时间 t 处死亡的瞬时风险;
  • 协变量Z:特征向量;
  • 基线风险函数λo(t) :描述的是事件风险随时间的变化,它是所有协变量都等于 0 的潜在风险;

另外,与单变量分析常用的Kaplan-Meier 曲线,COX模型是多因素生存分析的方法,并且COX模型可以包含类别变量(例如性别),还可以包含数值变量(例如年龄)。

而Kaplan-Meier 曲线只能包含类别变量。并且COX回归把生存分析方法拓展到同时评估几种风险因素对生存时间的影响,有更广泛的运用(直接好家伙😎)。

模型应用

以Kaggle上的电信流失的数据集为例,利用lifelines包搭建风险模型。

  1. 读取数据
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.read_csv('Telecom_customer churn.csv')
df = df.dropna()
df.set_index('Customer_ID', inplace=True)
  1. 删除类别数大于2的特征
df_str = df.loc[ : , df.dtypes == object]

for i in df_str.columns:
   if len(np.unique(df_str[i].values)) >2:
       del df[i]
  1. 特征one-hot
df_str = df.loc[:, df.dtypes == object]
for i in df_str.columns:
   one_hot = pd.get_dummies(df[i])
   one_hot.columns = [ i +'_'+j for j in one_hot.columns]
   df = df.drop(i,axis = 1)
   df = df.join(one_hot)
   
survival_time = df['months'].values
del df['months']
churn = df['churn'].values
del df['churn']
  1. 删除相关性高的特征
corr_matrix = df.corr().abs()
upper = corr_matrix.where(np.triu(np.ones(corr_matrix.shape), k=1).astype(np.bool))
to_drop = [column for column in upper.columns if any(upper[column] > 0.98)]
df.drop(to_drop, axis=1, inplace=True)

df = df[list(df.columns[:69])]
df['months'] = survival_time
df['churn'] = churn
df = df[df['churn'] == 1]
  1. 选择变量并建立cox模型
df_sampled = df.sample(n=1000)
from lifelines import CoxPHFitter

cph = CoxPHFitter(penalizer=0.01) 
cph.fit(df_sampled, duration_col='months', event_col='churn')
df_stats = cph.summary

features_valuable = list(df_stats[df_stats['exp(coef)'].values > 1.01].index) + list(df_stats[df_stats['exp(coef)'].values < 0.98].index)
df = df[features_valuable+['churn','months']]

CPH 模型的基本假设之一是特征不存多重共线性,需在建模前处理特征之间的多重共线性:

  • 可以在拟合 Cox 模型之前解决多重共线性问题;
  • 可以在回归期间对系数的大小应用惩罚,使用惩罚可以提高估计的稳定性并控制协变量之间的高度相关性。
  1. 模型结果解读
cph.summary

cph.plot()

危险比 (HR) 等于exp(coef) ,其中 coef 是特征对应的权重 。

如果某个特征的 exp(coef) = 1,则它不起作用;如果 exp(coef) > 1,则降低风险,提高生存率

了解每个特征或决策的影响的最佳方法是,通过保持其他特征数据不变来绘制单个特征或决策的生存曲线。

这里调用 plot_partial_effects_on_outcome( )方法并传递参数——感兴趣的特征和要显示的值。

特征models=9,超过42个月有80%的生存率,而其他取值,生存率较低。

通过上面多个特征的生存曲线的绘制,可以得出哪些动作可以提高客户的存活率。

我们甚至可以绘制出每个客户的生存曲线,通过查看客户特征来分析低生存率的原因:

<img src="https://p.pstatp.com/origin/pgc-image/f480f10833b846ffb1ed7df9746599a1" style="zoom:67%;" />

还可以,通过对某个客户实行不同策略,来比较策略对生存曲线的影响:

<img src="https://p.pstatp.com/origin/pgc-image/aa41ed618be347b997efcfa58ae78ef6" style="zoom:67%;" />

这里策略1(橙色线)的实施,比策略2(绿色线)效果更好,有更高生存率。所以,可以分析每个客户并设计主动策略以确保统计上的最高生存率。

小结

Cox 比例风险模型不仅可以找到影响流失的因素,以及不同因素的影响方向,而且可通过特征的分析,使我们能够得出个性化的策略来降低客户流失率,甚至还可以进行不同策略之间的比较,得出能提高留存的最佳策略。


没有蜡笔的小晞
6 声望3 粉丝