KMeans聚类方法进行RFM分析细分客户
2018-09-25 本文已影响233人
马淑
什么是RFM?
RFM分析(Recency,Frequency,Monetary)的含义
R(Recency):客户最近一次交易时间的间隔。R值越大,表示客户交易发生的日期越久,反之则表示客户交易发生的日期越近。
F(Frequency):客户在最近一段时间内交易的次数。F值越大,表示客户交易越频繁,反之则表示客户交易不够活跃。
M(Monetary):客户在最近一段时间内交易的金额。M值越大,表示客户价值越高,反之则表示客户价值越低。
RFM分析就是根据客户活跃程度和交易金额的贡献,进行客户价值细分的一种方法。

RFM分析的主要作用:
- 识别优质客户。可以指定个性化的沟通和营销服务,为更多的营销决策提供有力支持。
- 能够衡量客户价值和客户利润创收能力。
聚类方法对RFM进行客户细分
消费行为特征数据结构如下:

当设定KMeans聚类簇k=3时,得到每类聚簇的RFM密度分布如下所示:

聚类类别0特点:登录时间较近,消费频率较低,消费金额较低。
聚类类别1特点:登录时间较近,登录频率较高,消费金额较高。属于一般客户。
聚类类别2特点:较长时间没有登录,消费频率较低,消费金额一般,属于低价值客户。
如果设定k=9,可以得到如下的结果(图贴在Excel里面):

我们可以用TSNE对聚类的结果进行降维可视化,观察聚类的效果。可知聚类的效果还是比较可以接受的。


全部代码如下:
# -*- coding: utf-8 -*-
#--------------数据准备-----------------
import pandas as pd
inputfile = 'consumption_data.xls'
outputfile = 'data_type.xls'
k=9
iteration = 500
data = pd.read_excel(inputfile, index_col='Id')
data_zs =(data-data.mean())/data.std() #标准化,消除度量单位的干扰
#---------------聚类分析-----------------
from sklearn.cluster import KMeans
model = KMeans(n_clusters=k, init='k-means++',max_iter=iteration) #分为k类,最多迭代500次
model.fit(data_zs)
#----------------打印结果----------------
#统计各类别数目
r1 = pd.Series(model.labels_).value_counts()
r2 = pd.DataFrame(model.cluster_centers_)
r = pd.concat([r2,r1], axis=1)
r.columns = list(data.columns)+[u'聚类数量']
print(r)
#样本到对应聚类中心的距离平方和
print(model.inertia_)
#各样本对应聚类
r3 = pd.Series(model.labels_,index=data.index)
r = pd.concat([data,r3], axis=1)
r.columns = list(data.columns)+[u'聚类类别']
r.to_excel(outputfile)
#----------------画图比较----------------
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
for i in range(k):
cls=data[r[u'聚类类别']==i]
cls.plot(kind='kde',subplots=True,sharex=False)
plt.suptitle('聚类类别=%d; 样本数=%d' % (i, r1[i]))
plt.legend()
plt.show()
#-----------聚类降维可视化-----------
from sklearn.manifold import TSNE
tsne = TSNE()
tsne.fit_transform(data_zs) #进行数据降维
print(type(tsne))
tsne = pd.DataFrame(tsne.embedding_, index=data_zs.index) #转换数据格式
for j in range(k):
d=tsne[r[u'聚类类别']==j]
plt.plot(d[0],d[1],'.')
plt.show()