一.背景與挖掘目的
數(shù)據(jù)解釋
本數(shù)據(jù)源來自某零售企業(yè)的購物列表數(shù)據(jù),有大約9000多條數(shù)據(jù)滚婉,數(shù)據(jù)來源有2張表图筹,Goods Orders、Goods Types让腹。
主要包含3個(gè)屬性:id远剩、Goods、Types哨鸭。
id 商品所屬類別的編號(hào)
Goods 具體商品名稱
Goods 具體商品名稱
Types 商品類別
購物籃分析是通過發(fā)現(xiàn)顧客在一次購買行為中放入購物籃中不同商品之間的關(guān)聯(lián)民宿,根據(jù)商品之間的關(guān)聯(lián)規(guī)則制定銷售策略。
本案例的探索分析查看數(shù)據(jù)特征以及對(duì)商品熱銷情況像鸡、熱銷結(jié)構(gòu)進(jìn)行分析活鹰,希望發(fā)現(xiàn)規(guī)律并采取有效行動(dòng)哈恰,以增加銷量獲取最大利潤。
挖掘目的
1.構(gòu)建零售商品的Apriori關(guān)聯(lián)規(guī)則模型志群,分析商品之間的關(guān)聯(lián)性着绷。
2.根據(jù)模型給出銷售策略。
1.1 數(shù)據(jù)讀取
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')
最終讀取的數(shù)據(jù)如下.
1.2 熱銷產(chǎn)品分析
看一下熱銷產(chǎn)品前十有哪些.并且看看前十產(chǎn)品占訂單量的比例是多少.
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))
給熱銷產(chǎn)品畫個(gè)條形圖.
# 排名前十的商品條形圖
plt.figure(figsize = (8, 4))
plt.rcParams['font.sans-serif'] = 'SimHei'
sns.barplot(y="Goods", x="salesVolume", data=best_sale_TOP)
1.3 產(chǎn)品的結(jié)構(gòu)分析
對(duì)每類商品的熱銷程度進(jìn)行分析锌云,有利于商家制定商品在貨架上的擺放策略和位置荠医,以方便顧客的選購。
或者將熱銷商品放在商場深處桑涎,使顧客在購買熱銷商品前經(jīng)過非熱銷商品彬向,增加在非熱銷商品處的停留時(shí)間,促進(jìn)整體銷量攻冷。
#每種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))
結(jié)構(gòu)展示如圖.
畫個(gè)餅圖,展示銷量占比.
plt.figure(figsize=(5,5))
plt.pie(sort_link['percent'], labels = sort_link['Types'],autopct='%1.2f%%',wedgeprops = {'width' : 0.4})
plt.show()
從銷量占比情況來看娃胆,非酒精飲料、西點(diǎn)里烦、果蔬三類產(chǎn)品的銷量差距不大胁黑,占總銷量的50%左右州泊。其余商品可能并非銷售的主力軍。
二.建立Apriori模型
2.1 訂單表處理
在進(jìn)行Apriori關(guān)聯(lián)規(guī)則建模之前遥皂,需要處理訂單表渴肉,訂單表的id有重復(fù)項(xiàng)仇祭,同一個(gè)id表示同一個(gè)訂單颈畸。
也就是說眯娱,假如id=1的訂單里面有["水果","牛奶"徙缴,"面包"]三種商品,在GoodsOrder所呈現(xiàn)的是三條記錄[id=1,goods="水果"],[id=1,goods="牛奶"],[id=1,goods="面包"]。
現(xiàn)在需要做的就是這個(gè)過程的反向潘靖,這三條記錄按照同一個(gè)id蚤蔓,整合成一串商品列。
GoodsOrder_concat = GoodsOrder.groupby(['id'])['Goods'].apply(lambda x:x.str.cat(sep=',')).reset_index()
GoodsOrder_concat = GoodsOrder_concat[['Goods']]
最終得出的數(shù)據(jù)整合類GoodsOrder_concat如下.
2.2 找出頻繁項(xiàng)集
先將數(shù)據(jù)集處理成模型可以處理的格式.list格式.
dataset_a = GoodsOrder_concat['Goods'].str.split(',').tolist()
dataset_a
接下來引入算法模型.傳入數(shù)據(jù)集.
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_)
接下來調(diào)整頻繁項(xiàng)集的支持度,因?yàn)槭状握页龅念l繁項(xiàng)集較少,所以我不斷降低支持度吐辙,從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))#增加一列存儲(chǔ)項(xiàng)集的長度
frequent_itemsets
最終找出的頻繁項(xiàng)集表格如下.
2.3 找關(guān)聯(lián)規(guī)則
在找關(guān)聯(lián)規(guī)則中,不斷調(diào)整置信度參數(shù)疲扎,從0.9逐漸降低到0.4左右捷雕,大約找出26條關(guān)聯(lián)規(guī)則。
association_rules(frequent_itemsets,metric='confidence',min_threshold=0.35)
26條關(guān)聯(lián)規(guī)則里面壶熏,提升度lift都大于1.2浦译,是合格的。關(guān)聯(lián)規(guī)則的表格如下.
根據(jù)關(guān)聯(lián)規(guī)則作如下分析帽哑。
(根莖類蔬菜, 其他蔬菜)→(全脂牛奶)妻枕,這個(gè)規(guī)則的支持度約為2.3%粘驰,置信度約為48.9%,說明購買了根莖類蔬菜, 其他蔬菜之后蝌数,然后繼續(xù)購買全脂牛奶的概率為48.9%。這種情況發(fā)生的概率為2.3%饵撑。
(其他蔬菜)→(全脂牛奶),這個(gè)規(guī)則的支持度約為7.48%肄梨,置信度約為38.7%,說明購買了其他蔬菜之后侨赡,然后繼續(xù)購買全脂牛奶的概率為38.7%粱侣。這種情況發(fā)生的概率為7.48%。
(根莖類蔬菜)→(全脂牛奶)油猫,這個(gè)規(guī)則的支持度約為4.89%柠偶,置信度約為44.87%,說明購買了根莖類蔬菜之后毡证,然后繼續(xù)購買全脂牛奶的概率為44.87%蔫仙。這種情況發(fā)生的概率為4.89%。
(根莖類蔬菜)→(其他蔬菜)恤煞,這個(gè)規(guī)則的支持度約為4.74%施籍,置信度約為43.47%,說明購買了根莖類蔬菜之后丑慎,然后繼續(xù)購買其他蔬菜的概率為43.47%苔货。這種情況發(fā)生的概率為4.74%。
2.4 總結(jié)
對(duì)于模型結(jié)果姻灶,從購物者角度進(jìn)行分析:隨著生活質(zhì)量的提高和健康意識(shí)的增加产喉,蔬菜和牛奶均為現(xiàn)代家庭每日飲食必需品敢会。
還可以得出結(jié)論:顧客在購買其他商品時(shí)鸥昏,會(huì)很大概率同時(shí)購買全脂牛奶姐帚。因此,set場在做陳列擺放時(shí)可以把牛奶放在最里面罐旗,讓顧客有足夠多的時(shí)間經(jīng)過上市表格左列商品九秀。
另外,顧客同時(shí)購買根莖類蔬菜痹换、其他蔬菜娇豫、set奶油、豬肉锤躁、黃油系羞、本地蛋類霸琴、多種水果的概率較高,因此可以考慮捆綁銷售澎迎。