美文网首页数据分析数字银行客户关系管理
KMeans聚类方法进行RFM分析细分客户

KMeans聚类方法进行RFM分析细分客户

作者: 马淑 | 来源:发表于2018-09-25 21:46 被阅读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对聚类的结果进行降维可视化,观察聚类的效果。可知聚类的效果还是比较可以接受的。

k=3 k=9

全部代码如下:

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

相关文章

网友评论

    本文标题:KMeans聚类方法进行RFM分析细分客户

    本文链接:https://www.haomeiwen.com/subject/tgyloftx.html