在线教育付费用户流失预警

一. 背景:

  • 2018年度,新生52.6万人,盈利19.74亿; 在线教育产品的增长,不是看流量,而是看 留存
  • 在线教育产品有一些特点:
    -- 就是超低频和使用周期长,学生学习的频次往往以周来计,学习的时间少则两三个月,多则半年一年甚至更长,再这样长的使用周期内,用户中途退出是在所难免的

    * 全生命周期
    image.png

二.目标:

-- 提升留存率

-- 留存率=「复购用户数+召回用户数」/(复购前用户数+退费用户数)

-- 两件事:

-- 减少退费,
-- 积极续班和拓科

-- 提升付费用户留存,根据据学员学习过程中的表现以及数据反馈,提前预判学员的退费可能性在使用周期内能降低流失比例即退费率,可以为业务部门提供规则, 然 后做有针对性的运营工作, 可以显著提升留存率

三.数据指标搭建

数据指标搭建.png

四. 构建付费用户流失预警模型:

1. 业务理解:

①到底流失客户的哪些特性最显著?
②该问题为二分类问题, 有监督学习模型可选择;
--(LR; RF,xgboost等)
-- 不能用knn, svm ,基于实例的算法
③流失用户一定少量的;反应到数据上;负样本一定会少
需要进行过采样

2.数据获取及预处理

  • 导入库
# # 导入库

import pandas as pd
from sklearn.model_selection import train_test_split

import xgboost as xgb                             #confusion_matrix,混淆矩阵
from sklearn.metrics import  accuracy_score, auc, confusion_matrix, f1_score, \
    precision_score, recall_score, roc_curve  # 导入指标库   # 

from imblearn.over_sampling import SMOTE# 过抽样处理库SMOTE

import matplotlib.pyplot 
  • 1.数据预处理

# 读取数据

data = pd.read_csv('classification.csv', delimiter=',')   # 读取文件

X, y = data.iloc[:, :-1], data.iloc[:, -1] # X,为特征,  y为目标(是否流失)

n_samples, n_features = X.shape  # 总样本量,总特征数

print('样本: {0}| feature: {1} | Na_count: {2}'.format(n_samples, n_features, data.isnull().any().count()))
  • ①数据类型转换

字符串类型的特征需要处理成数值型才能建模,

  • ②.异常值,极值处理

1.指标性特征值域会有业务部门在需求清单里注明
2.极值一般特征分别使用1%和99%分位数替换超过上下限的值.
③ 缺失值处理
缺失比例大于30%就删除
其他分别以均值和中位值填充

  • ④ 过采样: 保持样本均衡

# 样本均衡处理,过采样

model_smote = SMOTE()  # 建立SMOTE模型对象
X, y = model_smote.fit_sample(X,y)  # 输入数据并作过抽样处理

3.特征工程

  • 3.1相关性分析
    • 热力图
      image
  • 3.2特征筛选
    • 1.移除低方差的特征
      from sklearn.feature_selection import VarianceThreshold
      VarianceThreshold(threshold=(.8 * (1 - .8))),
      threshold=方差阈值 ,低于多少删除
      传入的参数 方差阈值 每一列都会计算一个方差 如果方差低于这个阈值,这一列就会被删掉
    • 2.验证特征和目标之间是否有关联
      卡方检验: 对于分类问题 (y离散)
      卡方检验的目的:确定样本对象落入各类别的比例是否与随机期望比例相等.
  • 3.3数据标准化
StandardScaler

4.多模型拟合;确定评价函数

  • 1.拆分数据集

    • 将数据分为训练集和测试集

    • X_train, X_test, y_train, y_test = train_test_split(X, y,test_size=0.3, random_state=0)

  • 2. 评价指标

    • 精确率

    • 召回率

    • F1-Score

    • AUC 指标

  • 3.多模型拟合

    • LR二分类

      image

      • 随机森林

        image

      • xgboost

        image.png

5.根据评价函数;调整模型;对模型调参

  • 基于准确率和精准率; 选用xgboost;

  • RF模型降低的是方差, Xgboost降低的是模型偏差

  • 使用 GridSearchCV网格交叉验证,寻求最优参数

  • 画特征重要性条状图及树状图

    • xgb.plot_importance(model_xgb, height=0.5, importance_type='gain', max_num_features=10,xlabel='Gain Split',grid=False)

      image

    • xgb.to_graphviz(model_xgb, num_trees=9, yes_color='#638e5e', no_color='#a40000')

      image

    • 树状图中,流失标记的是1,未流失标记的是0。对应到图中就是左侧线;否则为False。那么,我们就是沿着左侧线条一直寻找即可

6.取出规则

  • 01.树状图中,流失标记的是1,未流失标记的是0。对应到图中就是左侧线;否则为False。那么,我们就是沿着左侧线条一直寻找即可取出前五个规则
     *  1.一周内未完成课时>3
    
     *   2.一周内未登录>=2: 
    
     *   3. 未完成作业和未完成月考>=3: 
    
     *   4. 连续未进行评价>=15: 
    
     *   5. 联系无响应>=3: 
    
         *   明显提出退费意向
    
  • 02.制定规则;遍历数据得到百分比
  • 前5条规则对应的用户数据

# 前5条规则对应的用户数据
rule_depth_1 = X_test['NO_completed_week']>=3   # 满足的为true,不满足的为Flase
rule_depth_2 = X_test['NO_login_week']>2
rule_depth_3 = X_test['NO_test_month']>=3
rule_depth_4 = X_test['NO_evaluate_day']>=15
rule_depth_5 = X_test['contact']>3
rule_list = [rule_depth_1,rule_depth_2,rule_depth_3,rule_depth_4,rule_depth_5]


rule_pd = [pd.DataFrame(i) for i in rule_list]# 获取一个特征列表

#合并
rule_pd_merge = pd.concat(rule_pd, axis=1)
rule_pd_merge
  • 计算 满足条件的占比

dyn_rules 第一次取前1个特征集,  比较他们每行的值是否都是True, 
dyn_rules 第二次取前2个特征集,  比较他们每行的值是否都是True,
dyn_rules 第三次取前3个特征集,  比较他们每行的值是否都是True,
dyn_rules 第四次取前4个特征集,  比较他们每行的值是否都是True,
dyn_rules 第五次取前5个特征集,  比较他们每行的值是否都是True,
for i in range(5):
    dyn_rules = rule_pd_merge.iloc[:,:i+1] # 取出top规则
    dyn_rules['is_true']=[all(i)==True for i in dyn_rules.values]# 得到都为true的record
    
    # 2. 取出y_test中的数据集(同时满足True, 流失)
    y_test_selected = y_test[dyn_rules['is_true']]
    # 3.取出概率 中 对应同时满足True  的数据集
    y_pre_selected = y_score[dyn_rules['is_true']]
#     4. 看 ==1,预计流失的概率中  >0.5的为true, 反之为Flase
    y_pre_cal = y_pre_selected[:,1] >=0.5
    #5.计算 总得 的个数
    total_samples = len(y_pre_cal)
    #6. 计算 为True的个数
    is_churn = y_pre_cal.sum()
    #7.计算  预计>0.5的 除以  真实为true  的占比
    churn_rate = float(is_churn)/total_samples
     # 计算样本比例
    print('出现前{}种情况, 预计流失情况'.format(i+1))
    print('total samples: {}'.format(total_samples))
    print('churn samples: {} | rate: {:.0%} '.format(is_churn,churn_rate))
    print('unchurn samples: {} | rate: {:.0%} '.format((total_samples-is_churn),(1-churn_rate)))
    print('-'*40)

出现前1种情况, 预计流失情况
total samples: 8362
churn samples: 2341 | rate: 28%
unchurn samples: 6021| rate:72%


出现前2种情况, 预计流失情况
total samples: 8362
churn samples: 3521| rate: 42%
unchurn samples: 4850| rate: 58%


出现前3种情况, 预计流失情况
total samples: 8362
...............................


出现前4种情况, 预计流失情况
total samples: 8362
..........................


出现前5种情况, 预计流失情况
total samples: 8362
churn samples: 7442| rate: 89%
unchurn samples: 920| rate: 11%

7.结果报告

  • 结论:

    * 1.一周内未完成课时三次以上: (True: 28%,  false: 72%)
      2.一周内未登录2次及以上: (True: 42%, false: 58%)
      3. 3次及以上未完成作业和未完成月考: (True: 71%, false: 29%)
      4. 连续15天未进行评价: (True: 82%, false: 18%)
      5. 三次以上联系无响应: (True: 89%, false: 11%)
              明显提出退费意向
    
  • 运营建议

    • (1)建议逐步增强挽回运营

      • 从第一步规则达到
        *通过APP设备温馨提示
      • 第二步规则
        • 1.做针对性服务, 单独发一些鼓励的话,提供单独反馈渠道
        • 2.根据性格等,匹配学伴,相互监督
      • 第三步规则
        • 一对一诊断; 一个小时以上;完成详尽的诊断报告;提供解决渠道
      • 第四/5步规则
        • 1.直接走入谈判渠道;讲明利害,拉长退费流程时间
    • (2)超预期服务 情感粘性

      • 提高服务
        • 1.老师指定KPI:
      • 周评率/月评率/单门课程评价
        • 2.产品:层次
    • (3)召回:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容