day12-关联分析

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的规则。
规则生成终止。

おすすめ

転載: blog.csdn.net/m0_73678713/article/details/134337967
おすすめ