案例-基于Apriori关联规则的商品购物列表分析

一.背景与挖掘目的

数据解释

本数据源来自某零售企业的购物列表数据,有大约9000多条数据,数据来源有2张表,Goods Orders、Goods Types。
主要包含3个属性:id、Goods、Types。

id 商品所属类别的编号
Goods 具体商品名称
Goods 具体商品名称
Types 商品类别

购物列商品.png

购物篮分析是通过发现顾客在一次购买行为中放入购物篮中不同商品之间的关联,根据商品之间的关联规则制定销售策略。
本案例的探索分析查看数据特征以及对商品热销情况、热销结构进行分析,希望发现规律并采取有效行动,以增加销量获取最大利润。

挖掘目的

1.构建零售商品的Apriori关联规则模型,分析商品之间的关联性。
2.根据模型给出销售策略。

1.1 数据读取

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
import warnings
warnings.filterwarnings('ignore')

GoodsOrder = pd.read_csv('data/GoodsOrder.csv',encoding='gbk')
GoodsTypes = pd.read_csv('data/GoodsTypes.csv',encoding='gbk')

GoodsOrder_ = GoodsOrder.merge(GoodsTypes,how='left',left_on='Goods',right_on='Goods')

最终读取的数据如下.


image.png

1.2 热销产品分析

看一下热销产品前十有哪些.并且看看前十产品占订单量的比例是多少.

best_sale = GoodsOrder_.groupby(['Goods']).agg({'id':'count'}).reset_index().sort_values('id',ascending=False).rename(columns={'id':'salesVolume'})

best_sale_TOP['occupy'] = best_sale_TOP['salesVolume']/best_sale['salesVolume'].sum()
best_sale_TOP = best_sale_TOP.reset_index()
best_sale_TOP['occupy'] = best_sale_TOP['occupy'].map(lambda x:'{:.2%}'.format(x))
image.png

给热销产品画个条形图.

# 排名前十的商品条形图
plt.figure(figsize = (8, 4))
plt.rcParams['font.sans-serif'] = 'SimHei'
sns.barplot(y="Goods", x="salesVolume", data=best_sale_TOP)
image.png

1.3 产品的结构分析

对每类商品的热销程度进行分析,有利于商家制定商品在货架上的摆放策略和位置,以方便顾客的选购。
或者将热销商品放在商场深处,使顾客在购买热销商品前经过非热销商品,增加在非热销商品处的停留时间,促进整体销量。

#每种Types商品的销量
sort_link = GoodsOrder_.groupby(['Types']).agg({'id':'count'}).reset_index().sort_values('id',ascending=False).rename(columns={'id':'salesVolume'})
sort_link['occupy'] = sort_link['salesVolume']/sort_link['salesVolume'].sum()
sort_link['percent'] = sort_link['salesVolume']/sort_link['salesVolume'].sum()
sort_link['occupy'] = sort_link['occupy'].map(lambda x:'{:.2%}'.format(x))

结构展示如图.


image.png

画个饼图,展示销量占比.

plt.figure(figsize=(5,5))
plt.pie(sort_link['percent'], labels = sort_link['Types'],autopct='%1.2f%%',wedgeprops = {'width' : 0.4})
plt.show()
image.png

从销量占比情况来看,非酒精饮料、西点、果蔬三类产品的销量差距不大,占总销量的50%左右。其余商品可能并非销售的主力军。

二.建立Apriori模型

2.1 订单表处理

在进行Apriori关联规则建模之前,需要处理订单表,订单表的id有重复项,同一个id表示同一个订单。


image.png

也就是说,假如id=1的订单里面有["水果","牛奶","面包"]三种商品,在GoodsOrder所呈现的是三条记录[id=1,goods="水果"],[id=1,goods="牛奶"],[id=1,goods="面包"]。

现在需要做的就是这个过程的反向,这三条记录按照同一个id,整合成一串商品列。

GoodsOrder_concat = GoodsOrder.groupby(['id'])['Goods'].apply(lambda x:x.str.cat(sep=',')).reset_index()
GoodsOrder_concat = GoodsOrder_concat[['Goods']]

最终得出的数据整合类GoodsOrder_concat如下.


image.png

2.2 找出频繁项集

先将数据集处理成模型可以处理的格式.list格式.

dataset_a = GoodsOrder_concat['Goods'].str.split(',').tolist()
dataset_a
image.png

接下来引入算法模型.传入数据集.

from mlxtend.frequent_patterns import apriori, association_rules
from mlxtend.preprocessing import TransactionEncoder
te = TransactionEncoder()
te_ary = te.fit_transform(dataset_a)
df = pd.DataFrame(te_ary, columns=te.columns_)

接下来调整频繁项集的支持度,因为首次找出的频繁项集较少,所以我不断降低支持度,从0.2,0.1,到0.02.

frequent_itemsets = apriori(df, min_support=0.02, use_colnames=True)
frequent_itemsets['length'] = frequent_itemsets['itemsets'].apply(lambda x:len(x))#增加一列存储项集的长度
frequent_itemsets

最终找出的频繁项集表格如下.


image.png

2.3 找关联规则

在找关联规则中,不断调整置信度参数,从0.9逐渐降低到0.4左右,大约找出26条关联规则。

association_rules(frequent_itemsets,metric='confidence',min_threshold=0.35)

26条关联规则里面,提升度lift都大于1.2,是合格的。关联规则的表格如下.


image.png

根据关联规则作如下分析。
(根茎类蔬菜, 其他蔬菜)→(全脂牛奶),这个规则的支持度约为2.3%,置信度约为48.9%,说明购买了根茎类蔬菜, 其他蔬菜之后,然后继续购买全脂牛奶的概率为48.9%。这种情况发生的概率为2.3%。

(其他蔬菜)→(全脂牛奶),这个规则的支持度约为7.48%,置信度约为38.7%,说明购买了其他蔬菜之后,然后继续购买全脂牛奶的概率为38.7%。这种情况发生的概率为7.48%。

(根茎类蔬菜)→(全脂牛奶),这个规则的支持度约为4.89%,置信度约为44.87%,说明购买了根茎类蔬菜之后,然后继续购买全脂牛奶的概率为44.87%。这种情况发生的概率为4.89%。

(根茎类蔬菜)→(其他蔬菜),这个规则的支持度约为4.74%,置信度约为43.47%,说明购买了根茎类蔬菜之后,然后继续购买其他蔬菜的概率为43.47%。这种情况发生的概率为4.74%。

2.4 总结

对于模型结果,从购物者角度进行分析:随着生活质量的提高和健康意识的增加,蔬菜和牛奶均为现代家庭每日饮食必需品。

还可以得出结论:顾客在购买其他商品时,会很大概率同时购买全脂牛奶。因此,set场在做陈列摆放时可以把牛奶放在最里面,让顾客有足够多的时间经过上市表格左列商品。

另外,顾客同时购买根茎类蔬菜、其他蔬菜、set奶油、猪肉、黄油、本地蛋类、多种水果的概率较高,因此可以考虑捆绑销售。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,340评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,762评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,329评论 0 329
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,678评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,583评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,995评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,493评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,145评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,293评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,250评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,267评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,973评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,556评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,648评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,873评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,257评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,809评论 2 339

推荐阅读更多精彩内容