在当今竞争激烈的商业环境中,了解客户对于推动增长和盈利至关重要。客户关系管理 (CRM) 分析提供了一套强大的工具,可帮助你深入了解客户行为、偏好和终身价值。在这篇博文中,我们将探讨几个关键概念,包括 RFM 分析和客户细分,以及使用 BG-NBD 和 Gamma-Gamma 子模型等先进技术进行客户终身价值 (CLTV) 和 CLTV 预测,并提供详细的代码示例和说明。
RFM 分析是一种简单而有效的技术,可根据客户的购买行为对其进行细分。它代表最近度、频率和货币价值。通过分析这三个指标,企业可以识别最有价值的客户并相应地制定营销策略。
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 指标:
today_date
减去每个客户的 LastPurchaseDate
。CustomerID
对数据分组,并计算每个客户的唯一InvoiceNo
值的数量。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 的分数。
# 计算 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 =(客户价值/客户流失率)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)对客户进行细分,并相应地制定策略:
这些是最有价值的客户,他们消费能力强,忠诚度高。
重点通过忠诚度计划和个性化服务来留住他们,并最大限度地增加交叉销售/追加销售的机会。
这些客户具有增加支出的潜力。
旨在通过有针对性的促销和增强客户体验来提高他们的购买频率和购物篮规模。
低收入潜力群体。
如果可能的话,不要投入大量资金,而应专注于将它们迁移到中/高 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 是一项重要指标。
虽然传统的 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
,monetary
和T值
,将 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 -设为星标,干货速递