当前位置: 首页 > news >正文

别再只懂Apriori了!用Python手写一个超市购物篮分析,从牛奶面包数据里挖出隐藏的关联规则

从零实现购物篮分析:用Python揭示牛奶与面包的隐藏关联

超市货架上看似随机摆放的商品,其实暗藏玄机。当顾客把牛奶和面包同时放进购物车时,背后可能隐藏着值得挖掘的商业规律。本文将带你用Python从零实现经典的购物篮分析,不依赖现成库,彻底掌握关联规则挖掘的核心原理。

1. 购物篮分析基础与数据准备

购物篮分析(Market Basket Analysis)是零售行业最常用的数据分析技术之一,它通过挖掘顾客购买商品之间的关联关系,帮助商家优化商品陈列、制定促销策略。这种分析的核心在于发现"如果顾客购买了A商品,那么他们也倾向于购买B商品"这样的规律。

关键概念速览

  • 支持度(Support):规则A→B在所有交易中出现的频率
  • 置信度(Confidence):在包含A的交易中,同时包含B的比例
  • 提升度(Lift):规则A→B的提升程度,衡量相关性

让我们从一个简单的数据集开始。假设我们收集了一家小型超市一周的购物数据,包含五种商品:牛奶、面包、苹果、香蕉和火腿。数据格式如下,其中1表示购买,0表示未购买:

1,1,0,0,0 # 购买了牛奶和面包 0,1,1,0,0 # 购买了面包和苹果 1,0,0,1,0 # 购买了牛奶和香蕉 0,0,1,1,0 # 购买了苹果和香蕉 1,1,0,0,1 # 购买了牛奶、面包和火腿

使用NumPy加载这个数据集:

import numpy as np data = np.loadtxt('shopping_data.txt', delimiter=',') print(f"数据集形状:{data.shape}") # 输出(5,5)表示5笔交易,5种商品

2. 手动计算购买频率与共现次数

理解购物篮分析的第一步是统计单个商品的购买频率和商品对的共现次数。这为我们后续计算支持度和置信度奠定基础。

from collections import defaultdict # 初始化计数器 item_counts = defaultdict(int) # 单个商品购买次数 pair_counts = defaultdict(int) # 商品对共现次数 total_transactions = len(data) # 总交易笔数 # 商品名称映射 items = ["milk", "bread", "apple", "banana", "ham"] # 统计购买频率 for transaction in data: for item_idx, purchased in enumerate(transaction): if purchased: item_counts[item_idx] += 1 # 统计商品对共现 for transaction in data: purchased_items = [i for i, val in enumerate(transaction) if val] for i in range(len(purchased_items)): for j in range(i+1, len(purchased_items)): pair = (purchased_items[i], purchased_items[j]) pair_counts[pair] += 1 # 同时记录反向组合 reverse_pair = (purchased_items[j], purchased_items[i]) pair_counts[reverse_pair] += 1 # 输出统计结果 print("商品购买次数统计:") for item_idx, count in item_counts.items(): print(f"{items[item_idx]}: {count}次")

统计结果示例

商品组合共现次数
牛奶→面包2次
面包→苹果1次
牛奶→香蕉1次
苹果→香蕉1次

3. 实现支持度与置信度计算

有了基础统计数据后,我们可以计算关联规则的两个核心指标:支持度和置信度。

支持度计算公式

支持度(A→B) = 包含A和B的交易数 / 总交易数

置信度计算公式

置信度(A→B) = 包含A和B的交易数 / 包含A的交易数

Python实现代码:

# 计算所有可能的规则 rules = [] for (premise, conclusion), count in pair_counts.items(): support = count / total_transactions confidence = count / item_counts[premise] rules.append({ 'rule': (premise, conclusion), 'support': support, 'confidence': confidence }) # 打印前5条规则 print("\n关联规则示例:") for i, rule in enumerate(rules[:5]): prem, conc = rule['rule'] print(f"规则{i+1}: 如果购买{items[prem]},则也会购买{items[conc]}") print(f" 支持度: {rule['support']:.2f}, 置信度: {rule['confidence']:.2f}")

注意:支持度衡量规则的普遍性,而置信度衡量规则的可靠性。两者都很重要,但需要平衡考虑。

4. 引入提升度优化规则质量

单纯依赖支持度和置信度可能会产生误导。例如,如果面包本身就很畅销,那么"牛奶→面包"的置信度可能很高,但这并不一定意味着两者有真正的关联。这时就需要引入提升度(Lift)

提升度计算公式

提升度(A→B) = 置信度(A→B) / 支持度(B)

提升度解释:

  • 1:A和B正相关

  • =1:A和B独立
  • <1:A和B负相关

Python实现:

# 计算提升度 for rule in rules: premise, conclusion = rule['rule'] support_conclusion = item_counts[conclusion] / total_transactions rule['lift'] = rule['confidence'] / support_conclusion # 按提升度排序 sorted_rules = sorted(rules, key=lambda x: x['lift'], reverse=True) print("\n按提升度排序的Top5规则:") for i, rule in enumerate(sorted_rules[:5]): prem, conc = rule['rule'] print(f"{i+1}. {items[prem]} → {items[conc]}") print(f" 支持度: {rule['support']:.2f}, 置信度: {rule['confidence']:.2f}, 提升度: {rule['lift']:.2f}")

典型提升度解读

  • 提升度1.5:购买A的顾客购买B的可能性比普通顾客高50%
  • 提升度0.8:购买A的顾客反而更少购买B

5. 结果可视化与业务应用

计算得到的规则需要直观展示才能发挥价值。我们可以使用matplotlib简单可视化:

import matplotlib.pyplot as plt # 提取Top5规则数据 top_rules = sorted_rules[:5] premises = [items[r['rule'][0]] for r in top_rules] conclusions = [items[r['rule'][1]] for r in top_rules] lift_values = [r['lift'] for r in top_rules] # 创建条形图 plt.figure(figsize=(10, 6)) bars = plt.barh([f"{p}→{c}" for p,c in zip(premises, conclusions)], lift_values) plt.xlabel('提升度') plt.title('关联规则提升度Top5') plt.xlim(0, max(lift_values)*1.1) # 在条形上添加数值 for bar in bars: width = bar.get_width() plt.text(width, bar.get_y() + bar.get_height()/2, f'{width:.2f}', ha='left', va='center') plt.tight_layout() plt.show()

业务应用场景

  1. 商品陈列优化:将高提升度的商品组合摆放在相邻位置
  2. 捆绑促销:对关联性强的商品设计组合优惠
  3. 个性化推荐:根据顾客已选商品推荐相关商品
  4. 库存管理:关联商品保持同步进货和促销节奏

6. 避免常见陷阱与误区

在实际应用中,购物篮分析有几个常见误区需要注意:

1. 忽视零交易的影响我们的示例数据很小,现实中可能有数千种商品组合从未一起出现过。这些"零"同样包含重要信息。

2. 过度依赖高置信度高置信度规则如果支持度很低,可能只是偶然现象。比如"鱼子酱→香槟"置信度可能很高,但实际交易数很少。

3. 忽略商品层级关系不同品类、品牌的商品需要分层分析。将"牛奶"作为一个整体分析可能掩盖不同品牌间的差异。

4. 不考虑时间因素季节性商品(如圣诞树与装饰灯)的关联可能只在特定时段成立。

改进建议代码

# 添加最小支持度阈值 min_support = 0.1 filtered_rules = [r for r in rules if r['support'] >= min_support] # 添加最小提升度阈值 min_lift = 1.2 filtered_rules = [r for r in filtered_rules if r['lift'] >= min_lift] print(f"经过过滤后剩余{len(filtered_rules)}条有意义规则")

7. 扩展思路与进阶技巧

掌握了基础实现后,可以考虑以下进阶方向:

1. 高效计算优化对于大规模数据,可以使用位图等数据结构优化存储和计算:

# 将交易数据转换为位图表示 bitmap_data = np.packbits(data.astype(bool), axis=1) # 位运算快速计算共现 def bitwise_and_count(a, b): return np.count_nonzero(np.bitwise_and(a, b))

2. 多层次关联分析除了商品间关联,还可以分析:

  • 商品类别关联
  • 购买时间关联(早上vs晚上)
  • 顾客属性关联(年龄、性别等)

3. 实时分析架构对于线上商城,可以设计实时关联规则推荐:

# 伪代码示例 def real_time_recommendation(cart_items, rules_db): recommendations = set() for item in cart_items: related_items = rules_db.get_related_items(item) recommendations.update(related_items) return recommendations - set(cart_items)

4. 结合其他算法

  • 与协同过滤结合提高推荐精度
  • 使用图算法发现商品社区
  • 应用深度学习挖掘非线性关系
http://www.gsyq.cn/news/1418093.html

相关文章:

  • Arduino与Visuino实现电机定时启停:可视化编程与L298N驱动详解
  • 据说刷一个百度热搜的成本在1万以上
  • 面向美区市场直播拍卖,跨境网络链路选型全指南
  • Mapillary Vistas数据集实战:用Python快速加载并可视化66类街景语义分割标签
  • 别再只算欧氏距离了!用Python+NumPy实战Grassmann流形,搞定人脸识别中的子空间比对
  • CentOS 7最小化安装后,5分钟搞定网络连接(含nmtui图文详解与常见坑点)
  • 口碑好的卡盒哪个创新强
  • 【ChatGPT汇报材料优化黄金法则】:20年高管秘书亲授——3类高频废稿+5步AI精修法,今日不学明天被退回
  • 保姆级教程:在Ubuntu 20.04上从零跑通《视觉SLAM十四讲》所有代码(附避坑指南)
  • 2026年5月早教中心室内玩具厂家推荐榜:儿童体适能器材、感统训练教具、跑酷套装、攀爬系列、体操垫厂家选择指南 - 海棠依旧大
  • 腾讯云代理商:腾讯云一键部署Hermes Agent 75个技能免配置开箱即用
  • 农业数字化|玉米地田间作物识别数据集|幼苗出苗率|杂草识别|YOLO格式|AI智能农田应用
  • 2026年5月口碑好的深圳居民搬家公司找哪家厂家推荐榜,居民搬家/单位搬迁/日式搬家/搬厂/贵重物品搬运厂家选择指南 - 海棠依旧大
  • 4 构建Agentic AI的实用技巧
  • AI 幻觉杀死了我的生产环境:LLM 输出校验的 6 层防御机制与兜底方案设计
  • Microchip SAM-ICE与Keil µVision调试配置指南
  • 2026年5月评价高的安阳防爆电机公司如何选厂家推荐榜,YBZ系列、YBK系列、矿用隔爆型、粉尘防爆型电机厂家选择指南 - 海棠依旧大
  • 电源箱厂家排行:深圳哪家最靠谱?
  • 告别Edge兼容模式!Win11里找回那个熟悉的IE图标,搞定老旧系统登录
  • CoreSight ELA-600跟踪数据溢出优化方案
  • 车辆线性二,三,四自由度汽车动力学模型稳定性对比仿真【附说明文档】
  • 【石油】基于matlab风化导致的石油有机碳和青藏高原净地质碳收支【含Matlab源码 15573期】
  • 2026 北京 GEO 优化服务商合作参考:客户评价与合规要求深度解析 - 玖叁鹿
  • 用LangGraph构建支持“暂停与人工介入”的长周期任务工作流
  • ST LIS3DHTR代理商
  • Windows 11 dwm.exe内存占用高?可能是Intel核显驱动的锅(附戴尔/灵越5570实测)
  • 告别批量计算:用Python手把手实现RLS算法,处理实时数据流(附完整代码)
  • 2026年四川区域高性价比挡墙钢模板生产供应企业全面梳理与产业分析 - 博客湾
  • 我采访了五个一人公司老板,发现他们都有一个共同点
  • 【助睿实验指导】浏览器用户行为分析与流失预测-数据加工