网站试听用户活跃度
RFE模型
- 基于用户的普通行为(非转化或交易行为)产生,思路与RFM类似
- 最近一次访问时间R(Recency)用户最近一次访问网站的时间
- 试听频率F(Frequency) 用户在特定时间周期内访问的频率
- 试听次数E(Engagements)
背景
与运营和销售同事一起讨论,对试听课的用户进行试听活跃度分析,了解用户的 活跃行为,建立模型,利用模型输出 结果,为营销活动提供决策依据。评估用户的价值层级,提升试听用户活跃度
选用 ** 最近一个月 ** 的试听用户记录,将最近一次登录时间、试听频率、试听时长,作为客户价值的衡量标准;连接数据库,提取试听用户信息,根据 RFE模型需求,进行数据清洗,整理出客户的特征信息 汇总所有数据,数据预 处理,处理缺失值,异常值;
实现过程
-
提取特征
- 用户id
- 访问日期
- 访问时长
- 用户积分商城得分
-
1.R / F /E 计算
# 1.最近一次访问时间(间隔)
# 1.时间间隔
data_merge['date_interval'] = data_merge['max_year_date']-data_merge['访问日期']
# 2.将时间间隔 转为数字
data_merge['date_interval'] = data_merge['date_interval'].apply(lambda x:x.days)
# 2./ F /E
rfe_gb = data_merge.groupby(['year','用户ID'],as_index=False).agg(
{'date_interval': 'min', # 计算最近一次订单时间 R
'访问日期': 'count', # 计算访问频率
'访问时长': 'sum'}) # 计算问总时长
# 重命名列名
rfe_gb.columns = ['用户ID','r','f','e']
-
2.计算R / F /E 分箱得分
-
说明: r和E 计划选择25%和75%作为区间划分的2个边界值,
-
F选值: 与业务部门沟通,划分时可以使用2和5来作为边界
-
业务部门认为访问次数>=2次可被定义为二次访问用户
-
r_bins = [-1,2, 15, 32]
f_bins = [0, 2, 5, 130]
e_bins = [1, 169, 12199, 206252]
# RFE 得分计算
rfe_gb["R_socre"] = pd.cut(rfe_gb['r'], r_bins, labels = [3,2,1])
rfe_gb["F_score"] = pd.cut(rfe_gb['f'], f_bins, labels = [1,2,3])
rfe_gb["E_socre"] = pd.cut(rfe_gb['e'], e_bins, labels = [1,2,3])
-
3.计算RFE权重
- 将rfE三列作为特征,将积分等级作为目标输入模型中做训练,,
- 通过模型的feature_importances_获得权重信息
# 将 积分商城得分拼接进来
rfe_merge = pd.merge(rfe_gb, data[-1], on = '用户ID', how = "inner")
rfe_merge.head()
# 将 积分商城得分 化为5箱
# 使用随机森林, 泛化性能好,
RFC_model = RandomForestClassifier()
RFC_model.fit(rfe_merge[['r','f','e']], rfe_merge[["积分等级"]])
weights = RFC_model.feature_importances_
print('特征重要性: {}'.format(RFC_model.feature_importances_))
#特征重要性: [0.40729642 0.00584036 0.58686323]
-
4.计算RFE总得分
-
方法一:加权得分
rfe_gb['rfe_score'] = rfe_gb['R_socre'] * weights[0] + rfe_gb['F_score'] * weights[1] + rfe_gb['E_socre'] * weights[2]
-
方法二:RFE组合
#转换数据类型 --str容易拼接
rfe_gb[['R_socre', 'F_score','E_socre']] = rfe_gb[['R_socre','F_score','E_socre']].astype(np.str)
-
5.结果展示
-
5.1 写入数据库
# 数据库信息
config = {'host': 'x.x.x.x, #
'user': '用户名', #
'password': '密码', # 密码
'port': 3306, # 端口,默认为3306
'database': 'test', # 数据库名称
'charset': 'utf8' # 字符编码
}
# 建表操作
con = pymysql.connect(**config) # 建立mysql连接
cursor = con.cursor() # 获得游标
cursor.execute("show tables") # 查询表
table_list = [t[0] for t in cursor.fetchall()] # 读出所有库
# 查找数据库是否存在目标表,如果没有则新建
table_name = 'sales_rfe_score' # 要写库的表名
if not table_name in table_list: # 如果目标表没有创建
cursor.execute('''
CREATE TABLE %s (
userid VARCHAR(20),
r_score int(2),
f_score int(2),
e_score int(2),
rfe_score DECIMAL(10,2),
rfe_group VARCHAR(10),
insert_date VARCHAR(20)
)ENGINE=InnoDB DEFAULT CHARSET=utf8
''' % table_name) # 创建新表
write_db_data = rfe_gb[['用户ID','r_score','f_score','e_score','rfe_score','rfe_group']] # 主要数据
timestamp = time.strftime('%Y-%m-%d', time.localtime(time.time())) # 日期
# 写库
for each_value in write_db_data.values:
insert_sql = "INSERT INTO `%s` VALUES ('%s',%s,%s,%s,%s,'%s','%s')" % \
(table_name, each_value[0], each_value[1], each_value[2], \
each_value[3],each_value[4],each_value[5],
timestamp) # 写库SQL依据
cursor.execute(insert_sql) # 执行SQL语句,execute函数里面要用双引号
con.commit() # 提交命令
cursor.close() # 关闭游标
con.close() # 关闭数据库连接
-
6.运营分析
-
1.基于RFE的汇总得分评估所有用户的活跃度价值,并可以做活跃度排名,该得分还可以作为输入维度与其他维度一起作为其他数据分析和挖掘模型的输入变量,为分析建模提供基础
-
2.此处主要展示基于 拼接得分的分布
-
RFE用户特征分析
-
第1类人:频次表现较差; 占比超过10%的群体。由于这类人群基数大,采取批量操作和运营的方式落地运营策略
- 212:一般性群体
- 211:低价值群体
- 312:一般性群体。
- 112:一般性群体
- 213:高价值群体
-
运营建议:
- 该阶段的主题主要集中在课程介绍、通过广撒网的方式,吸引加入免费社群,形成体量; 提供一定量的免费课,用辅助资料、干货分享、名师直播的形式吸引种子用户进入社群;促使其增加访问频次
-
第2类人群:占比为1%~10%的群体。这部分人群数量适中
- 111:低价值群体,这是一类在各个维度上都比较差的客户群体
- 会在其他各个群体策略和管理都落地后才考虑他们
- 313:高价值群体
- 有兴趣的新用户
- 113:高价值群体
- 访问时间,频次, 表现较差
-
运营建议:
- 该阶段的定期讨论案例、分享干货文案、进行机构直播分享
- 111:低价值群体,这是一类在各个维度上都比较差的客户群体
-
第3类群体:占比非常少,但却是非常重要的群体
- 这部分客户对于我们而言是非常重要的,因此我们需要对其实施个性化的营销,促使其完成付费转化:
- 例如:
- 333:高价值群体
- 233、223和133:高价值群体
- 322、323和332:普通群体
-
其他:
- 1.该得分还可以作为输入维度与其他维度一起构建模型
给是否转化(付费)打上标签,再计算各层次占比,将转化运营的资源针对性, - 2.完善了积分商城; 给与不同活跃度用户不同的积分策略;
- 1.该得分还可以作为输入维度与其他维度一起构建模型
-
第1类人:频次表现较差; 占比超过10%的群体。由于这类人群基数大,采取批量操作和运营的方式落地运营策略
网友评论