一、RFM模型简介
1.什么是RFM模型
RFM是一个比较原生的客户价值分群模型,是通过在某段时间内一个客户的最近的消费时间、总体购买频率、购买总金额这三个维度来描述该客户价值状况的客户分类模型。
2.三个维度
最近一次消费距离(Recency):这个值越小对我们来说价值越大
某段时间内消费次数 (Frequency):这个值越大越好
某段时间内消费总金额 (Monetary):这个值越大越好
3.客户价值分类标签
R | F | M | 价值分类 |
---|---|---|---|
1 | 1 | 1 | 重要价值客户 |
0 | 1 | 1 | 重要保持客户 |
1 | 0 | 1 | 重要发展客户 |
0 | 0 | 1 | 重要挽留客户 |
1 | 1 | 0 | 一般价值客户 |
0 | 1 | 0 | 一般保持客户 |
1 | 0 | 0 | 一般发展客户 |
0 | 0 | 0 | 一般挽留客户 |
4.如何进行分类
本次仅仅使用均值进行划分,大于均值为1,小于均值为0;
二、数据集情况
数据集来自于阿里天池:https://tianchi.aliyun.com/dataset/148605
注:字段有所改变
三、Python代码实现
核心代码
import numpy as np
from sqlalchemy import create_engine
import pandas as pd
conn = create_engine('mysql+pymysql://root:704256345@127.0.0.1:3306/sq?charset=utf8')
sql="select * from `user_action` where `behavior_type`=4;"
df = pd.read_sql(sql,conn)
rfm=df.pivot_table(index="user_id",values=["time","item_id","cost"],aggfunc={"time":"max","item_id":"count","cost":"sum"})
rfm["R"]=-(rfm["time"]-rfm["time"].max())/np.timedelta64(1,"D") ##取相差天数保留一位小数
rfm.rename(columns={"item_id":"F","cost":"M"},inplace=True)
def rfm_func(x):
level=x.apply(lambda x:"1" if x>=1 else "0")
label=level["R"]+level["F"]+level["M"]
d={
"111":"重要价值客户",
"011":"重要保持客户",
"001":"重要挽留客户",
"010":"一般保持客户",
"110":"一般价值客户",
"101":"重要发展客户",
"100":"一般发展客户",
"000":"一般挽留客户"
}
result=d[label]
return result
rfm["label"]=rfm[["R","F","M"]].apply(lambda x:x-x.mean()).apply(rfm_func,axis=1)
四、模型调优
1.指标
在实际的业务中需要根据维度进行调优;
example:一些较难成交的业务,可以使用活跃度替换的消费频率以及消费总金额
2.维度
原始的RFM模型仅仅从最近一次消费时间、消费频率、消费总金额这三个维度进行分析,实际业务中需要对维度进行增删。
五、策略
价值分类 | 策略 |
---|---|
重要价值客户 | SVIP客户,需要重点关注。 |
重要保持客户 | 给予优惠券或其他手段吸引到店 |
重要发展客户 | 签到活动,提高复购率 |
重要挽留客户 | 回归礼包、专属客户询问原因 |
一般价值客户 | 给予进阶的服务,推荐高价值的商品 |
一般保持客户 | 给予小额优惠券吸引到店 |
一般发展客户 | 提高复购率 |
一般挽留客户 | 放弃,召回成本低可以考虑召回 |