数据分析中的关联规则挖掘是什么?常用的算法有哪些?

发布时间:2026/7/12 10:36:48

数据分析中的关联规则挖掘是什么?常用的算法有哪些? 关联规则挖掘详解一、什么是关联规则挖掘关联规则挖掘Association Rule Mining是从大规模数据集中发现项与项之间隐含的共现关系的经典方法。最著名的案例就是啤酒与尿布——超市发现购买尿布的年轻父亲经常同时购买啤酒。核心思想如果某些项在事务中频繁地一起出现则它们之间可能存在有价值的关联关系。事务数据库示例 TID 购买商品 ───────────────────── T1 {面包, 牛奶, 黄油} T2 {面包, 尿布, 啤酒, 鸡蛋} T3 {牛奶, 尿布, 啤酒, 可乐} T4 {面包, 牛奶, 尿布, 啤酒} T5 {面包, 牛奶, 可乐} 挖掘结果 {尿布} → {啤酒} (支持度 60%, 置信度 75%) {面包, 牛奶} → {黄油} (支持度 20%, 置信度 50%)二、核心概念1. 基本定义概念定义示例项Item数据中最小的原子单位面包、牛奶项集Itemset项的集合{面包, 牛奶}事务Transaction一次事件中出现的项集T1: {面包, 牛奶, 黄油}规则RuleX → YX 为前件Y 为后件{面包} → {牛奶}2. 三大核心指标事务总数 N 5 规则: {尿布} → {啤酒} ├── 包含{尿布}的事务: T2, T3, T4 → 3个 ├── 包含{尿布,啤酒}的事务: T2, T3, T4 → 3个 └── 包含{啤酒}的事务: T2, T3, T4 → 3个指标公式计算示例含义支持度 SupportP(X∪Y) count(X∪Y) / N3/5 60%规则在数据中出现的频率置信度 ConfidenceP(Y|X) Support(X∪Y) / Support(X)3/3 100%X 出现时 Y 也出现的概率提升度 LiftConfidence(X→Y) / Support(Y)1.0 / 0.6 1.67X 对 Y 出现的提升程度提升度解读Lift 1X 与 Y 独立无关联Lift 1正相关X 促进 Y 出现有价值的规则Lift 1负相关X 抑制 Y 出现3. 其他重要指标指标公式含义Conviction(1 - Support(Y)) / (1 - Confidence)规则出错的概率比值越大规则越可靠LeverageSupport(X∪Y) - Support(X)×Support(Y)实际共现与独立假设的差值Kulc(Confidence(X→Y) Confidence(Y→X)) / 2两个方向置信度的均值对不平衡数据更稳健三、常用算法算法全景关联规则挖掘算法 ├── 经典频繁项集挖掘 │ ├── Apriori — 逐层搜索最经典 │ ├── FP-Growth — 无候选项模式树更高效 │ └── Eclat — 垂直数据格式深度优先 ├── 高效变体 │ ├── LCM — 最快频繁闭项集挖掘 │ ├── Charm — 频繁闭项集垂直格式 │ └── Mafia — 频繁极大项集 ├── 序列模式挖掘 │ ├── GSP — 广义序列模式 │ ├── PrefixSpan — 前缀投影更高效 │ └── SPADE — 垂直序列挖掘 └── 多维度/多层扩展 ├── MLTAML — 多层关联规则 └── Quantitative — 量化关联规则1. Apriori 算法 — 最经典核心思想先找频繁项集再生成规则。利用先验性质Apriori Property频繁项集的所有子集也必须是频繁的。逐层搜索过程 第1轮扫描数据库找频繁1-项集 {面包}:3 {牛奶}:4 {尿布}:3 {啤酒}:3 {可乐}:2 {黄油}:1 {鸡蛋}:1 ↓ 过滤 (min_support40%) L1 {面包, 牛奶, 尿布, 啤酒, 可乐} 第2轮L1 自连接 → 候选2-项集扫描数据库计数 {面包,牛奶}:3 {面包,尿布}:2 {面包,啤酒}:2 {面包,可乐}:1 {牛奶,尿布}:2 {牛奶,啤酒}:2 {牛奶,可乐}:2 {尿布,啤酒}:3 {尿布,可乐}:1 {啤酒,可乐}:1 ↓ 过滤 L2 {{面包,牛奶}, {尿布,啤酒}, ...} 第3轮L2 自连接 → 候选3-项集 ... 重复直到无法生成新的频繁项集frommlxtend.frequent_patternsimportapriori,association_rulesimportpandasaspd# 构造布尔事务矩阵transactionspd.DataFrame({面包:[1,1,0,1,1],牛奶:[1,0,1,1,1],尿布:[0,1,1,1,0],啤酒:[0,1,1,1,0],可乐:[0,0,1,0,1],},index[T1,T2,T3,T4,T5])# 挖掘频繁项集frequent_itemsapriori(transactions,min_support0.4,# 最小支持度阈值use_colnamesTrue)print(frequent_items)# 生成关联规则rulesassociation_rules(frequent_items,metricconfidence,# 评估指标min_threshold0.6# 最小置信度)# 筛选有价值的规则valuablerules[(rules[lift]1.2)(rules[confidence]0.7)]print(valuable[[antecedents,consequents,support,confidence,lift]])Apriori 的瓶颈每轮都要扫描全库候选项集数量爆炸特别是 k 较大时。2. FP-Growth 算法 — 更高效核心思想只需两次扫描数据库构建 FP 树压缩存储直接在树上挖掘频繁模式无需生成候选项集。FP 树构建过程 第1次扫描统计频次按频次降序排列项 牛奶:4 面包:3 尿布:3 啤酒:3 可乐:2 第2次扫描将每条事务按频次顺序插入树 ∅ (root) / \ 牛奶 面包 / | \ \ 面包 尿布 可乐 尿布 | | | 尿布 啤酒 啤酒 | 啤酒 节点记录: 项名 计数 链接(同项节点串联)frommlxtend.frequent_patternsimportfpgrowth,association_rules# FP-Growth 挖掘频繁项集API 与 apriori 一致内部更高效frequent_itemsfpgrowth(transactions,min_support0.4,use_colnamesTrue)# 生成规则与 Apriori 后续步骤相同rulesassociation_rules(frequent_items,metricconfidence,min_threshold0.6)Apriori vs FP-Growth 对比维度AprioriFP-Growth数据库扫描次数k1 次k 为最大项集长度2 次候选项集需要生成可能爆炸无需生成内存占用候选项集可能很大FP 树压缩存储适用场景项集较短、稀疏数据项集较长、密集数据实现复杂度简单较复杂3. Eclat 算法 — 垂直数据格式核心思想将水平事务格式转为垂直格式项 → TID 列表通过 TID 集合交集计算支持度深度优先搜索。水平格式 → 垂直格式转换 水平: 垂直: T1: {面包,牛奶} 面包: {T1,T2,T4,T5} T2: {面包,尿布,啤酒} 牛奶: {T1,T3,T4,T5} T3: {牛奶,尿布,啤酒} 尿布: {T2,T3,T4} T4: {面包,牛奶,尿布,啤酒} 啤酒: {T2,T3,T4} T5: {面包,牛奶,可乐} 可乐: {T3,T5} 计算 {尿布,啤酒} 的支持度: 尿布 ∩ 啤酒 {T2,T3,T4} ∩ {T2,T3,T4} {T2,T3,T4} Support 3/5 60%# mlxtend 不直接支持 Eclat可用 pyfim 或手动实现# 简化版 Eclat 实现defeclat(vertical_db,min_support,N):vertical_db: {item: set_of_tids}frequent{}defdfs(prefix,items,tids):foriteminsorted(items):new_tidstidsvertical_db[item]iftidselsevertical_db[item]iflen(new_tids)/Nmin_support:new_prefixprefix[item]frequent[frozenset(new_prefix)]len(new_tids)remaining{iforiinitemsifiitem}dfs(new_prefix,remaining,new_tids)dfs([],set(vertical_db.keys()),set())returnfrequent# 使用vertical_db{面包:{1,2,4,5},牛奶:{1,3,4,5},尿布:{2,3,4},啤酒:{2,3,4},可乐:{3,5}}resulteclat(vertical_db,min_support0.4,N5)维度AprioriFP-GrowthEclat搜索策略广度优先深度优先深度优先数据格式水平压缩树垂直扫描次数多次2次1次预转换后内存候选集FP树TID集合适合通用密集长模式稀疏短模式4. 序列模式挖掘 — PrefixSpan当项之间有时间顺序时需要序列模式挖掘# 序列数据库每个序列是按时间排列的项集sequences[[[面包],[牛奶,黄油],[啤酒]],# 顾客A的购买序列[[面包,牛奶],[尿布],[啤酒,可乐]],# 顾客B[[牛奶],[尿布,啤酒],[可乐]],# 顾客C]# 规则: {面包} → {牛奶} → {啤酒} (先买面包再买牛奶最后买啤酒)四、完整实战案例importpandasaspdfrommlxtend.frequent_patternsimportfpgrowth,association_rulesfrommlxtend.preprocessingimportTransactionEncoder# 1. 原始事务数据transactions[[面包,牛奶,黄油],[面包,尿布,啤酒,鸡蛋],[牛奶,尿布,啤酒,可乐],[面包,牛奶,尿布,啤酒],[面包,牛奶,可乐],[尿布,啤酒,可乐],[面包,牛奶,尿布,可乐],[面包,尿布,啤酒],]# 2. 编码为布尔矩阵teTransactionEncoder()te_aryte.fit(transactions).transform(transactions)dfpd.DataFrame(te_ary,columnste.columns_)# 3. FP-Growth 挖掘频繁项集frequent_itemsfpgrowth(df,min_support0.25,use_colnamesTrue)frequent_items[length]frequent_items[itemsets].apply(len)print( 频繁项集 )print(frequent_items.sort_values(support,ascendingFalse))# 4. 生成关联规则rulesassociation_rules(frequent_items,metriclift,min_threshold1.0)# 5. 多条件筛选有价值的规则valuable_rulesrules[(rules[support]0.25)(rules[confidence]0.6)(rules[lift]1.2)].sort_values(lift,ascendingFalse)print(\n 高价值关联规则 )print(valuable_rules[[antecedents,consequents,support,confidence,lift]].to_string())# 6. 可视化importmatplotlib.pyplotasplt plt.figure(figsize(10,6))scatterplt.scatter(rules[support],rules[confidence],crules[lift],cmapYlOrRd,alpha0.7,s80)plt.colorbar(scatter,labelLift)plt.xlabel(Support)plt.ylabel(Confidence)plt.title(Association Rules: Support vs Confidence (colorLift))plt.tight_layout()plt.show()五、应用场景领域应用示例规则零售/电商购物篮分析、商品推荐{手机壳} → {手机膜} Lift3.2金融交叉销售、欺诈模式{大额转账, 境外IP} → {欺诈}医疗症状-疾病关联、药物配伍{头痛, 发热} → {流感}Web 挖掘页面共访、导航路径{首页, 搜索页} → {商品详情页}网络运维故障关联分析{CPU飙升, 磁盘IO高} → {服务超时}教育知识点关联、学习路径{函数, 循环} → {递归}六、实践要点与常见误区要点说明最小支持度不宜过高过高会漏掉有价值的低频规则建议从低阈值开始逐步调高提升度比置信度更重要置信度高但提升度 ≤1 的规则无意义Y 本身就很频繁关注规则的可操作性规则必须有业务含义{牛奶}→{面包} 可能只是两者都畅销避免冗余规则{A,B}→{C} 和 {A}→{C} 可能表达同一关系优先保留更简洁的时间维度购物篮分析中同一购物车 ≠ 同一意愿需结合时间窗口数据预处理稀疏项可合并归类如红苹果“绿苹果→苹果”减少项数提升效率负关联同样重要Lift 1 的负关联互斥关系也有业务价值如{高端产品}→{折扣商品}

相关新闻