RFM模型与Spark实现

本文介绍RFM模型,包括R(最近消费时间)、F(消费频率)、M(消费金额)的定义和应用,展示了如何在Spark中实现RFM打分,并通过权重计算用户价值,最后给出了基于此模型的客户分群和标签策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RMF模型

什么是RMF模型

  • R最近一次消费时间:R越小,客户价值越高
  • F消费频率:F值会受到品类的影响,不适合做跨类目比较
  • M消费金额:最有价值的指标

利用以上三个指标将用户分为以下几类客户分类

给R、F、M按价值打分

  • R打分:最近一次消费距离当前日期越近,分值越高
  • F:消费频率越高,得分越高
  • M:消费金额越高,得分越高

得分过后需要给R、F、M一定权重,权重根据业务进行选取

基于RFM模型的用户价值划分

  • 确定RFM三个指标的分段和每个分段的分值
  • 计算每个客户RFM三个指标的得分
  • 计算每个客户的总得分,按照值的大小进行人群细分

代码实现

class RFM {
  /**
   * 基于RFM模型的客户分群
   * @param dataSet 数据集
   * @return 带有RFM打分和标签的数据集
   */
  def rfmGradation(dataSet:DataFrame):DataFrame={

    //一般情况下,做RFM模型,使用的是过去一年的订单数

    /**  计算RFM的值 */

    //计算R: 每个用户最近一次消费距今的时间间隔
    //datediff: 计算两个日期的间隔
    //to_date : String 转 date

    val r_agg = datediff(
      max(to_date(col("current_time"))),
      max(to_date(col("finish_time"))) //获取finish_time的最大值
    ).as("r")

    //计算F: 每个用户在指定时间范围内的消费次数
    val f_agg = count(col("*")).as("f")

    //计算M:每个用户在指定时间范围内的消费总额

    val m_agg = sum(col("final_total_amount")).as("m")

    //按用户id聚合获取RFM
    val rfm_data =
      dataSet.groupBy(col("user_id")).agg(r_agg,f_agg,m_agg)

    println("########计算RFM#############")
    rfm_data.show(false)

    /** 给RFM打分 (5分制) */

    //R_SCORE: 1-3天=5分,4-6天=4分,7-9天=3分,10-15天=2分,大于16天=1分
    val r_score = when(col("r")>=1&&col("r")<=3,5)
        .when(col("r")>=4&&col("r")<=6,4)
        .when(col("r")>=7&&col("r")<=9,3)
        .when(col("r")>=10&&col("r")<=15,2)
        .when(col("r")>=16,1)
        .as("r_score")

    //F_SCORE: ≥100次=5分,80-99次=4分,50-79次=3分,20-49次=2分,小于20次=1分
    val f_score = when(col("f")>=100,5)
      .when(col("f")>=80 && col("f")<=99,4)
      .when(col("f")>=50 && col("f")<=79,3)
      .when(col("f")>=20 && col("f")<=49,2)
      .when(col("f")<20,1)
      .as("f_score")

    //M_SCORE: ≥10000=5分,8000-10000=4分,5000-8000=3分,2000-5000=2分,<2000=1分
    val m_score = when(col("m")>=10000,5)
      .when(col("m")>=8000 && col("m")<10000,4)
      .when(col("m")>=5000 && col("m")<8000,3)
      .when(col("m")>=2000 && col("m")<5000,2)
      .when(col("m")<2000,1)
      .as("m_score")

    val rfm_score = rfm_data.withColumn("r_score",r_score)
        .withColumn("f_score",f_score)
        .withColumn("m_score",m_score)

    println("###########R,F,M打分####################")
    rfm_score.show(false)

    //计算RFM的总分,权重根据实际业务进行更改
    val _rfm_w_score = (col("r_score")*0.6
      +col("f_score")*0.3
      +col("m_score")*0.1
      ).as("rfm_score")

    val rfm_w_score = rfm_score.withColumn("rfm_score",_rfm_w_score)

    println("##########RFM的总分值###############")
    rfm_w_score.orderBy(desc("rfm_score")).show(false)

    val hive_rfm_w_score = rfm_w_score.select(
      col("user_id"),
      col("r"),
      col("f"),
      col("m")
    )
    println("##########准备写入到Hive数仓rfm表###############")
    hive_rfm_w_score.show(false)

    /** 打标签 */

    //重要价值用户  1
    //重要保持用户  2
    //一般价值用户  3

    //RFM_SCORE >= 9: 重要价值用户
    //RFM_SCORE >= 5 && RFM_SCORE < 9: 重要保持用户
    //RFM_SCORE < 5: 一般价值用户


    val tag_rule = when(col("rfm_score")>=9,1)
        .when(col("rfm_score")>=5&&col("rfm_score")<9
          ,2)
    .when(col("rfm_score")<5,3)

    val _rfm_tag = rfm_w_score.withColumn("tag_rule",tag_rule)

    val rfm_tag = TagUtils.taggingByRule(_rfm_tag,"rfm客户模型")

    println("########RFM客户价值标签#############")
    val hive_rfm_tag = rfm_tag.select(col("user_id"),
      col("tag_name_cn").as("tag_id"),
      col("tag_name").as("tag_value"))
    hive_rfm_tag.show(false)

    dataSet

  }

}
RFM模型是一种用于客户价值分析的常用工具,它根据客户最近一次购买时间(Recency)、购买频率(Frequency)和购买金额(Monetary)三个维度来对客户进行分类。在pyspark中,我们可以使用Spark SQL和DataFrame API来计算RFM模型。 首先,读入包含客户购买信息的数据集,并将其转换成DataFrame格式。假设数据集包含以下列:customer_id、transaction_date、transaction_amount。 ```python from pyspark.sql.functions import * from pyspark.sql.window import Window # 读入数据集 df = spark.read.csv("path/to/dataset", header=True, inferSchema=True) # 计算RFM模型 rfm = df.groupBy("customer_id") \ .agg(max("transaction_date").alias("recency"), count("transaction_amount").alias("frequency"), sum("transaction_amount").alias("monetary")) # 计算最近一次购买时间当前时间的差值(以天为单位) rfm = rfm.withColumn("recency_days", datediff(current_date(), col("recency"))) # 计算频率和金额的排名 w1 = Window.orderBy(desc("frequency")) w2 = Window.orderBy(desc("monetary")) rfm = rfm.withColumn("frequency_rank", rank().over(w1)) \ .withColumn("monetary_rank", rank().over(w2)) # 计算RFM得分 rfm = rfm.withColumn("recency_score", when(col("recency_days") <= 30, 5) .when((col("recency_days") > 30) & (col("recency_days") <= 90), 4) .when((col("recency_days") > 90) & (col("recency_days") <= 180), 3) .when((col("recency_days") > 180) & (col("recency_days") <= 365), 2) .otherwise(1)) \ .withColumn("frequency_score", when(col("frequency_rank") <= 20, 5) .when((col("frequency_rank") > 20) & (col("frequency_rank") <= 50), 4) .when((col("frequency_rank") > 50) & (col("frequency_rank") <= 100), 3) .when((col("frequency_rank") > 100) & (col("frequency_rank") <= 200), 2) .otherwise(1)) \ .withColumn("monetary_score", when(col("monetary_rank") <= 20, 5) .when((col("monetary_rank") > 20) & (col("monetary_rank") <= 50), 4) .when((col("monetary_rank") > 50) & (col("monetary_rank") <= 100), 3) .when((col("monetary_rank") > 100) & (col("monetary_rank") <= 200), 2) .otherwise(1)) # 计算总得分 rfm = rfm.withColumn("rfm_score", col("recency_score") + col("frequency_score") + col("monetary_score")) ``` 最后,我们可以根据RFM得分对客户进行分类,例如将得分在10-15分之间的客户分类为“重要保持”(important retain)类别,将得分在5-9分之间的客户分类为“重点发展”(focus development)类别等等。 以上就是在pyspark中计算RFM模型的一个示例。当然,具体的RFM模型计算方式可能因不同业务场景而有所不同,需要根据实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值