RFM模型:根据客户消费行为的三个关键指标(R-最近一次的购物时间,F-一段时间内客户的购物次数,M-客户消费总金额)来将客户分层并针对不同层级的客户进行不同的营销策略;
此次将客户分成8类(按R、F、M三个值的平均值作为阈值来进行划分),整理成函数如下:
#函数:该函数将客户按RFM方法分成八类,且显示对应的营销策略(分类的阈值和等级以及对于的营销策略可以按需进行更改)
def rfm_strategy(r,f,m,recently,frenquency,money):
if r>=recently:
if f >= frenquency:
if m>=money:
rfm="重要价值客户"
strategy="提高满意度,增加留存"
else:
rfm="一般价值客户"
strategy="引导其消费"
else:
if m >= money:
rfm="重要保持客户"
strategy="通过活动提高购买频率"
else:
rfm="一般保持客户"
strategy="利用优惠吸引客户消费"
else:
if f >= frenquency:
if m>=money:
rfm="重要发展客户"
strategy="触达客户,防止客户流失"
else:
rfm="一般发展客户"
strategy="较少关注"
else:
if m >= money:
rfm="重要挽留客户"
strategy="了解用户需求想办法挽留"
else:
rfm="一般挽留客户"
strategy="较少关注"
return rfm,strategy
接下来,将数据导入,计算出对应的数值,这里导入的数据是一张完整订单明细,一个客户会有多次消费记录,在这里我们需要对数据进行汇总和聚合操作,这里使用pivot_table方法来进行数据整理,这里需要留意,数据在进行此操作之前需要检查是否有脏数据(重复记录、重要值缺失、异常值),如有需先进行数据清洗
#导入数据,将订单日期转换成与目前日期相差的月份;
# 这里使用了pd.to_datetime方法将日期格式转化成标准日期格式;
# 最后使用relativedelta计算两个日期之间的月份差值;
data=pd.read_csv(r"D:\示例 - 超市.csv")
data['当前日期']=pd.Timestamp(date.today())
data['订单日期']=pd.to_datetime(data['订单日期'])
data['订单日期']=[relativedelta(dt1=data['当前日期'][i],dt2=data['订单日期'][i]).months for i in range(0,len(data['订单日期']))]
#使用透视表功能,统计每个客户的最近一次购买日与目前日期相差的月份、一段时间内的购买金额、一段时间内的购买频次;
#并计算出R、F、M的均值
result=pd.pivot_table(data=data[['客户名称','订单 Id','订单日期','销售额']],index=['客户名称'],\
values=['订单 Id','订单日期','销售额'],aggfunc={'订单 Id':np.size,'订单日期':np.min,'销售额':np.sum})
recently=result['订单日期'].mean()
frenquency=result['订单 Id'].mean()
money=result['销售额'].mean()
result=pd.DataFrame(data=result).reset_index()
这里已经将关键数值计算出来了,接下来可以使用我们之前写的函数来给客户加分类标签
#使用rfm_strategy函数计算每个客户对应的分类和策略
result[['标记','策略']]=[rfm_strategy(result['订单日期'][i],result['订单 Id'][i],result['销售额'][i],recently,frenquency,money)\
for i in range(0,len(result['订单日期']))]
接下来我们可以选择将数据导出(使用pd.to_csv方法),或者直接可视化看下客户分类的一个情况
#对分类的客户数量进行统计
result_data=pd.pivot_table(data=result,index=['标记'],values=['订单日期'],aggfunc='size')
result_data=pd.DataFrame(data=result_data).reset_index()
#对客户分类情况进行可视化
sns.set_style({'font.sans-serif':'Microsoft YaHei'})
plt.rcParams['font.sans-serif']=['SimHei']
plt.figure(figsize=(9,9))
x=range(8)
y1=result_data[0]
plt.title("RFM客户分类情况")
plt.bar(x, y1, tick_label=result_data['标记'], width=0.5,align='center')
ax=plt.gca()
for labels in ax.xaxis.get_ticklabels():
labels.set_rotation(45)
plt.show()