泰迪數(shù)據(jù)分析案例丨商品零售購物籃分析(上)
購物籃分析
關(guān)聯(lián)規(guī)則挖掘應(yīng)用
將單個客戶一次購買商品的總和(以收銀臺結(jié)賬為準(zhǔn))稱為一個購物籃。那么購物籃分析就是針對商品的相關(guān)性進(jìn)行分析。因為最初這種關(guān)聯(lián)分析主要是在超市應(yīng)用廣泛,所以也稱為“購物籃分析”。
購物籃分析是商業(yè)領(lǐng)域最前沿、最具挑戰(zhàn)性的問題之一,也是許多企業(yè)研究的重點問題。購物籃分析是通過發(fā)現(xiàn)顧客在一次購買行為中放入購物籃中不同商品之間的關(guān)聯(lián),研究客戶的購買行為,從而輔助零售企業(yè)制定營銷策略的一種數(shù)據(jù)分析方法。
本章使用Apriori關(guān)聯(lián)規(guī)則算法實現(xiàn)購物籃分析,發(fā)現(xiàn)超市不同商品之間的關(guān)聯(lián)關(guān)系,并根據(jù)商品之間的關(guān)聯(lián)規(guī)則制定銷售策略。
背景與挖掘目標(biāo)
現(xiàn)代商品種類繁多,顧客往往會由于需要購買的商品眾多而變得疲于選擇,且顧客并不會因為商品選擇豐富而選擇購買更多的商品。繁雜的選購過程往往會給顧客疲憊的購物體驗。對于某些商品,顧客會選擇同時購買,如面包與牛奶、薯片與可樂等,當(dāng)面包與牛奶或者薯片與可樂分布在商場的兩側(cè),且距離十分遙遠(yuǎn)時,顧客購買的欲望就會減少,在時間緊迫的情況下顧客甚至?xí)艞壻徺I某些計劃購買的商品。相反,把牛奶與面包擺放在相鄰的位置,既給顧客提供便利,提升購物體驗,又提高顧客購買的概率,達(dá)到了促銷的目的。許多商場以打折方式作為主要促銷手段,以更少的利潤為代價獲得更高的銷量。打折往往會使顧客增加原計劃購買商品的數(shù)量,對于原計劃不打算購買且不必要的商品,打折的吸引力遠(yuǎn)遠(yuǎn)不足。而正確的商品擺放卻能提醒顧客購買某些必需品,甚至吸引他們購買感興趣的商品。
因此,為了獲得最大的銷售利潤,銷售什么樣的商品,采用什么樣的促銷策略,商品在貨架上如何擺放,了解顧客的購買習(xí)慣和偏好對銷售商尤其重要。通過對商場銷售數(shù)據(jù)進(jìn)行分析,從而得到顧客的購買行為特征,并根據(jù)發(fā)現(xiàn)的規(guī)律而采取有效的行動,制定商品擺放、商品定價、新商品采購計劃,對商場增加銷量并獲取最大利潤有重要意義。
我們需要根據(jù)提供的數(shù)據(jù)實現(xiàn)以下目標(biāo):
1)?構(gòu)建零售商品的Apriori關(guān)聯(lián)規(guī)則模型,分析商品之間的關(guān)聯(lián)性;
2)?根據(jù)模型結(jié)果給出銷售策略。
01
挖掘建模的總體流程
本次數(shù)據(jù)挖掘建模的總體流程如圖 1所示。

圖?1??購物籃分析流程圖
購物籃關(guān)聯(lián)規(guī)則挖掘主要步驟如下:
1)?對原始數(shù)據(jù)進(jìn)行數(shù)據(jù)探索性分析,分析商品的熱銷情況與商品結(jié)構(gòu);
2)?對原始數(shù)據(jù)進(jìn)行數(shù)據(jù)預(yù)處理,轉(zhuǎn)換數(shù)據(jù)形式,使之符合Apriori關(guān)聯(lián)規(guī)則算法要求;
3)?在步驟(2)得到的建模數(shù)據(jù)基礎(chǔ)上,采用Apriori關(guān)聯(lián)規(guī)則算法,調(diào)整模型輸入?yún)?shù),完成商品關(guān)聯(lián)性分析;
4)?結(jié)合實際業(yè)務(wù),對模型結(jié)果進(jìn)行分析,根據(jù)分析結(jié)果給出銷售建議,最后輸出關(guān)聯(lián)規(guī)則結(jié)果。
02
數(shù)據(jù)探索分析
本案例的探索性分析是查看數(shù)據(jù)特征,以及對商品熱銷情況和商品結(jié)構(gòu)分析。
探索數(shù)據(jù)特征是了解數(shù)據(jù)的第一步。分析商品熱銷情況和商品結(jié)構(gòu),是為了更好地實現(xiàn)企業(yè)的經(jīng)營目標(biāo)。商品管理應(yīng)堅持商品齊全和商品優(yōu)選的原則,產(chǎn)品銷售基本滿足“二八定律”即80%的銷售額是由20%的商品創(chuàng)造的,這些商品是企業(yè)主要盈利商品,要作為商品管理的重中之重。商品熱銷情況分析和商品結(jié)構(gòu)分析也是商品管理不可或缺的一部分,其中商品結(jié)構(gòu)分析能夠幫助保證商品的齊全性,熱銷情況分析可以助力于商品優(yōu)選。
某商品零售企業(yè)共收集了9835個購物籃的數(shù)據(jù),購物籃數(shù)據(jù)主要包括3個屬性:id、Goods和Types。屬性的具體說明如表 1所示。

1. 數(shù)據(jù)特征
探索數(shù)據(jù)的特征,查看每列屬性、最大值、最小值,是了解數(shù)據(jù)的第一步。查看數(shù)據(jù)特征,如代碼清單1所示。
import numpy as np
import pandas as pd
inputfile = '../data/GoodsOrder.csv' ? # 輸入的數(shù)據(jù)文件
data = pd.read_csv(inputfile,encoding='gbk') ?# 讀取數(shù)據(jù)
data.info() ?# 查看數(shù)據(jù)屬性
data = data['id']
description = [data.count(),data.min(), data.max()] ?# 依次計算總數(shù)、最小值、最大值
description = pd.DataFrame(description, index=['Count','Min', 'Max']).T ?# 將結(jié)果存入數(shù)據(jù)框
print('描述性統(tǒng)計結(jié)果:\n',np.round(description)) ?# 輸出結(jié)果
代碼清單1 查看數(shù)據(jù)特征
根據(jù)代碼清單1可得,每列屬性共有43367個觀測值,并不存在缺失值。查看“id”屬性的大值和最小值,可知某商品零售企業(yè)共收集了9835個購物籃的數(shù)據(jù),其中包含169個不同的商品類別,售出商品總數(shù)為43367件。
2. 分析熱銷商品
商品熱銷情況分析是商品管理不可或缺的一部分,熱銷情況分析可以助力于商品優(yōu)選。計算銷量排行前10商品的銷量及占比,并繪制條形圖顯示銷量前10商品的銷量情況,如代碼清單2所示。
# 銷量排行前10商品的銷量及其占比
import pandas as pd
inputfile = '../data/GoodsOrder.csv' ?# 輸入的數(shù)據(jù)文件
data = pd.read_csv(inputfile,encoding='gbk') ?# 讀取數(shù)據(jù)
group = data.groupby(['Goods']).count().reset_index() ?# 對商品進(jìn)行分類匯總
sorted=group.sort_values('id',ascending=False)
print('銷量排行前10商品的銷量:\n', sorted[:10]) ?# 排序并查看前10位熱銷商品
# 畫條形圖展示出銷量排行前10商品的銷量
import matplotlib.pyplot as plt
x = sorted[:10]['Goods']
y = sorted[:10]['id']
plt.figure(figsize=(8, 4)) ?# 設(shè)置畫布大小
plt.barh(x,y)
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.xlabel('銷量') ?# 設(shè)置x軸標(biāo)題
plt.ylabel('商品類別') ?# 設(shè)置y軸標(biāo)題
plt.title('商品的銷量TOP10') ?# 設(shè)置標(biāo)題
plt.savefig('../tmp/top10.png') ?# 把圖片以.png格式保存
plt.show() ?# 展示圖片
# 銷量排行前10商品的銷量占比
data_nums = data.shape[0]
for idnex, row in sorted[:10].iterrows():
? ?print(row['Goods'],row['id'],row['id']/data_nums)
代碼清單2 分析熱銷商品
根據(jù)代碼清單2可得到銷量排行前10商品的銷量及其占比情況,如表 2和圖 2所示。

表?2?銷量排行前10商品的銷量及其占比

?圖 2?銷量排行前10的商品銷量情況
通過分析熱銷商品的結(jié)果可知,全脂牛奶銷售量最高,銷量為2513件,占比5.795%;其次是其他蔬菜、面包卷和蘇打,占比分別為4.388%、4.171%、3.955%。
2. 分析商品結(jié)構(gòu)
對每一類商品的熱銷程度進(jìn)行分析,有利于商家制定商品在貨架的擺放策略和位置,若是某類商品較為熱銷,商場可以把此類商品擺放到商場的中心位置,方便顧客選購。或者放在商場深處位置,使顧客在購買熱銷商品前經(jīng)過非熱銷商品,增加在非熱銷商品處的停留時間,促進(jìn)非熱銷產(chǎn)品的銷量。
原始數(shù)據(jù)中的商品本身已經(jīng)過歸類處理,但是部分商品還是存在一定的重疊,故再次對其進(jìn)行歸類處理。分析歸類后各類別商品的銷量及其占比,并繪制餅圖顯示各類商品的銷量占比情況,如代碼清單3所示
import pandas as pd
inputfile1 = '../data/GoodsOrder.csv'
inputfile2 = '../data/GoodsTypes.csv'
data = pd.read_csv(inputfile1,encoding='gbk')
types = pd.read_csv(inputfile2,encoding='gbk') ?# 讀入數(shù)據(jù)
group = data.groupby(['Goods']).count().reset_index()
sort = group.sort_values('id',ascending=False).reset_index()
data_nums = data.shape[0] ?# 總量
del sort['index']
sort_links = pd.merge(sort,types) ?# 合并兩個datafreame 根據(jù)type
# 根據(jù)類別求和,每個商品類別的總量,并排序
sort_link = sort_links.groupby(['Types']).sum().reset_index()
sort_link = sort_link.sort_values('id',ascending=False).reset_index()
del sort_link['index'] ?# 刪除“index”列
# 求百分比,然后更換列名,最后輸出到文件
sort_link['count'] = sort_link.apply(lambda line: line['id']/data_nums,axis=1)
sort_link.rename(columns={'count':'percent'},inplace=True)
print('各類別商品的銷量及其占比:\n',sort_link)
outfile1 = '../tmp/percent.csv'
sort_link.to_csv(outfile1,index=False,header=True,encoding='gbk') ?# 保存結(jié)果
# 畫餅圖展示每類商品銷量占比
import matplotlib.pyplot as plt
data = sort_link['percent']
labels = sort_link['Types']
plt.figure(figsize=(8, 6)) ?# 設(shè)置畫布大小 ?
plt.pie(data,labels=labels,autopct='%1.2f%%')
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.title('每類商品銷量占比') ?# 設(shè)置標(biāo)題
plt.savefig('../tmp/persent.png') ?# 把圖片以.png格式保存
plt.show()
代碼清單3?各類別商品的銷量及其占比
根據(jù)代碼清單3可得各類別商品的銷量及其占比情況,結(jié)果如表3、圖3所示。


通過分析各類別商品的銷量及其占比情況可知,非酒精飲料、西點、果蔬三類商品銷量差距不大,占總銷量的50%左右,同時,根據(jù)大類劃分發(fā)現(xiàn)和食品相關(guān)的類的銷量總和接近90%,說明了顧客傾向于購買此類產(chǎn)品,而其余商品僅為商場滿足顧客的其余需求而設(shè)定,并非銷售的主力軍。
進(jìn)一步查看銷量第一的非酒精飲料類商品的內(nèi)部商品結(jié)構(gòu),并繪制餅圖顯示其銷量占比情況,如代碼清單4所示。
# 先篩選“非酒精飲料”類型的商品,然后求百分比,然后輸出結(jié)果到文件。
selected = sort_links.loc[sort_links['Types'] == '非酒精飲料'] ?# 挑選商品類別為“非酒精飲料”并排序
child_nums = selected['id'].sum() ?# 對所有的“非酒精飲料”求和
selected['child_percent'] = selected.apply(lambda line: line['id']/child_nums,axis=1) ?# 求百分比
selected.rename(columns={'id':'count'},inplace=True)
print('非酒精飲料內(nèi)部商品的銷量及其占比:\n',selected)
outfile2 = '../tmp/child_percent.csv'
sort_link.to_csv(outfile2,index=False,header=True,encoding='gbk') ?# 輸出結(jié)果
# 畫餅圖展示非酒精飲品內(nèi)部各商品的銷量占比
import matplotlib.pyplot as plt
data = selected['child_percent']
labels = selected['Goods']
plt.figure(figsize=(8,6)) ?# 設(shè)置畫布大小
explode = (0.02,0.03,0.04,0.05,0.06,0.07,0.08,0.08,0.3,0.1,0.3) ?# 設(shè)置每一塊分割出的間隙大小
plt.pie(data,explode=explode,labels=labels,autopct='%1.2f%%',
? ? ?pctdistance=1.1,labeldistance=1.2)
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.title("非酒精飲料內(nèi)部各商品的銷量占比") ?# 設(shè)置標(biāo)題
plt.axis('equal')
plt.savefig('../tmp/child_persent.png') ?# 保存圖形
plt.show() ?# 展示圖形
代碼清單4?非酒精飲料內(nèi)部商品的銷量及其占比
根據(jù)代碼清單4可得非酒精飲料內(nèi)部商品的銷量及其占比情況,如表4、圖4所示。


通過分析非酒精飲料內(nèi)部商品的銷量及其占情況可知,全脂牛奶的銷量在非酒精飲料的總銷量中占比超過33%,前3種非酒精飲料的銷量在非酒精飲料的總銷量中占比接近70%,說明了大部分顧客到店購買的飲料為這三種,需要時常注意貨物的庫存,定期補(bǔ)貨必不可少。
更多具體詳細(xì)內(nèi)容可到 泰迪智能科技大數(shù)據(jù)培訓(xùn)平臺-泰迪云課堂咨詢咨詢了解更多