② 计算RFM三个指标
df2 = pd.pivot_table(df1,index="买家昵称", values=["买家昵称","天数","实付金额"], aggfunc={"买家昵称":"count","天数":"min","实付金额":"sum"}) df2 = df2[["天数","买家昵称","实付金额"]] df2.columns = ["R","F","M"] df2.reset_index() display(df2.shape) display(df2.head(10))
结果如下:
2)用户分层打分
通过上述分析,我们已经得到了每一个用户的“R”、“F”、“M”值。接下来要做的,就是给每一个用户进行分层。这里我们需要建立一个评判标准,由于RFM模型本身就是需要根据不同场景和业务需求来建立的,因此这个分层标准,也是需要我们沟通业务后,得到最后的分层标准。
以R指标为例进行说明,根据上表我们知道,R表示每个用户最后一次购买时间距离今天共经历了多少天。当这个值越小,说明用户近期又回购了此产品;当这个值越大,说明用户已经好久没有再次购买产品了,这个用户很有可能流失掉了(猜测)。
基于上述分析,我们采用通用的5分制打分法,对RFM进行分类打分。
说明:由于这个数据集时间较早,因此计算出来的最近一次购买时间距离今天的天数,会特别大,但是没有关系,我们演示这个案例只是为了说明RFM模型的建模过程,实际中,肯定是过几个月进行一次RFM建模是比较好的,这里你只需要知道原理就好。
对于R指标来说:我们可以求出,R指标最小值是660天,我们以30天作为时间间隔,660-690天,打5分;690-720,打4分;720-750打3分;750-780打2分;>780,打1分。
对于F指标来说:我们可以求出,F指标最小值是1次,我们以1次作为时间间隔,0-2,打1分;2-3,打2分;3-4,打3分;4-5,打4分;>5,打5分。
对于M指标来说:我们可以求出,M指标最小值是0.005元,我们以500元作为时间间隔,0-50,打1分;50-100,打2分;100-150,打3分;150-200,打4分;>200,打5分。
至此,我们已经建立好了打分标准,下面我们开始对每个用户进行分类打分。
def func1(x): if x>=660 and x<690: return 5 elif x>=690 and x<720: return 4 elif x>=720 and x<750: return 3 elif x>=750 and x<780: return 2 elif x>=780: return 1 def func2(x): if x>=0 and x<2: return 1 elif x>=2 and x<3: return 2 elif x>=3 and x<4: return 3 elif x>=4 and x<5: return 4 elif x>=5: return 5 def func3(x): if x>=0 and x<50: return 1 elif x>=50 and x<100: return 2 elif x>=100 and x<150: return 3 elif x>=150 and x<200: return 4 elif x>=200: return 5 df2["R-SCORE"] = df2["R"].apply(func1) df2["F-SCORE"] = df2["F"].apply(func2) df2["M-SCORE"] = df2["M"].apply(func3) df2.sample(10)
结果如下:
3)用户贴标签
前面的步骤中,我们已经根据业务需求,对RFM指标进行了分类打分,得到了R-SCORE、F-SCORE、M-SCORE三个指标。接下来,我们需要给每个用户贴标签,这里有两种方式可以进行用户贴标签。
第一种:根据业务场景和业务来分配全重,对于RFM这3个指标,你更看重哪个指标,就赋予它相应较大一点的权重,比如说赋予的权重是3:1:2。
第二种:完全根据单独的RFM标签来计算,比如说:R-SCORE>avg(R-SCORE)、F-SCORE>avg(F-SCORE)、M-SCORE>avg(M-SCORE),表示一个客户近期有购买,购买频率高于所有客户平均购买频率,购买金额高于所有客户的平均购买金额,因此我们贴上一个“重要挽留客户”的标签。
下面以第二种方法进行说明。根据上述叙述,每个指标有两种情况,要么>avg(),要么<avg()。由排列组合的知识,共有8种组合情况,当指标>avg(),我们记为1;当指标<avg(),我们记为0。因此可以得到如下的二维表格。
① 第一步
avg_r = df2["R-SCORE"].mean() avg_f = df2["F-SCORE"].mean() avg_m = df2["M-SCORE"].mean() display(avg_r,avg_f,avg_m)
结果如下:
② 第二步
def func1(x): if x>avg_r: return 1 else: return 0 def func2(x): if x>avg_f: return 1 else: return 0 def func3(x): if x>avg_m: return 1 else: return 0 df2["R-SCORE是否大于均值"] = df2["R-SCORE"].apply(func1) df2["F-SCORE是否大于均值"] = df2["F-SCORE"].apply(func1) df2["M-SCORE是否大于均值"] = df2["M-SCORE"].apply(func1) display(df2.sample(10))
结果如下: