引言
数据分析是当今信息时代的核心驱动力,通过深入挖掘数据,企业能够更好地了解其客户、市场和业务。在这篇博客中,我们将探讨一种强大的数据分析方法,即RFM分析,它是一种用于理解客户行为和价值的工具。我们将首先介绍数据分析的重要性,然后深入研究RFM分析,解释其核心概念,以及在哪些领域它可以发挥关键作用。
什么是RFM分析?
RFM分析是一种数据驱动的方法,用于分析和理解客户行为。它的名称来源于三个关键指标:Recency(最近一次交易时间)、Frequency(购买频率)和Monetary(购买金额)。这些指标被广泛应用于各种行业,从零售到电子商务,以帮助企业更好地理解客户,并制定相关的营销策略。
核心概念
Recency(最近一次交易时间):Recency衡量客户最近一次交易或互动的时间。这是一个关键的指标,因为它反映了客户的活跃度。通常,较近期的交易代表客户更有可能再次购买。
举例:假设你是一家在线服装店的所有者,你想知道哪些客户最近购买了你的商品。Recency指标将告诉你谁在最近的一段时间内进行了购物。
Frequency(购买频率):Frequency测量客户在特定时间段内的购买次数。高频率的客户通常更忠诚,因为他们反复购买你的产品或服务。
举例:继续考虑在线服装店,Frequency指标将揭示哪些客户是经常购物的忠实顾客,哪些则较少购物。
Monetary(购买金额):Monetary度量客户在一段时间内的总购买金额。购买金额是一个关键的指标,因为它表明客户对你的产品或服务的实际价值。
举例:通过查看购买金额,你可以发现哪些客户每次购物都花费大量资金,这对于定价和促销策略的制定非常重要。
RFM分析通过综合考虑这三个指标,可以帮助企业识别出不同类型的客户,如忠实客户、潜在客户和流失客户,从而制定有针对性的策略以提高客户满意度和营业额。
RFM分析的步骤和原理
RFM分析通常包括以下四个主要步骤:数据预处理、计算RFM指标、分段划分和用户特征分析
1. 数据预处理
数据预处理是任何数据分析项目的首要任务。在RFM分析中,数据通常来自不同的交易记录,因此需要经过整理和清洗,以确保数据的质量和一致性。
- 数据收集:收集来自不同渠道的交易数据,包括购买日期、交易金额等。
- 数据清洗:识别和处理缺失数据、异常值和重复记录,确保数据的准确性。
- 数据筛选:根据分析的目标,筛选出需要的交易记录信息,通常包括客户ID、交易日期和金额。
2. 计算RFM指标
一旦数据准备就绪,下一步是计算每个客户的RFM指标。这些指标将成为分析客户价值的基础。
计算Recency(R)
Recency指标衡量了客户最近一次交易的时间。通常,最近一次交易日期距离当前日期越近的客户,其Recency值越高。
计算Frequency(F)
Frequency指标度量了客户在一段时间内的购买频率。高频率购买的客户将具有较高的Frequency值。
计算Monetary(M)
Monetary指标代表客户在一段时间内的总购买金额。购买金额高的客户将具有较高的Monetary值。
3. 分段划分
一旦计算出每个客户的RFM值,接下来的任务是将客户分成不同的群体,以便更好地理解他们的特征和行为。分段通常涉及到将每个指标分成若干组,如高、中、低,然后将这些组合起来形成不同的RFM组合。这将帮助我们识别出不同类型的客户,例如:
RFM群组 | 最近购买时间(Recency) | 购买频率(Frequency) | 消费金额(Monetary) |
---|---|---|---|
忠实客户 | 高 | 高 | 高 |
潜在客户 | 低 | 中 | 中 |
流失客户 | 低 | 低 | 低 |
根据上述表格,我们可以看到不同类型客户的RFM指标特征。忠实客户在最近购买时间、购买频率和消费金额方面都表现出较高水平;潜在客户在这些指标上的表现相对中等;而流失客户在这些指标上都表现较低。
4. 用户特征分析
对每个RFM群体进行深入分析,以了解他们的特征和行为。这有利于制定有针对性的营销策略和服务改进措施。例如:
- 忠实客户:我们可以为他们提供专门的奖励计划,以激励他们继续购买。
- 潜在客户:我们可以发送定制的促销信息,以吸引他们成为忠实客户。
- 流失客户:我们可以尝试重新吸引他们通过特殊的优惠和个性化的沟通。
实战案例
本数据来自kaggle社区开放数据集”Tiktok E-Commerce Data”,鉴于数据集缺少 Recency 这个最近购买日期字段,以下均重点针对 Monetary与Frequency,并针对其他维度做分析
数据集源链接:https://www.kaggle.com/datasets/hanshunfan/tiktok-ecommerce-data
步骤1:数据预处理
import pandas as pd
# 读取csv数据集文件
file_path = 'E:\data\douyin.csv'
df = pd.read_csv(file_path)
# 查看数据看字段,查看基本信息
df.head()
df.info()
为了进行RFM分析,主要关注以下几个字段:
user_id
: 用户ID,用于标识不同的用户。gmv
: 交易金额,用于计算Monetary值。unit_sold
: 销售数量,可以用于辅助计算Frequency值。
首先,对数据进行清洗,以便仅保留有用的信息。
- 删除没有
user_id
的记录。 - 确保所有数值字段(如
gmv
和unit_sold
)都是数值类型。
# 数据清理
# 删除'user_id'为NaN的行
df_cleaned = df.dropna(subset=['user_id'])
# 确保'gmv'和'unit_sold'是数字
df_cleaned.loc[:, 'gmv'] = pd.to_numeric(df_cleaned['gmv'], errors='coerce')
df_cleaned.loc[:, 'unit_sold'] = pd.to_numeric(df_cleaned['unit_sold'], errors='coerce')
# 删除以下字段包含NaN值的行
df_cleaned = df_cleaned.dropna(subset=['user_id', 'gmv', 'unit_sold'])
# 查看清洗后的前5行
df_cleaned.head()
步骤2:计算RFM指标
在这一步,计算每个用户的Recency(最近一次购买)、Frequency(购买频率)和Monetary(消费金额)值。
由于提供的数据集没有具体的交易日期,无法计算Recency。不过Frequency和Monetary是可以计算的。
- Frequency: 对每个用户,计算其总的购买次数。
- Monetary: 对每个用户,计算其总的消费金额(
gmv
字段)。
# 计算每个用户的频率和消费值
# frequency:统计每个用户的消费频率
frequency_df = df_cleaned.groupby('user_id')['spu_id'].count().reset_index()
frequency_df.columns = ['user_id', 'Frequency']
# Monetary:汇总每个用户的总GMV
monetary_df = df_cleaned.groupby('user_id')['gmv'].sum().reset_index()
monetary_df.columns = ['user_id', 'Monetary']
# 合并频率和货币数据框架
rfm_df = pd.merge(frequency_df, monetary_df, on='user_id')
# 显示RFM DataFrame的前几行
rfm_df.head()
user_id Frequency Monetary
0 6.633285e+07 14 4608.959091
1 1.000428e+09 1 198.000000
2 2.595599e+09 5 3588.220000
3 2.613651e+09 3 191300.900000
4 2.748420e+09 2 164.000000
步骤3:分段划分
根据Frequency和Monetary值将用户分为不同的群体。通常,这一步使用分位数或自定义阈值来进行。
- 高频率、高消费(High Frequency, High Monetary)
- 高频率、低消费(High Frequency, Low Monetary)
- 低频率、高消费(Low Frequency, High Monetary)
- 低频率、低消费(Low Frequency, Low Monetary)
# 计算每个用户的消费频率和消费金额
frequency_quartiles = rfm_df['Frequency'].quantile([.25, .5, .75]).to_dict()
monetary_quartiles = rfm_df['Monetary'].quantile([.25, .5, .75]).to_dict()
# 创建一个Segment列,并将其初始化为空字符串
rfm_df['Segment'] = ''
# 高频率、高消费
rfm_df.loc[(rfm_df['Frequency'] > frequency_quartiles[0.75]) & (rfm_df['Monetary'] > monetary_quartiles[0.75]), 'Segment'] = 'High Frequency, High Monetary'
# 高频率、低消费
rfm_df.loc[(rfm_df['Frequency'] > frequency_quartiles[0.75]) & (rfm_df['Monetary'] <= monetary_quartiles[0.25]), 'Segment'] = 'High Frequency, Low Monetary'
# 低频率、高消费
rfm_df.loc[(rfm_df['Frequency'] <= frequency_quartiles[0.25]) & (rfm_df['Monetary'] > monetary_quartiles[0.75]), 'Segment'] = 'Low Frequency, High Monetary'
# 低频率、低消费
rfm_df.loc[(rfm_df['Frequency'] <= frequency_quartiles[0.25]) & (rfm_df['Monetary'] <= monetary_quartiles[0.25]), 'Segment'] = 'Low Frequency, Low Monetary'
rfm_df.head()
user_id Frequency Monetary Segment
0 6.633285e+07 14 4608.959091 High Frequency, High Monetary
1 1.000428e+09 1 198.000000
2 2.595599e+09 5 3588.220000 High Frequency, High Monetary
3 2.613651e+09 3 191300.900000
4 2.748420e+09 2 164.000000
用户分段已经完成!现在,已经根据Frequency和Monetary值将用户分为了不同的群体。
步骤4:分析用户特征
最后一步,将对这些不同的用户群体进行深入分析,以了解其特征和行为。
计算每个用户群体的平均Frequency和Monetary值。
# 通过计算平均频率和消费值来分析每个部分的特征
segment_analysis = rfm_df.groupby('Segment').agg({
'Frequency': 'mean',
'Monetary': 'mean',
'user_id': 'count'
}).reset_index()
# 重命名列
segment_analysis.columns = ['Segment', 'Average Frequency', 'Average Monetary', 'Number of Users']
# 显示
segment_analysis
Segment Average Frequency Average Monetary Number of Users
0 2.031206 3811.007892 23265
1 High Frequency, High Monetary 22.006266 235958.656175 5426
2 High Frequency, Low Monetary 4.315789 71.264366 19
3 Low Frequency, High Monetary 1.000000 75065.532261 2638
4 Low Frequency, Low Monetary 1.000000 45.086967 9646
不同用户群体的平均Frequency和Monetary值,以及每个群体中的用户数量:
- 高频率、高消费(High Frequency, High Monetary): 平均购买次数为22次,平均消费金额约为235,958。有5,426名用户属于这一类。
- 高频率、低消费(High Frequency, Low Monetary): 平均购买次数为4次,平均消费金额约为71。仅有19名用户属于这一类。
- 低频率、高消费(Low Frequency, High Monetary): 平均购买次数为1次,平均消费金额约为75,065。有2,638名用户属于这一类。
- 低频率、低消费(Low Frequency, Low Monetary): 平均购买次数为1次,平均消费金额约为45。有9,646名用户属于这一类。
不同维度分析
以上针对数据按照rfm步骤进行分析,现在针对以下四个维度进行分析
- 购买频率(Frequency): 展示不同购买频率的用户数量。
- 购买金额(Monetary): 展示用户的购买金额分布。
- 平均交易价值: 展示用户的平均交易价值分布。
- 用户分段(Segment): 展示各个用户分段的数量。
创建一个包含四个子图的可视化图形,每个子图都用于展示不同的RFM相关信息,包括购买频率、购买金额、平均交易价值和用户分组。展现不同用户群体的分布和行为。
import matplotlib.pyplot as plt
import seaborn as sns
# 设置可视化样式为白色网格
sns.set(style="whitegrid")
# 初始化图表
plt.figure(figsize=(20, 15))
# 创建2行2列的子图布局
plt.subplots_adjust(hspace=0.5, wspace=0.3)
# 子图1:频率(Frequency)的分布
plt.subplot(2, 2, 1)
sns.distplot(rfm_df['Frequency'], bins=50, kde=False, color='skyblue')
plt.title('Frequency distribution')
plt.xlabel('Frequency')
plt.ylabel('Number of users')
# 子图2:消费金额(Monetary)的分布
plt.subplot(2, 2, 2)
sns.distplot(rfm_df['Monetary'], bins=50, kde=False, color='skyblue')
plt.title('Monetary distribution')
plt.xlabel('Monetary')
plt.ylabel('Number of users')
# 平均交易金额
rfm_df['Average Transaction Value'] = rfm_df['Monetary'] / rfm_df['Frequency']
# 子图3:平均交易金额(Average Transaction Value)的分布
plt.subplot(2, 2, 3)
sns.distplot(rfm_df['Average Transaction Value'], bins=50, kde=False, color='skyblue')
plt.title('Average Transaction Value distribution')
plt.xlabel('Average Transaction Value')
plt.ylabel('Number of users')
# 子图4:用户群体(Segment)的数量统计
plt.subplot(2, 2, 4)
sns.countplot(y='Segment', data=rfm_df, order=rfm_df['Segment'].value_counts().index, palette='viridis')
plt.title('Count of user segments')
plt.xlabel('Number of users')
plt.ylabel('User segments')
plt.show()
分析和可视化结果
- 购买频率(Frequency): 大多数用户的购买频率较低,集中在10次以下。
- 购买金额(Monetary): 大多数用户的消费金额也相对较低,集中在10,000以下。
- 平均交易价值: 大部分用户的平均交易价值在10,000以下,这可能意味着多数用户更倾向于小额频繁的交易。
- 用户分段(Segment): 最多的用户属于“高频率、高消费”和“低频率、低消费”的分类。
总结
- 用户行为:现有的数据提供了关于用户购买频率和消费金额的有用信息,便于了解客户群体。
- 目标设定:通过用户分段,更有效地针对不同类型的用户进行个性化的营销活动。
- 价值识别:平均交易价值的计算用于识别哪些用户在单笔交易上可能带来更高的价值。
结语
RFM分析不仅适用于电商领域,还可以应用于零售、餐饮、金融等各行各业。无论是提升用户留存率、精确定位目标客户、优化产品推荐,还是改进客户服务,RFM分析都能够提供有力的支持和指导。
通过深入应用RFM分析,企业可以更好地洞察客户行为和价值,从而制定更有针对性的战略和决策,实现业务增长和持续竞争优势。数据分析的力量正在改变着各个行业,而RFM分析无疑是其中的一项强大工具,值得企业们深入探索和应用。