大数据【企业级360°全方位用户画像】之RFM模型和KMeans聚类算法

本文主要是介绍大数据【企业级360°全方位用户画像】之RFM模型和KMeans聚类算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        在上一篇博客《一文带你硬核踏入机器学习的大门》中,已经为大家介绍了很多关于机器学习的基础内容。本篇博客,我们将结合当前阶段正在做的用户画像项目,为大家介绍RFM模型KMeans聚类算法

        先赞后看,养成习惯!
在这里插入图片描述

文章目录

    • 一、RFM模型引入
      • 1、RFM详解
        • 1.1 R值:最近一次消费(Recency)
        • 1.2 F值:消费频率(Frequency)
        • 1.3 M值:消费金额(Monetary)
      • 2、 基于RFM模型的实践应用
        • 2.1 基于RFM模型进行客户细分
        • 2.2 通过RFM模型评分后输出目标用户
    • 二、KMeans聚类算法
      • 1、算法原理
      • 2、快速体验
        • 2.1 数据集
        • 2.2 代码演示
    • 结语


一、RFM模型引入

        比如电商网站要做一次营销活动,需要针对不同价值的客户群体进行分群,对于高价值的用户推荐手表,珠宝等高端商品,对于低价值用户推荐打折促销的廉价商品,当然还有以下这些问题都是需要考虑的:

        1.谁是我的最佳客户?

        2.谁即将要成为流失客户?

        3.谁将有潜力成为有价值的客户

        4.哪些客户能够留存?

        5.哪些客户会对你目前对活动有所反应?

        那么最终的问题是如何对客户进行分群,即如何建立客户的价值模型呢?

        在传统企业和电商众多的客户细分模型中,RFM模型是被广泛提到和使用的。
        RFM模型是衡量当前用户价值和客户潜在价值的重要工具和手段。

        RFM是Rencency(最近一次消费),Frequency(消费频率)、Monetary(消费金额),三个指标首字母组合,如图所示:
在这里插入图片描述
        一般情况下RFM模型可以说明下列几个事实:

        1.最近购买的时间越近,用户对产品促销互动越大

        2.客户购买的频率越高,客户就品牌的满意度就越大

        3.货币价值将高消费客户和低消费客户区分开来


        如图所示,根据RFM模型,就可以统计在某一段时间内,用户最近的消费间隔,消费次数和消费金额,再根据使用 k-means 算法对用户进行聚类分群

        注意一点,不仅仅可以局限于这三个数据字段,还可以根据业务需求,加入其他字段,进行调整模型。
在这里插入图片描述
        我们可以根据RFM模型计算出所有用户的RFM值形成一个二维表:

useridR值F值M值
12019-11-01510000
22019-10-014800

        对于以上数据的量纲不一致(单位不统一),所以要对数据进行归一化

        如何归一化? 我们可以自定义归一化的规则!即建立一个评分标准。

        那如何建立评分标准?我们可以根据运营/产品的经验,做一个标准,就像这样:

R: 1-3天=5分,4-6天=4分,7-9天=3分,10-15天=2分,大于16天=1分
F: ≥200=5分,150-199=4分,100-149=3分,50-99=2分,1-49=1分
M: ≥20w=5分,10-19w=4分,5-9w=3分,1-4w=2分,<1w=1分

        根据上面的打分规则就可以对数据进行自定义的归一化,得到如下类似结果:

useridR值F值M值
1512
2111

        那么现在数据已经归一化了,如何对数据进行分类?

        肯定不能简单的将数据直接丢到三维坐标系,因为坐标系的原点不好确定,且三维坐标系只能分为8类。所以应该使用算法进行分类(聚类)。让算法自动学习用户之间的相似度,然后相似度高的用户,自动聚成一类,最后完成聚类的划分

计算流程

1、首先对所有用户的最近一次消费时间/总共消费次数/总共消费金额进行统计
2、再进行归一化(运营/产品提供的打分规则)
3、再使用算法进行聚类(K-Means)
4、根据聚类结果给用户打Tag(标签)

1、RFM详解

1.1 R值:最近一次消费(Recency)

        消费指的是客户在店铺消费最近一次和上一次的时间间隔,理论上R值越小的客户是价值越高的客户,即对店铺的回购几次最有可能产生回应。目前网购便利,顾客已经有了更多的购买选择和更低的购买成本,去除地域的限制因素,客户非常容易流失,因此CRM操盘手想要提高回购率和留存率,需要时刻警惕R值。

        如下图,某零食网店用户最近一次消费R值分布图:
在这里插入图片描述
        1、客户R值呈规律性的“波浪形”分布,时间越长,波浪越小;

        2、最近一年内用户占比50%(真的很巧);

        数据分析:这个数据根据向行业内专业人员请教,已经是比较理想了的。说明每引入2个客户,就有一位用户在持续购买。说明店铺复购做的比较好。

1.2 F值:消费频率(Frequency)

        消费频率是客户在固定时间内的购买次数(一般是1年)。但是如果实操中实际店铺由于受品类宽度的原因,比如卖3C产品,耐用品等即使是忠实粉丝用户也很难在1年内购买多次。所以,有些店铺在运营RFM模型时,会把F值的时间范围去掉,替换成累计购买次数。

        如下图,某零食网店用户购买频次图(如1个客户在1天内购买多笔订单,则自动合并为1笔订单):
在这里插入图片描述
        1、购买1次(新客户)占比为65.5%,产生重复购买(老客户)的占比为34.4%;

        2、购买3次及以上(成熟客户)的占比为17%,购买5次及以上(忠实客户)的占比为6%;

        数据分析:影响复购的核心因素是商品,因此复购不适合做跨类目比较。比如食品类目和美妆类目:食品是属于“半标品”,产品的标品化程度越高,客户背叛的难度就越小,越难形成忠实用户;但是相对美妆,食品又属于易耗品,消耗周期短,购买频率高,相对容易产生重复购买,因此跨类目复购并不具有可比性。

1.3 M值:消费金额(Monetary)

        M值是RFM模型中相对于R值和F值最难使用,但最具有价值的指标。大家熟知的“二八定律”(又名“帕雷托法则”)曾作出过这样的解释:公司80%的收入来自于20%的用户。

        这个数据我在自己所从事的公司总都得到过验证!可能有些店铺不会那么精确,一般也会在30%客户贡献70%收入,或者40%贡献60%收入。

        理论上M值和F值是一样的,都带有时间范围,指的是一段时间(通常是1年)内的消费金额,在工作中我认为对于一般店铺的类目而言,产品的价格带都是比较单一的,比如:同一品牌美妆类,价格浮动范围基本在某个特定消费群的可接受范围内,加上单一品类购买频次不高,所以对于一般店铺而言,M值对客户细分的作用相对较弱。

        所以我认为用店铺的累计购买金额和平均客单价替代传统的M值能更好的体现客户消费金额的差异。

        教大家一个特别简单的累积金额划分方法:将1/2的客单价作为累积消费金额的分段,比如客单价是300元,则按照150元进行累计消费金额分段,得出十个分段。

        现以国内某知名化妆品店铺举例,店铺平均客单为160元,因此以80元作为间隔将累积消费金额分段,从表中可以很明显发现,累计消费160元以下用户占比为65.5%(近2/3),贡献的店铺收入比例只占31.6%(近1/3),具体如下:
在这里插入图片描述

2、 基于RFM模型的实践应用

        主要有两种方法来分析RFM模型的结果:用基于RFM模型的划分标准来进行客户细分,用基于RFM模型的客户评分来进行客户细分。

2.1 基于RFM模型进行客户细分

        CRM实操时可以选择RFM模型中的1-3个指标进行客户细分,如下表所示。切记细分指标需要在自己可操控的合理范围内,并非越多越好,一旦用户细分群组过多,一来会给自己的营销方案执行带来较大的难度,而来可能会遗漏用户群或者对同个用户造成多次打扰。

        最终选择多少个指标有两个参考标准:店铺的客户基数,店铺的商品和客户结构。
在这里插入图片描述
        店铺的客户基数:在店铺客户一定的情况下选择的维度越多,细分出来每一组的用户越少。对于店铺基数不大(5万以下客户数)的店铺而言,选择1-2个维度进行细分即可。对于客户超过50万的大卖家而言可以选择2-3个指标。

        店铺的商品和客户结构:如果在店铺的商品层次比较单一,客单价差异幅度不大的情况下,购买频次(F值)和消费金额(M值)高度相关的情况下,可以只选择比较容易操作的购买频次(F值)代替消费金额(M值)。对于刚刚开店还没形成客户粘性的店铺,则可以放弃购买频次(F值),直接用最后一次消费(R值)或者消费金额(M值)。

2.2 通过RFM模型评分后输出目标用户

        除了直接用RFM模型对用户进行分组之外,还有一种常见的方法是利用RFM模型的三个属性对客户进行打分,通过打分确定每个用户的质量,最终筛选出自己的目标用户。

        RFM模型评分主要有三个部分:

1、确定RFM三个指标的分段和每个分段的分值;
2、计算每个客户RFM三个指标的得分;
3、计算每个客户的总得分,并且根据总得分筛选出优质的客户

        比如,实操的过程中一般每个指标分为3-5段,其中R值可以根据开店以来的时间和产品的回购周期来判定,F值根据现有店铺的平均购买频次,M值可参考上文客单价的分段指标。

        举个例子:
在这里插入图片描述
        确认RFM的分段和对应分段的分值之后,就可以按照用户情况对应进行打分。

        这个时候可能有人会对此产生质疑,我如何验证这个给予的分值就是合理的呢?一般使用经验值或用算法模型进行验证。

        这里提供一个段子,可谓是很形象了。

在这里插入图片描述

二、KMeans聚类算法

1、算法原理

        在正式开始之前,我们可以先通过几个网址来感受一下KMeans的魅力。

        首先是 http://shabal.in/visuals/kmeans/3.html,我们可以通过刷新页面多次,来观察不同的KMeans聚类过程。下图是我把四次不同的结果合并在一起的一个结果。
在这里插入图片描述
        通过观察,我们可以得到初步结论:

  • 中心点数量4, 起始位置不相同。
  • 中心点可以移动
  • 中心点最后不移动

        第二个网址是 https://www.naftaliharris.com/blog/visualizing-k-means-clustering/

        这个网站更牛的一点是,可以自定义可视化K均值聚类。也就是,我们可以自定义K的数量,和初始位置,来查看不同的结果。

在这里插入图片描述
在这里插入图片描述
        初始情况下,大家应该看到的是下面这种情况
在这里插入图片描述
        接下来,我分别在图中的四个位置设置质心的位置
在这里插入图片描述
        然后不断的点击Go

在这里插入图片描述
        最后可能会看到类似如下的结果:
在这里插入图片描述        再让我们来看下其他的解释
在这里插入图片描述
        最后将不同种类的数据分到了不同的区域。有点类似班级位置的一个分布😂
在这里插入图片描述
        为了节约码字的时间,下面借助一些PPT来为大家说明
在这里插入图片描述
在这里插入图片描述
        我们可以得出,KMeans的计算步骤

1、选择 K 个点作为初始聚类中心
2、计算其他的点到中心点的距离, 进行聚类, 使用欧式距离
3、重新计算每个聚类的中心点, 再次聚类
4、直到中心点不再变化, 或者达到迭代次数

在这里插入图片描述
在这里插入图片描述

2、快速体验

        接下来让我们来感受一下KMeans的魅力。

2.1 数据集

        IRIS数据集由Fisher在1936年整理的一个经典数据集,在统计学习和机器学习领域都经常被用作示例。

        数据集内包含 3 类共 150 条记录,每类各 50 个数据,每条数据包含4个特征,都是浮点数,单位为厘米。

Sepal.Length(花萼长度)
Sepal.Width(花萼宽度)
Petal.Length(花瓣长度)
Petal.Width(花瓣宽度))

        目标值为鸢尾花的分类:

Iris Setosa(山鸢尾)
Iris Versicolour(杂色鸢尾)
Iris Virginica(维吉尼亚鸢尾)

        其中的数据分布如下:
在这里插入图片描述
        
在这里插入图片描述

2.2 代码演示
import org.apache.spark.ml.clustering.{KMeans, KMeansModel}
import org.apache.spark.ml.feature.{MinMaxScaler, MinMaxScalerModel}
import org.apache.spark.sql.{DataFrame, SparkSession}/*
用于实现  使用 kmeans 为鸢尾花数据分类*/
object Iris {def main(args: Array[String]): Unit = {//1、创建sparlsession对象val spark: SparkSession = SparkSession.builder().appName("Iris").master("local[*]").getOrCreate()spark.sparkContext.setLogLevel("WARN")//2、读取libsvm 数据val irisLibSvmDF: DataFrame = spark.read.format("libsvm").load("file:///E:\\数据集\\iris_kmeans.txt")irisLibSvmDF.show(false)/*+-----+-------------------------------+
|label|features                       |
+-----+-------------------------------+
|1.0  |(4,[0,1,2,3],[5.1,3.5,1.4,0.2])|
|1.0  |(4,[0,1,2,3],[4.9,3.0,1.4,0.2])|
|1.0  |(4,[0,1,2,3],[4.7,3.2,1.3,0.2])|
|1.0  |(4,[0,1,2,3],[4.6,3.1,1.5,0.2])|
|1.0  |(4,[0,1,2,3],[5.0,3.6,1.4,0.2])|*///3、数据归一化(将数据归一到0-1之间,计算速度快)//数据归一化//把数据映射到0~1范围之内处理,更加便捷快速//MinMaxScaler  把有量纲表达式变成无量纲表达式,便于不同单位或量级的指标能够进行比较和加权。//x' = (x - X_min) / (X_max - X_min)val scalerDatas: MinMaxScalerModel = new MinMaxScaler().setInputCol("features") //设置需要归一化的列.setOutputCol("featuresOut") //归一化后的数据的列名字.fit(irisLibSvmDF) //设置数据val scalerDF: DataFrame = scalerDatas.transform(irisLibSvmDF)scalerDF.show(false)
/*
+-----+-------------------------------+---------------------------------------------------------------------------------+
|label|features                       |featuresOut                                                                      |
+-----+-------------------------------+---------------------------------------------------------------------------------+
|1.0  |(4,[0,1,2,3],[5.1,3.5,1.4,0.2])|[0.22222222222222213,0.6249999999999999,0.06779661016949151,0.04166666666666667] |
|1.0  |(4,[0,1,2,3],[4.9,3.0,1.4,0.2])|[0.1666666666666668,0.41666666666666663,0.06779661016949151,0.04166666666666667] |
|1.0  |(4,[0,1,2,3],[4.7,3.2,1.3,0.2])|[0.11111111111111119,0.5,0.05084745762711865,0.04166666666666667]                |
|1.0  |(4,[0,1,2,3],[4.6,3.1,1.5,0.2])|[0.08333333333333327,0.4583333333333333,0.0847457627118644,0.04166666666666667]  |
|1.0  |(4,[0,1,2,3],[5.0,3.6,1.4,0.2])|[0.19444444444444448,0.6666666666666666,0.06779661016949151,0.04166666666666667] |*///4、使用kmeans进行计算val prediction: KMeansModel = new KMeans().setK(3) //设置需要划分类别的数量/个数.setMaxIter(10) //设置最大计算次数.setFeaturesCol("featuresOut") //设置特征的列    归一化后的列.setPredictionCol("predictionValue") //设置最终预测后的结果列名.setSeed(10) //设置随机种子.fit(scalerDF)val predictionDF: DataFrame = prediction.transform(scalerDF)predictionDF.show(false)/*
+-----+-------------------------------+---------------------------------------------------------------------------------+---------------+
|label|features                       |featuresOut                                                                      |predictionValue|
+-----+-------------------------------+---------------------------------------------------------------------------------+---------------+
|1.0  |(4,[0,1,2,3],[5.1,3.5,1.4,0.2])|[0.22222222222222213,0.6249999999999999,0.06779661016949151,0.04166666666666667] |0              |
|1.0  |(4,[0,1,2,3],[4.9,3.0,1.4,0.2])|[0.1666666666666668,0.41666666666666663,0.06779661016949151,0.04166666666666667] |0              |
|1.0  |(4,[0,1,2,3],[4.7,3.2,1.3,0.2])|[0.11111111111111119,0.5,0.05084745762711865,0.04166666666666667]                |0              |
|1.0  |(4,[0,1,2,3],[4.6,3.1,1.5,0.2])|[0.08333333333333327,0.4583333333333333,0.0847457627118644,0.04166666666666667]  |0              |
|1.0  |(4,[0,1,2,3],[5.0,3.6,1.4,0.2])|[0.19444444444444448,0.6666666666666666,0.06779661016949151,0.04166666666666667] |0              |
|1.0  |(4,[0,1,2,3],[5.4,3.9,1.7,0.4])|[0.30555555555555564,0.7916666666666665,0.11864406779661016,0.12500000000000003] |0              |*///简单验证predictionDF.groupBy("label","predictionValue").count().show()/*
+-----+---------------+-----+
|label|predictionValue|count|
+-----+---------------+-----+
|  2.0|              1|   47|
|  1.0|              0|   50|
|  2.0|              2|    3|
|  3.0|              1|   14|
|  3.0|              2|   36|
+-----+---------------+-----+*/}
}

结语

        本篇博客,主要为大家简单介绍了RFM模型和KMeans聚类算法,后续会将其与用户画像的项目结合起来,为大家讲解挖掘型标签开发的过程,敬请期待😎

        如果以上过程中出现了任何的纰漏错误,烦请大佬们指正😅

        受益的朋友或对大数据技术感兴趣的伙伴记得点赞关注支持一波🙏

        希望我们都能在学习的道路上越走越远😉

这篇关于大数据【企业级360°全方位用户画像】之RFM模型和KMeans聚类算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/689336

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G