文章目录
前言
该文章为连载的第一篇:RFM用户分类模型
某家在线教育机构拥有自己开发的教育产品VLE,该教育机构提供了他们四个学期里,开展的七门课的数据,接下来我会根据这些数据,为该教育机构做一系列的数据分析,包括用户的RFM模型、用户分群特征、用户成绩分析等等。
该教育机构部分数据库结构如下
如下这一篇文章为:用户的RFM模型
先简单介绍一下RFM模型:
RFM模型是衡量客户价值和客户创利能力的重要工具和手段。
该机械模型通过一个客户的
- 近期购买行为(R:Recency)、
- 购买的总体频率(F:Frequency)
- 花了多少钱(M:Monetary)
3项指标来描述该客户的价值状况。
该案例是在线教育产品,并且这里只提供用户一学期购买课程的消费注册使用情况,所以RFM会调正为:
- 近期产品使用行为(R:Recency)、
- 产品使用频率(F:Frequency)
- 花了多少钱(M:Monetary)
这个案例中计算用户RFM模型会用到:
- studentRegistration 学生注册信息表 (记为regi)
- studentVle 学生产品交互行为表 (记为vle)
- courses 课程表 (记为courses)
其中:
- code_presentation为学期
- code_module为课程
- 其他字面意思比较好理解
一、导入库
import pandas as pd
import numpy as np
import datetime
import time
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['Arial Unicode MS']
matplotlib.rcParams['axes.unicode_minus']=False
import matplotlib.pyplot as plt
import seaborn as sns
import sklearn
from sklearn.preprocessing import LabelEncoder
np.set_printoptions(suppress=True)
pd.set_option('display.float_format', lambda x: '%.4f' % x)
二、构造价格数据
因为这里没有关于价格的数据,我们需要对每门课构造一个价格
构造价格的依据:
- 假设AAA是最简单的课程课程难度随着AAA、BBB、CCC递增,价格会越来越贵
- 假设课程价格的基准是10*时间长度,同时价格根据难度增加,BBB为11乘时间长度,CCC为12,以此类推
- 同时物价膨胀学校每年也会调整增10%的学费
实现代码如下(示例):
presentation=sorted(courses["code_presentation"].unique().tolist())
#presentation 为['2013B', '2013J', '2014B', '2014J']
module=sorted(courses["code_module"].unique().tolist())
#module 为['AAA', 'BBB', 'CCC', 'DDD', 'EEE', 'FFF', 'GGG']
这里需要注意的是,不是每一学期都会开展这七门课
#基准价格
x=10
module_price={
}
for m in module:
module_price[m]=x+module.index(m)
#module_price 为{'AAA': 10, 'BBB': 11, 'CCC': 12, 'DDD': 13, 'EEE': 14, 'FFF': 15, 'GGG': 16}
#增加价格列,并用每门课基准价格乘时间长度
courses["price"]=courses["code_module"].map(module_price)
courses["price"]=courses["module_presentation_length"]*courses["price"]
#从第二学期开始,价格上升10%
for pre in presentation[1:]:
courses.loc[(courses["code_presentation"]==pre),"price"]*=(1.1)**(presentation.index(pre))
courses.sort_values(by=["code_presentation","code_module"]).head(10)
三、分别计算RFM信息
这里我们只选取最新的一个学期2014J计算