一. 背景:
- 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离散)
卡方检验的目的:确定样本对象落入各类别的比例是否与随机期望比例相等.
- 1.移除低方差的特征
-
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网格交叉验证,寻求最优参数
-
画特征重要性条状图及树状图
-
imagexgb.plot_importance(model_xgb, height=0.5, importance_type='gain', max_num_features=10,xlabel='Gain Split',grid=False)
-
imagexgb.to_graphviz(model_xgb, num_trees=9, yes_color='#638e5e', no_color='#a40000')
-
树状图中,流失标记的是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)召回:
-
网友评论