news 2026/8/4 23:57:42

19 Python关联分析:从频繁项集到关联规则——哪些规则真正值得用?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
19 Python关联分析:从频繁项集到关联规则——哪些规则真正值得用?

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 的规则

也就是说,这一步是在做:

规则筛选


十、结果表中的几个字段,应该怎么看?

输出结果里最关键的字段通常是这几个:

  • antecedents
  • consequents
  • support
  • confidence

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 要解决的问题。


写在最后

如果这篇文章对你有帮助,欢迎点赞、收藏、评论支持一下。

你在看规则结果时,第一反应更关注:

  • 哪条规则的支持度最高?
  • 哪条规则的置信度最高?
  • 还是哪条规则最适合拿来做促销推荐?

欢迎在评论区交流。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 15:13:30

终极指南:如何利用Ludwig实现高效多GPU模型并行训练

终极指南:如何利用Ludwig实现高效多GPU模型并行训练 【免费下载链接】ludwig 项目地址: https://gitcode.com/gh_mirrors/ludwi/ludwig Ludwig是一个功能强大的开源深度学习框架,它提供了简单易用的接口来构建和训练各种机器学习模型。在处理大规…

作者头像 李华
网站建设 2026/7/14 15:13:30

spring相关

1.springSpring 是一个开源的轻量级控制反转和面向切面编程的容器框架。轻量级是说它开发使用简单,功能强大控制反转是指将对象的创建,销毁控制交给 ioc 容器,方便解耦合,降低维护难度面向切面编程是指将相同的逻辑横向抽取出来&a…

作者头像 李华
网站建设 2026/7/14 15:13:29

【第一章】基于Simulink的控制器开发教程——目录

👋前言 基于Simulink的控制器开发是一种模型驱动的开发模式,核心是通过图形化建模搭建控制器算法,再结合仿真验证、最终实现控制器的快速开发与部署。这种开发模式覆盖了从算法设计到硬件实现的全流程,支持多种类型控制器的开发&a…

作者头像 李华
网站建设 2026/7/14 15:13:32

Qwen3-Reranker-0.6B实战案例:在4GB显存设备上运行语义重排序的调优技巧

Qwen3-Reranker-0.6B实战案例:在4GB显存设备上运行语义重排序的调优技巧 1. 理解语义重排序的价值 语义重排序是提升搜索和问答系统准确性的关键技术。想象一下,你在图书馆找书——先快速找到可能相关的几十本书(粗排)&#xff…

作者头像 李华
网站建设 2026/7/14 15:13:43

Qwen2-VL-2B-Instruct实操手册:Streamlit界面调试信息与Device维度解析

Qwen2-VL-2B-Instruct实操手册:Streamlit界面调试信息与Device维度解析 1. 项目简介与核心价值 如果你正在寻找一个能真正理解图片和文字之间关系的工具,那么GME-Qwen2-VL-2B-Instruct可能就是你要找的答案。这不是一个聊天机器人,而是一个…

作者头像 李华