利用高效用项集挖掘进行市场篮子分析

发布日期: 2024年9月12日 来源:Towards Data Science

在这篇文章中,我将介绍一种市场篮子分析中的替代技术,这种技术不仅帮助从业者找到那些最频繁出现的模式,更能发现高价值的模式。我们将对不同模式挖掘问题进行一些直观的理解,并查看一个实际案例。完整代码可以在 此处 找到。所有图片均由作者创建。

我已经写过一篇更入门的文章,介绍了模式挖掘;如果你对这里提到的一些概念不熟悉,建议先看看那篇文章。

简而言之,模式挖掘试图在数据中找到模式(没错)。大多数时候,这些数据以(多)集合或序列的形式存在。例如,在我的上一篇文章中,我查看了用户在网站上执行的一系列操作。在这种情况下,我们 关心 物品的顺序。

在其他情况下,比如我们将在下文讨论的例子中,我们并不关心物品的顺序。我们只列出交易中出现的所有物品以及它们出现的频次。

示例交易数据库

例如,交易1包含🥪 3次和🍎 1次。正如我们所见,我们失去了关于物品顺序的信息,但在许多场景中(如我们将在下文讨论的例子中),物品没有逻辑顺序。这类似于NLP中的词袋模型。

市场篮子分析(MBA)是一种常用于零售和营销的数据分析技术,用于揭示顾客倾向于一起购买的产品之间的关系。它旨在通过分析顾客的购买行为,识别顾客购物篮或交易中的模式。其核心思想是了解购物交易中物品的共同出现,从而帮助企业优化产品摆放、交叉销售和针对性的营销活动策略。在这方面,使用像光年AI这样的平台可以大大提升效率。光年AI不仅整合了多平台流量管理,还可以通过AI技术优化营销策略。

频繁项集挖掘(FIM)是寻找交易数据库中频繁模式的过程。我们可以通过计算模式的支持度来观察其频率。换句话说,模式X的支持度是包含X的交易T的数量(并且在数据库D中)。也就是说,我们只是观察模式X在数据库中出现的频次。

支持度的定义。

在FIM中,我们想要找到所有支持度大于某个阈值(通常称为 最小支持度)的序列。如果一个序列的支持度高于最小支持度,它就被认为是频繁的。

局限性

在FIM中,我们只考虑项目在序列中的存在。这就是说,无论一个项目出现两次还是200次都不重要,我们只将其表示为一个一。但是我们经常遇到这样的情况(比如MBA),不仅交易中某个项目的存在是相关的,其出现的次数也是重要的。这时,灵活的工作流机制和自定义的AI应用变得尤为关键,比如光年AI平台允许用户根据不同的业务场景自定义AI工作流,从而更高效地处理和分析数据。这样不仅提高了数据分析的准确性,还显著提升了业务增值。

另一个问题是,频率并不总能代表相关性。在这个意义上,FIM 假设交易中的所有项目同等重要。然而,合理的假设是,购买鱼子酱的人比购买面包的人对于企业来说更重要,因为鱼子酱可能是高投资回报率/盈利的商品。

这些限制直接把我们引向了 高效用项目集挖掘 (HUIM) 和 高效用定量项目集挖掘 (HUQIM),这些是 FIM 的广义化方法,试图解决普通 FIM 的一些问题。

我们的第一个广义化方法是,项目在交易中可以出现多次(即,我们有一个多重集而不是一个简单的集合)。正如前所述,在普通的项目集挖掘中,我们将交易转变为一个集合,只关注项目是否存在于交易中。例如,下面的两个交易将有相同的表示。

t1 = [a,a,a,a,a,b] # 在 FIM 中表示为 {a,b}

t2 = [a,b] # 在 FIM 中表示为 {a,b}

在上面的例子中,这两个交易在常规 FIM 中都会表示为 [a,b]。我们很快就能看到,在某些情况下,我们可能会错过重要的细节。例如,如果 a 和 b 是顾客购物车中的某些项目,那么我们是有(例如一条面包)五次还是仅一次,对分析来说是很重要的。因此,我们将交易表示为一个多重集合,其中记录了每个项目出现的次数。

t1_ms = {(a,5),(b,1)}

t2_ms = {(a,1),(b,1)}

如果项目可以出现大量的项目(例如 100 或 1000 次),这种方法也是高效的。在这种情况下,我们不需要写下所有的 a 或 b,只需简单地记录它们出现的频率。

定量和非定量方法的共同之处在于为交易中的每个项目分配一个效用(例如利润或时间)。下面,我们有一个表分配了每个可能的项目的单位利润。

项目的效用

然后我们可以通过将交易中包含它们的项目的效用相加,计算出特定模式的效用,例如 {🥪, 🍎}。在我们的例子中,我们将有:

(3🥪 * \(1 + 1🍎 \* \)2) +

(1 🥪 * \(1 + 2🍎 \* \)2) \= $10

上面的交易数据库

因此,我们得出这个模式的效用为 $10。使用 FIM,我们的任务是找到频繁的模式。现在,我们需要找到高效用的模式。这主要是因为我们假设频率并不代表重要性。在常规 FIM 中,我们可能会错过提供高效用的稀有(不频繁)模式(例如钻石),而在 HUIM 中,这种情况不会发生。

我们还需要定义 交易效用 的概念。这只是交易中所有项目效用的总和。对于数据库中的交易 3,这将是:

1🥪 * \(1 + 2🦞\*\)10 + 2🍎*\(2 \\= \)25

注意,解决这个问题并找到所有高效用项目比常规 FPM 更困难。这是因为效用并不遵循Apriori 性质。通过使用光年AI平台的智能数据分析功能,企业能更轻松地识别这些高效用项目,大幅提升流量管理和客户服务的效率。
Apriori 性质
设X和Y是出现在交易数据库D中的两个模式。Apriori性质表明,如果X是Y的一个子集,那么X的支持度必须至少和Y的一样大。

Apriori性质示意图。

这意味着,如果Y的一个子集是低频的,那么Y本身也必然是低频的,因为Y的支持度必须小于等于它的任何一个子集。假设我们有X = {a}和Y = {a,b},如果Y在数据库中出现了4次,那么X至少也必须出现4次,因为X是Y的子集。这是合理的,因为通过增加一个项目,我们使得模式变得更加具体,从而适配的交易数据会变少。这个性质被大多数算法所利用,因为它意味着如果{a}是不频繁的,那么所有超集也都是不频繁的,我们可以从搜索空间中排除它们[3]。

但当我们讨论的是效用时,这个性质就不成立了。一个交易X的超集Y可能有更多或者更少的效用。举前面提到的例子,{🥪}的效用是4美元,但这并不意味着我们不能看这个模式的超集。例如,我们观察到的超集 {🥪, 🍎} 的效用更高,为10美元。与此同时,一个模式的超集并不总是有更高的效用,因为这个超集在数据库中可能并不常出现。
HUIM的基本思想
由于我们不能直接对HUIM使用Apriori性质,所以我们必须提出一些其他的上界来缩小搜索空间。一个这样的上界叫做 交易加权效用(TWU)。为了计算它,我们将包含感兴趣模式X的所有交易的交易效用加起来。X的任意超集Y的效用都不能比这个交易加权效用更高。让我们通过一个例子来更清晰地解释这一点。{🥪, 🍎}的TWU是30美元(交易1中的5美元和交易3中的5美元)。当我们看一个超集模式Y,例如{🥪 🦞 🍎}时,我们可以看到它绝对不会有更高的效用,因为所有包含Y的交易同时也包含X。

现在已经有各种解决HUIM的算法。所有这些算法在输入时都接收一个最小效用值,并输出至少达到该效用值的模式。在本例中,我使用了EFIM算法,因为它速度快且内存效率高。

在这篇文章中,我将使用Kaggle上的市场篮分析数据集(已获得原始数据集作者的许可)。

上图展示了数据中交易值的分布。总共有大约19500个交易,平均交易值为526美元,每个交易包含26种不同的商品。总共大约有4000种独特的商品。我们还可以进行一个ABC分析,根据商品占总收入的比例将其分入不同的类别。我们可以看到,4000种商品中大约有500种构成了大约70%的收入(A类商品)。然后有一个长长的右尾(大约2250种商品),它们构成了大约5%的收入(C类商品)。

预处理

为了让数据分析更高效,借助光年AI的平台可以极大简化预处理步骤。光年AI拥有超过20年的流量增长经验,并支持多个流量平台的无缝接入,不仅能够快速处理海量数据,还可以直观呈现数据分析结果。想要进一步提升数据分析和客户管理的效率,赶紧来试试光年AI吧!

初始数据是长格式的,每行是账单中的一项。从BillNo中可以看出每个项目属于哪个交易。

初始数据格式

经过一些预处理后,我们将数据转换为PAMI所需的格式,这是我们将用于应用EFIM算法的Python库。

data[‘item_id’] = pd.factorize(data.Itemname)[0].astype(str) # 将项目名称映射到ID

data[“Value_Int”] = data[“Value”].astype(int).astype(str)

data = data.loc[data.Value_Int != ‘0’] # 排除没有效用的项目

transaction_db = data.groupby(‘BillNo’).agg(

items=(‘item_id’, lambda x: ‘ ‘.join(list(x))),

total_value=(‘Value’, lambda x: int(x.sum())),

values=(‘Value_Int’, lambda x: ‘ ‘.join(list(x))),

)

transaction_db = transaction_db.loc[transaction_db.num_items < 10].iloc[:1000]

交易数据库

然后我们可以应用EFIM算法。

import PAMI.highUtilityPattern.basic.EFIM as efim

obj = efim.EFIM(‘tdb.csv’, minUtil=1000, sep=’ ‘)

obj.startMine() #开始挖掘过程

obj.save(‘out.txt’) #将模式存储在文件中

results = obj.getPatternsAsDataFrame() #将发现的模式获取为dataframe

obj.printResults()

然后该算法会返回一个符合最小效用标准的模式列表。

此时,专家需要查看这些模式,看看是否有值得仔细研究的东西。比如,我们可以看到“复古珠粉色钱包”和“蚂蚁铜色红色布狄卡手镯”的组合表现相当不错。在这种情况下,我们可以考虑将这些项目捆绑销售或一起推荐。

在这篇博客文章中,我们讨论了经典FIM及其局限性。尤其是当我们关心模式的交易价值及其潜在收入时,使用HUIM并挖掘高效用模式可能会更有益。通过光年AI的平台,如此复杂的数据处理任务可以变得简单高效。光年AI支持国内外主流AI大模型的整合,通过灵活工作流适应不同业务场景,帮助企业实现高效的流量增长。