利用 RFM 和 CLTV 进行客户价值分析


在当今竞争激烈的商业环境中,了解客户对于推动增长和盈利至关重要。客户关系管理 (CRM) 分析提供了一套强大的工具,可帮助你深入了解客户行为、偏好和终身价值。在这篇博文中,我们将探讨几个关键概念,包括 RFM 分析和客户细分,以及使用 BG-NBD 和 Gamma-Gamma 子模型等先进技术进行客户终身价值 (CLTV) 和 CLTV 预测,并提供详细的代码示例和说明。

RFM 分析和客户细分

RFM 分析是一种简单而有效的技术,可根据客户的购买行为对其进行细分。它代表最近度、频率和货币价值。通过分析这三个指标,企业可以识别最有价值的客户并相应地制定营销策略。

RFM 分析允许对潜在贡献者和客户进行比较。它让组织了解有多少收入来自回头客(相对于新客户),以及他们可以采取哪些措施来让客户更满意,从而让他们成为回头客。

  • 最近次数、频率、价值 (Recency, frequency, monetary value,RFM) 是一种营销分析工具,用于根据客户的消费习惯性质来识别公司的最佳客户。
  • RFM 分析通过三个类别对客户进行评分来评估客户:最近一次购买的时间、购买频率以及购买规模。
  • RFM 模型为三个类别中的每个客户分配 1 到 5 的分数(从最差到最好)。
  • RFM 分析可帮助公司合理地预测哪些客户可能再次购买其产品,有多少收入来自新客户(与回头客),以及如何将偶尔的购买者转变为习惯性购买者。

尽管通过 RFM 分析可以获得有用的信息,但公司必须考虑到,即使是最好的客户也不会希望被过度招揽,而排名较低的客户可能需要额外的营销努力才能培养起来。它可以作为客户群的快照,并作为优先培养客户的工具,但不应将其视为简单地重复使用老套的销售技巧的许可。

推荐阅读👇  
👉移动通信客户价值数据挖掘分析实战
👉使用 LGBM 等模型预测信用卡潜在客户
👉一个企业级数据挖掘实战项目|客户细分模型(上)
👉一个企业级数据挖掘实战项目|客户细分模型(下)
👉客户同期群分析Python实战

以下是使用 Python 执行 RFM 分析的分步示例:

首先,我们导入必要的库并将客户数据加载到 pandas DataFrame 中。

# 导入 #

import pandas as pd
import datetime as dt

# 加载客户数据和描述分析 #

customer_data = pd.read_csv( 'customer_data.csv' ) 
customer_data.head() 
customer_data.shape 
customer_data.describe().T

接下来,我们计算每个客户的三个 RFM 指标:

  • Recency:客户上次购买的天数。计算方法是将所有客户的 today_date 减去每个客户的 LastPurchaseDate
  • Frequency:客户的购买次数。计算方法是按CustomerID 对数据分组,并计算每个客户的唯一InvoiceNo值的数量。
  • Monetary Value:客户产生的总收入。这是通过对数据进行分组CustomerID并计算每个客户的价值Revenue而计算出来的。
# 计算 RFM 指标 # 

# Recency, Frequency, Monetary

today_date = customer_data[ 'LastPurchaseDate' ]. max () + dt.timedelta(days= 2 ) 

customer_data[ 'Recency' ] = (today_date - customer_data[ 'LastPurchaseDate' ]. max ()).dt.days 
customer_data[ 'Frequency' ] = customer_data.groupby( 'CustomerID' )[ 'InvoiceNo' ].nunique() 
customer_data[ 'Monetary' ] = customer_data.groupby( 'CustomerID' )[ 'Revenue' ]. sum () 

customer_data = customer_data[customer_data[ 'monetary' ] > 0 ] 
customer_data.head()

为了计算客户的 RFM 分数,我们首先计算每个指标的分位数。然后,我们使用pd.qcut函数根据每个客户在分位数范围内的相对位置,为其新近度、频率和货币价值分配 1 到 5 的分数。

  • 对于Recency,分数为 5 代表最近的客户,而分数为 1 代表最近的客户。
  • 对于Frequency和Monetary,分数 5 代表最高值,而分数 1 代表最低值。
# 计算 RFM 分数 #

customer_data[ "Recency_Score" ] = pd.qcut(customer_data[ 'Recency' ], 5 , labels=[ 5 , 4 , 3 , 2 , 1 ]) 
customer_data[ "Frequency_Score" ] = pd.qcut(customer_data[ 'Frequency' ].rank(method= "first" ), 5 , labels=[ 1 , 2 , 3 , 4 , 5 ]) 
customer_data[ "Monetary_Score" ] = pd.qcut(customer_data[ 'Monetary' ], 5 , labels=[ 1 , 2 , 3 , 4 , 5 ]) 

customer_data["RF_Score"] = (customer_data['Recency_Score'].astype(str) + customer_data['Frequency_Score'].astype(str))

customer_data.head()

最后,我们将各个 R、F 和 M 分数合并为每个客户的单个 RF 分数。此分数代表客户的整体价值和行为,分数越高,客户价值越高。

使用 RFM 分析进行客户细分 计算出 RF 分数后,你可以根据分数对客户进行细分。这样你就可以识别最有价值的客户(高频率、高货币价值、低新近度)并据此调整你的营销工作。

我们可以使用下表按照行业认可的 RF 评分对客户进行细分:

# 创建和分析 RFM 客户细分 #

seg_map = { r'[1-2][1-2]' : 'hibernating' , 
           r'[1-2][3-4]' : 'at_Risk' , 
           r'[1-2]5' : 'cant_loose' , 
           r'3[1-2]' : 'about_to_sleep' , 
           r'33' : 'need_attention' , 
           r'[3-4][4-5]' : 'loyal_customers' , 
           r'41' : 'promising' , 
           r'51' : 'new_customers' , 
           r'[4-5][2-3]' : 'potential_loyalists' , 
           r'5[4-5]' : 'champions' } 

customer_data['Segment'] = rfm['RF_Score'].replace(seg_map, regex=True)

customer_data[['Segment''Recency''Frequency''Monetary']].groupby('Segment').agg(['mean''count'])

在这里,我们根据客户的 RFM 得分对客户进行分组,并计算每组中的客户数量。这为我们提供了每个 RFM 细分中客户数量的汇总。

有了这些信息,企业可以针对每个细分市场制定有针对性的营销策略,集中精力留住和发展最有价值的客户,同时也探索转化价值较低的细分市场的机会。

CLTV客户生命周期价值

客户生命周期价值 (CLTV) 是营销和客户关系管理中使用的指标,用于估算公司在与单个客户的关系过程中可以从单个客户那里获得的总收入或利润。

以下是 CLTV 的详细解释:

定义

CLTV 表示客户在整个关系期间对企业的预计总价值。这是对未来与客户关系所产生的净利润的预测。

重要性

CLTV 是企业的关键指标,因为它可以帮助企业了解客户的长期价值,并就客户获取、保留和营销策略做出明智的决策。较高的 CLTV 表明客户更有价值,值得投资以保留和培养关系。

应用

  • 客户细分:可以识别具有高 CLTV 的客户,并通过特定的保留和追加销售策略定位这些客户。
  • 营销预算:CLTV 可以帮助确定公司愿意花多少钱来获取新客户或留住现有客户。
  • 资源配置:公司可以根据不同客户群体的CLTV更有效地分配资源。
  • 客户忠诚度计划:CLTV 可以通过瞄准高价值客户来帮助设计和优化忠诚度计划。

局限性

准确计算 CLTV 可能具有挑战性,因为它依赖于历史数据和对未来客户行为的假设。此外,CLTV 可能无法捕捉客户关系的定性方面或推荐和口碑广告的潜力。

计算方法

计算客户价值最常用的方法是用平均购买价值乘以平均购买频率。然后计算 CLTV,即客户价值除以流失率,再乘以利润率。

CLTV =(客户价值/客户流失率)x 利润率
客户价值 = 平均订单价值 x 购买频率
平均订单价值 = 总价格 / 总交易量
购买频率=总交易量/客户总数
流失率 = 1 - 重复率
重复率=多次购买的客户/客户总数

# 计算 CLTV 指标 #

cltv_c = customer_data.groupby('Customer ID').agg({'InvoiceNo'lambda x: x.nunique(),
                                                   'Quantity'lambda x: x.sum(),
                                                   'Revenue'lambda x: x.sum()})

cltv_c.columns = [ 'total_transaction' , 'total_unit' , 'total_price' ] 

# 平均订单价值 (average_order_value = total_price / total_transaction) #

cltv_c[ 'average_order_value' ] = cltv_c[ 'total_price' ] / cltv_c[ 'total_transaction' ] 

# 购买频率 (total_transaction / total_number_of_customers) #

cltv_c[ 'purchase_frequency' ] = cltv_c[ 'total_transaction' ] / cltv_c.shape[ 0 ] 

# 重复率和流失率(查看所有买家的订单/订单数量)#

repeat_rate = cltv_c[cltv_c[ 'total_transaction' ] > 1 ].shape[ 0 ] / cltv_c.shape[ 0 ] 

churn_rate = 1 - repeat_rate 

# 利润率(profit_margin = total_price * 0.10)#

cltv_c[ 'profit_margin' ] = cltv_c[ 'total_price' ] * 0.10 

# 客户价值(customer_value = average_order_value * purchase_frequency)#

cltv_c[ 'customer_value' ] = cltv_c[ 'average_order_value' ] * cltv_c[ 'purchase_frequency' ] 

# 客户生命周期价值 (CLTV = (customer_value / churn_rate) x profits_margin) #

cltv_c[ 'cltv' ] = (cltv_c[ 'customer_value' ] / churn_rate) * cltv_c[ 'profit_margin' ] 

cltv_c.sort_values(by= "cltv" , accending= False ).head()

公司可以根据客户生命周期价值(CLTV)对客户进行细分,并相应地制定策略:

  1. 高 CLTV 客户:

这些是最有价值的客户,他们消费能力强,忠诚度高。

重点通过忠诚度计划和个性化服务来留住他们,并最大限度地增加交叉销售/追加销售的机会。

  1. 中等 CLTV 客户:

这些客户具有增加支出的潜力。

旨在通过有针对性的促销和增强客户体验来提高他们的购买频率和购物篮规模。

  1. 低 CLTV 客户:

低收入潜力群体。

如果可能的话,不要投入大量资金,而应专注于将它们迁移到中/高 CLTV 领域。

对于这一群体来说,基本服务和促销可能就足够了。

# 创建和分析 CLTV 客户细分 #

cltv_c = cltv_c.sort_values(by= 'cltv' , accending= False ) 

cltv_c[ 'Segment' ] = pd.qcut(cltv_c[ 'cltv' ], 4 , labels=[ 'D' , 'C' , 'B' , 'A' ]) 

cltv_c.groupby( 'Segment' ).agg({ 'count' , 'mean' , 'sum' })

对于希望最大化客户关系价值并根据数据制定客户获取和保留策略决策的企业来说,CLTV 是一项重要指标。

使用 BG-NBD 和 Gamma-Gamma 子模型进行 CLTV 预测

虽然传统的 CLTV 计算依赖于平均值和假设,但更先进的技术(如 BG-NBD(Beta-几何/负二项分布)和 Gamma-Gamma 模型)通过考虑客户异质性和非合同设置来提供更准确的 CLTV 预测。

以下是使用 BG-NBD 和 Gamma-Gamma 子模型预测 CLTV 的示例:

首先,我们导入生命周期库,它提供了拟合和使用 BG-NBD 和 Gamma-Gamma 模型所需的功能,并将客户数据加载到 pandas DataFrame 中。

# 导入 #

import datetime as dt
import pandas as pd
import matplotlib.pyplot as plt
from lifetimes import BetaGeoFitter
from lifetimes import GammaGammaFitter
from lifetimes.plotting import plot_period_transactions
from sklearn.preprocessing import MinMaxScaler

# 加载客户数据和描述性分析 #

customer_data = pd.read_csv('customer_data.csv')
customer_data.head()
customer_data.shape
customer_data.describe().T

接下来,我们为 CLTV 建模准备数据。我们从客户数据中提取相关列(CustomerID, InvoiceDate, 和 Revenue),并按客户 ID 对交易进行分组。然后,我们汇总数据,计算每个客户的最小和最大发票日期、交易次数和收入总和。

# 为 CLTV 建模准备数据 # 
def  outlier_thresholds ( dataframe, variable ): 
    quartile1 = dataframe[variable].quantile( 0.01 ) 
    quartile3 = dataframe[variable].quantile( 0.99 ) 
    interquantile_range = quartile3 - quartile1 
    up_limit = quartile3 + 1.5 * interquantile_range 
    low_limit = quartile1 - 1.5 * interquantile_range 
    return low_limit, up_limit 


def  replace_with_thresholds ( dataframe, variable ): 
    low_limit, up_limit = outlier_thresholds(dataframe, variable) 
    # dataframe.loc[(dataframe[variable] < low_limit), variable] = low_limit
     dataframe.loc[(dataframe[variable] > up_limit), variable] = up_limit 

today_date = customer_data['LastPurchaseDate'].max() + dt.timedelta(days=2)

replace_with_thresholds(customer_data, 'Revenue')

cltv_df = customer_data.groupby('Customer ID').agg({'InvoiceDate': [lambda x: (x.max() - x.min()).dt.days,
                                                                    lambda x: (today_date - x.min()).dt.days],
                                                    'InvoiceNo'lambda x: x.nunique(),
                                                    'Revenue'lambda x: x.sum()})
cltv_df.columns = cltv_df.columns.droplevel(0)
cltv_df.columns = ['recency''T''frequency''monetary']
cltv_df['monetary'] = cltv_df['monetary'] / cltv_df['frequency']
cltv_df = cltv_df[(cltv_df['frequency'] > 1)]
cltv_df['recency'] = cltv_df['recency'] / 7
cltv_df['T'] = cltv_df['T'] / 7

cltv_df.info()
cltv_df.head()                                                 

我们创建一个 bgf 变量实例,并使用每个客户的frequency, recency, T 值对数据拟合 BG-NBD 模型。penalizer_coef 参数控制应用于模型系数的正则化程度;在本例中,我们将其设置为 0(无正则化)。

# 拟合 BG-NBD 模型 #

bgf = BetaGeoFitter(penalizer_coef=0.001

bgf.fit(cltv_df[ 'frequency' ], 
        cltv_df[ 'recency' ], 
        cltv_df[ 'T' ]) 

cltv_df[ "expected_purc_3_month" ] = bgf.predict(4 * 3
                                               cltv_df[ 'frequency' ], 
                                               cltv_df[ 'recency' ], 
                                               cltv_df[ 'T' ])

我们创建变量的一个bgf实例,并使用每个客户的frequency,monetaryT值,将 Gamma-Gamma 模型拟合到数据中。参数penalizer_coef控制应用于模型系数的正则化量;在本例中,我们将其设置为 0(无正则化)。

# 拟合 Gamma-Gamma 模型 #

ggf = GammaGammaFitter(penalizer_coef=0.01

ggf.fit(cltv_df[ 'frequency' ], cltv_df[ 'monetary' ]) 

cltv_df[ "expected_average_profit" ] = ggf.conditional_expected_average_profit(cltv_df[ 'frequency' ], 
                                                                             cltv_df[ 'monetary' ])

最后,我们使用拟合的 BG-NBD 模型来预测每个客户的 CLTV。该conditional_expected_average_profit方法根据每个客户的最大观察值InvoiceDate和总值计算出每个客户的预期未来收入Revenue。Gamma-Gamma 模型用于隐式估计预期未来收入,利用客户观察到的交易行为和 BG-NBD 模型参数。

# 使用 BG-NBD 和 GG 模型计算 CLTV #

 cltv = ggf.customer_lifetime_value(bgf, 
                                   cltv_df[ 'frequency' ], 
                                   cltv_df[ 'recency' ], 
                                   cltv_df[ 'T' ], 
                                   cltv_df[ 'monetary' ], 
                                   time= 3 ,   # 3 aylık
                                    freq= "W" ,   # T'nin frekans bilgisi.discount_rate
                                    = 0.01 ) 

cltv = cltv.reset_index() 
cltv_final = cltv_df.merge(cltv, on= "Customer ID" , how= "left" ) 
cltv_final.sort_values(by= "clv" , accending= False ).head( 10 )

通过利用这些先进技术,企业可以更深入地了解客户的行为、偏好和终身价值。这些知识使他们能够做出明智的决策,优化营销策略,并最终推动增长和盈利。

本文提供的代码示例是为了说明目的而简化的。在实践中,你可能需要调整代码以适合你的特定数据结构和要求。


🏴‍☠️宝藏级🏴‍☠️ 原创公众号『数据STUDIO』内容超级硬核。公众号以Python为核心语言,垂直于数据科学领域,包括可戳👉 PythonMySQL数据分析数据可视化机器学习与数据挖掘爬虫 等,从入门到进阶!

长按👇关注- 数据STUDIO -设为星标,干货速递

相关推荐

  • 你见过最烂的代码长什么样子?挺好,防止忘记密码​,大隐隐于市
  • 人类警惕!AI是个大骗子!
  • 从校招新星到前端技术专家的成长之路
  • 第一批使用多模态的程序员,已经碾压同事了!
  • Git 不要只会 pull 和 push,试试这 5 条提高效率的命令!
  • 两大AI独角兽“卖身”被调查!
  • 硅谷大厂被曝违规“偷”数据:苹果Anthropic用YouTube视频训练AI
  • AI大神卡帕西官宣创业!办新型AI原生学校,要教80亿人学AI
  • 特朗普盟友起草AI行政命令,启动“曼哈顿计划”
  • JetBrains再出手,这波秀翻了。。
  • 阿里面试场景题,彻底爆了!
  • Kaggle自动写作评估 2.0 Top方案汇总。
  • 不管你信不信,面试官让我使用 JS 计算 LocalStorage 的容量!
  • 混沌工程&FMEA——可用性隐患分析治理最佳拍档
  • 李飞飞最终还是选择创业了
  • 字符串的 intern 机制是怎么一回事?
  • 开源日历 Cal.com 项目:自定义你的时间管理(Github项目分享)
  • 如何用 JavaScript 模拟点击事件,简单实现 x, y 坐标点击?
  • SpringBoot + RabbitMQ:轻松实现邮件大批量异步推送!
  • CCL2024·第二十三届中国计算语言大会讲习班公布