代码改变世界

RFM模型的变形LRFMC模型与K-means算法的有机结合

2019-10-05 19:00  Dorisoy  阅读(4152)  评论(0编辑  收藏  举报

应用场景: 可以应用在不同行业的客户分类管理上,比如航空公司,传统的RFM模型不再适用,通过RFM模型的变形LRFMC模型实现客户价值分析;基于消费者数据的精细化营销

应用价值: LRFMC模型构建之后使用了经典的聚类算法-K-Means算法来对客户进行细分,而不是传统的来与参考值对比进行手工分类,使得准确率和效率得到了大大提升,从而实现客户价值分析,进行精准的价格和服务设置;

经常买机票的朋友不知道有没有发现,机票的价格通常“阴晴不定”。3个月前是一个价格,2个月1个月1周前又是另一个价格;有时候白天和凌晨价格还大有来去,价格也时涨时跌。就我同事,过年前定好了高铁票,临走时看了一眼机票发现跌完比高铁票还便宜,果断退了买机票。更有甚者,不同账号登陆的价格还不一样…不懂的人认为水深,其实这些都是基于消费者数据的精细化营销。

RFM就是一种典型的对客户分类然后针对性营销的模型。**RFM模型在上一篇也已讲到,相信大家也已经很熟悉,它是由R(最近消费时间间隔)、F(消费频次)和M(消费总额)三个指标构成,通过该模型识别出高价值客户,在最后我也提及**RFM模型也不是万能的,但是适当的对RFM进行升级或者变形也可能会有很好的用处。比如在航空行业,直接使用M指标并不能反映客户的真实价值,因为“长途低等舱”可能没有“短途高等舱”价值高,所以得根据实际行业灵活调整RFM模型的指标。

国内外航空公司最常用的是根据客户价值分析特色LRFMC模型,将客户聚类为重要保持客户,重要发展客户,重要挽留客户,一般客户,低价值客户,从而针对每种类别的客户制定对应的价格和服务。本文的特别之处是在于LRFMC模型构建之后使用了经典的聚类算法-K-Means算法来对客户进行细分,而不是传统的来与参考值对比进行手工分类。使得准确率和效率得到了大大提升。

以某航空公司为例,利用LRFMC模型,教大家介绍如何在实际工作中结合K-means聚类算法将客户价值进行分类,从而实现客户价值分析,进行精准的价格和服务设置。

LRFMC模型

传统的RFM模型它是依据各个属性的平均值进行划分,但是,细分的客户群太多,精准营销的成本太高。,因此LRFMC模型将客户聚类为重要保持客户,重要发展客户,重要挽留客户,一般客户,低价值客户,从而针对每种类别的客户制定对应的价格和服务。

分析过程

首先,明确目标是客户价值识别,应用最广泛的模型是三个指标(消费时间间隔(Recency),消费频率(Frequency),消费金额(Monetary)) 
以上指标简称RFM模型,作用是识别高价值的客户。消费金额,一般表示一段时间内,消费的总额。但是,因为航空票价收到距离和舱位等级的影响,同样金额对航空公司价值不同因此,需要修改指标。选定变量,舱位因素=舱位所对应的折扣系数的平均值=C,距离因素=一定时间内积累的飞行里程=M,再考虑到,航空公司的会员系统,用户的入会时间长短能在一定程度上影响客户价值,所以增加指标L=入会时间长度=客户关系长度。因此,总共确定了五个指标,消费时间间隔R,客户关系长度L,消费频率F,飞行里程M和折扣系数的平均值C。以上指标,作为航空公司识别客户价值指标,记为LRFMC模型

LRFMC模型指标含义

  • L:会员入会时间距观测窗口结束的月数。
  • R:客户最近一次乘坐公司飞机距离观测窗口结束的月数。
  • F:客户在观测窗口内乘坐公司飞机的次数。
  • M:客户在观测窗口内累计的飞行里程碑。
  • C:客户在观测窗口内乘坐仓位所对应的折扣系数的平均值。

K-mean算法

作为数据挖掘的一个重要研究课题,聚类分析技术越来越受到人们的关注。聚类就是将物理或抽象对象的集合分成多个相似的数据子集,同一个子集内的对象之间具有较高的相似度,而不同子集内的对象差别较大。经过专家学者们的研究,目前聚类算法可以归纳为如下几类:基于划分的方法、基于密度的方法、基于层次的方法、基于模型的方法和高维数据的方法。K-means算法作为一种基于划分的动态聚类算法,它以误差平方和SSE作为聚类准则函数,具有简单有效、收敛速度较快、便于处理大型数据集等优点,从而获得了广泛的应用。

K-means算法的步骤如下: 

简单总结起来就是:初始化聚类中心、样本点划分、更新聚类中心、样本点划分、更新聚类中心....直至收敛即可

使用Python进行K-means算法的实现代码:

 1 import numpy as np
 2 # import matplotlib.pyplot as plt
 3 # 加载数据
 4 def loadDataSet(fileName):
 5     data = np.loadtxt(fileName,delimiter='\t')
 6     return data
 7  
 8  
 9 # 距离度量使用欧氏距离
10 def distEclud(x,y):
11     return np.sqrt(np.sum((x-y)**2)) 
12  
13  
14 # 随机k个初始聚类中心
15 def randCent(dataSet,k):
16     m,n = dataSet.shape
17     centroids = np.zeros((k,n))
18     for i in range(k):
19         index = int(np.random.uniform(0,m)) #
20         centroids[i,:] = dataSet[index,:]
21     return centroids
22  
23  
24 # K-means算法过程
25 def KMeans(dataSet,k):
26     m = np.shape(dataSet)[0]  #行的数目
27     # 第一列存样本属于哪一簇
28     # 第二列存样本的到簇的中心点的误差
29     clusterAssment = np.mat(np.zeros((m,2)))
30     clusterChange = True
31  
32     # 第1步 初始化centroids
33     centroids = randCent(dataSet,k)
34     while clusterChange:
35         clusterChange = False
36  
37         # 遍历所有的样本(行数)
38         for i in range(m):
39             minDist = 100000.0
40             minIndex = -1
41  
42             # 遍历所有的质心
43             #第2步 找出最近的质心
44             for j in range(k):
45                 # 计算该样本到质心的欧式距离
46                 distance = distEclud(centroids[j,:],dataSet[i,:])
47                 if distance < minDist:
48                     minDist = distance
49                     minIndex = j
50             # 第 3 步:更新每一行样本所属的簇
51             if clusterAssment[i,0] != minIndex:
52                 clusterChange = True
53                 clusterAssment[i,:] = minIndex,minDist**2
54         #第 4 步:更新质心
55         for j in range(k):
56             pointsInCluster = dataSet[np.nonzero(clusterAssment[:,0].A == j)[0]]  # 获取簇类所有的点
57             centroids[j,:] = np.mean(pointsInCluster,axis=0)   # 对矩阵的行求均值
58     print("Congratulations,cluster complete!")
59     return centroids,clusterAssment

看起来可能会比较复杂,但其实可能没有必要这样做,因为这些经典的机器学习算法只需要在python中调用一个包就好了

 1 from sklearn.cluster import KMeans
 2  
 3 # 这里参数的选择要注意下:n_clusters为类簇个数,init表示初始聚类中心选择方法,n_init表示算法运行的次数选择最优输出,max_iter表示最大迭代次数,tol表示误差平方和的阈值,小于时即停止迭代。
 4 kmeans = KMeans(n_clusters=K, init='random', n_init=1, max_iter=300, tol=0.0001).fit(X)
 5 # 聚类中心
 6 centers = kmeans.cluster_centers_
 7 # print("聚类中心:\n", centers)
 8 # 聚类结果
 9 result = kmeans.labels_
10 # 误差平方和
11 sse = kmeans.inertia_

构建模型及模型应用

数据预处理

数据预处理这一步的重要性就不用我多说了,其中需要进行缺失值处理,异常值处理等等,这时候我们已经完成了数据的过滤,计算,筛选操作,并得到了LRFMC模型的五个指标,但通过观察可以发现,这些数据之间的量级是不同的,差距甚至达到了千万倍的级别,量纲不同进行训练不能真实的反映数据的变动规律,想要建立建立正确的模型,还需要对数据进行标准化处理。常用的数据标准化处理有z-sores标准化、最大最小化等:

from sklearn import preprocessing
import pandas as pd
 
 
process = input("请输入预处理数据方法:")
if process == "标准化":
    X = preprocessing.scale(np.array(pd1, dtype=np.float64))
elif process == "最大最小":
    X = preprocessing.MinMaxScaler().fit_transform(np.array(pd1, dtype=np.float64))
elif process == "归一化":
    X = preprocessing.normalize(np.array(pd1, dtype=np.float64), norm='l2')

客户聚类

接下来就可以使用预处理完的数据来进行聚类,属性值就选LRFMC模型的五个指标,类簇数目为5类,最大迭代次数一般几百次或者默认值就可以,距离度量使用默认的欧式距离即可。这里有一点需要注意,就是在初始聚类中心的选择方法上,可以选择“K-means++”,当然也可以自己输入,因为K-means算法对初始聚类中心敏感,不同的初始聚类中心选取会得到不同的聚类结果。

1 kmeans = KMeans(n_clusters=5, init='k-means++', n_init=1, max_iter=300, tol=0.0001).fit(X)

进一步可以数据可视化,也可以对得到的聚类结果进行客户价值分析了

客户价值分析

  1. 类簇0 重要保持客户:R(最近乘坐航班)低,F(乘坐次数)、C(平均折扣率高,舱位较高)、M(里程数)高。最优先的目标,进行差异化管理,提高满意度。

  2. 类簇1 重要发展客户:R(最近乘坐航班)低,F(乘坐次数)高,M(里程数)也不低,潜在价值客户。虽然说,当前价值不高,但是却有很大的发展潜力,促使这类客户在本公司消费和合作伙伴处消费。

  3. 类簇2 重要挽留客户:C(平均折扣率高,舱位较高)、F(乘坐次数)、M(里程数)较高,但是较长时间没有乘坐(R)小。增加与这类客户的互动,了解情况,采取一定手段,延长客户生命周期。

  4. 类簇3 一般与低价值客户:C、F、M、L都较低,但L高。他们可能是在公司打折促销时才会乘坐本公司航班。

  5. 类簇4 低价值客户:各方面的数据都是比较低的,属于一般或低价值用户。

这里客户价值分析可以根据企业具体应用场景灵活分析,针对这5类客户,航空公司就可能采取不同的措施,如会员的升级与保级、交叉销售、管理模式的改变等。企业要获得长期的丰厚利润,必须需要大量稳定的、高质量的客户。维持老客户的成本远远低于新客户,保持优质客户是十分重要的。精准营销中,也有成本因素,所以按照客户价值排名,进行优先的,特别的营销策略,是维持客户的关键。

总结

结合航空公司客户价值案例的分析,针对传统RFM模型的不足,结合案例进行改造,介绍了一种RFM模型的变形LRFMC模型与聚类算法-K-means算法的有机结合应用,最后通过聚类结果的分析,选出客户价值排行,并且制定相应策略,为企业节约成本,提升效率保驾护航。