要实现精细化运营,就需要对用户进行分层,筛选出各层次的用户,这样运营才能针对性的制作策略去运营。我今天就来说下用户分层经典的模型RFM模型与聚类分析模型,今天主要介绍RFM模型
一、什么是RFM模型
RFM是3个指标的缩写,最近一次消费时间间隔(Recency),消费频率(Frequency),消费金额(Monetary)。而RFM模型就是通过这三项指标,来描述客户的价值状况,从而得到分群的客户。其中R是指用户的最近一次消费时间距现在有多长时间了,这个指标反映用户流失与复购(粘性)
F是指用户在指定观察的周期内消费了几次。这个指标反映了用户的消费活跃度(忠诚度)
M是指用户在指定的观察周期内在平台花了多少钱,这个指标反映用户对公司贡献的价值(营收)
二、什么时候用
任何模型最终都是腰围业务服务的,并不任何时候、任何数据都可以套用这个模型最客户分群的。用RFM模型时需要考虑下面几个因素需要客户有一定的消费频次,像房子、耐用品、家私这类,客户不会隔三差五去消费这些东西,所以这类的消费数据要做客户价值分析的话,RFM不是一个好的选择
需要客户有消费金额,对企业产生价值
需要记录有用户ID,这样RFM分层完后才能对应上
RFM 更使用于传统企业里的运营商、银行、航空,以及互联网消费行业
三、怎么用
下面我就接着上一篇文章中京东消费者数据,用python来实现RFM模型,由于数据集中缺少购买金额这个数据,所以这个维度我就先忽略不看,重要的还是思路
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
jd_consumer=pd.read_excel('./京东消费者分析数据.xlsx',sheet_name='JD_Fnl')
jd_consumer.head()观察购买次数频率的分布
jd_consumer[jd_consumer['type']=='Order'].groupby('customer_id').size().sort_values(ascending=False)
customer_id
653834 3
813206 2
228162 2
507444 2
1496979 2
..
1087899 1
1087819 1
1087596 1
1087560 1
64 1
Length: 10652, dtype: int64
我只选择消费食品的用户用来分析,因为用户在一定时间内购买食品的频次比其他电子产品、服饰等更活跃对数据进行整合,以2018年04月15号到2018年3月1号为观察的时间区间
#对列重命名
jd_consumer.rename(columns={'action_date':'action_time'},inplace=True)
#提取时间中的小时时段
jd_consumer['action_date']=jd_consumer['action_time'].apply(lambda x:pd.datetime.strftime(x,'%Y-%m-%d'))
jd_consumer['action_month']=jd_consumer['action_time'].apply(lambda x:pd.datetime.strftime(x,'%Y-%m'))
jd_consumer_food=jd_consumer[(jd_consumer['type']=='Order') &
(jd_consumer['shop_category']=='Food') &
(jd_consumer['action_month']=='2018-03')][['customer_id',
'action_date','type']].drop_duplicates()R
idx=jd_consumer_food.groupby('customer_id').size().sort_values(ascending=False)[:1000].index
jd_rfm=jd_consumer_food[jd_consumer_food['customer_id'].isin(idx)].groupby('customer_id').agg({'action_date':'max','type':'count'})
jd_rfm['R']=(pd.to_datetime('2018-04-15')-pd.to_datetime(jd_rfm['action_date'])).dt.days
jd_rfm.rename(columns={'type':'F'},inplace=True)
jd_rfm=jd_rfm.drop('action_date',axis=1)这里需要注意,R、F阈值的划分需要与实际的业务相结合,制定出贴合业务的阈值,这样划分出来的结果才是最优的。考虑数据本身不是很全,我这里直接用均值作为阈
rmd = jd_rfm['R'].mean()
fmd = jd_rfm['F'].mean()
rmd,fmd
(29.321, 1.004)
def customer_type(frame):
customer_type = []
for i in range(len(frame)):
if frame.iloc[i,1]<=rmd and frame.iloc[i,0]>=fmd :
customer_type.append('重要价值用户')
elif frame.iloc[i,1]>rmd and frame.iloc[i,0]>=fmd :
customer_type.append('重要唤回用户')
elif frame.iloc[i,1]<=rmd and frame.iloc[i,0]
customer_type.append('重要深耕用户')
elif frame.iloc[i,1]>rmd and frame.iloc[i,0]
customer_type.append('即将流失用户')
frame['classification'] = customer_type
customer_type(jd_rfm)
print('不同类型的客户总数:')
print('--------------------')
jd_rfm.groupby(by='classification').size().reset_index(name='客户数')
四、用户分类完整表
由于此数据缺失金额,所以没能进行一个完整的RFM分析,不过具体的思路上面已经阐释清楚了,以下附上一个完整的RFM用户分类表作为实战参考
五、后续
RFM可以根据用户的这三类数据进行分层,但实际中很多其它维度的数据,所以为了更好的实现精细化运营,需要更多的维度参与进来。下一篇我会介绍怎么实现给用户打标签,为用户画像
以下链接可到上一篇文章Wvvi:电商消费者数据分析zhuanlan.zhihu.com