跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python算法

使用 Python 进行 RFM 分析

RFM 分析基于最近一次消费、消费频率和消费金额评估客户价值。通过 Python 代码实现数据清洗、RFM 值计算、评分分配及客户细分,并结合可视化图表分析各价值段客户的分布与特征,为营销策略提供数据支持。

DevOpsTeam发布于 2025/2/5更新于 2026/6/1220 浏览
使用 Python 进行 RFM 分析

RFM 分析用于根据客户的购买行为来了解和细分客户。RFM 代表最近一次消费 (Recency)、消费频率 (Frequency) 和消费金额 (Monetary),这是三个关键指标,可提供有关客户参与度、忠诚度和企业价值的信息。

RFM 分析:概述

RFM 分析是数据科学专业人员使用的一个概念,特别是在营销领域,用于根据客户的购买行为来理解和细分客户。

使用 RFM 分析,企业可以评估客户的:

  • Recency(他们最后一次购买的日期)
  • Frequency(购买的频率)
  • Monetary(购买的金额)

这是提供有关客户参与度、忠诚度和对企业价值的信息的三个关键指标。

要使用 Python 执行 RFM 分析,我们需要一个包含客户 ID、购买日期和交易金额的数据集。有了这些信息,我们可以计算每个客户的 RFM 值,并分析他们的模式和行为。

使用 Python 进行 RFM 分析
import pandas as pd
import plotly.express as px
import plotly.io as pio
import plotly.graph_objects as go
pio.templates.default = "plotly_white"

data = pd.read_csv("rfm_data.csv")
print(data.head())

输出

text
   CustomerID PurchaseDate  TransactionAmount ProductInformation  OrderID  \
0        8814   2023-04-11             943.31          Product C   890075   
1        2188   2023-04-11             463.70          Product A   176819   
2        4608   2023-04-11              80.28          Product       
                         
                         

     
       
      
     
      
       
A
340062
3
2559
2023-04-11
221.29
Product
A
239145
4
9482
2023-04-11
739.56
Product
A
194545
Location
0
Tokyo
1
London
2
New
York
3
London
4
Paris
计算 RFM 值
from datetime import datetime

# Convert 'PurchaseDate' to datetime
data['PurchaseDate'] = pd.to_datetime(data['PurchaseDate'])

# Calculate Recency
data['Recency'] = (datetime.now().date() - data['PurchaseDate'].dt.date).dt.days

# Calculate Frequency
frequency_data = data.groupby('CustomerID')['OrderID'].count().reset_index()
frequency_data.rename(columns={'OrderID': 'Frequency'}, inplace=True)
data = data.merge(frequency_data, on='CustomerID', how='left')

# Calculate Monetary Value
monetary_data = data.groupby('CustomerID')['TransactionAmount'].sum().reset_index()
monetary_data.rename(columns={'TransactionAmount': 'MonetaryValue'}, inplace=True)
data = data.merge(monetary_data, on='CustomerID', how='left')

为了计算最近时间,我们从当前日期中减去购买日期,并使用 datetime.now().date() 函数提取天数。它给出了自客户上次购买以来的天数,代表了他们的最近价值。

然后,我们计算了每个客户的频率。我们按'CustomerID'对数据进行分组,并计算唯一'OrderID'值的数量,以确定每个客户的购买次数。它给出了频率值,代表每个客户的购买总数。

最后,我们计算了每个客户的货币价值。我们按'CustomerID'对数据进行分组,并对'TransactionAmount'值进行求和,以计算每个客户的总支出。它为我们提供货币价值,代表每个客户的总货币贡献。

通过执行这些计算,我们现在为每个客户提供了必要的 RFM 值,这是了解 RFM 分析中客户行为和细分的重要指标。

在继续之前,让我们看看结果数据:

print(data.head())

输出

text
   CustomerID PurchaseDate  TransactionAmount ProductInformation  OrderID  \
0        8814   2023-04-11             943.31          Product C   890075   
1        2188   2023-04-11             463.70          Product A   176819   
2        4608   2023-04-11              80.28          Product A   340062   
3        2559   2023-04-11             221.29          Product A   239145   
4        9482   2023-04-11             739.56          Product A   194545   

   Location  Recency  Frequency  MonetaryValue  
0     Tokyo       62          1         943.31  
1    London       62          1         463.70  
2  New York       62          1          80.28  
3    London       62          1         221.29  
4     Paris       62          1         739.56  
计算 RFM 评分
# Define scoring criteria for each RFM value
recency_scores = [5, 4, 3, 2, 1]  # Higher score for lower recency (more recent)
frequency_scores = [1, 2, 3, 4, 5]  # Higher score for higher frequency
monetary_scores = [1, 2, 3, 4, 5]  # Higher score for higher monetary value

# Calculate RFM scores
data['RecencyScore'] = pd.cut(data['Recency'], bins=5, labels=recency_scores)
data['FrequencyScore'] = pd.cut(data['Frequency'], bins=5, labels=frequency_scores)
data['MonetaryScore'] = pd.cut(data['MonetaryValue'], bins=5, labels=monetary_scores)

分配从 5 到 1 的分数来计算 recency 分数,其中分数越高表示最近的购买。这意味着最近购买的客户将获得更高的 recency 分数。

分配从 1 到 5 的分数来计算 frequency 分数,其中较高的分数表示较高的购买频率。购买频率更高的客户将获得更高的频率分数。

为了计算 monetary 分数,分配从 1 到 5 的分数,其中较高的分数表示客户花费的金额较高。

为了计算 RFM 分数,我们使用 pd.cut() 函数将 recency、frequency 和 monetary 划分到 bin 中。我们为每个值定义 5 个 bin,并为每个 bin 分配相应的分数。

一旦将分数添加到数据中,您将注意到它们是分类变量。您可以使用 data.info() 方法来确认这一点。因此,我们需要将它们的数据类型转换为整数,以进一步使用这些分数:

# Convert RFM scores to numeric type
data['RecencyScore'] = data['RecencyScore'].astype(int)
data['FrequencyScore'] = data['FrequencyScore'].astype(int)
data['MonetaryScore'] = data['MonetaryScore'].astype(int)
RFM 值划分

现在,让我们根据分数计算最终 RFM 分数和价值段:

# Calculate RFM score by combining the individual scores
data['RFM_Score'] = data['RecencyScore'] + data['FrequencyScore'] + data['MonetaryScore']

# Create RFM segments based on the RFM score
segment_labels = ['Low-Value', 'Mid-Value', 'High-Value']
data['Value Segment'] = pd.qcut(data['RFM_Score'], q=3, labels=segment_labels)

为了计算 RFM 分数,我们将 Recency,Frequency 和 Monetary 的分数相加。例如,如果客户的 Recency 得分为 3,Frequency 得分为 4,Monetary 得分为 5,则其 RFM 得分将为 12。

在计算 RFM 分数之后,我们基于分数创建 RFM 段。我们将 RFM 分数分为三个部分,即'低价值'、'中等价值'和'高价值'。分段是使用 pd.qcut() 函数完成的,该函数在分段之间均匀分布分数。

print(data.head())

输出

text
   CustomerID PurchaseDate  TransactionAmount ProductInformation  OrderID  \
0        8814   2023-04-11             943.31          Product C   890075   
1        2188   2023-04-11             463.70          Product A   176819   
2        4608   2023-04-11              80.28          Product A   340062   
3        2559   2023-04-11             221.29          Product A   239145   
4        9482   2023-04-11             739.56          Product A   194545   

   Location  Recency  Frequency  MonetaryValue  RecencyScore  FrequencyScore  \
0     Tokyo       62          1         943.31             1               1   
1    London       62          1         463.70             1               1   
2  New York       62          1          80.28             1               1   
3    London       62          1         221.29             1               1   
4     Paris       62          1         739.56             1               1   

   MonetaryScore  RFM_Score Value Segment  
0              2          4     Low-Value  
1              1          3     Low-Value  
2              1          3     Low-Value  
3              1          3     Low-Value  
4              2          4     Low-Value  

现在我们来看看分布情况:

[图表:RFM 价值段分布]

RFM 客户细分

我们计算的上述片段是 RFM 值片段。现在,我们将计算 RFM 客户细分。RFM 价值段表示基于客户的 RFM 分数将客户分类为诸如'低价值'、'中等价值'和'高价值'的组。通过将 RFM 分数划分为不同的范围或组来确定这些分段,从而允许对总体客户 RFM 特征进行更细粒度的分析。RFM 价值部分帮助我们了解客户在 Recency,Frequency 和 Monetary 方面的相对价值。

现在,让我们创建并分析 RFM 客户细分,这些细分是基于 RFM 分数的更广泛的分类。在 Recency,Frequency 和 Monetary 方面,以下是如何创建 RFM 客户细分:

# Create a new column for RFM Customer Segments
data['RFM Customer Segments'] = ''

# Assign RFM segments based on the RFM score
data.loc[data['RFM_Score'] >= 9, 'RFM Customer Segments'] = 'Champions'
data.loc[(data['RFM_Score'] >= 6) & (data['RFM_Score'] < 9), 'RFM Customer Segments'] = 'Potential Loyalists'
data.loc[(data['RFM_Score'] >= 5) & (data['RFM_Score'] < 6), 'RFM Customer Segments'] = 'At Risk Customers'
data.loc[(data['RFM_Score'] >= 4) & (data['RFM_Score'] < 5), 'RFM Customer Segments'] = "Can't Lose"
data.loc[(data['RFM_Score'] >= 3) & (data['RFM_Score'] < 4), 'RFM Customer Segments'] = "Lost"

# Print the updated data with RFM segments
print(data[['CustomerID', 'RFM Customer Segments']])

在上面的代码中,我们根据 RFM 分数将 RFM 细分给客户,然后在数据中创建一个名为'RFM Customer Segments'的新列。

RFM 分析

现在,让我们分析每个价值细分中不同 RFM 客户细分的客户分布:

segment_product_counts = data.groupby(['Value Segment', 'RFM Customer Segments']).size().reset_index(name='Count')

segment_product_counts = segment_product_counts.sort_values('Count', ascending=False)

fig_treemap_segment_product = px.treemap(segment_product_counts, 
                                         path=['Value Segment', 'RFM Customer Segments'], 
                                         values='Count',
                                         color='Value Segment', color_discrete_sequence=px.colors.qualitative.Pastel,
                                         title='RFM Customer Segments by Value')
fig_treemap_segment_product.show()

[图表:RFM 客户细分按价值分布]

现在让我们分析 Champions 细分市场中 RFM 值的分布:

# Filter the data to include only the customers in the Champions segment
champions_segment = data[data['RFM Customer Segments'] == 'Champions']

fig = go.Figure()
fig.add_trace(go.Box(y=champions_segment['RecencyScore'], name='Recency'))
fig.add_trace(go.Box(y=champions_segment['FrequencyScore'], name='Frequency'))
fig.add_trace(go.Box(y=champions_segment['MonetaryScore'], name='Monetary'))

fig.update_layout(title='Distribution of RFM Values within Champions Segment',
                  yaxis_title='RFM Value',
                  showlegend=True)

fig.show()

[图表:Champions 细分市场 RFM 值分布]

现在,让我们分析 Champions 细分市场中的 RFM 之间的相关性:

correlation_matrix = champions_segment[['RecencyScore', 'FrequencyScore', 'MonetaryScore']].corr()

# Visualize the correlation matrix using a heatmap
fig_heatmap = go.Figure(data=go.Heatmap(
                   z=correlation_matrix.values,
                   x=correlation_matrix.columns,
                   y=correlation_matrix.columns,
                   colorscale='RdBu',
                   colorbar=dict(title='Correlation')))

fig_heatmap.update_layout(title='Correlation Matrix of RFM Values within Champions Segment')

fig_heatmap.show()

[图表:Champions 细分市场 RFM 相关性热力图]

现在让我们来看看所有细分市场的客户数量:

import plotly.colors

pastel_colors = plotly.colors.qualitative.Pastel

segment_counts = data['RFM Customer Segments'].value_counts()

# Create a bar chart to compare segment counts
fig = go.Figure(data=[go.Bar(x=segment_counts.index, y=segment_counts.values,
                            marker=dict(color=pastel_colors))])

# Set the color of the Champions segment as a different color
champions_color = 'rgb(158, 202, 225)'
fig.update_traces(marker_color=[champions_color if segment == 'Champions' else pastel_colors[i]
                               for i, segment in enumerate(segment_counts.index)],
                  marker_line_color='rgb(8, 48, 107)',
                  marker_line_width=1.5, opacity=0.6)

# Update the layout
fig.update_layout(title='Comparison of RFM Segments',
                  xaxis_title='RFM Segments',
                  yaxis_title='Number of Customers',
                  showlegend=False)

fig.show()

[图表:RFM 细分市场客户数量对比]

现在让我们来看看所有细分市场的 Recency,Frequency 和 Monetary 分数:

# Calculate the average Recency, Frequency, and Monetary scores for each segment
segment_scores = data.groupby('RFM Customer Segments')['RecencyScore', 'FrequencyScore', 'MonetaryScore'].mean().reset_index()

# Create a grouped bar chart to compare segment scores
fig = go.Figure()

# Add bars for Recency score
fig.add_trace(go.Bar(
    x=segment_scores['RFM Customer Segments'],
    y=segment_scores['RecencyScore'],
    name='Recency Score',
    marker_color='rgb(158,202,225)'
))

# Add bars for Frequency score
fig.add_trace(go.Bar(
    x=segment_scores['RFM Customer Segments'],
    y=segment_scores['FrequencyScore'],
    name='Frequency Score',
    marker_color='rgb(94,158,217)'
))

# Add bars for Monetary score
fig.add_trace(go.Bar(
    x=segment_scores['RFM Customer Segments'],
    y=segment_scores['MonetaryScore'],
    name='Monetary Score',
    marker_color='rgb(32,102,148)'
))

# Update the layout
fig.update_layout(
    title='Comparison of RFM Segments based on Recency, Frequency, and Monetary Scores',
    xaxis_title='RFM Segments',
    yaxis_title='Score',
    barmode='group',
    showlegend=True
)

fig.show()

[图表:各细分市场 RFM 分数对比]

总结

RFM 分析用于根据客户的购买行为来了解和细分客户。RFM 代表 Recency,Frequency 和 Monetary,这是三个关键指标,可提供有关客户参与度、忠诚度和企业价值的信息。

目录

  1. RFM 分析:概述
  2. 使用 Python 进行 RFM 分析
  3. 计算 RFM 值
  4. Convert 'PurchaseDate' to datetime
  5. Calculate Recency
  6. Calculate Frequency
  7. Calculate Monetary Value
  8. 计算 RFM 评分
  9. Define scoring criteria for each RFM value
  10. Calculate RFM scores
  11. Convert RFM scores to numeric type
  12. RFM 值划分
  13. Calculate RFM score by combining the individual scores
  14. Create RFM segments based on the RFM score
  15. RFM 客户细分
  16. Create a new column for RFM Customer Segments
  17. Assign RFM segments based on the RFM score
  18. Print the updated data with RFM segments
  19. RFM 分析
  20. Filter the data to include only the customers in the Champions segment
  21. Visualize the correlation matrix using a heatmap
  22. Create a bar chart to compare segment counts
  23. Set the color of the Champions segment as a different color
  24. Update the layout
  25. Calculate the average Recency, Frequency, and Monetary scores for each segment
  26. Create a grouped bar chart to compare segment scores
  27. Add bars for Recency score
  28. Add bars for Frequency score
  29. Add bars for Monetary score
  30. Update the layout
  31. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Python 核心数据结构:集合与冻结集合
  • Graylog开源日志管理平台核心优势与部署指南
  • macOS 安装 Claude Code 后无法启动的排查与修复指南
  • JSP 基础:深入理解前后端交互与核心对象
  • Flutter 三方库 objectid:离线分布式高可用 ID 引擎
  • 三本必读的 AI 大模型开发指南
  • Neo4j Desktop 安装与使用:本地实例、远程连接及数据导入
  • Java 数据类型、运算符与方法核心总结
  • SkyWalking Python 应用追踪实战:基于 skywalking-python 的埋点
  • Python 高级编程技术详解与实战
  • Rust 系统编程核心技能——文件操作与网络编程基础及进阶
  • Android 手机本地运行 Stable Diffusion 的开源方案
  • DeepSeek 深度使用指南与高效提示词技巧
  • LeetCode 34 在排序数组中查找元素的第一个和最后一个位置
  • ProtonVPN iOS/Mac 应用项目结构及配置教程
  • Git 拉取时分支分歧错误解决方案
  • AI 重构电力电子设计:从工程师直觉到算法驱动的范式跃迁
  • 使用 InstantID 在 SDXL 模型中生成 AI 写真
  • 低代码诞生的背景与软件复杂度累积
  • GitHub Copilot 接入第三方模型 API 配置指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online