Press "Enter" to skip to content

使用信用卡交易数据掌握客户细分

使用RFM分数构建客户细分

Image by Andrea Piacquadio on Pexels

客户细分是根据历史购买模式来识别客户细分的过程。例如,它可以涉及识别重复/忠诚的客户、高消费客户、进行一次性或不频繁购买的客户等等。可以使用频繁购买次数、交易金额、购买日期等信息来创建细分。所有这些特征都可以用来生成具有易于解释特征的明确定义的聚类。

这些细分的特征可以为公司提供大量信息和商业价值。例如,公司可以利用这些细分通过定向促销信息、客户保留活动、忠诚计划、产品交叉销售等方式增加收入。公司可以针对每个细分目标客户群体发送相关的定制信息。此外,这些细分可以提供关于客户最喜欢哪种渠道的信息,无论是电子邮件、社交媒体还是外部应用程序。公司还可以使用消费者细分来进行上销或交叉销售。例如,他们可以为经常购买的商品提供高价选项,或为先前购买的商品提供补充产品。所有这些策略都可以用来增加收入和客户保留。

有许多用于客户细分的技术。一种流行的生成客户细分的技术是最近性、频率和货币值(RFM)分数。

最近性、频率和货币值

  1. 最近性是指客户最后一次购买与参考日期(通常是数据中的当前日期或最大日期)之间的天数。
  2. 频率是指客户最后一次购买与参考日期(通常是数据中的当前日期或最大日期)之间的购买次数。
  3. 货币值是指客户在第一次购买和最后一次购买之间花费的总金额。

您可以使用这些值构建RFM分数,用于细分和识别高价值和低价值客户。这些分数可用于各种业务用例,包括定制营销、流失分析、价格优化等。

在这里,我们将看到如何使用信用卡交易数据集计算RFM分数。我们将使用DataFabrica上提供的合成信用卡交易数据。该数据包含合成的信用卡交易金额、信用卡信息、交易ID等。免费版可以根据Apache 2.0许可证进行下载、修改和共享。

为此工作,我将在Deepnote中编写代码,Deepnote是一个协作的数据科学笔记本,可以轻松运行可重复的实验。

探索数据

首先,让我们转到Deepnote并创建一个新项目(如果您还没有帐户,可以免费注册)。

让我们安装必要的软件包:

由作者创建的嵌入

并导入我们将使用的软件包:

由作者创建的嵌入

接下来,让我们将数据读入pandas数据帧并显示前五行数据:

由作者创建的嵌入

接下来,让我们将数据帧过滤为仅包含购买Chick-fil-A的客户:

由作者创建的嵌入

接下来,我们可以查看每个州的客户数量。为此,我们需要将商家州映射到州的缩写,这将允许我们在Plotly中绘制每个州的客户数量:

由作者创建的嵌入

接下来,让我们映射州的缩写并定义我们的state_count表。我们通过对每个州的每个持卡人执行groupby nunique()操作来实现这一点:

df['merchant_state_abbr'] = df['merchant_state'].map(state_abbreviations)state_counts = df.groupby('merchant_state_abbr')['cardholder_name'].nunique().reset_index()state_counts.columns = ['State', 'Customer_Count']

接下来,我们可以使用Plotly Express的chloropleth方法生成每个州的客户数量的地理图:

fig = px.choropleth(state_counts, locations='State', locationmode='USA-states',                    color='Customer_Count', scope='usa',                    color_continuous_scale='Blues',                    title='按州划分的客户数量')fig.show()

完整的逻辑是:

由作者创建的嵌入

生成RFM分数

现在让我们定义创建RFM分数的逻辑。首先,将我们的transaction_date转换为pandas的日期时间对象,并创建一个NOW变量,该变量是transaction_date的最大值:

df['transaction_date'] = pd.to_datetime(df['transaction_date'])NOW = df['transaction_date'].max()

接下来,让我们执行一次分组聚合操作,以计算最近性、频率和货币价值。

  1. 最近性 – 最大的整体日期减去最大的客户日期:df.groupby('cardholder_name').agg({'transaction_date': lambda x: (NOW - x.max()).days})
  2. 频率 – 每个客户的交易ID数量:df.groupby('cardholder_name').agg({'transaction_id': lambda x: len(x)})
  3. 货币价值 – 每个客户的交易金额总和:df.groupby('cardholder_name').agg({'transaction_amount': lambda x: x.sum()})

我们还将转换成最近性的transaction_date为整数:

rfmTable = df.groupby('cardholder_name').agg({'transaction_date': lambda x: (NOW - x.max()).days, 'transaction_id': lambda x: len(x), 'transaction_amount': lambda x: x.sum()})rfmTable['transaction_date'] = rfmTable['transaction_date'].astype(int)

接下来,让我们适当地重命名列。

  1. transaction_date变为recency
  2. transaction_id变为frequency
  3. transaction_amount变为monetary_value
rfmTable.rename(columns={'transaction_date': 'recency',                          'transaction_id': 'frequency',                         'transaction_amount': 'monetary_value'}, inplace=True)rfmTable = rfmTable.reset_index()

完整的逻辑是:

由作者创建的嵌入

我们可以看一下最近性的分布:

由作者创建的嵌入

频率:

由作者创建的嵌入

货币价值:

由作者创建的嵌入

接下来,我们可以使用Pandas的qcut方法计算最近性、频率和货币价值的四分位数:

rfmTable['r_quartile'] = pd.qcut(rfmTable['recency'], q=4, labels=range(1,5), duplicates='raise')rfmTable['f_quartile'] = pd.qcut(rfmTable['frequency'], q=4, labels=range(1,5), duplicates='drop')rfmTable['m_quartile'] = pd.qcut(rfmTable['monetary_value'], q=4, labels=range(1,5), duplicates='drop')rfm_data = rfmTable.reset_index()

接下来,我们可以可视化最近性/频率的热力图,其中每个单元格显示具有相应最近性和频率值的客户百分比。首先,让我们计算百分比:

heatmap_data = rfm_data.groupby(['r_quartile', 'f_quartile']).size().reset_index(name='Percentage')heatmap_data['Percentage'] = heatmap_data['Percentage'] / heatmap_data['Percentage'].sum() * 100

接下来,让我们生成热力图矩阵:

heatmap_matrix = heatmap_data.pivot('r_quartile', 'f_quartile', 'Percentage')

使用Seaborn和Matplotlib生成地图,并对我们的热力图进行标签和标题:

sns.set()sns.heatmap(heatmap_matrix, annot=True, fmt=".2f", cmap="YlGnBu")plt.title("客户细分热力图")plt.xlabel("频率四分位数")plt.ylabel("最近性四分位数")plt.show()

完整的逻辑是:

由作者创建的嵌入

我们可以从我们的热图中看到以下见解:

  1. 16.21%的客户最近购买但购买不频繁。
  2. 3.45%的客户是频繁和最近的客户。
  3. 10%的客户经常购买但时间不长。
  4. 5.86%的客户最近没有购买,也不频繁购买。

我们只考虑了单个商家Chick-fil-A,但我鼓励您为其他休闲和精致餐饮商家重复此分析。

接下来,我们可以通过连接最近性,频率和货币值的四分位数来生成我们的RFM得分:

由作者创建的嵌入

我们可以可视化我们的RFM得分分布:

由作者创建的嵌入

在这里,我们可以看到最常见的RFM得分是“411”,对应于最近购买且花费不频繁和很少的客户。

使用RFM得分生成和可视化客户细分

接下来,我们可以生成我们的客户细分。这一步有点主观,但我们定义我们的细分如下:

  1. 高级客户:r,f和m都≥3
  2. 重复购买者:f≥3且r或m≥3
  3. 高消费者:m≥3且f或r≥3
  4. 有风险的客户:r,f和m中的两个或更多≤2
  5. 不活跃的客户:两个或更多= 1
  6. 其他:其他任何情况

由作者创建的嵌入

接下来,我们可以看到细分的分布情况:

由作者创建的嵌入

在这里,我们可以看到最大的客户细分是不活跃的客户,其次是有风险的客户,高消费者,重复购买者和高级客户。

并且也可以可视化细分的分布:

由作者创建的嵌入

我们还可以查看每个客户细分的平均货币值:

由作者创建的嵌入

我们可以看到高级客户,重复购买者和高消费者的平均货币值最高。此外,不活跃和有风险的客户的货币值较低。

每个客户细分的平均频率值:

由作者创建的嵌入

我们可以看到高级客户,重复购买者和高消费者的频率最高,而有风险和不活跃的客户频率较低。

最后,每个客户细分的平均最近性值:

由作者创建的嵌入

我们可以看到“其他”类别拥有最近的购买。这可能是一个适合“新”客户的分段,其购买模式不确定。

使用客户细分进行定制营销

您可以使用这些客户细分生成与每个细分相关的定制/个性化营销信息。例如,您可以通过特别促销和忠诚度交易奖励高级客户。您还可以根据他们的购买历史推广他们可能感兴趣购买的其他产品。对于重复/忠诚客户,您可以开展自动化的电子邮件活动以保持他们的忠诚度。有风险的客户通常处于不参与状态。我们可以为这些客户制定活动,以重新吸引他们并促使他们重新开始购买。不活跃的客户也可以开展类似的活动。最后,对于高消费者,我们可以提供特别促销和交易,以供他们再次购买的高价产品。

使用这些数据,我们可以进一步分析并使用itemsprices字段为这些细分制定定制营销活动。

我鼓励您从GitHub下载代码,并为其他餐厅商家重复此分析。

结论

在这里,我们讨论了如何对合成信用卡交易数据进行客户细分。我们首先进行了一些简单的数据探索,查看了商家Chick-fil-A每个州的客户数量。接下来,我们计算了生成RFM得分所需的最近性,频率和货币值的列。然后,我们展示了如何为每个客户生成最近性,频率和货币值的四分位数,并将其用于构建RFM得分。然后,我们使用RFM得分生成客户细分“高级客户”,“重复购买者”,“高消费者”,“有风险的客户”和“不活跃的客户”。接下来,我们生成了一些可视化图表,以分析数据中客户细分的分布。

使用RFM分数生成有见地的客户细分是任何希望提供商业价值的数据科学家所必备的技能。构建可解释的细分并从这些细分中获取洞见可以帮助企业设计能够增加收入和客户保留率的营销活动策略。了解客户的购买行为使企业能够针对适当的客户群体定制促销优惠。本文提供了开始的基础知识!

合成信用卡数据的免费版本在这里。完整的数据集可以在这里找到。

Leave a Reply

Your email address will not be published. Required fields are marked *