01 / 12
复现 + 诊断 + 优化

商品零售购物篮分析

基于 GoodsOrder.csvGoodsTypes.csv, 严格复现书中 Apriori 案例的代码逻辑、参数设定和输出口径, 再从数据、方法、模型和决策表达四个维度做诊断与优化。

BRDICD 汇报结构 书本代码复现 FP-Growth 替换 业务决策建议
41080当前 CSV 商品记录数
9356购物篮笔数
158商品数量
9品类数量

结论导向问题:哪些商品该相邻陈列?哪些组合值得捆绑?仅有规则表为什么还不够支撑经营决策?

分析路径:先复现关联规则建模流程,再从结果解释、方法改进和经营应用三个层面展开。

02 / 12

汇报围绕 BRDICD 六个环节展开

B

背景

  • 书本案例目标
  • 零售业务问题
  • 数据来源与边界
R

复现

  • 代码运行
  • 流程解析
  • 原始结果
D

诊断

  • 数据问题
  • 方法问题
  • 模型问题
I

优化

  • 方法改进
  • 模型替换
  • 阈值重设
C

对比

  • 指标对比
  • 规则数量
  • 可视化对照
D

决策

  • 哪个更好
  • 业务建议
  • 后续路径
03 / 12

书本案例要回答的,本质上是一个零售经营问题

书中目标

构建零售商品的 Apriori 关联规则模型,分析商品之间的关联性;再根据模型结果给出销售策略。

业务翻译

  • 哪些商品经常一起出现,适合相邻陈列?
  • 哪些商品组合适合捆绑、满减或联促?
  • 如何从“规则很多”中挑出真正值得执行的规则?

分析范围

本次分析以既有零售案例为基础,先复现关联规则挖掘流程,再对结果进行诊断、优化与经营解释。

数据口径说明

书页中写的是 9835 个购物篮、169 个商品、43367 条记录;当前项目下实际 CSV 是 9356 个购物篮、158 个商品、41080 条记录。

所以:代码逻辑可以完全复现,结果口径可以完全复现,但具体数值会跟着当前 CSV 版本变化。

9835书中购物篮数
9356当前购物篮数
169书中商品数
158当前商品数

分析含义

这说明结果解读需要同时结合数据版本、参数设定与输出口径,不能孤立看待单张结果表。

04 / 12

书本方法流程复现:先探索,再转换,再建模,最后解释规则

STEP 01数据探索

查看数据特征、检查缺失、统计热销商品,并理解商品结构。

STEP 02数据预处理

按 id 合并商品清单,转换为 Apriori 需要的事务列表格式。

STEP 03自写 Apriori

找频繁项集,生成满足 min_support、min_conf、lift>1 的规则。

STEP 04规则解释

挑出重点规则,翻译成货架陈列、捆绑促销和补货建议。

书本关键参数

  • 最小支持度:0.02
  • 最小置信度:0.35
  • 规则筛选条件:lift > 1
if __name__ == '__main__':
    dataSet = data_translation
    L, supportData = apriori(dataSet, minSupport=0.02)
    rule = gen_rule(L, supportData, minConf=0.35)

# 书中逻辑重点:
# 1. 先找频繁项集
# 2. 再从频繁项集生成强关联规则
# 3. 同时要求置信度达标、提升度大于 1
05 / 12

复现 1:先看数据特征,再看热销商品

书本复现终端输出
按书中口径运行后的终端截图:记录数 41080、购物篮 9356、商品 158、规则数 28。

流程解析

这一步做了三件事:读取 CSV查看 info按商品聚合销量。作用不是预测,而是先知道数据规模、字段结构和热销中心。

热销商品TOP10
TOP10 商品销量图。当前 CSV 中,全脂牛奶、其他蔬菜、面包卷、苏打、酸奶位列前五。

解释决策

热销商品并不等于关联规则,但它能告诉我们:哪些商品是顾客最常买、最适合先做补货和显性陈列管理的中心商品。

06 / 12

复现 2:做商品结构分析,再看饮料内部构成

各类商品销量占比
品类层占比复现。饮料、西点、果蔬三类销量最接近,合计接近总销量的 53%。

流程解析

书里先把商品销量表和类型映射表合并,再按 Types 聚合。这样商品级“长表”变成了可管理的品类结构。

饮料内部销量占比
饮料内部结构复现。全脂牛奶在饮料类中的占比最高,前 3 类饮品占比接近 70%。

解释决策

这一步的价值是告诉业务:不是所有热销都在同一层级看。商品级适合补货,品类级适合陈列,品类内部适合做货架资源分配。

07 / 12

复现 3:把长表转换成事务清单,再按书中自写 Apriori 建模

# 书中数据转换逻辑
data['Goods'] = data['Goods'].apply(lambda x: ',' + x)
data = data.groupby('id').sum().reset_index()
data['Goods'] = data['Goods'].apply(lambda x: [x[1:]])
data_list = list(data['Goods'])

data_translation = []
for i in data_list:
    p = i[0].split(',')
    data_translation.append(p)

# 作用:
# 一行一个商品 -> 一行一个购物篮 -> 每个购物篮是一个商品列表

为什么必须做这一步

Apriori 的输入不是“订单-商品明细长表”,而是“每个购物篮包含哪些商品”的事务型列表。转换完才能计算项集支持度。

# 书中规则生成逻辑
L, supportData = apriori(data_translation, minSupport=0.02)
rule = gen_rule(L, supportData, minConf=0.35)

# 在 calc_conf 中还要求:
if conf >= minConf and lift > 1:
    ruleList.append((lhs, rhs, conf))

解释决策

支持度保证规则“不是偶然”,置信度保证规则“有预测力”,lift>1 保证“这不是随机共现”。这三个约束一起,才让规则有业务意义。

08 / 12

复现 4:规则输出结果已经跑出来,但还需要被解释成业务语言

当前 CSV 的复现结果

按书中参数和代码逻辑运行,当前数据共得到 28 条 有效规则。代表性规则包括:

lhsrhssupportconfidencelift
{其他蔬菜}{全脂牛奶}0.0786660.3867581.439915
{酸奶}{全脂牛奶}0.0588930.4016031.495186
{根茎类蔬菜}{其他蔬菜}0.0498080.4347012.137187
规则运行截图
终端输出呈现了模型运行过程与关联规则原始结果。
规则 1

买其他蔬菜的顾客,有 38.68% 同时买全脂牛奶。

规则 2

买酸奶的顾客,有 40.16% 同时买全脂牛奶。

规则 3

买根茎类蔬菜的顾客,有 44.87% 同时买全脂牛奶。

规则 4

根茎类蔬菜与其他蔬菜之间的共购关系更强,lift 超过 2.13。

09 / 12

只复现还不够:这里至少有三个明显问题

数据问题

数据版本与业务维度都有限

  • 当前 CSV 与书中统计规模不一致,说明案例数据有版本差异。
  • 只有 id、Goods、Types,没有价格、门店、时间、用户标签。
  • 因此能回答“买了什么”,但难回答“什么时候、哪里、对谁有效”。
方法问题

Apriori 更像教学方案,不是表达最优方案

  • Apriori 会反复扫描候选项集,效率不高。
  • 同样阈值下,FP-Growth 能得到相同商品级规则,但过程更轻。
  • 只展示商品级规则,较难直接对应货架、促销和区域陈列等经营动作。
模型问题

规则虽然有效,但还不够决策友好

  • 很多规则都指向全脂牛奶,容易形成“结果堆叠”。
  • 规则多时,业务方不知道应该优先看哪几条。
  • 缺少一个从商品级到品类级的桥梁,导致解释成本高。
10 / 12

优化方案围绕方法、层级和阈值三个方向展开

优化 1:模型替换

FP-Growth 替换 Apriori 的求解过程。在相同商品级阈值下,输出规则数量仍为 28,说明替换不改变结论,只优化实现方式。

优化 2:增加品类级规则

把商品结果提升为经营语言:不再只说“酸奶买牛奶”,还说“饮料 + 果蔬会带动米粮调料、肉类和西点”。

优化 3:重新设阈值

品类级采用 support=0.15confidence=0.55,把原本爆炸的 1269 条规则压缩为 28 条,便于汇报与决策。

# 优化后的两条路线
# 路线 A:商品级 FP-Growth(结果与书本对齐)
goods_freq = fpgrowth(goods_matrix, min_support=0.02)
goods_rules = association_rules(goods_freq, metric='confidence', min_threshold=0.35)

# 路线 B:品类级 FP-Growth(表达更适合业务)
type_freq = fpgrowth(type_matrix, min_support=0.15)
type_rules = association_rules(type_freq, metric='confidence', min_threshold=0.55)
type_rules = type_rules[type_rules['lift'] > 1]

为什么这三刀是合理的

它们分别解决了三个问题:运行方式更现代结果层级更接近经营语言输出数量更适合展示和筛选

11 / 12

对比结论:商品级用于“复现一致性”,品类级用于“业务解释力”

规则数量对比
对比图显示:商品级 FP-Growth 与书本 Apriori 都是 28 条规则;未经调参的品类级会爆炸,因此需要重设阈值。

汇报维度评分

书本一致性95
运行效率88
业务可讲性92

三种方案对比

方案支持度置信度频繁项集数规则数
书本自写 Apriori0.020.3512928
FP-Growth 商品级0.020.3512928
FP-Growth 品类级0.150.552928

优化后更值得讲的规则

规则置信度lift
{果蔬;西点} ⇒ {肉类}58.09%1.56
{果蔬;饮料} ⇒ {米粮调料}56.20%1.55
{肉类;饮料} ⇒ {果蔬}67.80%1.48

这些规则比“某个单品带出某个单品”更适合直接翻译成区域陈列和组合促销方案。

12 / 12

最终决策:保留书本复现作为基线,汇报与经营建议采用优化版表达

哪个更好?

如果目的是上课复现:书本自写 Apriori 是基线,必须保留。
如果目的是做经营建议:品类级 FP-Growth 更好,因为它能直接对应货架、区域、组合和促销动作。

建议 1:把高频中心商品放在显眼位置

全脂牛奶、酸奶、其他蔬菜相关规则最集中,应作为核心补货和重点陈列商品。

建议 2:做“果蔬 + 饮料 + 米粮/肉类”联合陈列

品类级规则表明顾客在这些品类之间存在稳定联动,可做家庭采购场景化摆放。

建议 3:把单品规则和品类规则分层使用

商品级用于捆绑推荐,品类级用于货架区位和促销主题,不要混用。

综合结论

  • 已完成关联规则建模流程的完整复现。
  • 识别出数据版本差异及结果表达层级的局限。
  • 通过 FP-Growth 与品类级规则提升了结果的经营解释力。
优化终端输出
优化版终端输出展示了改进模型在当前参数下的结果表现。

一句话收束

这组案例最值得带走的,不是“Apriori 会不会写”,而是:同一个算法结果,怎样组织成更能支撑业务决策的表达。

01 / 12