建立RFM模型分析客户价值
RFM模型是衡量客户价值和客户潜在价值的重要工具和手段,它包括以下三个指标:
R:最近消费时间间隔(Recency)
F:消费频率(Frequency)
M:消费金额(Monetary)
下面对R、F、M 三个指标进行详细介绍:
R为最近消费时间间隔,表示客户最近一次消费时间与之前消费时间的距离。R越大,表示客户很久未发生交易;R越小,表示客户最近有交易发生。R越大则客户越可能会‘沉睡’,流失的可能性越大,在这部分客户中,可能有些优质客户,值得通过一些营销手段进行激活!
F为消费频率,表示一段时间内的客户消费次数,F越大,表示客户交易越频繁,是非常忠诚的客户,也是对公司产品认同度较高的客户;F越小,表示客户不够活跃,且可能是竞争对手的常客;针对F较小,且消费额较大的客户,需要推出一定的竞争策略,将这批客户从竞争对手中争取过来!
M为消费金额,表示客户每次消费金额,可以用最近一次消费金额,也可以用过去的平均消费金额,根据分析的目的不同,可以有不同的标识方法。 -------------------------------------- 一般来说,单词交易金额较大的客户,支付能力强,价格敏感度低,帕累托法则告诉我们,一家公司80%的收入都是由消费最多的20%客户贡献,所以消费金额较大的客户是较为优质的客户,是高价值客户,这类客户可采取一对一的营销方案。
数据抽取
import pandas as pd
# 读取文件
df1 = pd.read_excel(r'D:\glenchen\Desktop\data\2020.xlsx')
df2 = pd.read_excel(r'D:\glenchen\Desktop\data\2021.xlsx')
# 抽取指定列数据
df1 = df1[['买家会员名','买家实际支付金额','订单付款时间']]
df2 = df2[['买家会员名','买家实际支付金额','订单付款时间']]
# 数据合并与导出
dfs = pd.concat([df1,df2])
print(dfs.head())
数据处理
#datetime_is_numeric=True 去除警告
view = dfs.describe(include='all',datetime_is_numeric=True).T
view['null'] = len(dfs)-view['count']
view = view[['null','max','min']] # 空值,最大值,最小值
view
这里可以看到订单付款时间中有637条空值记录,买家实际支付金额最小值为0,说明这些数据中的客户并没有在我们店铺消费,属于无效数据,因此没有必要对这部分客户进行分析。这里我们需要处理掉这些数据!
# 去掉空值以及支付金额为0的数据
data = dfs[dfs['订单付款时间'].notnull()&dfs['买家实际支付金额']!= 0]
data
计算RFM值
import numpy as np
# 计算RFM值
data = data.copy() #去除警告信息
data['最近消费时间间隔'] = (pd.to_datetime('2021-12-31') - pd.to_datetime(data['订单付款时间'])).values/np.timedelta64(1,'D')
df1 = data.groupby('买家会员名').agg({'买家会员名':'size','最近消费时间间隔':'min','买家实际支付金额':'sum'})
df1 = df1.rename(columns={'买家会员名':'消费频率','买家实际支付金额':'消费金额'})
df1
df = df1[['最近消费时间间隔','消费频率','消费金额']]
df2 = df
df2 = (df2 - df2.mean(axis = 0))/(df2.std(axis = 0))
df2.columns = ['R','F','M']
df2
客户聚类
from sklearn.cluster import KMeans
k = 4 #设置聚类类别数
kmodel = KMeans( n_clusters = k ) #创建聚类模型
kmodel.fit(df2) #训练模型
r1 = pd.Series(kmodel.labels_).value_counts()
r2 = pd.DataFrame(kmodel.cluster_centers_)
r = pd.concat([r2,r1],axis=1)
r.columns = list(df2.columns)+[u'聚类数量']
r3 = pd.Series(kmodel.labels_,index=df2.index) #类型标记
r = pd.concat([df2,r3],axis=1) #数据合并
r.columns = list(df2.columns)+[u'聚类类别']
#######################################################
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 密度图
for i in range(k):
cls = df2[r[u'聚类类别']==i]
cls.plot(kind = 'kde',linewidth = 2,subplots = True ,sharex = False)
plt.suptitle('客户群=%d;聚类数量=%d'%(i,r1[i]))
plt.show()
这里借鉴了机器学习的k-means聚类算法实现聚类分析,当然也可以自己根据业务的实际情况划分客户群
标记客户类别
# 标记原始数据的类别
df = pd.concat([df,pd.Series(kmodel.labels_,index = df.index)],axis = 1)
df.columns = ['R-最近消费时间间隔','F-消费频率','M-消费金额','类别']
df
df_mean = df.groupby(['类别']).mean()
df_mean
new = df_mean.mean()
# 增加一行RFM平均值(忽略索引),判断RFM值的高低
df3 = df_mean.append(new,ignore_index=True)
df3