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

一. 背景:

  • 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)召回:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容