在商业世界中,理解并应用客户终身价值(CLV)的概念至关重要。这一理念基于帕累托原则,即80%的业务收入往往来自20%的客户。这意味着维护现有客户比寻找新客户成本更低,效率更高。因此,识别并维护那些为公司带来稳定且增长收入的客户群体是提升业务绩效的关键。
为了实现这一目标,可以使用RFM分析,这是一种评估客户价值的简单而有效的方法。RFM代表最近一次购买时间(Recency)、购买频率(Frequency)和购买金额(Monetary)。通过这三个维度,可以对客户进行评分,并据此制定不同的营销策略。
让通过一个银行的例子来深入了解RFM分析的过程。假设银行想要识别关键客户,以便进行维护、发展或获取。在这种情况下,需要根据上述三个指标对最近与银行有交易的客户进行评分,并创建一个评分方法来细分客户群体,并应用不同的营销计划。
首先,需要从银行过去一年的交易数据中提取R、F和M。RFM分析最好使用最新的数据,并根据业务需要每季度或半年更新一次。例如,如果一个客户在5月1日存入10,000元,6月10日又存入5,000元,而在7月1日进行RFM分析,那么对于这个客户来说,最近一次购买时间(Recency)是1个月,购买频率(Frequency)是2次,购买金额(Monetary)是15,000元。
接下来,需要根据每个参数的排名为每个客户打分。对于最近一次购买时间,数值越小越好,因为这意味着客户对记忆更新鲜;而对于购买频率和购买金额,数值越大越好。以上述表格为例,与所有客户相比,客户3在最近一次购买时间上排名第一,购买频率排名第四,购买金额排名第二。
然后,需要根据每个参数对每个客户的得分进行标准化(0-100)。标准化得分 = 当前值 / 最大值 * 100。最后,需要为每个客户计算加权得分,综合考虑每个参数。综合得分 = 0.15*R + 0.28*F + 0.57*M。权重可以根据领域知识或业务输入为每个参数分配不同的权重。在这个例子中,更重视购买频率和购买金额。
import numpy as np
import pandas as pd
import time, warnings
import datetime as dt
warnings.filterwarnings("ignore")
# 读取数据
df = pd.read_csv("retail_data.csv")
df.head()
# RFM分析
# 创建R, F, M三个特征
# 计算最近一次购买时间
df['date'] = pd.DatetimeIndex(df['InvoiceDate']).date
recency_df = df.groupby(by='CustomerID', as_index=False)['date'].max()
recency_df.columns = ['CustomerID', 'LastPurchaseDate']
recent_date = recency_df.LastPurchaseDate.max()
recency_df['Recency'] = recency_df['LastPurchaseDate'].apply(lambda x: (recent_date - x).days)
recency_df.head()
# 计算购买频率
df1 = df
df1.drop_duplicates(subset=['InvoiceNo', 'CustomerID'], keep="first", inplace=True)
frequency_df = df1.groupby(by=['CustomerID'], as_index=False)['InvoiceNo'].count()
frequency_df.columns = ['CustomerID', 'Frequency']
frequency_df.head()
# 计算购买金额
df['TotalCost'] = df['Quantity'] * df['UnitPrice']
monetary_df = df.groupby(by='CustomerID', as_index=False).agg({'TotalCost': 'sum'})
monetary_df.columns = ['CustomerID', 'Monetary']
monetary_df.head()
# 创建RFM表
temp_df = recency_df.merge(frequency_df, on='CustomerID')
rfm_df = temp_df.merge(monetary_df, on='CustomerID')
rfm_df.set_index('CustomerID', inplace=True)
rfm_df.head()
# 排名每个指标
rfm_df['R_rank'] = rfm_df['Recency'].rank(ascending=False)
rfm_df['F_rank'] = rfm_df['Frequency'].rank(ascending=True)
rfm_df['M_rank'] = rfm_df['Monetary'].rank(ascending=True)
rfm_df.head()
# 标准化每个排名
rfm_df['R_rank_norm'] = (rfm_df['R_rank'] / rfm_df['R_rank'].max()) * 100
rfm_df['F_rank_norm'] = (rfm_df['F_rank'] / rfm_df['F_rank'].max()) * 100
rfm_df['M_rank_norm'] = (rfm_df['M_rank'] / rfm_df['M_rank'].max()) * 100
rfm_df.head()
# 计算最终得分
rfm_df['RFM_Score'] = 0.15 * rfm_df['R_rank_norm'] + 0.28 * rfm_df['F_rank_norm'] + 0.57 * rfm_df['M_rank_norm']
rfm_df = rfm_df.round(0)
rfm_df.head()
# 客户细分
rfm_df["Customer_segment"] = np.where(rfm_df['RFM_Score'] > 75, "High Value Customer", (np.where(rfm_df['RFM_Score'] < 50, "Low Value Customer", "Medium Value Customer")))
rfm_df.head()