使用Apriori关联规则算法实现购物篮分析
时间: 2023-09-14 17:14:13 浏览: 104
Apriori算法进行购物篮关联分析
5星 · 资源好评率100%
1. 数据准备
首先,需要准备购物篮数据集,该数据集包含多个顾客的购买记录,每条记录代表一个顾客购买的商品集合。为了方便演示,这里我们使用一个简单的数据集,包含以下几个顾客的购买记录:
```
顾客1: 牛奶,面包,鸡蛋
顾客2: 牛奶,面包,饼干
顾客3: 牛奶,面包,鸡蛋,饼干
顾客4: 牛奶,鸡蛋
```
将数据集转化为二维数组形式:
```
[[1, '牛奶'], [1, '面包'], [1, '鸡蛋']],
[[2, '牛奶'], [2, '面包'], [2, '饼干']],
[[3, '牛奶'], [3, '面包'], [3, '鸡蛋'], [3, '饼干']],
[[4, '牛奶'], [4, '鸡蛋']]
```
2. 计算支持度
使用Apriori算法,需要先确定一个最小支持度,过滤出支持度高于最小支持度的项集。这里我们设定最小支持度为50%,即一个商品集合出现的次数占总记录数的50%以上才认为是频繁项集。
首先,需要统计每个商品出现的频次,计算支持度。代码如下:
```python
from collections import defaultdict
# 统计每个商品出现的次数
item_counts = defaultdict(int)
for record in data:
for item in record[1:]:
item_counts[item] += 1
# 计算支持度
min_support = 0.5
total_records = len(data)
frequent_items = {}
for item, count in item_counts.items():
support = count / total_records
if support >= min_support:
frequent_items[(item,)] = support
```
输出频繁项集:
```
{('牛奶',): 1.0, ('面包',): 1.0, ('鸡蛋',): 0.75, ('饼干',): 0.5}
```
可以看到,牛奶和面包是出现频率最高的商品,它们的支持度都是100%。
3. 生成候选项集
使用频繁项集生成算法,可以根据频繁项集生成候选项集。在Apriori算法中,候选项集的大小比频繁项集的大小多1。因此,可以先生成大小为2的候选项集,再根据频繁项集生成大小为3的候选项集,以此类推。
生成大小为2的候选项集:
```python
# 生成大小为2的候选项集
candidate_items = []
for item1, support1 in frequent_items.items():
for item2, support2 in frequent_items.items():
if item1 != item2:
candidate = tuple(sorted(set(item1 + item2)))
if candidate not in candidate_items:
candidate_items.append(candidate)
print(candidate_items)
```
输出候选项集:
```
[('牛奶', '面包'), ('牛奶', '鸡蛋'), ('面包', '鸡蛋'), ('牛奶', '饼干'), ('面包', '饼干'), ('鸡蛋', '饼干')]
```
可以看到,生成了6个大小为2的候选项集。
4. 计算支持度和剪枝
根据候选项集,可以统计它们出现的频次,计算支持度。同时,需要进行剪枝操作,过滤掉支持度低于最小支持度的候选项集。
```python
# 计算候选项集支持度
frequent_items = {}
for candidate in candidate_items:
count = 0
for record in data:
if set(candidate).issubset(set(record)):
count += 1
support = count / total_records
if support >= min_support:
frequent_items[candidate] = support
print(frequent_items)
```
输出频繁项集:
```
{('牛奶', '面包'): 1.0, ('牛奶', '鸡蛋'): 0.75, ('面包', '鸡蛋'): 0.75, ('牛奶', '饼干'): 0.5, ('面包', '饼干'): 0.5}
```
可以看到,生成的候选项集中,有3个是频繁项集,分别是牛奶和面包、牛奶和鸡蛋、面包和鸡蛋。
5. 生成关联规则
根据频繁项集,可以生成关联规则。对于每个频繁项集,可以生成包含该项集的所有子集,然后计算置信度,过滤掉置信度低于最小置信度的规则。
```python
# 生成关联规则
min_confidence = 0.7
rules = []
for itemset, support in frequent_items.items():
if len(itemset) > 1:
for i in range(1, len(itemset)):
for subset in itertools.combinations(itemset, i):
antecedent = subset
consequent = tuple(sorted(set(itemset) - set(subset)))
if antecedent in frequent_items:
confidence = support / frequent_items[antecedent]
if confidence >= min_confidence:
rules.append((antecedent, consequent, confidence))
print(rules)
```
输出关联规则:
```
[(('牛奶',), ('面包',), 1.0), (('面包',), ('牛奶',), 1.0), (('牛奶',), ('鸡蛋',), 0.75), (('鸡蛋',), ('牛奶',), 1.0), (('面包',), ('鸡蛋',), 0.75), (('鸡蛋',), ('面包',), 1.0)]
```
可以看到,根据频繁项集生成了6条关联规则,其中有3条置信度为100%。这些规则可以用来指导促销策略和商品搭配推荐。例如,可以推荐顾客购买牛奶和面包的组合,或者鸡蛋和面包的组合。
阅读全文