1. 引言
在电商场景中,购物车是用户购买意图最集中的地方。相比单纯的浏览行为,加入购物车的商品往往更能反映真实的消费需求。如果能够从海量购物车数据中挖掘出商品之间的组合规律,就能为推荐系统、营销活动和库存管理提供直接支撑。本文围绕「关联商品发现」这一主题,介绍如何通过API获取购物车数据,并在此基础上挖掘商品组合规律。
2. 核心概念
在动手之前,先厘清几个关键概念,便于后续理解整个挖掘流程。
- 购物车数据:用户在一次会话中加入购物车的商品集合,通常以订单或会话为单位记录。
- 关联规则:用于描述商品之间共现关系的规则,例如「购买A的用户也倾向于购买B」。
- 支持度:某个商品组合在所有购物车中出现的比例,反映组合的普遍程度。
- 置信度:在包含A的购物车中,同时包含B的比例,反映规则的可靠性。
- 提升度:衡量A与B之间关联强度相对于随机共现的提升程度。
3. 数据获取:通过API拉取购物车记录
挖掘组合规律的第一步,是把购物车数据从业务系统中取出来。这里以REST API为例,说明如何分页拉取购物车记录,并整理成后续分析所需的格式。
import requests
def fetch_cart_data(api_url, token, page_size=100):
headers = {"Authorization": f"Bearer {token}"}
page = 1
all_carts = []
while True:
resp = requests.get(
api_url,
headers=headers,
params={"page": page, "page_size": page_size},
timeout=10
)
resp.raise_for_status()
data = resp.json()
items = data.get("items", [])
if not items:
break
all_carts.extend(items)
total = data.get("total", 0)
if len(all_carts) >= total:
break
page += 1
return all_carts上述代码按页拉取数据,直到取完所有记录。实际项目中,建议在循环中加入重试和限流逻辑,避免对上游服务造成压力。
4. 数据清洗与格式化
原始接口返回的字段往往比较杂乱,需要先做清洗,再转换成适合关联分析的格式。核心工作包括去重、过滤异常记录,以及把每个购物车中的商品ID整理成列表。
def clean_and_format(carts):
cleaned = []
for cart in carts:
cart_id = cart.get("cart_id")
product_ids = cart.get("product_ids", [])
if not cart_id or not product_ids:
continue
# 去重并保持顺序
unique_ids = list(dict.fromkeys(product_ids))
if len(unique_ids) < 2:
continue
cleaned.append(unique_ids)
return cleaned这里过滤掉商品数少于2的购物车,因为单个商品的购物车无法构成组合关系。清洗后的数据是一个列表的列表,每个内层列表代表一个购物车中的商品集合。
5. 挖掘组合规律
数据准备好之后,就可以进行关联分析。这里使用经典的Apriori思路,先统计频繁项集,再生成关联规则。为便于演示,下面给出一个轻量实现,不依赖第三方库。
from collections import defaultdict
from itertools import combinations
def find_frequent_pairs(carts, min_support=0.01):
total = len(carts)
pair_count = defaultdict(int)
for items in carts:
for pair in combinations(sorted(items), 2):
pair_count[pair] += 1
frequent = {
pair: count / total
for pair, count in pair_count.items()
if count / total >= min_support
}
return frequent
def generate_rules(frequent_pairs, carts, min_confidence=0.3):
total = len(carts)
item_count = defaultdict(int)
for items in carts:
for item in set(items):
item_count[item] += 1
rules = []
for (a, b), support in frequent_pairs.items():
conf_ab = support / (item_count[a] / total)
conf_ba = support / (item_count[b] / total)
if conf_ab >= min_confidence:
rules.append((a, b, support, conf_ab))
if conf_ba >= min_confidence:
rules.append((b, a, support, conf_ba))
return rules上述代码先统计两两共现的商品对,再根据支持度和置信度筛选出有价值的规则。实际生产环境中,可以替换为mlxtend或Spark MLlib等成熟方案,以应对更大规模的数据。
6. 结果解读与业务应用
挖掘出的规则需要结合业务场景进行解读。以下是一个简单的规则输出示例,展示商品A与商品B之间的支持度、置信度和提升度。
| 商品A | 商品B | 支持度 | 置信度 | 提升度 |
|---|---|---|---|---|
| 手机壳 | 钢化膜 | 0.052 | 0.61 | 3.2 |
| 咖啡豆 | 手冲壶 | 0.038 | 0.47 | 2.8 |
| 运动鞋 | 运动袜 | 0.045 | 0.55 | 2.5 |
提升度大于1说明两个商品之间存在正向关联。例如手机壳与钢化膜的提升度为3.2,意味着同时购买这两者的概率远高于随机水平。这类规则可以直接用于以下场景:
- 购物车推荐:用户加入手机壳后,在结算页推荐钢化膜。
- 捆绑促销:将高关联商品打包销售,提升客单价。
- 货架陈列:在实体场景中把关联商品摆放在相邻位置。
7. 注意事项与优化方向
关联挖掘虽然直观,但在实际落地时需要注意几个问题。
- 数据时效性:购物车规律会随季节和促销活动变化,建议定期重新训练模型。
- 冷门商品:支持度阈值过低会引入大量噪声,过高则会漏掉长尾组合,需要根据业务目标权衡。
- 组合爆炸:当商品数量很大时,频繁项集数量会急剧增长,建议引入最大项集限制或使用FP-Growth等更高效的算法。
- 因果性:关联不等于因果,挖掘出的规则需要结合业务经验验证,避免盲目应用。
8. 总结
本文从API数据获取出发,介绍了购物车数据的清洗、格式化,以及基于支持度和置信度的关联规则挖掘方法,并给出了结果解读和业务应用建议。通过这套流程,可以较为系统地发现商品之间的组合规律,为推荐、营销和运营提供数据支撑。后续可以在此基础上引入时间窗口、用户分层等维度,进一步提升挖掘效果。如有任何疑问,欢迎留言探讨!

