Python数据分析案例15——超市零售购物篮关联分析(apriori)

news2024/9/27 17:27:29

啤酒和纸尿裤的故事大多数人都听说过,纸尿裤的售卖提升了啤酒的销售额。

关联分析就是这样的作用,可以研究某种商品的售卖对另外的商品的销售起促进还是抑制的作用。


案例背景

本次案例背景是超市的零售数据,研究商品之间的关联规则。使用的自然是最经典的apriori算法。

数据展示,数据是一个excel表:

 id表示订单编号,id=1表示第一个订单的销售的商品,如图就是第一个订单卖出了柑橘类水果,人造黄油,即食汤,半成品面包四个商品,其他以此类推。


数据读取

导入包,设置

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

pd.options.display.float_format = '{:,.4f}'.format   #设置小数显示4位
np.set_printoptions(precision=4)
plt.rcParams ['font.sans-serif'] ='SimHei'               #显示中文
plt.rcParams ['axes.unicode_minus']=False               #显示负号

读取案例数据

inputfile = '../data/GoodsOrder.csv'  # 输入的数据文件
data = pd.read_csv(inputfile,encoding = 'gbk')  # 读取数据
data.info()

可以看到是43367条样本。

对商品进行分类汇总,计算每类商品的销售数量,得到前10 的商品

group = data.groupby(['Goods']).count().sort_values('id',ascending=False)            # 对商品进行分类汇总
group.head(10)

 

画柱状图展示;

plt.figure(figsize=(6,3),dpi=128)
sns.barplot(y=group.index[:10],x=group['id'][:10],orient="h")
plt.xlabel('商品订单量')
plt.ylabel('商品名称')
plt.xticks(fontsize=10,rotation=45)
plt.title("销售量前十商品订单数量")
plt.show()

 

 可以看到卖得最多的是全脂牛奶,蔬菜等。


类别分析

读取每种商品对应的类别:

types = pd.read_csv('../data/GoodsTypes.csv',encoding = 'gbk')  # 读入数据
types.head()

 可以看到这个表格包含了所有商品对应的食物的总类别

这个表对上面分类汇总后的订单表进行合并:(放在excel里面实现这一步就是vlookup函数)

sort_links = pd.merge(group.reset_index(),types,on='Goods')  # 合并两个datafreame 
sort_links

 然后我们画出所有大类别商品的销售数量和的比例图:

(sort_links.groupby(['Types']).sum().reset_index()   #分组聚合
.sort_values('id',ascending = False)                #排序
.assign(ratio=lambda d:d['id']/d['id'].sum())[['Types','ratio']]  #计算比例
.set_index('Types').plot                          #画图
.pie(subplots=True,figsize=(8,8),autopct="%.2f%%",legend=False)
)

 可以看到每种大类商品的销售数量比例。


预处理

将原始数据进行合并,每个订单的商品都弄在一起

data['Goods'] = data['Goods'].apply(lambda x:','+x)
data = data.groupby('id').sum().reset_index()
data

 可以看到总共有9835个订单,每个订单里面的商品数量名称都不尽相同。

将上面的订单都变为列表,查看前五个

data['Goods'] = data['Goods'].apply(lambda x :x[1:].split(','))
data_list = list(data['Goods'])
data_list[:5]

 每个订单都是一个列表,装着所有的商品名称,数据准备完成,下面进行关联分析


关联分析

导入包,计算模型,得到结果。这里模型的最小支持度选为0.03,最小置信度选为0.4.

# 导入 apyori 模块下的 apriori 函数
from apyori import apriori
results = apriori(data_list, min_support=0.03, min_confidence=0.4)

打印结果,并装入数据框方便下面画图:

df=pd.DataFrame()
# 遍历结果数据
lis1=[];lis2=[];lis3=[];lis4=[]
for result in results:
    # 获取支持度,并保留3位小数
    support = round(result.support, 3)
    # 遍历ordered_statistics对象
    for rule in result.ordered_statistics:
        # 获取前件和后件并转成列表
        head_set = list(rule.items_base)
        tail_set = list(rule.items_add)
        # 跳过前件为空的数据
        if head_set == []:
                continue
        # 将前件、后件拼接成关联规则的形式
        related_catogory = str(head_set)+'→'+str(tail_set)
        # 提取置信度,并保留3位小数
        confidence = round(rule.confidence, 3)
        # 提取提升度,并保留3位小数
        lift = round(rule.lift, 3)
        # 查看强关联规则,支持度,置信度,提升度
        print(related_catogory, support, confidence, lift)
        lis1.append(related_catogory);lis2.append(support)
        lis3.append(confidence);lis4.append(lift)

 可以看到最终得到了5个关联规则。

变成数据框

df['related_catogory']=lis1
df['support']=lis2
df['confidence']=lis3
df['lift']=lis4
df=df.sort_values('lift',ascending = False)
df

 画图之前要对数据做一点变形,使用数据融合

df_bar=pd.melt(df,id_vars=['related_catogory'],var_name='变量名称',value_name='变量值')
df_bar

 或者数据堆叠方法,也是一样的效果:

#或者
df.set_index('related_catogory').stack().reset_index()

 画柱状图:(不喜欢这个颜色可以改palette这个参数。)

plt.figure(figsize=(9,3),dpi=128)
sns.barplot(x=df_bar.related_catogory,y=df_bar.变量值,hue=df_bar.变量名称,palette = "twilight")
plt.xticks(fontsize=8,rotation=10)
plt.xlabel('关联规则')
plt.show()

 5个关联规则对应的支持度,置信度,提升度都在这个图上了。


结论 

本次分析得到,买根‘’茎类蔬菜' 会促进['其他蔬菜']的销售量,其提升度最大,为2.247。

同样买['酸奶']会促进['全脂牛奶']的销售量。

买['根茎类蔬菜']促进['全脂牛奶']的销售量。

['热带水果']→['全脂牛奶']

['酸奶']→['全脂牛奶']

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

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

相关文章

移植SFUD,驱动SPI FLASH ZD25WQ80

1、关于SFUD SFUD (Serial Flash Universal Driver) 串行 Flash 通用驱动库,支持众多spi flash,关于SFUD的详细资料可参考:https://github.com/armink/SFUD。 2、为什么会有通用驱动 JEDEC (固态技术协会)针对串行 …

Python的22个万用公式,你确定不看看吗

前言 在大家的日常python程序的编写过程中,都会有自己解决某个问题的解决办法,或者是在程序的调试过程中,用来帮助调试的程序公式。 小编通过几十万行代码的总结处理,总结出了22个python万用公式,可以帮助大家解决在…

TypeScript中type和interface区别

typescript中interface介绍:TypeScript 中的接口 interface_疆~的博客-CSDN博客通常使用接口(Interface)来定义对象的类型。https://blog.csdn.net/qq_40323256/article/details/128478749 type type关键字是声明类型别名的关键字。用来给一…

windows 编译C++ boost库(超详细)

系列文章目录 文章目录系列文章目录前言一、windows二、b2.exe 参数前言 boost库其实不进行编译,大部分库也是可以正常使用的 而且也有一个开源工具vcpkg可以帮组我们下载编译,只是在国内用起来比较麻烦,而且还时常出bug 所以这里详细记录…

mac下,使用 docker 搭建,单机机器集群

背景: 在 Mac本下,通过 docker 完成一个 es 集群(3台-或许可多台)搭建。(后续如果有真实的机器,只需要又该对应的 ip 地址即可,需要关注的是,机器间是可以互相 ping通的,…

4.3.5、IPv4 地址的应用规划

给定一个 IPv4 地址块,如何将其划分成几个更小的地址块,并将这些地址快分配给互联网中的不同网络, 进而可以给各网络中的主机和路由器接口分配 IPv4 地址。 一般有两种方法: 定长的子网掩码 FLSM (Fixed Length Sub…

线程,进程以及Java中创建线程的多种方式

1. 前言 今天的这篇文章的目的还是为了讲述下什么叫线程,什么是进程。可能之前很多人都是通过背书得来的,今天就从通俗易懂的角度来分析下 2. 适合人群 线程以及进程的初学者 3. 开始 3.1 什么是程序 其实不管是程序/ 进程/ 线程都是基于操作系统而言…

141.环形链表

给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(…

SuperMap iDesktop地质体模型匹配地形——精修地质体模型路线

作者:超图研究院技术支持中心-于丁 地质体模型匹配地形——精修地质体模型路线 相信大家开展地质体业务时,常常会遇到构建的精模地质体与DEM地形数据的交界面,嵌合效果不佳、相互压盖、渲染冲突不稳定(闪面)、掩盖、漂…

前端期末考试试题及参考答案(03)

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 一、 填空题 transition属性中______规定应用过渡的CSS属性的名称。transition属性中______定义过渡效果花费的时间。transition属性中______属性规定过渡效果的时间曲线。…

GitHub入门指南(上)

前言 我去年入门 GitHub,一开始不知道从哪开始学,在网上查找了很多文章、教程学习。这篇文章就是以我刚学习时的小白视角写的,希望能帮助到想开始学习 GitHub 又不知如何上手的学习者。因为我也是初级水平,文中介绍的知识基于我自…

6.移动端布局-rem布局

1.rem基础 优点:可以通过修改html里边文字的大小来改变页面中其他元素的大小,可以实现整体控制 1.1 rem单位 rem(root em)是一个相对单位,类似于em。 em是相对于自身元素字体大小(若自身没有设置font-size则基础父元素的字体大…

一次SQL调优 聊一聊 SQLSERVER 数据页

一:背景 1.讲故事 最近给一位朋友做 SQL 慢语句 优化,花了些时间调优,遗憾的是 SQLSERVER 非源码公开,玩起来不是那么顺利,不过从这次经历中我觉得明年的一个重大任务就是好好研究一下它,争取在 SQLSERVE…

uniapp实现音频播放抢占系统音频焦点

项目为使用uniapp框架开发的Android/iOS APP应用 实现功能需求 假设手机正在播放音乐,当前APP处于前台收到消息,需播放提示音提示用户。目标为降低后台正在播放音乐的音量,播放提示音,播放完毕后恢复后台音乐音量 需求分析 乍…

拉伯证券|新能源汽车前11月产销翻倍,渗透率升至三分之一

2022年11月,国内新能源轿车渗透率已升至33.8%,创前史新高。 2022年的最终一个交易日早盘,两市高开高走,沪指涨0.61%,深证成指涨0.35%,创业板指涨0.3%。板块上来看,Web3.0、虚拟人、网络游戏概念…

BI技巧丨RankxYoY

群友:PowerBI可以实现两年的排名差异么? 白茶:可以!安排! 本期的问题,来自于群内小伙伴的一个实际应用场景。在实际业务中,这个需求属于常见类型,展示当前排名时,用户关注…

【软件测试】 测试开发?看看一线大厂需求的测试开发技能......

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 能在一线大厂工作是…

FPGA知识汇集-FPGA系统时序理论

时序约束条件 下面来具体讨论一下系统时序需要满足的一些基本条件。我们仍然以下图的结构为例,并可以据此画出相应的时序分析示意图。 在上面的时序图中,存在两个时序环,我们称实线的环为建立时间环,而虚线的环我们称之为保持时间…

Java死锁

一.死锁是什么? 死锁指两个或者两个以上的线程在执行过程中,去争夺同样一个共享资源,造成的相互等待的现象,如果没有外部干预,线程会一直阻塞,无法往下执行,这样一直处于相互等待资源的线程叫做…

极米Z6X Pro怎么样?极米Z6X Pro亮度如何?极米Z6X Pro值得入手吗?

投影仪不知怎么选?不妨看看极米Z6X Pro,半山黛青的全新配色下,是仅有5.3cm的轻薄机身,1.4kg的重量,一只手就可以轻松拿取。相比同价位的投影产品,极米Z6X Pro摆放方便又不占地,外观时尚精致&…