Python数据分析案例15——超市零售购物篮关联分析(apriori)
数据分析:Python的Pandas库数据处理 #生活知识# #编程教程#
啤酒和纸尿裤的故事大多数人都听说过,纸尿裤的售卖提升了啤酒的销售额。
关联分析就是这样的作用,可以研究某种商品的售卖对另外的商品的销售起促进还是抑制的作用。
案例背景本次案例背景是超市的零售数据,研究商品之间的关联规则。使用的自然是最经典的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
np.set_printoptions(precision=4)
plt.rcParams ['font.sans-serif'] ='SimHei'
plt.rcParams ['axes.unicode_minus']=False
python
运行
读取案例数据
inputfile = '../data/GoodsOrder.csv'
data = pd.read_csv(inputfile,encoding = 'gbk')
data.info()
python
运行

可以看到是43367条样本。
对商品进行分类汇总,计算每类商品的销售数量,得到前10 的商品
group = data.groupby(['Goods']).count().sort_values('id',ascending=False)
group.head(10)
python
运行

画柱状图展示;
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()
python
运行

可以看到卖得最多的是全脂牛奶,蔬菜等。
类别分析读取每种商品对应的类别:
types = pd.read_csv('../data/GoodsTypes.csv',encoding = 'gbk')
types.head()
python
运行

可以看到这个表格包含了所有商品对应的食物的总类别
这个表对上面分类汇总后的订单表进行合并:(放在excel里面实现这一步就是vlookup函数)
sort_links = pd.merge(group.reset_index(),types,on='Goods')
sort_links
python
运行

然后我们画出所有大类别商品的销售数量和的比例图:
(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)
)
python
运行

可以看到每种大类商品的销售数量比例。
预处理将原始数据进行合并,每个订单的商品都弄在一起
data['Goods'] = data['Goods'].apply(lambda x:','+x)
data = data.groupby('id').sum().reset_index()
data
python
运行

可以看到总共有9835个订单,每个订单里面的商品数量名称都不尽相同。
将上面的订单都变为列表,查看前五个
data['Goods'] = data['Goods'].apply(lambda x :x[1:].split(','))
data_list = list(data['Goods'])
data_list[:5]
python
运行

每个订单都是一个列表,装着所有的商品名称,数据准备完成,下面进行关联分析
关联分析导入包,计算模型,得到结果。这里模型的最小支持度选为0.03,最小置信度选为0.4.
from apyori import apriori
results = apriori(data_list, min_support=0.03, min_confidence=0.4)
python
运行
打印结果,并装入数据框方便下面画图:
df=pd.DataFrame()
lis1=[];lis2=[];lis3=[];lis4=[]
for result in results:
support = round(result.support, 3)
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)
confidence = round(rule.confidence, 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)
python
运行

可以看到最终得到了5个关联规则。
变成数据框
df['related_catogory']=lis1
df['support']=lis2
df['confidence']=lis3
df['lift']=lis4
df=df.sort_values('lift',ascending = False)
df
python
运行

画图之前要对数据做一点变形,使用数据融合
df_bar=pd.melt(df,id_vars=['related_catogory'],var_name='变量名称',value_name='变量值')
df_bar
python
运行

或者数据堆叠方法,也是一样的效果:
df.set_index('related_catogory').stack().reset_index()
python
运行

画柱状图:(不喜欢这个颜色可以改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()
python
运行

5个关联规则对应的支持度,置信度,提升度都在这个图上了。
结论本次分析得到,买根‘’茎类蔬菜' 会促进['其他蔬菜']的销售量,其提升度最大,为2.247。
同样买['酸奶']会促进['全脂牛奶']的销售量。
买['根茎类蔬菜']促进['全脂牛奶']的销售量。
['热带水果']→['全脂牛奶']
['酸奶']→['全脂牛奶']
创作不易,看官觉得写得还不错的话点个关注和赞吧,本人会持续更新python数据分析领域的代码文章~(需要定制代码可私信)
网址:Python数据分析案例15——超市零售购物篮关联分析(apriori) https://www.yuejiaxmz.com/news/view/1388369
相关内容
数据挖掘实战—商品零售购物篮分析关联分析之Apriori算法
数据挖掘与商业智能的实践案例分析
有趣的数据分析案例
【数据分析】销售案例——用户购买频次
数据分析案例:医疗数据分析与预测
10个超有趣的经典数据分析案例!让你轻松了解数据分析!——九数云BI
《python数据分析与挖掘》
2025中国零售大数据行业市场深度分析及发展前景预测
揭秘关联规则算法:生活中的智慧购物秘诀与惊人案例深度解析

