一.背景与挖掘目的
数据解释
本数据源来自某零售企业的购物列表数据,有大约9000多条数据,数据来源有2张表,Goods Orders、Goods Types。
主要包含3个属性:id、Goods、Types。
id 商品所属类别的编号
Goods 具体商品名称
Goods 具体商品名称
Types 商品类别
购物篮分析是通过发现顾客在一次购买行为中放入购物篮中不同商品之间的关联,根据商品之间的关联规则制定销售策略。
本案例的探索分析查看数据特征以及对商品热销情况、热销结构进行分析,希望发现规律并采取有效行动,以增加销量获取最大利润。
挖掘目的
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奶油、猪肉、黄油、本地蛋类、多种水果的概率较高,因此可以考虑捆绑销售。
网友评论