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

2020-08-22  本文已影响0人  风图莫

一. 背景:

二.目标:

-- 提升留存率

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

-- 两件事:

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

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

三.数据指标搭建

数据指标搭建.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 
# 读取数据

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.特征工程

StandardScaler

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

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

6.取出规则

# 前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.结果报告

上一篇 下一篇

猜你喜欢

热点阅读