Apriori算法:购物篮分析

article/2025/1/12 20:49:29

一、作业要求

  1. 编写Apriori算法程序,平台自选。
  2. 用Apriori 算法找出频繁项集,支持度和置信度根据情况自行设定。
  3. 找出强关联规则以及相应的支持度和置信度
  4. 完成挖掘报告
  5. 数据部分:
    数据已上传网盘:
    链接:https://wwn.lanzoul.com/iBhis000uiwb
    密码:53b2

    ID表示每一笔订单,ITEMS表示每笔订单对应的物品,每件物品由一个大写字母表示
    在这里插入图片描述

二、概要设计

Apriori算法流程:
① 扫描数据集,从数据集中生成候选k项集Ck(k从1开始)
② 计算Ck中每个项集的支持度,删除低于阈值的项集,构成频繁项集Lk
③ 将频繁项集Lk中的元素进行组合,生成候选K+1项集Ck+1
④ 重复步骤②③,直到满足以下两个条件之一时,算法结束
i.频繁项集无法组合生成更大的候选项集
ii.所有的候选项集支持度都低于指定阈值(最小支持度),无法生成频繁项集

代码流程:
读取文件数据集,首先对数据进行扫描、切分,生成候选1项集,根据候选1项集生成频繁1项集,接着根据频繁1项集生成候选2项集,以此类推,依次迭代,根据候选k项集生成频繁k项集,接着根据频繁k项集组合成候选K+1项集。依次获取所有的频繁项集,根据所有频繁项集在一定的置信度下得到购物篮数据的强关联规则。

核心函数:
读取文件数据集: loadData(path)
获取候选1项集:buildC1(dataset)
候选k项集生成频繁k项集:ck_to_lk(dataset,ck,min_support)
频繁k项集组合成候选k+1项集:lk_to_ck(lk_list)
获取所有频繁k项集:get_L_all(dataset,min_support)
生成关联规则:rules_from_L_all(L_all,min_confidence)
程序合并,从原始数据生成所有频繁项集和对应置信度下的关联规则:
apriori(dataset,min_support,min_confidence)

三、详细设计及核心代码

传入数据集文件获取数据集,将每一行ID对应的产品逐个分开,存入列表,循环将列表存入数组,每次循环列表置空,返回数组结果。

# 读取文件数据集
def loadData(path):df = pd.read_excel(path,sheet_name='DATASET1', header=1)df=df.iloc[:,1]result=[]for i in range(len(df)):# 每次循环置空dataset = []for row in df:dataset=list(row)result.append(dataset)# print(result)
return result

生成候选1项集,通过itertool.chain将数据变成一维,相当于扁平化,此时再将数据放入set()进行去重操作,对于每个项集,使用frozenset进行操作,为了将元素作为字典的key

# 生成候选1项集
def buildC1(dataset):item1=set(itertools.chain(*dataset))return [frozenset([i]) for i in item1]

根据候选k项集生成频繁k项集,字典中的key为frozenset类型的对象,字典的value为每个项集对应的支持度。循环记录每一个项集,依次判断项集是否在记录中出现,即判断是不是子集,如果出现,则次数加1,最后计算出现频率,即每个项集的支持度,结果返回每个项集frozenset对象以及对应的支持度。

# 候选k项集->频繁k项集
def ck_to_lk(dataset,ck,min_support):# 定义项集-频数字典,存储每个项集(key)与其对应的频数valuesupport={}for row in dataset:for item in ck:# 判断项集是否在记录中出现(判断是不是子集)if item.issubset(row):support[item]=support.get(item,0)+1total=len(dataset)return {k: v/total for k, v in support.items() if v/total >= min_support}

频繁k项集组合成候选k+1项集,参数lk_list为所有频繁k项集构成的列表,通过itertools.combinations获取任意两个元素序号的索引组合,将对应位置的两个频数k项集进行组合,合并成一个新的项集,如果组合之后的项集是k+1项集,则为候选k+1项集,加入到结果set中,函数结果返回所有候选k+1项集构成的set

# 频繁k项集组合成候选k+1项集
def lk_to_ck(lk_list):# 保存所有组合之后的候选k+1项集ck=set()lk_size=len(lk_list)# 如果频繁k项集的数量小于1,则不可能再通过组合生成候选k+1项集if lk_size > 1:# 获取频繁k项集的k值k=len(lk_list[0])# 获取任意两个元素序号的索引组合for i,j in itertools.combinations(range(lk_size),2):# 将对应位置的两个频数k项集进行组合,生成一个新的项集(合并)t=lk_list[i] | lk_list[j]# 如果组合之后的项集是k+1项集,则为候选k+1项集,加入到结果set中if len(t)==k+1:ck.add(t)return ck

获取所有频繁k项集,当频繁k项集的数量大于1,才可能再通过组合生成候选k + 1项集,将频繁k项集数量大于1作为循环条件,反复进行操作由频繁k项集生成候选k+1项集,由候选k+1项集组合生成频繁k+1项集。如果频繁k+1项集字典不为空,则将所有频繁k+1项集加入到L_all字典中,否则,频繁k+1项集为空,退出循环,最终结果得到所有频繁k项集。

# 获取所有频繁k项集
def get_L_all(dataset,min_support):c1 = buildC1(dataset)L1 = ck_to_lk(dataset, c1, min_support)# 定义字典,保存所有的频繁k项集L_all=L1Lk=L1# 当频繁k项集的数量大于1,才可能再通过组合生成候选k + 1项集while len(Lk) > 1:lk_key_list=list(Lk.keys())# 由频繁k项集生成候选k+1项集ck=lk_to_ck((lk_key_list))# 由候选k+1项集组合生成频繁k+1项集Lk=ck_to_lk(dataset,ck,min_support)# 如果频繁k+1项集字典不为空,则将所有频繁k+1项集加入到L_all字典中if len(Lk) > 0:L_all.update(Lk)else:# 否则,频繁k+1项集为空,退出循环breakreturn L_all

从所有的频繁项集字典中,生成关联规则,参数L_all为所有频繁项集,参数min_confidence为最小置信度,大于最小置信度则保留关联规则。通过条件概率公式计算每个频繁项集的置信度,若大于最小置信度,则通过左侧,右侧,支持度和置信度的方式展示频繁项集的关联规则。

# 从所有的频繁项集字典中,生成关联规则
def rules_from_L_all(L_all,min_confidence):# 保存所有候选的关联规则rules=[]for Lk in L_all:if len(Lk) > 1:rules.extend(rules_from_item(Lk))result=[]for left,right in rules:support=L_all[left | right]confidence=support/L_all[left]if confidence >= min_confidence:result.append({"左侧":left,"右侧":right,"支持度":support,"置信度":confidence})# print(result)return result

代码合并,从原始数据根据最小支持度和最小置信度生成所有频繁项集和对应置信度下的关联规则,并格式化打印最终结果

def apriori(dataset,min_support,min_confidence):L_all=get_L_all(dataset,min_support)print(len(L_all))for i in range(len(L_all)):L_all_list=list(L_all)print(L_all_list[i])rules=rules_from_L_all(L_all,min_confidence)return rules

四、运行结果截图

根据不同的支持度和置信度做了四组实验,结果展示如下:
① 支持度:0.3,置信度0.4
所有频繁项集:
在这里插入图片描述

根据所有频繁项集生成的强关联规则:
在这里插入图片描述

② 支持度:0.4,置信度0.5
所有频繁项集:
在这里插入图片描述

根据所有频繁项集生成的强关联规则:
在这里插入图片描述
③ 支持度:0.5,置信度0.6
所有频繁项集:
在这里插入图片描述
根据所有频繁项集生成的强关联规则:(此时无法产生强关联规则)
在这里插入图片描述
④ 支持度:0.4,置信度0.9
所有频繁项集:
在这里插入图片描述
根据所有频繁项集生成的强关联规则:
在这里插入图片描述

五、总结

根据上述四组实验可以得出一些结论:在支持度为0.3的条件下,[A,H]->[M],[A,M]->[H]与[H,M]->[A]这三条关联规则的置信度相对高,其中[A,M]->[H]的置信度最高,在购买产品A,M的条件下,购买产品H的概率很高;产品S,O,Y支持度较高,出售情况良好,在支持度为0.4的情况下,[O,S]->[Y],[O,Y]->[S]与[S,Y]->[0]这三条关联关系的置信度最高,在购买产品O,S的条件下,购买产品Y的概率很高;在购买产品O,Y的条件下,购买产品S的概率很高;在购买产品S,Y的条件下,购买产品O的概率很高。因此,这一系列结论可以为超市产品的组合销售等销售方式提供建议。

六、完整代码

# _*_ coding:utf-8 _*_
import pandas as pd
import itertools
# 读取文件数据集
def loadData(path):# df = pd.read_excel('Apriori_1000_Items_DataSet.xls',sheet_name='DATASET1', header=1)df = pd.read_excel(path,sheet_name='DATASET1', header=1)df=df.iloc[:,1]result=[]for i in range(len(df)):# 每次循环置空dataset = []for row in df:# row = row.strip("\n")dataset=list(row)result.append(dataset)# print(result)return result# 候选1项集
def buildC1(dataset):item1=set(itertools.chain(*dataset))return [frozenset([i]) for i in item1]# 根据候选1项集生成频繁1项集,字典中的key为frozenset类型的对象
# 字典的value为每个项集对应的支持度
# 候选k项集->频繁k项集,最小支持度
def ck_to_lk(dataset,ck,min_support):# 定义项集-频数字典,存储每个项集(key)与其对应的频数valuesupport={}for row in dataset:for item in ck:# 判断项集是否在记录中出现(判断是不是子集)if item.issubset(row):support[item]=support.get(item,0)+1total=len(dataset)return {k: v/total for k, v in support.items() if v/total >= min_support}# 频繁k项集组合成候选k+1项集
# lk_list为所有频繁k项集构成的列表
# ck:返回所有候选k+1项集构成的set
def lk_to_ck(lk_list):# 保存所有组合之后的候选k+1项集ck=set()lk_size=len(lk_list)# 如果频繁k项集的数量小于1,则不可能再通过组合生成候选k+1项集if lk_size > 1:# 获取频繁k项集的k值k=len(lk_list[0])# 获取任意两个元素序号的索引组合for i,j in itertools.combinations(range(lk_size),2):# 将对应位置的两个频数k项集进行组合,生成一个新的项集(合并)t=lk_list[i] | lk_list[j]# 如果组合之后的项集是k+1项集,则为候选k+1项集,加入到结果set中if len(t)==k+1:ck.add(t)return ck# 获取所有频繁k项集
def get_L_all(dataset,min_support):c1 = buildC1(dataset)L1 = ck_to_lk(dataset, c1, min_support)# 定义字典,保存所有的频繁k项集L_all=L1Lk=L1# 当频繁k项集的数量大于1,才可能再通过组合生成候选k + 1项集while len(Lk) > 1:lk_key_list=list(Lk.keys())# 由频繁k项集生成候选k+1项集ck=lk_to_ck((lk_key_list))# 由候选k+1项集组合生成频繁k+1项集Lk=ck_to_lk(dataset,ck,min_support)# 如果频繁k+1项集字典不为空,则将所有频繁k+1项集加入到L_all字典中if len(Lk) > 0:L_all.update(Lk)else:# 否则,频繁k+1项集为空,退出循环breakreturn L_all# 生成关联规则
def rules_from_item(item):# 定义规则左侧的列表left=[]for i in range(1,len(item)):left.extend(itertools.combinations(item,i))# 集合的差集return [(frozenset(le),frozenset(item.difference(le))) for le in left]# 从所有的频繁项集字典中,生成关联规则
# min_confidence最小置信度,保留关联规则
def rules_from_L_all(L_all,min_confidence):# 保存所有候选的关联规则rules=[]for Lk in L_all:if len(Lk) > 1:rules.extend(rules_from_item(Lk))result=[]for left,right in rules:support=L_all[left | right]confidence=support/L_all[left]lift=confidence/L_all[right]if confidence >= min_confidence:result.append({"左侧":left,"右侧":right,"支持度":support,"置信度":confidence})# print(result)return resultdef apriori(dataset,min_support,min_confidence):L_all=get_L_all(dataset,min_support)print(len(L_all))for i in range(len(L_all)):L_all_list=list(L_all)print(L_all_list[i])rules=rules_from_L_all(L_all,min_confidence)return rulesdef change(item):li=list(item)# for i in range(len(li)):return lipath='Apriori_1000_Items_DataSet.xls'
dataset=loadData(path)
# rules=apriori(dataset,0.05,0.3)
# print(rules)
# c1=buildC1(dataset)
# print(c1)
# L1=ck_to_lk(dataset,c1,0.05)
# print(L1)
# c2=lk_to_ck(list(L1.keys()))
# print(c2)
# L2=ck_to_lk(dataset,c2,0.05)
# print(L2)
# L_all=get_L_all(dataset,0.2)
# print(L_all)
# 生成项集{1,2,3}的关联规则
# print(rules_from_item(frozenset({1,2,3})))
# rules_from_L_all(L_all,0.3)# 赋予支持度和置信度
rules=apriori(dataset,0.4,0.9)
df=pd.DataFrame(rules)
df=df.reindex(["左侧","右侧","支持度","置信度"],axis=1)
df["左侧"]=df["左侧"].apply(change)
df["右侧"]=df["右侧"].apply(change)
print("\n共产生"+str(len(df))+"条关联规则")
print("展示入下:")
print(df)

http://chatgpt.dhexx.cn/article/MXlifgru.shtml

相关文章

【数据分析】产品关联度分析和购物篮分析(1)

产品关联度分析 关联分析是发现交易数据库中不同商品(项)之间的联系,主要应用于电商网站 推荐、线下零售门店商品摆放等场景中。 关联规则: 1.支持度(support):数据集中包含某几个特定项的概率…

【Clemetine】市场购物篮分析

一、实验目的及要求 通过项目的训练学习,了解数据挖掘在零售业中应用状况,掌握数据挖掘在零售业中分析方法及过程。 二、实验仪器设备 系统环境:Windows10 软件环境:SPSS Clementine11.1 三、实验内容 (一&#x…

购物篮分析模型实例——数据分析必备模型

要想做好数据分析必定要理解和熟悉掌握各类数据分析模型,但大部分文章只是给你罗列出了有哪几种数据分析模型及对应理论,并未用实例来辅助说明。 很多时候这些模型都进了收藏夹吃灰,大家也没有深刻理解这种分析模型,等到下次要开始…

商品零售购物篮分析——关联挖掘

一、实验目的 掌握对数据进行预处理和探索性分析的方法;掌握如何利用Apriori关联规则算法进行购物篮分析。 二实验内容 构建零售商品的Apriori关联规则模型,分析商品之间的关联性;根据模型结果给出销售策略。 三、实验操作步骤和结果分析…

使用Apriori关联规则算法实现购物篮分析

Apriori算法是一种挖掘关联规则的频繁项集算法,其核心思想是通过候选集生成和情节的向下封闭检测两个阶段来挖掘频繁项集,而且算法已经被广泛的应用到商业,网络安全等各个领域。 购物篮分析是通过发视频顾客再一次购物行为中放入购物篮中不同…

r语言商品购物篮分析

商品购物篮分析 现代商品种类繁多,顾客往往会由于需要购买的商品众多而变得疲于选择,且顾客并不会因为商品选择丰富而选择购买更多的商品。 对于某些商品,顾客会选择同时购买,如面包与牛奶、薯片与可乐等,当面包与牛…

销售需求丨购物篮分析

​ BOSS:那个谁,对,就是你,你给我研究研究咱商场物品摆放是否合理?! 白茶:(Excuse me?)…BOSS,那个我就是个码字的! BOSS:…

[Python] 电商平台用户的购物篮分析

目录 一、背景1. 项目描述2. 数据描述 二、相关模块1. 相关模块2. 数据导入3. 数据处理 三、商品销售分析1. 日销售情况2. 月销售情况3. 观察畅销品 四、 购物篮分析1. 购物篮系数2. 指定商品的购物篮系数3. 指定商品的人气指数 五、用户行为分析1. 用户的消费情况2. 用户初次购…

【Python数据挖掘】购物篮分析

购物篮分析 变量解释 变量含义说明ReceiptID收据单号Value支付金额pmethod支付渠道1现金,2信用卡,3电子支付,4其他sex性别1男性,2女性homeown是否有住宅1有,2无,3未知income收入age年龄其他其他购买的各种…

python数据分析与挖掘实战(商品零售购物篮分析)

一、引言 购物篮分析是商业领域最前沿、最具挑战性的问题之一,也是许多企业重点研究的问题。购物篮分析是通过发现顾客在一次购买行为中放入购物篮中不同商品之间的关联,研究顾客的购买行为,从而辅助零售企业制定营销策略的一种数据分析方法。…

数据挖掘实战—商品零售购物篮分析

文章目录 引言一、数据探索性分析1.数据质量分析1.1 缺失值分析1.2 异常值分析1.3 重复数据分析 2.数据特征分析2.1 描述性统计分析2.2 分布分析2.2.1 商品热销情况分布分析2.2.2 按类别划分商品销量分布分析2.2.3 商品内部结构分布分析 二、数据预处理三、模型构建 案例数据百…

购物篮分析( Apriori算法)—零售数据实战

购物篮分析( Apriori算法)—零售数据实战 【开题】在我从事零售行业的期间,曾拜读过"啤酒与尿布"一书,对于沃尔玛的购物篮分析模型产生极大的兴趣。由于网上对Aprioro算法介绍的内容较少,故而本人不得已回去…

商品零售购物篮分析

1 案例背景 购物篮分析是通过发现顾客在一次购买行为中放入购物篮中不同商品之间的关联,研究顾客的购买行为,从而辅助零售企业制定营销策略的一种数据分析方法。 通过对商场销售数据进行分析,得到顾客的购买行为特征,并根据发现的…

数据分析一定要懂的模型——购物篮模型

要想做好数据分析必定要理解和熟悉掌握各类数据分析模型,但网络上的大部分文章只是给你罗列出了有哪几种数据分析模型及对应理论,并未用实例来辅助说明。 很多时候,看完就只是看完,并没有深刻理解这种分析模型,等到下…

购物篮分析的基本概念、商业价值与算法介绍

作者 | gongyouliu 编辑 | auroral-L 全文共4915字,预计阅读时间45分钟。 购物篮分析的基本概念、商业价值与算法介绍 1. 什么是购物篮分析 2. 购物篮分析的商业价值 2.1 指导线下门店商品排列、摆放 2.2 优化线下采购、供应链与库存 2.3 为活动营销提供数据支…

给Windows系统配置host

以管理员身份运行命令提示符;注意:一定要管理员身份运行,否则后面存host的时候会出现没有修改权限的问题在命令行中键入:notepad,然后回车;这是打开记事本命令在记事本中工具栏选择“文件-打开”&#xff0…

#vue# 【二】本地电脑如何配置host文件?

#vue# 本地电脑如何配置host文件? (1)host概念 在进行请求接口之前,我们需要先配备好host Hosts:它是一个没有扩展名的系统文件, 而它的的基本作用,就是将一些我们个人常用的网址和相对应的IP…

window -- 配置hosts

在我们使用内网办公的时候,很多时候连接一些环境都是通过域名去访问的,但是因为这些内网的域名在公网是不存在的,可能会导致我们访问找不到地址,这时候我们可以配置本地hosts,把内网的域名与对应的ip映射起来&#xff…

vmware 配置host-only ip

增加网卡 新增加这个文件&#xff0c;根据ip a的信息增加 cat > /etc/sysconfig/network-scripts/ifcfg-enp0s8 <<EOF NM_CONTROLLEDyes BOOTPROTOnone ONBOOTyes IPADDR11.11.11.108 NETMASK255.255.255.0 DEVICEenp0s8 PEERDNSno EOF 默认安装虚拟机时候&#xff…

[windows]修改本机host配置

修改本机host配置 windows修改本机host配置 windows修改本机host配置 进入我的电脑C盘进入C:\Windows\System32\drivers\etc找到hosts文件修改