客户价值分析【python建立RFM模型】

338 阅读5分钟

建立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())

image.png

数据处理

#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

image.png

这里可以看到订单付款时间中有637条空值记录,买家实际支付金额最小值为0,说明这些数据中的客户并没有在我们店铺消费,属于无效数据,因此没有必要对这部分客户进行分析。这里我们需要处理掉这些数据!

# 去掉空值以及支付金额为0的数据
data = dfs[dfs['订单付款时间'].notnull()&dfs['买家实际支付金额']!= 0]
data

image.png

计算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

image.png

df = df1[['最近消费时间间隔','消费频率','消费金额']]
df2 = df
df2 = (df2 - df2.mean(axis = 0))/(df2.std(axis = 0))
df2.columns = ['R','F','M']
df2

image.png

客户聚类

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()

image.png

image.png

这里借鉴了机器学习的k-means聚类算法实现聚类分析,当然也可以自己根据业务的实际情况划分客户群

标记客户类别

# 标记原始数据的类别
df = pd.concat([df,pd.Series(kmodel.labels_,index = df.index)],axis = 1)
df.columns = ['R-最近消费时间间隔','F-消费频率','M-消费金额','类别']
df

image.png

df_mean = df.groupby(['类别']).mean()
df_mean

image.png

new = df_mean.mean()
# 增加一行RFM平均值(忽略索引),判断RFM值的高低                                            
df3 = df_mean.append(new,ignore_index=True)
df3

image.png

第4行为RFM各项均值,作为判断高低的点,低于均值为“低”,高于均值为“高”

0 - 潜在客户:R、F、M低,这类客户短时间内在店铺消费过,消费次数和消费金额较少,是潜在客户,虽然这类客户的当前价值并不是很高,但却有很大的发展潜力,针对这类客户进行密集的营销信息推送,增加其在店铺的消费次数和消费金额。

1 - 一般发展客户:低价值客户,R高,F、M低,说明这类客户很长时间没有在店铺交易了,而且消费次数和消费金额也较少,这类客户可能只会在店铺打折促销活动时才会消费,要想办法激活,否则会有流失的危险。

2 - 一般保持客户:F高,这类客户消费次数多,是忠实的客户,针对这类客户应多传递促销活动、品牌信息、新品/活动信息等。

3 - 重要保持客户:F、M高,R略高于平均分。他们是高价值客户,是最为理想型的客户类型,他们对企业品牌认可,对产品认可,贡献值最大,所占比例却非常小。这类客户花钱多又经常来,但是最近没来,这是一段时间没来的忠实客户。建议将这类客户进行一对一营销,以提高这类客户的忠诚度和满意度,尽可能延长这类客户的高水平消费。