
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[[面包,牛奶],[面包,尿布,啤酒,鸡蛋],[牛奶,尿布,啤酒,可乐],[面包,牛奶,尿布,啤酒],[面包,牛奶,尿布,可乐]]# 数据编码teTransactionEncoder()te_arrayte.fit(transactions).transform(transactions)dfpd.DataFrame(te_array,columnste.columns_)# 第一步找频繁项集freq_itemsapriori(df,min_support0.6,use_colnamesTrue)# 第二步由频繁项集生成关联规则rulesassociation_rules(freq_items,metricconfidence,min_threshold0.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_itemsapriori(df,min_support0.6,use_colnamesTrue)这一步和上一篇一致先找到高频商品组合。例如可能会找到(面包, 牛奶)(啤酒, 尿布)(面包, 牛奶, 尿布)这些只是“高频组合”还不是最终规则。第二步由频繁项集生成规则rulesassociation_rules(freq_items,metricconfidence,min_threshold0.6)这一步是真正从频繁项集中生成规则。参数里最重要的是metricconfidence表示用“置信度”作为筛选标准min_threshold0.8表示只保留置信度不低于 0.8 的规则也就是说这一步是在做规则筛选十、结果表中的几个字段应该怎么看输出结果里最关键的字段通常是这几个antecedentsconsequentssupportconfidence1. 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 要解决的问题。写在最后如果这篇文章对你有帮助欢迎点赞、收藏、评论支持一下。你在看规则结果时第一反应更关注哪条规则的支持度最高哪条规则的置信度最高还是哪条规则最适合拿来做促销推荐欢迎在评论区交流。