用Python的mlxtend库5分钟实现电商购物篮分析实战
每次走进超市,你是否好奇为什么牙膏总是摆在牙刷旁边?或者为什么啤酒和尿布这两个看似毫不相关的商品会放在同一个促销区?这背后隐藏着一门叫做"购物篮分析"的数据科学技术。作为数据分析师,我们不必深究复杂的算法原理,借助Python的mlxtend库就能快速挖掘这些有趣的商品关联规律。
1. 环境准备与数据理解
在开始之前,确保你已经安装了必要的Python库。打开你的Jupyter Notebook或喜欢的IDE,运行以下命令:
pip install pandas mlxtend我们将使用一个模拟的电商订单数据集来演示整个过程。这个数据集包含1000条交易记录,每条记录代表一个顾客在一次购物中购买的商品组合。数据格式如下:
| 订单ID | 商品列表 |
|---|---|
| 1001 | 牛奶,面包,鸡蛋 |
| 1002 | 啤酒,尿布,零食 |
| 1003 | 面包,牛奶,尿布,啤酒 |
| ... | ... |
关键概念快速理解:
- 支持度(Support):商品组合出现的频率,如"啤酒和尿布"出现在30%的订单中
- 置信度(Confidence):购买A商品的顾客中,有多大比例也买了B商品
- 提升度(Lift):衡量商品关联的强度,大于1表示正相关
2. 数据预处理与频繁项集挖掘
首先导入必要的库并加载数据:
import pandas as pd from mlxtend.preprocessing import TransactionEncoder from mlxtend.frequent_patterns import apriori # 加载数据 df = pd.read_csv('ecommerce_transactions.csv') transactions = df['商品列表'].apply(lambda x: x.split(',')) # 数据编码 te = TransactionEncoder() te_ary = te.fit(transactions).transform(transactions) df_encoded = pd.DataFrame(te_ary, columns=te.columns_) # 挖掘频繁项集 frequent_itemsets = apriori(df_encoded, min_support=0.05, use_colnames=True) print(frequent_itemsets.sort_values('support', ascending=False).head(10))这段代码会输出支持度最高的商品组合。例如:
| 支持度 | 商品组合 |
|---|---|
| 0.32 | (牛奶) |
| 0.28 | (面包) |
| 0.18 | (牛奶, 面包) |
| 0.15 | (啤酒) |
| 0.12 | (尿布) |
| 0.09 | (啤酒, 尿布) |
3. 关联规则生成与筛选
有了频繁项集后,我们可以生成关联规则并计算置信度和提升度:
from mlxtend.frequent_patterns import association_rules # 生成关联规则 rules = association_rules(frequent_itemsets, metric="confidence", min_threshold=0.5) # 筛选有价值的规则 strong_rules = rules[ (rules['lift'] > 1.2) & (rules['confidence'] > 0.6) ].sort_values('lift', ascending=False) print(strong_rules[['antecedents', 'consequents', 'support', 'confidence', 'lift']])输出可能显示如下强关联规则:
| 前项 | 后项 | 支持度 | 置信度 | 提升度 |
|---|---|---|---|---|
| (啤酒) | (尿布) | 0.09 | 0.75 | 2.5 |
| (面包) | (牛奶) | 0.18 | 0.65 | 2.0 |
| (鸡蛋) | (面包) | 0.07 | 0.68 | 1.8 |
4. 业务解读与策略制定
数据分析的最终目的是指导业务决策。以下是如何解读和利用这些关联规则的实用建议:
1. 商品陈列优化:
- 将啤酒和尿布摆放在相邻货架或同一促销区
- 在面包区设置牛奶的交叉销售点
2. 促销策略设计:
- 对购买啤酒的顾客推送尿布优惠券
- 推出"面包+牛奶"组合优惠套餐
3. 库存管理:
- 当啤酒销量增加时,提前准备更多尿布库存
- 在早餐食品促销期间,确保面包和牛奶的供应充足
常见陷阱与解决方案:
问题1:规则太多,难以筛选有价值的
- 解决方案:设置更高的最小支持度和置信度阈值
- 使用提升度作为主要筛选指标,只保留提升度>1.5的规则
问题2:规则看似合理但实际无业务价值
- 解决方案:结合业务知识人工验证,如"盐和糖"的高关联可能只是基础食品
5. 高级技巧与性能优化
当处理大型数据集时,可以尝试以下优化方法:
# 使用更高效的FP-growth算法 from mlxtend.frequent_patterns import fpgrowth frequent_itemsets_fp = fpgrowth(df_encoded, min_support=0.05, use_colnames=True) # 并行计算加速 rules_parallel = association_rules( frequent_itemsets, metric="lift", min_threshold=1, parallel=True, num_cores=4 ) # 内存优化技巧 te = TransactionEncoder() te_ary = te.fit(transactions).transform(transactions, sparse=True) # 使用稀疏矩阵参数调优指南:
| 参数 | 推荐范围 | 影响说明 |
|---|---|---|
| min_support | 0.01-0.1 | 值越小,规则越多但计算越慢 |
| min_confidence | 0.5-0.8 | 值越高,规则越可靠但数量越少 |
| min_lift | 1.2-3.0 | 过滤掉弱关联规则 |
| max_length | 2-4 | 限制规则中商品的最大数量 |
在实际电商项目中,我发现将min_support设置为0.02-0.05,min_confidence设置为0.6左右,能够产生既有业务价值又不过于稀疏的规则集。对于新品或高价商品,可以适当降低支持度阈值,因为这些商品本身的购买频率可能较低但关联价值很高。