
前言这个标题把两个不同层面的概念并在一起说需要先拆开澄清否则容易走偏。数据化运营是一种工作方式——用数据指标来指导运营决策关联规则association rule是数据挖掘里的一类具体方法用于发现哪些东西经常一起出现。关联规则是数据化运营可以调用的一种工具不是数据化运营本身。把它俩混为一谈会导致一开始就去调算法却没想过挖出来的规则要用来做什么决策。另一个常见误解是关联规则就是购物篮分析只能用在超市。它的确是靠购物篮数据出名的但同一套数学可以用于内容推荐看了这篇的人还看了哪些、故障诊断报警 A 出现时常见 B、用户行为序列分析。方法是通用的数据形式都是一堆集合。本文先把支持度、置信度、提升度这三个指标讲透再用纯标准库在小型数据集上实现一遍关联规则挖掘最后讨论这些规则落到运营上意味着什么、以及有哪些容易误读的地方。一、三个核心指标关联规则写成 X → Y意思是出现 X 的记录里往往也出现 Y。评价一条规则好坏看三个量支持度supportX 和 Y 同时出现的记录占全部记录的比例。它衡量这条规则覆盖的样本有多普遍。置信度confidence在出现 X 的记录中同时出现 Y 的比例。它衡量规则的可靠程度。提升度lift置信度除以 Y 本身的支持度。它衡量有了 X相比没有 XY 出现的可能性提高了多少。公式是这样的指标公式含义支持度support(X∪Y) count(X∪Y) / N覆盖率越大约普遍置信度confidence(X→Y) support(X∪Y) / support(X)可靠性越高越可信提升度lift(X→Y) confidence(X→Y) / support(Y)提升幅度大于 1 才是正向关联提升度是最容易被忽略也最关键的指标。假设 90% 的用户本来就买了 Y那么买了 X 的人有 85% 也买了 Y这条规则的置信度看着很高其实比平均水平还低提升度小于 1——这不是关联是 Y 本身就太普遍。二、Apriori 的剪枝思路如果商品有 100 种所有可能的组合是 2 的 100 次方穷举不可能。Apriori 用了一条简单但有力的性质来剪枝如果一个项集是频繁的支持度达到阈值那么它的所有子集也一定是频繁的。反过来如果一个项集不频繁那么包含它的任何超集也一定不频繁。于是算法分两阶段先自底向上找所有频繁项集从单个项开始逐层扩展并砍掉不达标的组合再从频繁项集里生成规则。阈值通常设一个最小支持度min_support过滤掉长尾再设一个最小置信度min_confidence过滤掉不可靠的规则。这里的阈值不是越高越好。min_support 设太高只剩几条显而易见的大路货规则设太低则会产生海量噪声规则无法落地。三、用标准库实现一遍在小数据集上不用 Apriori 那套剪枝也能算清楚——直接枚举所有组合、统计频次即可。下面的代码可以直接运行数据规模大时必须换成真正的 Apriori 或 FP-Growth 实现如第三方库 mlxtend本机没有安装具体 API 以其官方文档为准。# 适用于 Python 3.8from itertools import combinationsfrom collections import defaultdictdef load_transactions():return [{面包, 牛奶},{面包, 尿布, 啤酒, 鸡蛋},{牛奶, 尿布, 啤酒, 可乐},{面包, 牛奶, 尿布, 啤酒},{面包, 牛奶, 尿布, 可乐},]def count_itemsets(transactions, max_size):统计所有大小不超过 max_size 的项集的出现次数。counts defaultdict(int)for basket in transactions:items sorted(basket)for size in range(1, max_size 1):for combo in combinations(items, size):counts[frozenset(combo)] 1return countsdef rule_metrics(counts, total, x, y):计算规则 x - y 的支持度、置信度与提升度。xy counts.get(x | y, 0)cx counts.get(x, 0)cy counts.get(y, 0)if cx 0 or cy 0 or total 0:return Nonesupport xy / totalconfidence xy / cxlift confidence / (cy / total)return support, confidence, lift推演一下count_itemsets用defaultdict(int)累加每个组合在几笔交易里出现过frozenset用作字典键因为集合可哈希而列表不可哈希。rule_metrics里x | y是两个集合的并集counts.get(x | y, 0)取出它出现的次数。接下来把它们串起来输出满足阈值的规则# 适用于 Python 3.8def mine_rules(min_support0.4, min_confidence0.6):transactions load_transactions()total len(transactions)counts count_itemsets(transactions, max_size3)rules []for itemset, cnt in counts.items():if len(itemset) 2:continueif cnt / total min_support:continueitems sorted(itemset)for size in range(1, len(items)):for left in combinations(items, size):x frozenset(left)y itemset - xmetrics rule_metrics(counts, total, x, y)if metrics is None:continuesupport, confidence, lift metricsif confidence min_confidence and lift 1:rules.append((x, y, support, confidence, lift))rules.sort(keylambda r: r[4], reverseTrue)return rulesfor x, y, support, confidence, lift in mine_rules():print(f{set(x)} - {set(y)} 支持度{support:.2f} 置信度{confidence:.2f} 提升度{lift:.2f})这段先按 min_support 砍掉不频繁的项集再对剩下的每个项集枚举所有左部/右部切分方式只保留同时满足置信度和提升度门槛的规则最后按提升度排序。注意排序键取的是r[4]也就是提升度而不是置信度——正如上一节所说置信度高的规则未必是好规则。四、规则怎么用到运营上挖出的规则本身不是结论要经过一步人话翻译和一步因果审视翻译成可执行动作。{啤酒} - {尿布}提升度高可以对应到这两类商品放在相邻货架组合优惠券这类动作。审视因果。关联规则只说明共现不说明原因。啤酒和尿布同时出现很可能是年轻父亲一次采购这个共同原因导致的而不是啤酒导致了尿布。没有因果的规则不能用来做给用户推 Y 就能提升 Y 销量的承诺。考虑干预的副作用。推荐系统里高提升度的规则可能只是在重复用户本来就会做的事推荐它没有增量价值。用途规则形态需要额外注意商品陈列高提升度、中等支持度门店空间有限要按品类约束组合营销高置信度、支持度达标防止把本来就会买的组合当增量内容推荐序列化后的关联规则时序信息比共现更重要流失预警负向关联出现 X 则少出现 Y需要额外的因果验证常见坑点只看置信度、不看提升度。Y 本身很普遍时高置信度毫无意义。❌ 买了 X 的人 85% 买 Y所以 X 关联 Y ✅ 计算提升度确认lift 1最好明显大于 1再采信。支持度阈值设得过低。会产出成千上万条规则其中大量是巧合共现运营上根本无法落地。❌min_support0.001之后手工翻页挑规则 ✅ 从较高阈值起步逐级降低每一步都检查新增规则是否可解释。用列表当项集的字典键。列表不可哈希counts[[面包, 牛奶]]会抛TypeError: unhashable type: list。❌ 用list做项集键 ✅ 用frozenset或tuple做键。把关联当成因果。共现可能来自第三个隐藏因素也可能纯粹是巧合。❌ 直接依据规则上线买 X 推 Y并承诺销量提升 ✅ 把规则当作假设用 A/B 实验去验证增量效果。忽略数据集规模差异。在几千条记录上挖出的规则推广到千万级用户时支持度分布可能完全不同原先的阈值不再适用。❌ 小样本上调好的阈值直接搬到全量 ✅ 每次换数据集都重新评估支持度分布与阈值。把连续值直接当作项。金额、时长这类连续变量不能像面包牛奶那样直接进项集否则每个具体数值都变成一个独立项组合爆炸。❌ 把price19.9当成一个项 ✅ 先分箱离散化成低价/中价/高价再接进关联规则。在遍历字典时修改它。生成规则时顺手往counts里加项会抛RuntimeError: dictionary changed size during iteration。❌ 边遍历counts.items()边写入新键 ✅ 先把需要的新键收集到临时字典遍历结束后再合并。用集合的运算符号搞错并集与差集。x - y是差集x | y是并集写成x y会直接抛TypeError。❌ 用x y表示两个项集的合并 ✅ 用x | y求并集itemset - x求右部项集。总结概念要点支持度覆盖率用来过滤长尾、控制规则数量置信度条件概率衡量规则可靠性提升度关键指标大于 1 才是正向关联Apriori依据非频繁项集的超集必非频繁剪枝数据结构项集用frozenset当字典键落地规则要翻译成动作并另行验证因果工具小数据可手写大数据用成熟库API 以官方文档为准关联规则能给运营提供线索但它的输出是这些东西经常一起出现而不是让这些东西一起出现就能带来增长。把三个指标算准、把支持度阈值调好、把关联与因果分清楚这套方法才真正用得住。