1 python推导关联分析
1.1 加载数据
def load_data_set():
"""加载订单数据"""
return [
['豆奶', '莴苣'],
['莴苣', '尿布', '葡萄酒', '甜菜'],
['豆奶', '尿布', '葡萄酒', '橙汁'],
['莴苣', '豆奶', '尿布', '葡萄酒'],
['莴苣', '尿布', '豆奶', '橙汁']
]
1.2 获取订单中的每个商品
def create_c1(order_list):
"""
获取订单中不重复的数据元素
order_list: 订单数据
return: 不重复的每个商品
"""
c1 = {
item for order in order_list for item in order}
print('不重复的商品数据:', c1)
ret_list = []
for res in c1:
ret_list.append(frozenset([res])) # frozenset 冻结的集合, 防止数据被修改
return ret_list
def scan_d(order_list, ck, min_support=None):
"""
根据所有不重复的商品计算支持度, 返回满足符合条件支持度的商品
order_list: 订单列表源数据
ck: 所有不重复的商品
min_support: 最小支持度
return: 符合最小支持度的商品列表, 所有商品支持度的字典
"""
item_count = {
} # 统计商品出现的次数
"""统计商品在订单中出现的次数"""
for order in order_list: # 遍历每一个订单数据
for item in ck:
# issubset 判断在当前订单中, 是否出现了 item 商品
if item.issubset(order):
# 满足if条件就代表在字典中是第一次出现
# get(键, 不存在设置的值)
item_count[item] = item_count.get(item, 0) + 1
print('\n\n统计商品在订单中出现的次数:\n', item_count)
"""计算每个商品的支持度"""
num_order = len(order_list) # 获取订单数量
ret_list = {
} # 所有商品支持度的字典
support_list = [] # 符合最小支持度的商品列表
for key in item_count.keys():
support = item_count[key] / num_order # 计算每个商品的支持度
# 筛选符合支持度的商品
if support >= min_support:
support_list.append(key)
ret_list[key] = support
# support_list 符合最小支持度的商品列表, ret_list所有商品支持度的字典
return support_list, ret_list
1.3 方法调用
"""加载订单数据"""
data_set = load_data_set()
print('\n\n 订单数据: \n', data_set)
"""获取订单中不重复的数据元素"""
c1 = create_c1(data_set)
print('\n\n 订单中所有不重复的商品: \n', c1)
"""计算支持度"""
#满足最小支持度的商品列表 l1
#所有商品及其支持度的字典 supp_data
l1, supp_data = scan_d(data_set, c1, 0.5)
print('\n\n 符合最小支持度的商品列表: \n', l1)
print('\n\n 所有商品支持度的字典: \n')
import pprint
pprint.pprint(supp_data)
输出:
订单数据:
[['豆奶', '莴苣'], ['莴苣', '尿布', '葡萄酒', '甜菜'], ['豆奶', '尿布', '葡萄酒', '橙汁'], ['莴苣', '豆奶', '尿布', '葡萄酒'], ['莴苣', '尿布', '豆奶', '橙汁']]
不重复的商品数据: {
'葡萄酒', '莴苣', '尿布', '豆奶', '橙汁', '甜菜'}
订单中所有不重复的商品:
[frozenset({
'葡萄酒'}), frozenset({
'莴苣'}), frozenset({
'尿布'}), frozenset({
'豆奶'}), frozenset({
'橙汁'}), frozenset({
'甜菜'})]
统计商品在订单中出现的次数:
{
frozenset({
'莴苣'}): 4, frozenset({
'豆奶'}): 4, frozenset({
'葡萄酒'}): 3, frozenset({
'尿布'}): 4, frozenset({
'甜菜'}): 1, frozenset({
'橙汁'}): 2}
符合最小支持度的商品列表:
[frozenset({
'莴苣'}), frozenset({
'豆奶'}), frozenset({
'葡萄酒'}), frozenset({
'尿布'})]
所有商品支持度的字典:
{
frozenset({
'莴苣'}): 0.8,
frozenset({
'豆奶'}): 0.8,
frozenset({
'葡萄酒'}): 0.6,
frozenset({
'尿布'}): 0.8,
frozenset({
'甜菜'}): 0.2,
frozenset({
'橙汁'}): 0.4}
不重复的商品数据: {
'葡萄酒', '莴苣', '尿布', '豆奶', '橙汁', '甜菜'}
统计商品在订单中出现的次数:
{
frozenset({
'莴苣'}): 4, frozenset({
'豆奶'}): 4, frozenset({
'葡萄酒'}): 3, frozenset({
'尿布'}): 4, frozenset({
'甜菜'}): 1, frozenset({
'橙汁'}): 2}
l1: [] l2: [] l1 | l2: frozenset({
'豆奶', '莴苣'})
l1: [] l2: [] l1 | l2: frozenset({
'葡萄酒', '莴苣'})
l1: [] l2: [] l1 | l2: frozenset({
'莴苣', '尿布'})
l1: [] l2: [] l1 | l2: frozenset({
'葡萄酒', '豆奶'})
l1: [] l2: [] l1 | l2: frozenset({
'豆奶', '尿布'})
l1: [] l2: [] l1 | l2: frozenset({
'葡萄酒', '尿布'})
统计商品在订单中出现的次数:
{
frozenset({
'豆奶', '莴苣'}): 3, frozenset({
'葡萄酒', '莴苣'}): 2, frozenset({
'莴苣', '尿布'}): 3, frozenset({
'葡萄酒', '尿布'}): 3, frozenset({
'葡萄酒', '豆奶'}): 2, frozenset({
'豆奶', '尿布'}): 3}
l1: ['豆奶'] l2: ['莴苣'] l1 | l2: frozenset({
'豆奶', '莴苣', '尿布'})
l1: ['豆奶'] l2: ['葡萄酒'] l1 | l2: frozenset({
'葡萄酒', '豆奶', '莴苣', '尿布'})
l1: ['豆奶'] l2: ['豆奶'] l1 | l2: frozenset({
'豆奶', '莴苣', '尿布'})
l1: ['莴苣'] l2: ['葡萄酒'] l1 | l2: frozenset({
'葡萄酒', '莴苣', '尿布'})
l1: ['莴苣'] l2: ['豆奶'] l1 | l2: frozenset({
'豆奶', '莴苣', '尿布'})
l1: ['葡萄酒'] l2: ['豆奶'] l1 | l2: frozenset({
'葡萄酒', '豆奶', '尿布'})
统计商品在订单中出现的次数:
{
frozenset({
'豆奶', '莴苣', '尿布'}): 2}
...
frozenset({
'葡萄酒', '尿布'}): 0.6,
frozenset({
'葡萄酒', '豆奶'}): 0.4,
frozenset({
'豆奶', '尿布'}): 0.6,
frozenset({
'豆奶', '莴苣', '尿布'}): 0.4}
Output is truncated. View as a scrollable element or open in a text editor. Adjust cell output settings...
'只计算了支持度'
Generating itemsets.
Counting itemsets of length 1.
Found 6 candidate itemsets of length 1.
Found 4 large itemsets of length 1.
[('豆奶',), ('莴苣',), ('尿布',), ('葡萄酒',)]
Counting itemsets of length 2.
Found 6 candidate itemsets of length 2.
[('尿布', '莴苣'), ('尿布', '葡萄酒'), ('尿布', '豆奶'), ('莴苣', '葡萄酒'), ('莴苣', '豆奶'), ('葡萄酒', '豆奶')]
Iterating over transactions.
Found 4 large itemsets of length 2.
[('尿布', '莴苣'), ('尿布', '葡萄酒'), ('尿布', '豆奶'), ('莴苣', '豆奶')]
Counting itemsets of length 3.
Found 1 candidate itemsets of length 3.
[('尿布', '莴苣', '豆奶')]
Iterating over transactions.
Itemset generation terminated.
Generating rules from itemsets.
Generating rules of size 2.
Rule generation terminated.
(({
1: {
('豆奶',): 4, ('莴苣',): 4, ('尿布',): 4, ('葡萄酒',): 3},
2: {
('尿布', '莴苣'): 3, ('尿布', '葡萄酒'): 3, ('尿布', '豆奶'): 3, ('莴苣', '豆奶'): 3}},
[{
葡萄酒} -> {
尿布}]),)
** 注释 **
l1, supp_data = scan_d(data_set, c1, 0.5)
这种语法称为解构赋值或多重赋值。这种语句会将函数scan_d(data_set, c1, 0.5)的返回值分解为两个部分,并将它们分别赋值给l1和supp_data。
如果你将其改写为两个独立的语句:
l1 = scan_d(data_set, c1, 0.5)
supp_data = scan_d(data_set, c1, 0.5)
这两行代码的功能是一样的,都会调用函数scan_d(data_set, c1, 0.5)并获取其返回值。但是,由于函数调用是按顺序执行的,这两行代码可能会导致函数scan_d被执行两次,从而可能产生两次不同的结果(除非你的函数是纯函数,即不依赖于任何外部状态或副作用)。
所以,如果你的函数scan_d的结果依赖于其输入的顺序(例如,如果它依赖于外部状态或具有副作用),那么上述两行代码会产生不同的结果。在这种情况下,使用解构赋值可能会更有效,因为它可以确保函数只被调用一次,然后将其结果分配给两个变量。
2 Apriori工具包
在终端下载pip install efficient-apriori
from efficient_apriori import apriori # 导入
data = [
['豆奶', '莴苣'],
['莴苣', '尿布', '葡萄酒', '甜菜'],
['豆奶', '尿布', '葡萄酒', '橙汁'],
['莴苣', '豆奶', '尿布', '葡萄酒'],
['莴苣', '尿布', '豆奶', '橙汁']
]
apriori(data, min_support=0.5, min_confidence=0.8, verbosity=2),
# 没有数值详细的计算过程
输出:
订单数据:
[['豆奶', '莴苣'], ['莴苣', '尿布', '葡萄酒', '甜菜'], ['豆奶', '尿布', '葡萄酒', '橙汁'], ['莴苣', '豆奶', '尿布', '葡萄酒'], ['莴苣', '尿布', '豆奶', '橙汁']]
不重复的商品数据: {
'葡萄酒', '莴苣', '尿布', '豆奶', '橙汁', '甜菜'}
订单中所有不重复的商品:
[frozenset({
'葡萄酒'}), frozenset({
'莴苣'}), frozenset({
'尿布'}), frozenset({
'豆奶'}), frozenset({
'橙汁'}), frozenset({
'甜菜'})]
统计商品在订单中出现的次数:
{
frozenset({
'莴苣'}): 4, frozenset({
'豆奶'}): 4, frozenset({
'葡萄酒'}): 3, frozenset({
'尿布'}): 4, frozenset({
'甜菜'}): 1, frozenset({
'橙汁'}): 2}
符合最小支持度的商品列表:
[frozenset({
'莴苣'}), frozenset({
'豆奶'}), frozenset({
'葡萄酒'}), frozenset({
'尿布'})]
所有商品支持度的字典:
{
frozenset({
'莴苣'}): 0.8,
frozenset({
'豆奶'}): 0.8,
frozenset({
'葡萄酒'}): 0.6,
frozenset({
'尿布'}): 0.8,
frozenset({
'甜菜'}): 0.2,
frozenset({
'橙汁'}): 0.4}
不重复的商品数据: {
'葡萄酒', '莴苣', '尿布', '豆奶', '橙汁', '甜菜'}
统计商品在订单中出现的次数:
{
frozenset({
'莴苣'}): 4, frozenset({
'豆奶'}): 4, frozenset({
'葡萄酒'}): 3, frozenset({
'尿布'}): 4, frozenset({
'甜菜'}): 1, frozenset({
'橙汁'}): 2}
l1: [] l2: [] l1 | l2: frozenset({
'豆奶', '莴苣'})
l1: [] l2: [] l1 | l2: frozenset({
'葡萄酒', '莴苣'})
l1: [] l2: [] l1 | l2: frozenset({
'莴苣', '尿布'})
l1: [] l2: [] l1 | l2: frozenset({
'葡萄酒', '豆奶'})
l1: [] l2: [] l1 | l2: frozenset({
'豆奶', '尿布'})
l1: [] l2: [] l1 | l2: frozenset({
'葡萄酒', '尿布'})
统计商品在订单中出现的次数:
{
frozenset({
'豆奶', '莴苣'}): 3, frozenset({
'葡萄酒', '莴苣'}): 2, frozenset({
'莴苣', '尿布'}): 3, frozenset({
'葡萄酒', '尿布'}): 3, frozenset({
'葡萄酒', '豆奶'}): 2, frozenset({
'豆奶', '尿布'}): 3}
l1: ['豆奶'] l2: ['莴苣'] l1 | l2: frozenset({
'豆奶', '莴苣', '尿布'})
l1: ['豆奶'] l2: ['葡萄酒'] l1 | l2: frozenset({
'葡萄酒', '豆奶', '莴苣', '尿布'})
l1: ['豆奶'] l2: ['豆奶'] l1 | l2: frozenset({
'豆奶', '莴苣', '尿布'})
l1: ['莴苣'] l2: ['葡萄酒'] l1 | l2: frozenset({
'葡萄酒', '莴苣', '尿布'})
l1: ['莴苣'] l2: ['豆奶'] l1 | l2: frozenset({
'豆奶', '莴苣', '尿布'})
l1: ['葡萄酒'] l2: ['豆奶'] l1 | l2: frozenset({
'葡萄酒', '豆奶', '尿布'})
统计商品在订单中出现的次数:
{
frozenset({
'豆奶', '莴苣', '尿布'}): 2}
...
frozenset({
'葡萄酒', '尿布'}): 0.6,
frozenset({
'葡萄酒', '豆奶'}): 0.4,
frozenset({
'豆奶', '尿布'}): 0.6,
frozenset({
'豆奶', '莴苣', '尿布'}): 0.4}
Output is truncated. View as a scrollable element or open in a text editor. Adjust cell output settings...
'只计算了支持度'
Generating itemsets.
Counting itemsets of length 1.
Found 6 candidate itemsets of length 1.
Found 4 large itemsets of length 1.
[('豆奶',), ('莴苣',), ('尿布',), ('葡萄酒',)]
Counting itemsets of length 2.
Found 6 candidate itemsets of length 2.
[('尿布', '莴苣'), ('尿布', '葡萄酒'), ('尿布', '豆奶'), ('莴苣', '葡萄酒'), ('莴苣', '豆奶'), ('葡萄酒', '豆奶')]
Iterating over transactions.
Found 4 large itemsets of length 2.
[('尿布', '莴苣'), ('尿布', '葡萄酒'), ('尿布', '豆奶'), ('莴苣', '豆奶')]
Counting itemsets of length 3.
Found 1 candidate itemsets of length 3.
[('尿布', '莴苣', '豆奶')]
Iterating over transactions.
Itemset generation terminated.
Generating rules from itemsets.
Generating rules of size 2.
Rule generation terminated.
(({
1: {
('豆奶',): 4, ('莴苣',): 4, ('尿布',): 4, ('葡萄酒',): 3},
2: {
('尿布', '莴苣'): 3, ('尿布', '葡萄酒'): 3, ('尿布', '豆奶'): 3, ('莴苣', '豆奶'): 3}},
[{
葡萄酒} -> {
尿布}]),)
以下是翻译:
生成项集。
计算长度为1的项集。
找到6个长度为1的候选项集。
找到4个长度为1的项集。
[(“豆奶”),(“莴苣”,),(“尿布”,),(“葡萄酒”,))
计算项集长度为2。
找到6个长度为2的候选项集。
[(“尿布”、“莴苣”),(“尿布”,“葡萄酒”),(“尿布”,“豆奶”),(“莴苣”、“葡萄酒”),(“莴苣”、“豆奶”),(“葡萄酒”,“豆奶”)]
遍历的事务。
找到4个长度为2的项集。
[(“尿布”、“莴苣”),(“尿布”,“葡萄酒”),(“尿布”,“豆奶”),(“莴苣”、“豆奶”)]
计算项集长度3。找到1个长度为3的候选项集。
[(“尿布”、“莴苣”、“豆奶”)]
遍历的事务。
项集生成结束。
从项集生成规则。
生成大小为2的规则。
规则生成终止。