老陈在城西开了家火锅店,每晚打烊后,他都会把小本本摊开,把每桌点的菜记成一行。记了半年,他看出点门道:点毛肚的桌,多半也会点鸭肠。他把毛肚和鸭肠打包成“招牌双拼”,卖得风生水起。这是正关联规则——“买了A通常也买B”。 可有一天他翻账本愣住了:点了麻辣锅底的桌,几乎从不点清汤锅底;点了冰镇酸梅汤的人,也很少再要热豆浆。这些客人不是不爱吃,而是“买了A反而不买B”。老陈要是不懂这个理,傻乎乎给麻辣锅底客人塞清汤锅底优惠券,人家只会觉得他莫名其妙。 这篇文章要讲的,就是挖掘这类“回避关系”的负关联规则。它的思想和正关联规则正好互补:不但要看“谁和谁一起出现”,还要看“谁和谁互相回避”。老陈靠它把互斥菜品分开、给麻辣客人反向推荐冰粉、把酸梅汤券塞给爱吃辣的人……这套思路落到电商、超市和内容平台,就是互斥商品排查、品类优化和精准反向推荐。
对 AI 从业者而言,负关联规则是与正关联规则互补的核心技能:它能发现“互斥”而非“共生”的商品关系,让推荐、品类与促销策略更精准,是零售与电商数据分析面试的高频考点。
可视化演示
动态演示买了A反而不买B的负关联规则的核心机制,通过源头/管道/节点/终端四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
买了A反而不买B的负关联规则:一负关联 一、负关联规则的定义与动机 二、负关联规则的四种基本类型 核心机制可视化 买了A反而不买B的负关联规则整体架构与关键组件
负关联概念
老陈的账本里除了“黄金搭档”那一页,还有一页“火锅冤家”:麻辣锅底和清汤锅底几乎从不同桌出现,酸梅汤和热豆浆也互不相让。生活里这种“有你没我”的搭配比比皆是:有人买了豆浆就不买牛奶,有人有了 Switch 就不买 PS5,买了安卓手机就不再买苹果配件。负关联规则,就是专门从购物记录里挖出这些“回避关系”的算法。
正关联规则关注“A 出现时 B 也出现”的概率高不高,负关联规则正好反过来:A 出现时,B 反而不出现。一条负关联规则写作 A⇒¬B,读作“买了 A 就不买 B”。它不是什么玄学,而是用概率刻画“回避”:在所有订单里,同时包含 A 又不包含 B 的比例必须足够明显,才称得上规则。
支撑这条规则的第一把尺子是支持度:
老陈按这个公式一算:麻辣锅底和清汤锅底的支持度是 0.51,也就是说超过一半的桌都严格“二选一”。这个数字让他确信,“火锅冤家”不是错觉,而是一条值得记录下来的负关联规则。
- 支持度符号support 缩写为 supp,代表规则在数据中的覆盖广度,是第一条准入线。
- 概率刻画把“覆盖广度”写成概率形式,即在全部订单中抽出“含 A 且不含 B”那一撮。
- 分子计数逐个订单检查,数出所有“含 A 且不含 B”的订单个数。
- 分母归一除以订单总数,把计数变成 0 到 1 之间的比例,方便跨数据集比较。
支持度置信度
光知道“冤家名单”还不够,老陈还想知道这张名单有多可靠:如果一个客人点了麻辣锅底,他到底有多大概率真的不点清汤?支持度回答“这条规则覆盖了多少数据”,但覆盖广不等于规律稳。好比一个县里 90% 的人都说“我不吃香菜”,可这话放在火锅店就不一定成立——还得看点了麻辣锅底的人里,有多少真的避开了清汤。
这把新尺子叫置信度,它回答的是条件概率问题:“在前件成立”的前提下,后件有多大概率成立。置信度越高,说明“买 A 就回避 B”的行为越稳定。
支持度和置信度要搭配使用,像一对质检员:支持度太低,样本太少,结论不可信;置信度太低,即使样本够,规律也不稳定。比如“买了清汤锅底的人不点麻辣”支持度只有 0.15,就算置信度再高,覆盖的顾客太少,也不值得为它调整菜单。老陈最后算出来,“麻辣→不点清汤”的支持度 0.51、置信度 0.93,双双过关;而“锅里加枸杞→不点冰啤”支持度只有 0.02,方向虽对,样本太少,只配当花边新闻。
- 条件概率P(¬B|A) 读作“给定 A 发生时 ¬B 的概率”,刻画 A 对 B 的压制作用。
- 分子A 与 ¬B 同时发生的比例,即负支持度。
- 分母归一除以 P(A),只在“买了 A”的群体里计算回避比例。
- 互补形式用 1 减去正置信度,说明正负规则共用一套统计原料,互为镜像。
提升度判负相关
账本上还有一件怪事让老陈挠头:点了麻辣锅底的桌,点雪花肥牛的比例也不低。那“麻辣→不点清汤”到底是因为两种锅底真的互斥,还是因为清汤锅底本来就没什么人点?好比班里 90 分以上的同学都不戴帽子,你能说“考高分和戴帽子互斥”吗?不能——因为全班本来就不怎么有人戴帽子。这时候需要第三把尺子:提升度,它把规则放到“全店基线”里比一比。
提升度的思想很朴素:先假设 A 和 B 互不影响,算出“本来应该有多少人同时买它们”,再看实际同时买了多少。实际远低于期望,说明 A 的出现压低了 B;实际远高于期望,说明 A 拉动了 B。
火锅店的例子里,清汤锅底的基线比例只有 0.17,按独立假设,麻辣桌里本应有约 0.09 桌点清汤;实际只有 0.04,lift≈0.38,明显小于 1,“互斥”坐实了。反过来,毛肚和鸭肠的 lift≈2.1,是标准的“黄金搭档”。老陈这下明白:光有名单和可靠性还不够,还得排除“本来就没几个人点”的错觉。三把尺子量完,他才敢说“麻辣与清汤水火不容”。
- 真实共现分子是 A 和 B 同时出现的实际比例。
- 独立基线分母假设两者互不影响时的期望共现比例。
- 比值判断真实值除以期望值,大于 1 说明出现得比独立假设更频繁。
- 三区间解读把比值分成小于 1、等于 1、大于 1 三档,分别对应回避、独立、相伴。
正负规则辨析
老陈的菜单上有两页:一页叫“搭档”,一页叫“冤家”。正关联规则像餐厅里的“食客结伴”——看到毛肚和鸭肠总是一起出现;负关联规则像“座位回避”——有人喜欢靠窗,有人死活不坐窗边。一个管“相伴”,一个管“回避”,看起来是冤家对头,实际上是同一枚硬币的两面。
从数学上看,正负规则共用同一套统计原料,只是视角相反。对同一对商品 A、B,“买 A 也买 B”和“买 A 不买 B”是互斥且完备的两个事件,它们的置信度加起来恒等于 1:
这也解释了为什么“买了麻辣锅底的人也顺手点清汤锅底”这种正规则支持度极低——因为它和负规则天然互补。电商里到处是这种镜像:买了 iPhone 的人不买安卓通用配件,买了无糖饮料的人不买含糖饮料。不过要注意,负规则的挖掘难度比正规则高:正规则靠“频繁项集”的单调性可以大幅剪枝,负规则要找的恰恰是“不共现”,候选组合更多,还得逐个做方向检验。老陈把两页菜单贴在一起看:毛肚配鸭肠是“同路人”,麻辣配清汤是“陌路人”。一个老板既要知道谁和谁要好,也要知道谁和谁不对付,才能把店经营得滴水不漏。
- 正规则置信度买 A 的顾客中同时买 B 的比例,刻画“相伴”。
- 负规则置信度买 A 的顾客中不买 B 的比例,刻画“回避”。
- 互斥完备对任意一个买了 A 的顾客,B 的命运只有“买”或“不买”两种,两者不重叠。
- 和为 1两段概率拼成完整概率空间,一方升高另一方必降低。
负关联挖掘法
有了三把尺子,怎么批量找出所有“火锅冤家”?总不能把菜单上 100 种菜两两配对,人工逐一排查。老陈需要一条流水线:先生成候选名单,再让质检员筛一遍,最后请提升度签字确认。
这条流水线分三步。第一步生成候选对:先按单品支持度筛掉太冷门的商品,剩下的两两配对。第二步双阈值剪枝:要求负支持度足够高、负置信度足够稳,把“覆盖太窄”和“规律太飘”的候选直接淘汰。第三步做提升度方向检验:确认 A 与 B 的共现概率确实低于独立基线,排除“本来就没多少人买 B”的错觉。三步全部通过,才正式登记为负关联规则。
工程上还有个常用的技巧:把 ¬B 当成一个“伪商品”塞进数据集,用改造过的 Apriori 在同一套框架里挖负规则,只是候选空间会膨胀,需要按支持度排序后分批验证。老陈的流水线跑了一天,产出 20 对“冤家”,里面既有锅底互斥这种意料之中的,也有“鹅肠和热豆浆”这种没想到的——后来一查才发现,天热时点鹅肠的客人爱配冰啤酒。这让他明白:机器挖出的只是线索,最终还得回到店里验证。
- 候选商品对被怀疑互相回避的两个商品,是流水线的输入。
- 支持度关卡回避现象覆盖的订单数要超过最小支持度,避免样本太少。
- 置信度关卡在买 A 的群体里,回避 B 的比例要超过最小置信度,保证规律稳定。
- 提升度关卡共现提升度小于 1,证明回避不是基线错觉。
- 三关全过三个条件用逻辑与连接,缺一不可,全部满足才输出规则。
商业应用落地
流水线跑通了,老陈开始用“冤家名单”赚钱。他把菜单重新排了版:麻辣锅底和清汤锅底分开放在两页,再也没人点完麻辣后对着清汤发呆;点麻辣锅底的桌,服务员会主动送一小碗冰粉,说是“解辣神器”,客人眼睛都亮了。
这套玩法搬到更大的商业场景里,就是四大应用。第一,互斥商品排查:把负关联规则挖出的组合从套餐和推荐位里拿掉,避免“推荐了也白推荐”。第二,反向推荐:既然买了 A 不买 B,那就给 A 用户推“B 的替代品”,把回避关系变成新的转化机会。第三,品类陈列优化:互斥品分架陈列,中间插入互补品,延长顾客动线。第四,错峰促销:把优惠券投给“回避关系”的另一端商品,避免券发到不相关的客群手里浪费预算。衡量效果时,要用负关联规则自己的提升度:
电商里同样好用:买了奶粉的顾客反而不买咖啡,说明客群错位,母婴区不该塞咖啡券;买了健身器材的人不买膨化零食,那就反向推荐蛋白粉和瑜伽垫。三个月后,老陈的店因为反向推荐小食和饮品,客单价涨了 12%。他终于明白:被拒绝的商品不是垃圾信息,而是通往用户真实需求的另一条路。
- 实际回避比例分子统计“买 A 且不买 B”的真实占比。
- 独立基线分母是假设两者无关时的期望回避比例。
- 比值真实回避强度相对随机基线的倍数。
- 判定标准比值大于 1,说明“回避”不是巧合,规则值得落地。
AI 应用场景
电商平台互斥商品排查
阶段:数据探索与特征工程
解决的问题:传统做法靠运营经验猜测哪些商品不宜捆绑,漏掉大量隐性互斥组合;负关联规则从订单日志自动算出“买 A 不买 B”的显著组合,把容易踩坑的推荐位提前过滤掉。
具体案例:某 3C 电商发现“旗舰手机→¬通用充电配件”的支持度高达 0.62,提升度仅 0.31。运营据此把旗舰机详情页的配件推荐位换成同品牌专属配件,点击率提升 18%,退货率同步下降。
连锁商超品类陈列优化
阶段:数据挖掘与决策支持
解决的问题:货架摆放全凭店长经验,互斥商品放同一排会互相抢生意;负关联规则给出数据依据,指导把互斥品类分区陈列,并在中间插入互补品拉升连带购买。
具体案例:某连锁超市按月跑负关联规则,发现“炒锅→¬电饭煲”这类厨电二选一现象突出。他们将两类厨电分到不同通道,中间插入铲勺、调味品等互补小件,单店客单价提升 9%,滞销率下降 7%。
促销券错峰投放
阶段:效果评估与营销策略
解决的问题:群发优惠券会投给互斥客群,转化极低还伤品牌好感;负关联规则识别出“回避对”后,把券转向用户真正需要的反向互补商品。
具体案例:某火锅连锁品牌用负关联规则发现“麻辣锅底→¬清汤锅底”后,把原本发给麻辣用户的清汤锅底兑换券改为酸梅汤券,核销率从 0.3% 涨到 6.1%,连带客单价提升 12%。
Python 演示
# -*- coding: utf-8 -*-"""负关联规则挖掘:找出"买了A反而不买B"的商品对"""from itertools import combinationsfrom collections import defaultdict # 模拟火锅店点单流水:每桌是一个商品集合orders = [ {"麻辣锅底", "毛肚", "酸梅汤"}, {"麻辣锅底", "鸭肠", "毛肚"}, {"清汤锅底", "肥牛", "豆浆"}, {"麻辣锅底", "毛肚"}, {"清汤锅底", "青菜", "肥牛"}, {"麻辣锅底", "鸭肠", "冰粉"}, {"清汤锅底", "豆浆"}, {"麻辣锅底", "毛肚", "冰粉"}, {"清汤锅底", "肥牛"}, {"麻辣锅底", "鸭肠"},] def mine_negative_rules(orders, min_sup=0.2, min_conf=0.7): """返回负关联规则列表,每项为 (A, B, 支持度, 置信度, 提升度)""" n = len(orders) item_sup = defaultdict(int) for order in orders: for item in order: item_sup[item] += 1 items = [it for it, c in item_sup.items() if c / n >= min_sup] rules = [] for A, B in combinations(items, 2): sup_A = item_sup[A] / n sup_B = item_sup[B] / n sup_AB = sum(1 for o in orders if A in o and B in o) / n sup_AnB = sup_A - sup_AB # 买A不买B的支持度 conf_AnB = sup_AnB / sup_A if sup_A else 0 lift_AB = sup_AB / (sup_A * sup_B) if sup_A * sup_B else 0 if sup_AnB >= min_sup and conf_AnB >= min_conf and lift_AB < 1: rules.append((A, B, sup_AnB, conf_AnB, lift_AB)) rules.sort(key=lambda r: r[4]) # 提升度越小,负关联越强 return rules def main(): print("发现负关联规则(买了A反而不买B):") for A, B, sup, conf, lift in mine_negative_rules(orders): print("{} -> 不买{} | 支持度={:.2f} 置信度={:.2f} 提升度={:.2f}".format( A, B, sup, conf, lift)) if __name__ == "__main__": main()
item_sup[item] += 1逐单统计每个商品的出现次数,得到单品支持度的原料。items = [it for it, c in item_sup.items() if c / n >= min_sup]先按最小支持度剪枝,太冷门的商品不参与配对。sup_AnB = sup_A - sup_AB用“买 A 的占比”减去“A 和 B 都买”的占比,巧妙算出“买 A 不买 B”的支持度。lift_AB = sup_AB / (sup_A * sup_B) if sup_A * sup_B else 0提升度小于 1 说明共现比独立假设还少,判定为负关联。rules.sort(key=lambda r: r[4])按提升度从小到大排序,把最“水火不容”的商品组合排在前面。
常见误区
误区“反正正规则挖不出来,就挖负规则呗,负关联不就是那些不靠谱、置信度很低的规则吗?”
正解负关联规则不是“弱的正规则”,而是方向明确的“回避规则”,用 conf(A⇒¬B) 度量。火锅店里“麻辣锅底→不点清汤锅底”的置信度高达 0.93,比很多正规则都强。它“负”在共现关系是负的,不在规则的可靠程度是负的。
为何常见:名字里的“负”字容易让人联想到“没用、反向、质量差”,混淆了符号方向与规则质量这两个维度。
误区“lift<1 就是负关联,直接拿去做推荐准没错。”
正解lift<1 只说明相关性方向为负,还必须通过支持度关卡,证明覆盖的订单足够多。比如“清汤→不点鹅肠”提升度虽然低,但支持度只有 0.1,样本太少,很可能是偶然,不能据此调整菜单。三把尺子要一起看,只看一把都会翻车。
为何常见:只关注方向而忽视幅度和样本量,把“统计上有关”直接当成“业务上有用”。
误区“数据说买 A 的人不买 B,那 A 和 B 就是互斥商品,以后别放一起卖。”
正解负相关背后可能是替代关系、季节因素、价格带错位、人群差异等多种原因。比如“无糖饮料与含糖饮料”反映的是健康偏好,而非两种饮料不能共存;“鹅肠和热豆浆”可能是季节在作怪。负关联规则给出的是线索,因果关系要靠业务验证。
为何常见:把相关关系直接当成因果关系,忽视了隐藏的第三变量。
误区“Apriori 挖正规则那么熟,把 B 换成 ¬B 不就顺手挖出负规则了吗?”
正解¬B 的计数依赖项集之外的大量组合,频繁项集的反单调性在负规则上不再成立,直接套 Apriori 会产生爆炸性候选。工程上常见做法是负项扩展、约束剪枝或抽样近似,计算成本远高于正规则。
为何常见:两者名字里都带“关联规则”,让人误以为实现上只差一个取反操作。
面试题
Q1. 负关联规则 A⇒¬B 的支持度应该怎么计算?
- A.同时买 A 和 B 的订单占比
- B.买 A 但不买 B 的订单占比← 正确答案
- C.不买 A 且不买 B 的订单占比
- D.仅统计买 A 的订单占比
答案:B。支持度衡量规则覆盖的广度。A⇒¬B 要求订单“含 A”且“不含 B”,所以统计的是“买 A 但不买 B”的订单占比。选 A 是正规则支持度,选 C 是“都不买”,选 D 丢了“不买 B”这一半约束。
Q2. 某数据集中 sup(A)=0.6,sup(B)=0.5,sup(AB)=0.2,则 lift(A⇒B) 的取值和关系是?
- A.0.67,属于负关联← 正确答案
- B.0.67,属于正关联
- C.1.50,属于负关联
- D.1.50,属于正关联
答案:A。lift = P(AB) / (P(A)×P(B)) = 0.2 / (0.6×0.5) = 0.67。小于 1 说明实际共现比独立假设的期望更低,A 的出现压低了 B,属于负关联。选 C/D 是分子分母算反或混淆方向。
Q3. 关于置信度 conf(A⇒¬B),下列说法正确的是?
- A.等于 P(A∧¬B)/P(¬B)
- B.等于 1 减 conf(A⇒B)← 正确答案
- C.等于 P(B|A) 的值
- D.等于 P(A∧B)/P(A)
答案:B。在“买了 A”的群体里,“买 B”与“不买 B”是互斥且完备的,两者置信度相加恒等于 1,所以 B 正确。A 把分母错写成 P(¬B),C 和 D 都是正规则置信度的表达式。
Q4. 挖掘负关联规则时,“提升度方向检验”的主要目的是?
- A.让支持度阈值更低
- B.排除“本来共现率就低”的基线错觉← 正确答案
- C.让置信度阈值更高
- D.减少商品候选数量
答案:B。提升度把实际共现概率与“两者独立”时的期望对比。若 B 本身基数很低,A 与 B 共现少可能只是基线低,不一定是回避;提升度检验就是排除这种错觉,确认负相关是真实关系。
Q5. 下列哪些情况适合用负关联规则来发现?
- A.买无糖饮料的人不买含糖饮料← 正确答案
- B.买手机的人同时买充电宝
- C.买麻辣锅底的人不点清汤锅底← 正确答案
- D.买电脑的人大概率买鼠标
答案:AC。负关联规则专挖“回避关系”。A 和 C 都是“买了 A 就不买 B”的互斥模式;B 和 D 是“买了 A 也买 B”的共生模式,属于正关联规则的适用范围。
Q6. 提升度 lift(A⇒B)=1 表示什么?
- A.A 与 B 完全互斥
- B.A 与 B 相互独立← 正确答案
- C.A 与 B 强正相关
- D.规则计算有错误
答案:B。提升度等于实际共现概率除以独立假设下的期望共现概率。比值等于 1,说明实际共现与期望一致,A 和 B 互不影响,即相互独立。小于 1 是互斥,大于 1 才是正相关。
Q7. 关于负关联规则挖掘,下列说法正确的有?
- A.支持度、置信度、提升度需要联合使用← 正确答案
- B.频繁项集单调性对负规则依然成立
- C.负规则可用于反向推荐场景← 正确答案
- D.提升度小于 1 且支持度足够才值得关注← 正确答案
答案:ACD。三把尺子缺一不可,A 正确;负规则的挖掘依赖“不共现”计数,频繁项集的反单调性不再成立,B 错误;负规则正好用于给 A 用户推 B 的替代品,C 正确;lift<1 只是方向,还需支持度保证覆盖,D 正确。
Q8. 超市发现“买奶粉的妈妈不买咖啡”,最合理的业务动作是?
- A.把奶粉与咖啡捆绑销售
- B.在奶粉区投放咖啡优惠券
- C.反向推荐母婴相关商品← 正确答案
- D.立刻将咖啡下架停售
答案:C。负关联规则的价值是把“回避”变成新机会。给奶粉用户推咖啡大概率被无视,反向推母婴辅食、尿不湿等互补商品才是正解。A、B 违背了回避关系,D 是过度反应,把相关当因果。
Q9. 一条负关联规则 A⇒¬B 的置信度高达 0.9,但支持度只有 0.01,正确的判断是?
- A.非常可靠,应尽快上线
- B.置信度过低,需要调高
- C.支持度过低,需谨慎使用← 正确答案
- D.提升度必然大于一
答案:C。置信度高只说明“一旦买 A,几乎不买 B”,但支持度 0.01 意味着只有 1% 的订单覆盖这条规律,样本太少极易受噪声影响,业务上要谨慎,先扩大数据验证。A 忽略覆盖,B 理解反了,D 与负关联方向矛盾。
Q10. 负关联规则在零售分析中的典型应用包括?
- A.互斥商品排查← 正确答案
- B.品类陈列优化← 正确答案
- C.反向推荐引导← 正确答案
- D.计算商品毛利率
答案:ABC。负关联规则的核心应用是识别互斥、指导陈列、做反向推荐和错峰促销。计算商品毛利率属于财务分析,与关联规则无关,选 D 说明混淆了业务分析工具与财务指标。