数据分析案例丨商品零售购物篮分析(下)

news2024/11/23 19:57:04

数据分析案例丨商品零售购物篮分析(上)

03

数据预处理

通过对数据探索分析,发现数据数据完整,并不存在缺失值。建模之前需要转变数据的格式,才能使用apriori函数进行关联分析。对数据进行转换,如代码清单1所示。

import pandas as pdinputfile='../data/GoodsOrder.csv'data = pd.read_csv(inputfile,encoding='gbk')
# 根据id对“Goods”列合并,并使用“,”将各商品隔开data['Goods'] = data['Goods'].apply(lambda x:','+x)data = data.groupby('id').sum().reset_index()
# 对合并的商品列转换数据格式data['Goods'] = data['Goods'].apply(lambda x :[x[1:]])data_list = list(data['Goods'])
# 分割商品名为每个元素data_translation = []for i in data_list:    p = i[0].split(',')    data_translation.append(p)print('数据转换结果的前5个元素:\n', data_translation[0:5])

代码清单1

04

模型构建

本案例的目标是探索商品之间的关联关系,因此采用关联规则算法,挖掘它们之间的关联关系。关联规则算法主要用于寻找数据中项集之间的关联关系。它揭示了数据项间的未知关系,基于样本的统计规律,进行关联规则分析。根据所分析的关联关系,可从一个属性的信息来推断另一个属性的信息。当置信度达到某一阈值时,就可以认为规则成立。Apriori算法是常用的关联规则算法之一,也是最为经典的分析频繁项集的算法,第一次实现在大数据集上可行的关联规则提取的算法。除此之外,还有FP-Tree算法,Eclat算法和灰色关联算法等。本案例主要使用Apriori算法进行分析。

1. 商品购物篮关联规则模型构建

本次商品购物篮关联规则建模的流程如图1所示。

图片

图1 商品购物篮关联规则模型建模流程图

由图1可知,模型主要由输入、算法处理、输出3个部分组成。输入部分包括:建模样本数据的输入;建模参数的输入。算法处理部分是采用Apriori关联规则算法进行处理。输出部分为采用Apriori关联规则算法进行处理后的结果。

模型具体实现步骤为:首先设置建模参数最小支持度、最小置信度,输入建模样本数据;然后采用Apriori关联规则算法对建模的样本数据进行分析,以模型参数设置的最小支持度、最小置信度以及分析目标作为条件,如果所有的规则都不满足条件,则需要重新调整模型参数,否则输出关联规则结果。

目前,如何设置最小支持度与最小置信度,并没有统一的标准。大部分都是根据业务经验设置初始值,然后经过多次调整,获取与业务相符的关联规则结果。本案例经过多次调整并结合实际业务分析,选取模型的输入参数为:最小支持度0.02、最小置信度0.35。其关联规则代码如代码清单2所示。

from numpy import *
def loadDataSet():    return [['a', 'c', 'e'], ['b', 'd'], ['b', 'c'], ['a', 'b', 'c', 'd'], ['a', 'b'], ['b', 'c'], ['a', 'b'],            ['a', 'b', 'c', 'e'], ['a', 'b', 'c'], ['a', 'c', 'e']]
def createC1(dataSet):    C1 = []    for transaction in dataSet:        for item in transaction:            if not [item] in C1:                C1.append([item])    C1.sort()    # 映射为frozenset唯一性的,可使用其构造字典    return list(map(frozenset, C1))     
# 从候选K项集到频繁K项集(支持度计算)def scanD(D, Ck, minSupport):    ssCnt = {}    for tid in D:   # 遍历数据集        for can in Ck:  # 遍历候选项            if can.issubset(tid):  # 判断候选项中是否含数据集的各项                if not can in ssCnt:                    ssCnt[can] = 1  # 不含设为1                else:                    ssCnt[can] += 1  # 有则计数加1    numItems = float(len(D))  # 数据集大小    retList = []  # L1初始化    supportData = {}  # 记录候选项中各个数据的支持度    for key in ssCnt:        support = ssCnt[key] / numItems  # 计算支持度        if support >= minSupport:            retList.insert(0, key)  # 满足条件加入L1中            supportData[key] = support      return retList, supportData
def calSupport(D, Ck, min_support):    dict_sup = {}    for i in D:        for j in Ck:            if j.issubset(i):                if not j in dict_sup:                    dict_sup[j] = 1                else:                    dict_sup[j] += 1    sumCount = float(len(D))    supportData = {}    relist = []    for i in dict_sup:        temp_sup = dict_sup[i] / sumCount        if temp_sup >= min_support:            relist.append(i)# 此处可设置返回全部的支持度数据(或者频繁项集的支持度数据)            supportData[i] = temp_sup    return relist, supportData # 改进剪枝算法def aprioriGen(Lk, k):    retList = []    lenLk = len(Lk)    for i in range(lenLk):        for j in range(i + 1, lenLk):  # 两两组合遍历            L1 = list(Lk[i])[:k - 2]            L2 = list(Lk[j])[:k - 2]            L1.sort()            L2.sort()            if L1 == L2:  # 前k-1项相等,则可相乘,这样可防止重复项出现                # 进行剪枝(a1为k项集中的一个元素,b为它的所有k-1项子集)                a = Lk[i] | Lk[j]  # a为frozenset()集合                a1 = list(a)                b = []                # 遍历取出每一个元素,转换为set,依次从a1中剔除该元素,并加入到b中                for q in range(len(a1)):                    t = [a1[q]]                    tt = frozenset(set(a1) - set(t))                    b.append(tt)                t = 0                for w in b:                    # 当b(即所有k-1项子集)都是Lk(频繁的)的子集,则保留,否则删除                    if w in Lk:                        t += 1                if t == len(b):                    retList.append(b[0] | b[1])    return retList
def apriori(dataSet, minSupport=0.2):# 前3条语句是对计算查找单个元素中的频繁项集    C1 = createC1(dataSet)    D = list(map(set, dataSet))  # 使用list()转换为列表    L1, supportData = calSupport(D, C1, minSupport)    L = [L1]  # 加列表框,使得1项集为一个单独元素    k = 2    while (len(L[k - 2]) > 0):  # 是否还有候选集        Ck = aprioriGen(L[k - 2], k)        Lk, supK = scanD(D, Ck, minSupport)  # scan DB to get Lk        supportData.update(supK)  # 把supk的键值对添加到supportData里        L.append(Lk)  # L最后一个值为空集        k += 1    del L[-1]  # 删除最后一个空集    return L, supportData  # L为频繁项集,为一个列表,1,2,3项集分别为一个元素
# 生成集合的所有子集def getSubset(fromList, toList):    for i in range(len(fromList)):        t = [fromList[i]]        tt = frozenset(set(fromList) - set(t))        if not tt in toList:            toList.append(tt)            tt = list(tt)            if len(tt) > 1:                getSubset(tt, toList)
def calcConf(freqSet, H, supportData, ruleList, minConf=0.7):    for conseq in H:  #遍历H中的所有项集并计算它们的可信度值        conf = supportData[freqSet] / supportData[freqSet - conseq]  # 可信度计算,结合支持度数据        # 提升度lift计算lift = p(a & b) / p(a)*p(b)        lift = supportData[freqSet] / (supportData[conseq] * supportData[freqSet - conseq])        if conf >= minConf and lift > 1:            print(freqSet - conseq, '-->', conseq, '支持度', round(supportData[freqSet], 6), '置信度:', round(conf, 6),                  'lift值为:', round(lift, 6))            ruleList.append((freqSet - conseq, conseq, conf))
# 生成规则def gen_rule(L, supportData, minConf0.7):    bigRuleList = []    for i in range(1, len(L)):  # 从二项集开始计算        for freqSet in L[i]:  # freqSet为所有的k项集            # 求该三项集的所有非空子集,1项集,2项集,直到k-1项集,用H1表示,为list类型,里面为frozenset类型,            H1 = list(freqSet)            all_subset = []            getSubset(H1, all_subset)  # 生成所有的子集            calcConf(freqSet, all_subset, supportData, bigRuleList, minConf)    return bigRuleList
if __name__ == '__main__':    dataSet = data_translation    L, supportData = apriori(dataSet, minSupport0.02)    rule = gen_rule(L, supportData, minConf0.35)

代码清单2   构建关联规则模型

运行代码清单2得到的结果如下。​​​​​​​

frozenset({'水果/蔬菜汁'}) --> frozenset({'全脂牛奶'}) 支持度 0.02664 置信度:0.368495 lift值为:1.44216frozenset({'人造黄油'}) --> frozenset({'全脂牛奶'}) 支持度 0.024199 置信度:0.413194 lift值为:1.617098...      ...      ...      ...frozenset({'根茎类蔬菜', '其他蔬菜'}) --> frozenset({'全脂牛奶'}) 支持度 0.023183 置信度:0.48927 lift值为:1.914833

2.模型分析

根据代码清单2运行结果,我们得出了26个关联规则。根据规则结果,可整理出购物篮关联规则模型结果,如表1所示。

图片

表1  购物篮关联规则模型结果

根据表1中的输出结果,对其中4条进行解释分析如下。

(1) {'其他蔬菜', '酸奶'}=>{'全脂牛奶'}支持度为2.23%,置信度最大为51,29%。说明同时购买酸奶,其他蔬菜和全脂牛奶这3种商品的概率达51,29%,而这种情况发生的可能性为2.23%。

(2) {'其他蔬菜'}=>{'全脂牛奶'}支持度最大为7.48%,置信度为38.68%。说明同时购买其他蔬菜和全脂牛奶这2种商品的概率达38.68%,而这种情况发生的可能性为7.48%。

(3) {'根茎类蔬菜'}=>{'全脂牛奶'}支持度为4.89%,置信度为44.87%。说明同时购买根茎类蔬菜和全脂牛奶这三种商品的概率达44.87%,而这种情况发生的可能性为4.89%。

(4) {'根茎类蔬菜'}=>{'其他蔬菜'}支持度为4.74%,置信度为43.47%。说明同时根茎类蔬菜和其他蔬菜这2种商品的概率达43.47%,而这种情况发生的可能性为4.74%。

综合表1以及输出结果分析,顾客购买酸奶和其他蔬菜的时候会同时购买全脂牛奶,其置信度最大达到51,29%。其他蔬菜、根茎类蔬菜和全脂牛奶同时购买的概率较高。

对于模型结果,从购物者角度进行分析:现代生活中,大多数购物者为家庭煮妇,购买的商品大部分是食品,随着生活质量和健康意识的增加,其他蔬菜、根茎类蔬菜和全脂牛奶均为现代家庭每日饮食所需品,因此,其他蔬菜、根茎类蔬菜和全脂牛奶同时购买的概率较高符合现代人们的生活健康意识。

2.模型应用

模型结果表明顾客购买商品的时候会同时购买全脂牛奶。因此,商场应该根据实际情况将全脂牛奶放在顾客购买商品的必经之路,或者商场显眼位置,方便顾客拿取。其他蔬菜、根茎类蔬菜、酸奶油、猪肉、黄油、本地蛋类和多种水果同时购买的概率较高,可以考虑捆绑销售,或者适当调整商场布置,将这些商品的距离尽量拉近,提升购物体验

了解更多数据分析案例,可持续关注哟~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/912055.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TIA博途中的数据类型基本介绍

TIA博途中的数据类型基本介绍 基本数据类型 Bool 布尔 FALSE 或TRUE 举例: I0.0 Q0.2 M100.0 DB0.DBX2.5 Byte 字节 二进制:2#0000 0000 到2#1111 1111 无符号整数:0到255 有符号整数:-128到127 十六进制:16#00到16#FF 举例: IB2 MB100 DB1.DBB2 Word 字 二进制:2#0000 …

钉钉公布AI版本商业定价,调用一次大模型不到5分钱

8月22日,在2023年钉钉生态大会上,钉钉总裁叶军公布了钉钉全面智能化的最新进展:已有17条产品线、55个场景全面接入大模型,完成智能化再造;钉钉同时面向生态伙伴和客户开放智能化底座AI PaaS,表示将用大模型…

基于Java水果售卖系统设计与实现(论文+源码)_kaic

第1章 绪 论 1.1 课题研究的背景 随着信息技术的发展,互联网经济快速兴起,电子商务发展迅速,网上购物受到人们的广泛关注和普遍欢迎。水果传统售卖模式的缺点不断暴露,不能满足当今人们快节奏的生活模式需要。将水果的售卖带…

Dubbo服务

dubbo服务分为服务的提供者和消费者 1.服务提供者在nacos注册后通过 DubboService 暴漏服务 2.dubbo服务消费者通过 DubboReference来进行远程服务调用 dubbo的高级特性 1.启动检查:如果启动消费者无提供者则报错,通过配置文件check: fa…

实战演练 | Navicat 导入向导

数据库工具中的导入导出功能是指将数据从一个数据库系统导出到另一个数据库系统,或者将数据从一个文件格式导出到另一个文件格式。导入导出功能可以通过各种方式实现,例如使用SQL语句、数据库管理工具或第三方库和工具。在进行数据迁移时,通常…

排序算法合集

F B I W a r n i n g : \color{red}FBI \qquad Warning: FBIWarning: 本人没有完整的计算机科班的教育经历,但是一直在兢兢业业,努力学习。 这些排序函数都是自己零零散散写的,也没有经过深思熟虑和优化,纯粹是为了自娱自乐。 …

c++ qt--信号与槽(一) (第三部分)

c qt–信号与槽(一) (第三部分) 一.用qt自带的方法添加信号槽 1.第一种 1.如何添加 2.在何处进行绑定 2.第二种 1.如何添加 2.在何处进行绑定 而且会在mainwindow.h中添加槽函数的声明,在mainwindow.cpp中添加槽函数的定义 在mainwindow…

C语言入门 Day_8数据与运算小结

目录 前言 1.精度 2.运算 2.易错点 3.思维导图 前言 到目前为止我们一共学习了四种数据类型,他们分别是表示整数的整型;表示小数的浮点型;表示字符的字符型;和表示布尔数的布尔型。 表示整数的整型,它的变量类型名…

如何搭建智能问答FAQ的底层数据基础呢?

搭建智能问答FAQ的底层数据基础是构建一个高效和准确的问答系统的关键。在这篇文章中,我们将探讨如何搭建智能问答FAQ的底层数据基础,并介绍需要注意的几个方面。 一、了解智能问答FAQ的概念和优势 智能问答FAQ是一种基于人工智能技术的问答系统&#…

趣解设计原则之单一职责(论一个小老板的发家史)

一、前言 今天我们来聊一聊设计原则中的单一职责,还是按照惯例,先介绍一下含义,然后呢,我们再来讲一个小故事。 单一职责(SRP:Single Reposibility Principle)的定义: 一个类或者模…

static的使用

static的使用 在C语言中,static是一个关键字,用于指定变量、函数和代码块的作用域和生命周期。 用法: 静态变量 1.修饰变量:使用static关键字声明的变量是静态变量,它们的作用域被限制在定义它们的源文件中&#x…

SRE 与开发的自动化协同 -- 生产环境出现 bug 自动生成异常追踪

简介 生产环境 bug 的定义:RUM 应用和 APM 应用的 error_stack 信息被捕捉后成为 bug。 以 APM 新增错误巡检为例,当出现新错误时,在观测云控制台的「事件」模块下生成新的事件报告,捕捉为 bug。同时利用 Dataflux Func 创建异常…

一篇文章带你认识重构

文章目录 一、重构的目的:为什么要重构(why)?二、重构的对象:到底重构什么(what)?三、重构的时机:什么时候重构(when)?四、重构的方法…

Transformer在医学影像中的应用综述-分类

文章目录 COVID-19 Diagnosis黑盒模型可解释的模型 肿瘤分类黑盒模型可解释模型 视网膜疾病分类小结 总体结构 COVID-19 Diagnosis 黑盒模型 Point-of-Care Transformer(POCFormer):利用Linformer将自注意的空间和时间复杂度从二次型降低到线性型。POCFormer有200…

Unscreen-AI自动删除视频背景工具 无需绿屏

Unscreen是什么 Unscreen是一款AI自动删除视频背景工具,可以帮你把视频和GIF中的背景去除,目前支持的格式:.mp4、.webm、.ogg、.ogg、.ogv、.mov、.gif,用户不需要手动选择像素、颜色和掩码,而是使用AI 自动分析视频&…

ms-tpm-20-ref构建脚本说明

bootstrap 这个脚本主要做了以下几件事情: 1. 设置环境变量:将 AUTORECONF 环境变量设置为 autoreconf,如果该变量已经定义,则不会进行重新设置。 2. 生成文件列表:通过 src_listvar 函数生成各个目录下的源文件列表&…

易云维智慧实验室综合管理平台以技术赋能和数据驱动,助力实验室设备集中管控和能耗管理

目前,我国实验室存在纸质记录多、信息孤岛、不可追溯、安全隐患多、运行能耗高、管理难等问题;同时,国内LIMS实验室信息系统专业化程度低,功能结构单一,不能满足现阶段实验室管理需要;构建一个基于物联网技…

macOS M1使用TensorFlow GPU加速

本人是在pycharm运行代码,安装了tensorflow版本2.13.0 先运行代码查看有没有使用GPU加速: import tensorflow as tf# Press the green button in the gutter to run the script. if __name__ __main__:physical_devices tf.config.list_physical_dev…

Leetcode每日一题:849. 到最近的人的最大距离(2023.8.22 C++)

目录 849. 到最近的人的最大距离 题目描述: 实现代码与解析: 双指针 原理思路: 849. 到最近的人的最大距离 题目描述: 给你一个数组 seats 表示一排座位,其中 seats[i] 1 代表有人坐在第 i 个座位上&#xff0c…

jQuery Editable Select可搜索下拉选项框

前言 可搜索的下拉选项框 源码地址:https://github.com/indrimuska/jquery-editable-select 可搜索的下拉选项框 引入依赖 <script src"//code.jquery.com/jquery-1.12.4.min.js"></script> <script src"//rawgithub.com/indrimuska/jquery…