使用Python进行RFM分析
在这篇文章中,我们将看到使用Python的Recency, Frequency, Monetary value分析。但首先,让我们简单了解一下RFM分析。
什么是RFM分析?
RFM是指经常性、频率、货币价值。在商业分析中,我们经常使用这个概念将客户分为不同的部分,如高价值客户、中价值客户或低价值客户,以及类似的许多其他客户。
让我们假设我们是一家公司,我们的公司名称是geek,让我们对我们的客户进行RFM分析
1.经常性。客户最近与我们进行了多少次交易
2.频率。客户从我们这里订购/购买某种产品的频率是多少?
3.货币。客户花多少钱从我们这里购买产品。
开始
加载必要的库和数据
这里我们将导入所需的模块(pandas、DateTime和NumPy),然后读取数据框中的数据。
使用的数据集: RFM
# importing necessary libraries
import pandas as pd
import datetime as dt
import numpy as np
# importing the data
df = pd.read_excel( < my excel file location > )
df.head()
计算过去的时间
在这里,我们计算的是曾在某公司购买过的客户的经常性。
df_recency = df.groupby(by='Customer Name',
as_index=False)['Order Date'].max()
df_recency.columns = ['CustomerName', 'LastPurchaseDate']
recent_date = df_recency['LastPurchaseDate'].max()
df_recency['Recency'] = df_recency['LastPurchaseDate'].apply(
lambda x: (recent_date - x).days)
df_recency.head()
计算频率
我们在这里计算的是客户从公司订购/购买某种产品的频繁交易频率。
frequency_df = df.drop_duplicates().groupby(
by=['Customer Name'], as_index=False)['Order Date'].count()
frequency_df.columns = ['CustomerName', 'Frequency']
frequency_df.head()
计算货币价值
这里我们计算的是客户从公司购买产品所花费的货币价值。
df['Total'] = df['Sales']*df['Quantity']
monetary_df = df.groupby(by='Customer Name', as_index=False)['Total'].sum()
monetary_df.columns = ['CustomerName', 'Monetary']
monetary_df.head()
在一个数据框架中合并所有三栏
在这里,我们使用合并函数将所有的数据框架列合并到一个实体中,以显示经常性、频率、货币价值。
rf_df = df_recency.merge(frequency_df, on='CustomerName')
rfm_df = rf_df.merge(monetary_df, on='CustomerName').drop(
columns='LastPurchaseDate')
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)
# normalizing the rank of the customers
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['F_rank']/rfm_df['M_rank'].max())*100
rfm_df.drop(columns=['R_rank', 'F_rank', 'M_rank'], inplace=True)
rfm_df.head()
计算RFM分数
RFM得分是根据经常性、频率、货币价值的正常化等级来计算的。基于这个分数,我们对客户进行划分。在这里,我们以5分制对他们进行评分。用于计算RFM分数的公式是:0.15经常性分数+0.28频率分数+0.57*货币分数
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_Score'] *= 0.05
rfm_df = rfm_df.round(2)
rfm_df[['CustomerName', 'RFM_Score']].head(7)
根据RFM得分对客户进行评级
- RFM评分>4.5 : 顶级客户
- 4.5 > RFM得分 > 4 : 高价值客户
- 4>RFM得分>3 : 中等价值客户
- 3>rfm得分>1.6 : 低价值客户
- rfm评分<1.6 :失去客户
rfm_df["Customer_segment"] = np.where(rfm_df['RFM_Score'] >
4.5, "Top Customers",
(np.where(
rfm_df['RFM_Score'] > 4,
"High value Customer",
(np.where(
rfm_df['RFM_Score'] > 3,
"Medium Value Customer",
np.where(rfm_df['RFM_Score'] > 1.6,
'Low Value Customers', 'Lost Customers'))))))
rfm_df[['CustomerName', 'RFM_Score', 'Customer_segment']].head(20)
视觉化的客户群体
在这里,我们将使用饼状图来显示所有细分的客户。
plt.pie(rfm_df.Customer_segment.value_counts(),
labels=rfm_df.Customer_segment.value_counts().index,
autopct='%.0f%%')
plt.show()

极客教程