Chevron Left

查看所有社区故事

使用RFM、AUM和K-means聚类进行客户细分

2023年4月12日

Uchechukwu Emmanuel

Cowrywise

photo of Uchechukwu Emmanuel

Uchechukwu 是 Cowrywise 的软件工程师和技术作家,Cowrywise 是一家将财富管理数字化的金融科技公司。他对数据工程和机器学习有浓厚的兴趣,并乐于分享这些主题的见解。您可以通过 Twitter @onlyoneucheLinkedIn 与他取得联系。

客户细分有助于公司深入了解客户行为并量身定制服务以满足他们的需求。在 Cowrywise,一个尼日利亚金融科技平台,我们正在使用 Metabase 可视化这些见解,并通过以下方式提供解决方案:

  • RFM(最近一次购买、购买频率和货币价值),
  • AUM(管理资产)每日指标,以及
  • K-Means 聚类。

理解 RFM(最近一次购买、购买频率和货币价值)

RFM允许我们根据客户的交易历史进行客户细分,包括

  • 自上次交易以来经过的时间(近期性),
  • 他们已进行的交易数量(频率),以及
  • 他们在平台上花费的金额(货币价值)。为了计算RFM,为每个指标分配分数:近期性、频率和货币价值。最高分数表示与您的平台互动更好。例如,昨天进行了交易、过去进行过多次交易并在平台上花费了大量资金的客户将获得更高的RFM分数。

以下是用于计算RFM分数的Python脚本

import pandas as pd
import datetime as dt

# Load transaction data
df = pd.read_csv("transactions.csv")

# Convert transaction_date to datetime
df["transaction_date"] = pd.to_datetime(df["transaction_date"])

# Calculate Recency, Frequency, and Monetary Value
snapshot_date = df["transaction_date"].max() + dt.timedelta(days=1)
df_rfm = df.groupby("user_id").agg({
    "transaction_date": lambda x: (snapshot_date - x.max()).days,
    "transaction_id": "count",
    "amount": "sum"
}).reset_index()

# Rename columns
df_rfm.rename(columns={
    "transaction_date": "Recency",
    "transaction_id": "Frequency",
    "amount": "MonetaryValue"
}, inplace=True)

# Print the first five rows of the RFM dataframe
print(df_rfm.head())

将AUM添加到RFM中

RFM的缺点是它忽略了客户的投资行为。为了获得更全面的客户投资习惯和行为视图,我们将每天管理的资产AUM添加到RFM分数中。AUM是客户已投资的资产总价值,除以他们开始投资以来的天数。以下是用于创建此混合指标的脚本

# Load AUM data
df_aum = pd.read_csv("aum.csv")

# Convert start_date to datetime
df_aum["start_date"] = pd.to_datetime(df_aum["start_date"])

# Calculate the number of days since the customer started investing
df_aum["InvestmentDays"] = (snapshot_date - df_aum["start_date"]).dt.days

# Calculate AUM per day
df_aum["AUMperDay"] = df_aum["aum"] / df_aum["InvestmentDays"]

# Merge RFM and AUM dataframes
df_hybrid = pd.merge(df_rfm, df_aum[["user_id", "AUMperDay"]], on="user_id", how="inner")

# Print the first five rows of the hybrid dataframe
print(df_hybrid.head())

使用k-均值聚类对客户进行分组

一旦计算了RFM和AUM分数,我们使用k-均值聚类根据这些指标对客户进行分组。k-均值聚类是一种无监督的机器学习算法,它根据数据的相似性将数据点分组到k个聚类中。在这种情况下,k代表我们想要创建的客户细分数量。我们将RFM和AUM数据合并到一个数据框中。然后我们使用肘部法则来确定数据的最佳聚类数量。以下示例中使用的肘部法则涉及将簇内平方和(WCSS)与聚类数量进行比较。我们选择图表的“肘部”处的聚类数量,此时添加更多聚类不会显著减少WCSS。以下是用于对我们的数据进行k-均值聚类的脚本。在我们的案例中,我们选择四个聚类作为最佳聚类数量。我们将k-均值聚类算法拟合到我们的数据,并将每个客户分配到相应的聚类。

from sklearn.cluster import KMeans

# combine RFM and AUM data into a single dataframe
rfm_aum_data = pd.concat([rfm_scores, aum_scores], axis=1)

# determine optimal number of clusters using elbow method
wcss = []
for i in range(1, 11):
    kmeans = KMeans(n_clusters=i, init='k-means++', max_iter=300, n_init=10, random_state=0)
    kmeans.fit(rfm_aum_data)
    wcss.append(kmeans.inertia_)
plt.plot(range(1, 11), wcss)
plt.title('Elbow Method')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()

# fit k-means clustering to data
kmeans = KMeans(n_clusters=4, init='k-means++', max_iter=300, n_init=10, random_state=0)
kmeans.fit(rfm_aum_data)

# assign clusters to each customer
customer_clusters = kmeans.predict(rfm_aum_data)

在Metabase中可视化细分

一旦每个客户被分配到一个聚类,您就可以开始在Metabase中可视化客户细分!首先,确保您有一个Metabase账户并且已经将Metabase连接到您的数据源。一旦连接

  1. 选择 新增 > 问题
  2. 选择您的customer_segmentation表作为起点(或您称为包含您的rfm_scoreaum_per_daysegment字段)的表的名称)。
  3. 一旦您编写了查询,点击 可视化 以创建可视化。
  4. 您可以使用查询构建器来过滤和汇总数据,然后选择您想要使用的可视化类型。例如,使用条形图显示客户在不同细分中的分布,或使用散点图显示RFM分数和每天AUM之间的关系。
  5. 当您有一些有趣的结果时,点击 保存 按钮。
  6. 您可以将保存的问题添加到Metabase仪表板中,并设置过滤器,以便人们可以通过细分、日期范围或其他您选择的变量来查看数据。

Uchechukwu Emmanuel

Cowrywise

photo of Uchechukwu Emmanuel

Uchechukwu 是 Cowrywise 的软件工程师和技术作家,Cowrywise 是一家将财富管理数字化的金融科技公司。他对数据工程和机器学习有浓厚的兴趣,并乐于分享这些主题的见解。您可以通过 Twitter @onlyoneucheLinkedIn 与他取得联系。

您可能还喜欢

预测下一个点击

Ukrit Wattanavaekin

Metabase

利用数据提供可信的指标

Frédéric Vion

Subclic

数据驱动型产品管理

Victor Bolu

WebAutomation

您可能还喜欢

预测下一个点击

Ukrit Wattanavaekin

Metabase

利用数据提供可信的指标

Frédéric Vion

Subclic

数据驱动型产品管理

Victor Bolu

WebAutomation