应用场景: 可以应用在不同行业的客户分类管理上,比如航空公司,传统的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算法的实现代码:

 import numpy as np
# import matplotlib.pyplot as plt
# 加载数据
def loadDataSet(fileName):
data = np.loadtxt(fileName,delimiter='\t')
return data # 距离度量使用欧氏距离
def distEclud(x,y):
return np.sqrt(np.sum((x-y)**2)) # 随机k个初始聚类中心
def randCent(dataSet,k):
m,n = dataSet.shape
centroids = np.zeros((k,n))
for i in range(k):
index = int(np.random.uniform(0,m)) #
centroids[i,:] = dataSet[index,:]
return centroids # K-means算法过程
def KMeans(dataSet,k):
m = np.shape(dataSet)[0] #行的数目
# 第一列存样本属于哪一簇
# 第二列存样本的到簇的中心点的误差
clusterAssment = np.mat(np.zeros((m,2)))
clusterChange = True # 第1步 初始化centroids
centroids = randCent(dataSet,k)
while clusterChange:
clusterChange = False # 遍历所有的样本(行数)
for i in range(m):
minDist = 100000.0
minIndex = -1 # 遍历所有的质心
#第2步 找出最近的质心
for j in range(k):
# 计算该样本到质心的欧式距离
distance = distEclud(centroids[j,:],dataSet[i,:])
if distance < minDist:
minDist = distance
minIndex = j
# 第 3 步:更新每一行样本所属的簇
if clusterAssment[i,0] != minIndex:
clusterChange = True
clusterAssment[i,:] = minIndex,minDist**2
#第 4 步:更新质心
for j in range(k):
pointsInCluster = dataSet[np.nonzero(clusterAssment[:,0].A == j)[0]] # 获取簇类所有的点
centroids[j,:] = np.mean(pointsInCluster,axis=0) # 对矩阵的行求均值
print("Congratulations,cluster complete!")
return centroids,clusterAssment

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

 from sklearn.cluster import KMeans

 # 这里参数的选择要注意下:n_clusters为类簇个数,init表示初始聚类中心选择方法,n_init表示算法运行的次数选择最优输出,max_iter表示最大迭代次数,tol表示误差平方和的阈值,小于时即停止迭代。
kmeans = KMeans(n_clusters=K, init='random', n_init=1, max_iter=300, tol=0.0001).fit(X)
# 聚类中心
centers = kmeans.cluster_centers_
# print("聚类中心:\n", centers)
# 聚类结果
result = kmeans.labels_
# 误差平方和
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算法对初始聚类中心敏感,不同的初始聚类中心选取会得到不同的聚类结果。

 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算法的有机结合应用,最后通过聚类结果的分析,选出客户价值排行,并且制定相应策略,为企业节约成本,提升效率保驾护航。

RFM模型的变形LRFMC模型与K-means算法的有机结合的更多相关文章

  1. KNN 与 K - Means 算法比较

    KNN K-Means 1.分类算法 聚类算法 2.监督学习 非监督学习 3.数据类型:喂给它的数据集是带label的数据,已经是完全正确的数据 喂给它的数据集是无label的数据,是杂乱无章的,经过 ...

  2. 航空客户价值分析特色LRFMC模型——RFM升级

    本文转载自微信公众号TIpDM. 每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 我们说RFM ...

  3. 用交叉验证改善模型的预测表现-着重k重交叉验证

    机器学习技术在应用之前使用“训练+检验”的模式(通常被称作”交叉验证“). 预测模型为何无法保持稳定? 让我们通过以下几幅图来理解这个问题: 此处我们试图找到尺寸(size)和价格(price)的关系 ...

  4. kaggle赛题Digit Recognizer:利用TensorFlow搭建神经网络(附上K邻近算法模型预测)

    一.前言 kaggle上有传统的手写数字识别mnist的赛题,通过分类算法,将图片数据进行识别.mnist数据集里面,包含了42000张手写数字0到9的图片,每张图片为28*28=784的像素,所以整 ...

  5. PyTorch保存模型与加载模型+Finetune预训练模型使用

    Pytorch 保存模型与加载模型 PyTorch之保存加载模型 参数初始化参 数的初始化其实就是对参数赋值.而我们需要学习的参数其实都是Variable,它其实是对Tensor的封装,同时提供了da ...

  6. [Pytorch]Pytorch 保存模型与加载模型(转)

    转自:知乎 目录: 保存模型与加载模型 冻结一部分参数,训练另一部分参数 采用不同的学习率进行训练 1.保存模型与加载 简单的保存与加载方法: # 保存整个网络 torch.save(net, PAT ...

  7. (十三)GBDT模型用于评分卡模型python实现

    python信用评分卡建模(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_ca ...

  8. 生成模型 VS 判别模型 (含义、区别、对应经典算法)

      从概率分布的角度考虑,对于一堆样本数据,每个均有特征Xi对应分类标记yi. 生成模型:学习得到联合概率分布P(x,y),即特征x和标记y共同出现的概率,然后求条件概率分布.能够学习到数据生成的机制 ...

  9. padding标准盒模型和怪异盒子模型

    我们都知道padding是为块级元素设置内边距 但是在使用过程中,我们却会遇到一些问题.padding的标准盒模型和怪异盒模型 padding盒子模型 我们通过demo来讲这个问题,用文字干讲第一没意 ...

随机推荐

  1. SpringBootSecurity学习(25)前后端分离版之OAuth2.0 令牌中继

    增加Eureka 前面介绍的项目都是授权服务和资源服务单独两个,这样在资源服务中的 check_token 地址都是写死的地址 : 下面我们把eureka加上,这样就可以直接用服务名了.eureka服 ...

  2. js 时间格式化成字符串

    我用的简单的直接的字符串格式转化 function getTimeStr() { var date = new Date(); var year = date.getFullYear(); var m ...

  3. 使用JavaConfig配置SpringMVC

    目录结构 web.xml: <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi ...

  4. Django---Http协议简述和原理,HTTP请求码,HTTP请求格式和响应格式(重点),Django的安装与使用,Django项目的创建和运行(cmd和pycharm两种模式),Django的基础文件配置,Web框架的本质,服务器程序和应用程序(wsgiref服务端模块,jinja2模板渲染模块)的使用

    Django---Http协议简述和原理,HTTP请求码,HTTP请求格式和响应格式(重点),Django的安装与使用,Django项目的创建和运行(cmd和pycharm两种模式),Django的基 ...

  5. codeforces#566(Div.2)B

    B.Plus from Picture You have a given picture with size w×hw×h. Determine if the given picture has a ...

  6. golang中uint8字节切片转字符串

    假如拿到了一个字节切片test1 = {'a', 'b', 'c', 'd', 11} package main import ( "fmt" "reflect" ...

  7. 49.react中使用less

    1.安装less:npm install less less-loader --save 2.webpack.config.js中配置: oneOf: [ {   test: /\.less$/,   ...

  8. CSS 精灵技术(sprite)

    一.精灵技术产生的背景 图所示为网页的请求原理图,当用户访问一个网站时,需要向服务器发送请求,网页上的每张图像都要经过一次请求才能展现给用户.  然而,一个网页中往往会应用很多小的背景图像作为修饰,当 ...

  9. 关于Apache安全加固的总结

    在给企业提加固方案的时候,检查服务器安全设置是必不可少的. “最小权限原则”: 当一个黑客在入侵一个网络并拿到webshell的后续就是思考是否需要提权.如果此刻的webshell直接是system或 ...

  10. 面试题:android的安全机制有哪些

    1 uid . gid . gids Android 的权限分离的基础是建立在 Linux 已有的 uid . gid . gids 基础上的 . UID: Android 在 安装一个应用程序,就会 ...