3、关联规则挖掘:Apriori算法原理、FP-Growth算法、关联规则评估指标

好,咱们进入关联规则挖掘这一章。说实话,这是消费数据分析里最“接地气”的一块。你想想看,超市里“啤酒和尿布”的故事,就是关联规则最经典的案例。我当年刚入行时,觉得这玩意儿就是“找规律”,后来才发现,里面的门道深着呢。

这一章,我会把三个核心东西讲透:Apriori算法FP-Growth算法,还有怎么评估这些规则靠不靠谱。嗯,咱们一个一个来。

3.1 关联规则的基本概念

先说说什么是关联规则。说白了,就是找“如果买了A,那么很可能也会买B”这种模式。

举个例子:
{牛奶} → {面包}
意思是:买了牛奶的顾客,有较大概率也会买面包。

这里面有几个关键术语,我建议你记牢:

  • 项集(Itemset):一个或多个商品的集合。比如{牛奶, 面包}就是一个2-项集。
  • 支持度(Support):某个项集在所有交易中出现的频率。比如100笔交易里,有10笔同时买了牛奶和面包,那支持度就是10%。
  • 置信度(Confidence):在买了A的情况下,也买了B的概率。比如买了牛奶的顾客里,有60%也买了面包,那置信度就是60%。
  • 提升度(Lift):衡量A和B的相关性。大于1表示正相关,小于1表示负相关。

我个人习惯:先看支持度,再看置信度,最后用提升度验证。支持度太低,说明这个规则覆盖的用户太少,没啥商业价值。

3.2 Apriori算法原理

Apriori算法是关联规则挖掘的“老祖宗”。它的核心思想很简单:如果一个项集是频繁的,那么它的所有子集也必须是频繁的。反过来,如果一个项集不频繁,那它的超集肯定也不频繁。

嗯,这里要注意:Apriori算法有两个主要步骤:

  1. 生成频繁项集:从1-项集开始,逐层筛选,直到找不到更大的频繁项集为止。
  2. 生成关联规则:从频繁项集中,提取出满足置信度要求的规则。

我在项目中遇到过一个问题:当数据量很大时,Apriori会生成大量的候选集,性能堪忧。比如有1000种商品,光2-项集就有近50万个候选,这还只是开始。

下面是一个简单的Apriori算法伪代码,你可以感受一下:

# Apriori算法伪代码
L1 = 所有频繁1-项集
for k = 2; Lk-1 != 空集; k++:
    Ck = 由Lk-1生成的候选k-项集
    扫描数据库,计算Ck中每个候选的支持度
    Lk = 支持度 >= min_support的候选集
返回所有Lk的并集

我曾经踩过的坑:Apriori算法对内存消耗很大。如果你直接拿几百万条交易数据跑,很容易OOM。我的建议是:先做数据采样,或者用FP-Growth替代。

3.3 FP-Growth算法

FP-Growth算法,全称是Frequent Pattern Growth。它解决了Apriori的两个痛点:不需要生成候选集,而且只需要扫描两次数据库

它的核心思路是:构建一棵FP树(Frequent Pattern Tree),把所有交易数据压缩到一棵树上,然后递归挖掘频繁项集。

具体步骤:

  1. 第一次扫描:统计所有项的频率,过滤掉不频繁的项。
  2. 第二次扫描:对每条交易,按频率降序排序,然后插入到FP树中。
  3. 递归挖掘:从FP树的每个分支出发,递归生成条件模式基,再构建条件FP树,直到找到所有频繁项集。

你想想看,FP-Growth比Apriori快了多少?我做过对比测试:同样是100万条交易数据,Apriori跑了将近2小时,FP-Growth只用了不到5分钟。差距就是这么明显。

我的建议:在实际项目中,除非数据量特别小(比如几千条),否则优先选择FP-Growth。Apriori更适合教学和理解原理,FP-Growth才是工业级的工具。

下面我用SVG画一张FP-Growth的流程图,帮你理清思路:

FP-Growth算法流程图 第一次扫描数据库 统计所有项的频率 过滤不频繁项 保留频繁项 第二次扫描 构建FP树 递归挖掘FP树 生成条件模式基 输出所有频繁项集 完成关联规则挖掘

3.4 关联规则评估指标

找到了规则,不代表它就有用。我见过太多人,跑出一堆规则,结果全是“买了A也买了A”这种废话。所以,评估指标很重要。

常用的评估指标有这几个:

指标 公式 含义 我的经验
支持度 P(A∩B) 规则覆盖的交易比例 一般设0.01~0.05,看数据量
置信度 P(B|A) 规则的可信程度 通常要求>0.5,但别太高
提升度 P(B|A)/P(B) A对B的购买促进作用 >1才有意义,越大越好
杠杆率 P(A∩B) - P(A)P(B) 与随机购买的差异 正值表示正相关
确信度 P(A)P(¬B)/P(A∩¬B) 规则被推翻的概率 越大越可靠

我个人最看重的指标:提升度。置信度高不一定有用,比如“买了牛奶也买了牛奶”置信度100%,但没意义。提升度>1,才说明A和B真的有关系。

举个例子:
假设有100笔交易,其中:
- 20笔买了啤酒
- 15笔买了尿布
- 10笔同时买了啤酒和尿布

那么:
- 支持度 = 10/100 = 0.1
- 置信度 = 10/20 = 0.5
- 提升度 = 0.5 / (15/100) = 3.33

提升度3.33,说明买了啤酒的顾客,买尿布的概率是普通顾客的3.33倍。嗯,这个规则值得关注。

我曾经犯过的错:只看置信度,忽略了提升度。结果给业务方推了一堆“买了A也买A”的规则,被骂惨了。从那以后,我每次出规则,都会把提升度放在第一位。

3.5 实际应用中的注意事项

最后,分享几个我在项目中积累的经验:

  • 数据预处理很重要:把商品名称统一,去掉重复交易,处理缺失值。这一步做不好,后面全是垃圾。
  • 支持度阈值要调:设得太低,规则太多,全是噪音;设得太高,规则太少,找不到有价值的信息。我一般从0.01开始试。
  • 别只看数字:有些规则统计上显著,但业务上没意义。比如“买了打印机也买了打印纸”,这还用挖掘吗?
  • 注意时间窗口:关联规则默认不考虑时间顺序。但实际中,“先买A再买B”和“同时买A和B”意义完全不同。

好了,这一章的内容就到这里。关联规则挖掘,说白了就是帮你在数据里“找关系”。Apriori是基础,FP-Growth是效率,评估指标是质量。三者缺一不可。

专注资料整理