Python 数据分析入门:从频繁项集到关联规则——哪些规则真正值得用?
适合人群:Python 初学者 / 数据分析入门 / 数据挖掘入门 / 教学案例分享
在上一篇里,我们已经解决了一个关键问题:
怎么从购物小票里找到高频商品组合?
也就是说,我们已经能够用 Apriori 找到像下面这样的频繁项集:
{面包, 牛奶}{尿布, 啤酒}{面包, 牛奶, 尿布}
但问题来了:
- 高频组合就一定有业务价值吗?
- 同一个组合,为什么写成不同规则,意义会不一样?
- 超市到底应该拿哪条规则去做搭配推荐或者促销设计?
举个最直接的例子:
如果{啤酒, 尿布}很常见,那么我们可以写成:
- 啤酒 -> 尿布
- 尿布 -> 啤酒
看起来只是前后顺序调了一下,但它们的含义并不完全一样,实际价值也可能不同。
所以在关联分析里,找到频繁项集还不是终点。
下一步真正重要的是:
把频繁项集变成可用的关联规则,并筛选出真正值得关注的强关联规则。
本文继续沿用“校园超市购物小票分析”这个案例,带你理解:
- 频繁项集和关联规则到底有什么区别
- 为什么高频组合不等于好规则
- 强关联规则是怎么筛选出来的
- 如何用 Python 从频繁项集生成关联规则
- 怎么看支持度、置信度,以及规则结果表
如果你已经看完 Apriori 那一篇,这一篇就是最自然的下一步。
摘要
关联规则挖掘通常包括两个阶段:先找出所有频繁项集,再由频繁项集生成强关联规则。强关联规则需要满足最小支持度和最小置信度要求 [2]。本文以校园超市购物小票为案例,介绍如何从频繁项集出发构造关联规则,并重点说明频繁项集与关联规则的区别、支持度与置信度在规则筛选中的作用。文章结合 Python 代码,演示如何使用association_rules()生成规则,并输出规则的前件、后件、支持度和置信度,帮助初学者理解哪些规则真正具有应用价值 [2]。
一、导语:高频组合找到了,为什么还不够?
假设超市已经通过 Apriori 找到了很多高频商品组合,比如:
{面包, 牛奶}{尿布, 啤酒}{面包, 牛奶, 尿布}
这时候很多初学者会觉得:
既然高频组合已经找到了,分析是不是就结束了?
其实还没有。
因为“经常一起出现”不等于“规则有价值”。
比如{啤酒, 尿布}很常见,确实说明这两个商品经常一起买。
但如果要拿它去做促销或推荐,还得进一步回答:
- 到底是“买啤酒的人更容易买尿布”
- 还是“买尿布的人更容易买啤酒”?
- 这条规则到底够不够稳定?
- 它适不适合做推荐逻辑?
这就是为什么频繁项集之后,还要继续做:
关联规则生成与筛选
二、先从一个真实问题开始:同一个组合,写成哪条规则更有意义?
继续沿用校园超市案例。
现在超市已经发现:
{啤酒, 尿布}是一个频繁项集。
接下来,超市经理提出了一个更实际的问题:
如果我想做促销推荐,到底该写成哪条规则?
可能的写法有两种:
啤酒 -> 尿布 尿布 -> 啤酒表面上看,这只是顺序换了一下,但业务含义完全不同:
啤酒 -> 尿布:买啤酒的人,是否倾向于顺便买尿布?尿布 -> 啤酒:买尿布的人,是否倾向于顺便买啤酒?
这两条规则谁更强、谁更稳定、谁更适合做促销,不能靠感觉判断,而要靠数据指标来筛选。
三、频繁项集和关联规则,到底有什么区别?
这是这一课最容易混淆的地方。
1. 频繁项集是什么?
频繁项集是指:
经常一起出现的商品组合
比如:
{面包, 牛奶}{尿布, 啤酒}
它强调的是:
这个组合常不常一起出现
2. 关联规则是什么?
关联规则是指:
从某个商品或商品组合,推导另一个商品或商品组合的关系
形式通常写成:
A -> B例如:
面包 -> 牛奶它强调的是:
当 A 出现时,B 是否也更可能出现
3. 一句话区分
可以先记住:
- 频繁项集 = 高概率一起出现的组合
- 关联规则 = 从一个组合推导另一个组合的规则
所以:
{面包, 牛奶}是频繁项集面包 -> 牛奶是关联规则
四、关联规则是怎么从频繁项集里生成出来的?
关联规则不是凭空来的,它是由频繁项集拆出来的。
比如频繁项集:
{面包, 牛奶}就可以拆成两条规则:
面包 -> 牛奶 牛奶 -> 面包再比如频繁项集:
{面包, 牛奶, 尿布}就可以拆成更多规则,例如:
面包, 牛奶 -> 尿布 面包, 尿布 -> 牛奶 牛奶, 尿布 -> 面包 面包 -> 牛奶, 尿布 牛奶 -> 面包, 尿布这也说明:
一个频繁项集,往往可以生成多条不同的关联规则。
但并不是所有规则都值得保留,还要进一步筛选。
五、什么样的规则才叫“强关联规则”?
在关联规则分析中,一般不是“只要能生成规则就拿来用”,而是要筛选出:
强关联规则
所谓强关联规则,通常要满足两个基本条件:
- 支持度达到要求
- 置信度达到要求
也就是说:
- 这条规则不能太少见
- 这条规则还得足够稳定
如果一条规则出现得很少,或者虽然出现了但并不可靠,那通常就不适合直接拿来做促销或推荐。
六、为什么高频组合不一定是好规则?
这一点特别值得讲清楚,因为学生很容易误解为:
“频繁项集已经很高频了,那从里面生成的规则肯定就有价值。”
其实不一定。
举个例子:
如果{啤酒, 尿布}很常见,只能说明:
- 啤酒和尿布经常一起出现
但这并不自动意味着:
- 买啤酒的人一定会买尿布
- 或者买尿布的人一定会买啤酒
因为:
- 啤酒本身出现次数可能不多
- 尿布本身出现次数可能更多
- 同样一个组合,换一个方向写成规则,强度就可能变掉
所以,频繁项集只能说明“组合常见”,但要判断规则值不值得用,还得继续看:
- 支持度
- 置信度
七、继续用校园超市案例:从频繁项集生成规则
还是用这组交易记录:
transactions=[['面包','牛奶'],['面包','尿布','啤酒','鸡蛋'],['牛奶','尿布','啤酒','可乐'],['面包','牛奶','尿布','啤酒'],['面包','牛奶','尿布','可乐']]前面我们已经可以通过 Apriori 找出频繁项集。
接下来要做的,就是:
从这些频繁项集中,生成真正可用的规则。
八、Python 实操:从频繁项集生成关联规则
下面直接上代码。
importpandasaspdfrommlxtend.preprocessingimportTransactionEncoderfrommlxtend.frequent_patternsimportapriori,association_rules transactions=[['面包','牛奶'],['面包','尿布','啤酒','鸡蛋'],['牛奶','尿布','啤酒','可乐'],['面包','牛奶','尿布','啤酒'],['面包','牛奶','尿布','可乐']]# 数据编码te=TransactionEncoder()te_array=te.fit(transactions).transform(transactions)df=pd.DataFrame(te_array,columns=te.columns_)# 第一步:找频繁项集freq_items=apriori(df,min_support=0.6,use_colnames=True)# 第二步:由频繁项集生成关联规则rules=association_rules(freq_items,metric="confidence",min_threshold=0.6)print("关联规则:")print(rules[['antecedents','consequents','support','confidence']])输出:
关联规则: antecedents consequents support confidence 0 (啤酒) (尿布) 0.6 1.00 1 (尿布) (啤酒) 0.6 0.75 2 (牛奶) (尿布) 0.6 0.75 3 (尿布) (牛奶) 0.6 0.75 4 (面包) (尿布) 0.6 0.75 5 (尿布) (面包) 0.6 0.75 6 (面包) (牛奶) 0.6 0.75 7 (牛奶) (面包) 0.6 0.75九、这段代码在做什么?
这段代码其实就是把“关联规则挖掘的两步”完整串起来了。
第一步:找频繁项集
freq_items=apriori(df,min_support=0.6,use_colnames=True)这一步和上一篇一致,先找到高频商品组合。
例如可能会找到:
(面包, 牛奶)(啤酒, 尿布)(面包, 牛奶, 尿布)
这些只是“高频组合”,还不是最终规则。
第二步:由频繁项集生成规则
rules=association_rules(freq_items,metric="confidence",min_threshold=0.6)这一步是真正从频繁项集中生成规则。
参数里最重要的是:
metric="confidence"
表示用“置信度”作为筛选标准min_threshold=0.8
表示只保留置信度不低于 0.8 的规则
也就是说,这一步是在做:
规则筛选
十、结果表中的几个字段,应该怎么看?
输出结果里最关键的字段通常是这几个:
antecedentsconsequentssupportconfidence
1. antecedents
表示规则左边,也叫“前件”。
例如:
(啤酒)意思是规则从“啤酒”出发。
2. consequents
表示规则右边,也叫“后件”。
例如:
(尿布)表示最终推导的是“尿布”。
3. support
表示这条规则对应的整体支持度。
也就是:
这条规则涉及的组合在所有交易中常不常见
4. confidence
表示这条规则的置信度。
也就是:
当前件出现时,后件也出现的把握有多大
这也是这一篇最重要的筛选指标。
十一、运行结果应该怎么理解?
假设输出结果类似这样:
antecedents consequents support confidence 0 (啤酒) (尿布) 0.6 1.00 1 (尿布) (啤酒) 0.6 0.75可以这样理解:
规则1:啤酒 -> 尿布
支持度 0.6
说明“啤酒和尿布”这个组合在全部交易中占比 60%置信度 1.00
说明买了啤酒的人,100% 同时买了尿布
这条规则非常强,因为它说明:
只要啤酒出现,尿布就一定同时出现
规则2:尿布 -> 啤酒
- 支持度还是 0.6
- 置信度是 0.75
说明买尿布的人,有 75% 的概率也买了啤酒。
这条规则也有一定价值,但没有上一条那么强。
十二、为什么同一个组合,写成不同规则会不一样?
这一点非常重要,也是很多初学者第一次接触关联规则时最容易忽略的地方。
假设我们已经找到了一个频繁项集:
{啤酒, 尿布}这说明:
啤酒和尿布这两个商品经常一起出现。
但问题是,从这个频繁项集里可以拆出两条不同的规则:
啤酒 -> 尿布 尿布 -> 啤酒表面上看,这只是顺序换了一下,但它们的含义并不一样。
先看:啤酒 -> 尿布
这条规则的意思是:
买了啤酒的人,会不会也买尿布?
在当前样例数据中:
- 啤酒一共出现了 3 次
- 这 3 次都同时出现了尿布
所以这条规则的置信度是:
3 / 3 = 1.00也就是说:
买啤酒的人,100% 同时买了尿布
再看:尿布 -> 啤酒
这条规则的意思是:
买了尿布的人,会不会也买啤酒?
在当前样例数据中:
- 尿布一共出现了 4 次
- 其中有 3 次同时出现了啤酒
所以这条规则的置信度是:
3 / 4 = 0.75也就是说:
买尿布的人,有 75% 的概率同时买了啤酒
为什么这两条规则不一样?
虽然它们都来自同一个频繁项集:
{啤酒, 尿布}但它们的分母不一样:
啤酒 -> 尿布的分母是“啤酒出现次数”尿布 -> 啤酒的分母是“尿布出现次数”
因为前件不同,置信度就可能不同。
这说明:
同一个高频组合,拆成不同方向的规则之后,强度可能并不一样。
这对业务有什么意义?
如果要做促销推荐:
啤酒 -> 尿布说明“买啤酒的人几乎一定也买尿布”,这条规则更强(大概率是一个男被老婆叫出来买尿布,顺手就买了啤酒)尿布 -> 啤酒虽然也有一定关系,但稳定性没有前者那么高
所以在实际分析中,不能只看到“这两个商品经常一起出现”,还要继续看:
到底哪一个方向的规则更强、更值得应用。
十三、支持度和置信度在规则筛选中分别起什么作用?
很多初学者学到这里,会把这两个指标混在一起。
其实它们的角色不太一样。
支持度:先看这条规则常不常见
如果支持度很低,说明这条规则虽然可能“看起来挺准”,但它出现次数太少,业务意义有限。
例如:
- 只在极少数交易里出现
- 就算置信度高,也不一定值得拿来做促销
置信度:再看这条规则稳不稳定
置信度高,说明这条规则比较可靠。
例如:
- 买了啤酒的人,几乎都会买尿布
- 这种规则就更适合做组合推荐
所以可以先记住一句话:
支持度看“常不常见”,置信度看“准不准”。
十四、这一课最核心要记住什么?
学完这一课,至少要把下面几件事想清楚:
1)频繁项集和关联规则不是一回事
- 频繁项集:高频商品组合
- 关联规则:从一个组合推导另一个组合的关系
2)为什么不能停留在频繁项集
因为高频组合不等于高价值规则,还要继续筛选。
3)规则是怎么来的
规则是从频繁项集中拆出来的。
4)什么是强关联规则
通常要同时满足支持度和置信度要求。
5)代码里最关键的函数是什么
是:
association_rules()它的作用就是:
从频繁项集生成关联规则。
十五、结尾总结
这一课主要解决的是一个非常实际的问题:
高频商品组合找到了,接下来怎么变成真正能用的规则?
通过校园超市购物小票案例,可以先建立下面这几个核心认识:
- 频繁项集是后续生成规则的基础
- 关联规则是从频繁项集中拆出来的
- 同一个高频组合,可以生成多条不同方向的规则
- 高频组合不等于好规则,还要进一步筛选
- 支持度和置信度是规则筛选中最基础的两个指标
对于初学者来说,这一课最重要的不是背公式,而是先理解:
关联分析真正有价值的,不只是“找到组合”,而是“找到可用规则”。
而下一步,自然就是另一个非常现实的问题:
如果数据量变大了,Apriori 太慢怎么办?
这正是下一课 FP-Growth 要解决的问题。
写在最后
如果这篇文章对你有帮助,欢迎点赞、收藏、评论支持一下。
你在看规则结果时,第一反应更关注:
- 哪条规则的支持度最高?
- 哪条规则的置信度最高?
- 还是哪条规则最适合拿来做促销推荐?
欢迎在评论区交流。