本文仅作为个人学习笔记,文中内容排版均存在借鉴摘抄,仅作为个人总结学习所用
RFM模型是用户运营中的重要模型,使用该模型,对用户进行分类,针对不同的客户推行不同的策略,实现精准化运营,以获取最大的转换率。
R(Recency)最近一次消费时间
F(Frequency)消费频率
M(Monetary)消费金额
该案例目的是了解同一张消费小票上商品的相关关系,类似于啤酒与尿不湿之间的案例;包含以下字段id
产品信息:货号,年份,季节,上市日期,类别…
销售明细:销售日期,货号,销售单编号…
案例中存在一张小票上有多件商品,数据重复的问题,因此需要先对数据进行去重操作
1.复制一个“产品信息”的表,重命名为“关联产品信息”;接着将销售明细中的销售单编号分别匹配到产品信息以及关联产品信息中——合并查询
2.分别展开销售明细表中的销售单编号
3.合并查询
4.展开“关联产品信息列”并将展开后的列改名为“关联产品货号”便于后面识别
5.最终进行条件列的筛选,“产品信息”表中货号相等的数据极为重复数据,筛选出非重复数据,就可以进入下一步RFM模型的构建了
(1)R值、F值、M值构建
最后一个交易日期 = maxx(filter(‘销售明细’,earlier([会员ID])=[会员ID]),[销售日期])
最后一个交易日期 =
MAXX (
FILTER (
'销售明细',
'销售明细'[会员ID]
= EARLIER ( '销售明细'[会员ID] )
),
'销售明细'[销售日期]
)
在这个公式里,FILTER函数的目的是限制MAXX函数查找 [销售日期] 最大日期的作用范围,也就是给MAXX函数规定运行的上下文。而FITLER函数内,则通过调用EARLIER函数,将销售明细表单内 [会员ID] 相同的数据筛选出来生成一个新的表单,作为FILTER函数的返回结果。
eralier函数
语法:
earlier( < column>,< number>) 第一个参数是列名,第二个参数一般可以省略
earlier函数提取本行对应的该列的值,实际上就是提取本行和参数列交叉的单元格
作用:
遍历某列的每行,获取每行的值;一般结合过滤条件使用,可以起到分组(不是真正的分组只是将相同的行放在一起即伪分组)/累计计算/错位计算,并且伪分组还可以和累计计算/错位计算结合
R值 = DATEDIFF('销售明细'[最后一个交易日期],TODAY(),DAY)
F值 = DISTINCTCOUNT('销售明细'[销售单编号])
M值 = SUM('销售明细'[销售额])
datediff():函数返回两个日期之间的天数。
【语法】 DATEDIFF(date1,date2)
注释:只有值的日期部分参与计算。
(2)新建RFM表
RFM表 =
SUMMARIZE(
'销售明细',
'销售明细',
'销售明细'[会员ID],
"R",[R值],
"F",[F值],
"M",[M值]
)
关于SUMMARIZE函数
https://blog.csdn.net/landly2018/article/details/115794479?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163878381916780255275141%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=163878381916780255275141&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allbaidu_landing_v2~default-1-115794479.first_rank_v2_pc_rank_v29&utm_term=summarize+powerbi&spm=1018.2226.3001.4187
(3)计算RFM得分
M得分 = IF('RFM表'[M]>=AVERAGE('RFM表'[M]),2,1)
F得分 = IF('RFM表'[F]>=AVERAGE('RFM表'[F]),2,1)
M得分 = IF('RFM表'[M]>=AVERAGE('RFM表'[M]),2,1)
M得分 = IF('RFM表'[M]>=AVERAGE('RFM表'[M]),2,1)
RFM值 = 'RFM表'[R得分]&'RFM表'[F得分]&'RFM表'[M得分]
(4)会员分类
会员分组 =
SWITCH (
'RFM表'[RFM值],
"111", "流失会员",
"112", "重要挽留会员",
"121", "一般保持会员",
"122", "重要保持会员",
"211", "新会员",
"212", "重要发展会员",
"221", "一般价值会员",
"222", "重要价值会员",
BLANK()
)



