利用Python進行市場購物籃分析——入門篇
更多深度文章,請關注:https://yq.aliyun.com/cloud
python分析師可以使用許多數據分析工具,但知道在那些情況下使用那些數據分析工具可能很困難。一種有用的(但卻被忽視)的技術稱為關聯分析,它嚐試在大型數據集中查找相關商品之間的關聯。一個具體的應用通常稱為市場籃子分析。最經典引用的市場籃子分析的例子是所謂的“啤酒和尿布”案例。基本的故事是,大型零售商能夠挖掘他們的交易數據,並找到一個意想不到的購買啤酒和嬰兒尿布的購買模式。
不幸的是,這個故事很可能是一個數據城市傳奇。然而,它是挖掘事務數據可以獲得的商業價值的示例。
如果你對Python數據科學有一些基本的了解,可能你的第一個傾向就是考慮scikit學習一個現成的算法。然而,scikit-learn不支持這種算法。幸運的是,Sebastian Raschka 提供了非常有用的具有Apriori算法的MLxtend庫的,以方便我們進一步分析我們所掌握的數據。
接下來我將演示一個使用此庫來分析相對較大的在線零售數據集的示例,並嚐試查找有趣的購買組合。在本文結尾處,我希望你能掌握將其應用於你自己的數據集的基本方法。
為什麼是關聯分析?
在當今的世界,有許多複雜的數據分析方法(聚類,回歸,神經網絡,隨機森林,SVM等)。這些方法中的很多種所麵臨的挑戰在於它們可能難以調整,並需要相當多的數據準備和特征工程才能獲得好的結果。換句話說,它們都非常強大,但需要掌握很多知識才能正確實現。
關聯分析對數學知識的掌握要求非常低,而且結果易於向非技術人員解釋。此外,它是一種無監督的學習工具,可以查找隱藏的模式,因此對數據準備和特征工程的需求有限。對於某些數據探索案例來說,這是一個很好的開始,並且可以發現使用其他方法深入了解數據的方式。
另外一個額外的好處,MLxtend庫中的python實現對於非常熟悉scikit-learn 和pandas應該是非常簡單的。由於所有這些原因,我認為這是一個有用的工具來幫助你解決數據分析實際問題。
關聯分析101
理解關聯分析中常用使用的幾個術語很重要。在介紹數據挖掘是為那些有興趣了解這些定義和算法實現的人,讓他們對關聯分析的數學方法有一個基本的概念。
關聯規則通常如下:{Diapers} - > {Beer},這意味著在同一交易中購買尿布的客戶之間和購買啤酒之間存在很強的關係。
在上麵的例子中,{Diaper}是前提,{Beer}是後果。前提和後果可以包含很多內容,換句話說,就是類似{Diaper,Gum} - > {Beer,Chips}也是一個有效的關聯規則。
信心是對關聯規則可靠性的度量。上述例子中有0.5的信心意味著在購買了Diaper和Gum的情況下,有50%的可能去購買Beer和Chips。對於產品推薦,50%的置信度可能是完全可以接受的,但在醫療情況下,此級別可能不夠高。
如果兩個規則是獨立的,Lift是觀察到的支持與預期的支持的比率(lift解釋詳見維基百科)。基本的經驗法則是Lift接近1表示規則完全獨立。Lift> 1通常更“有趣”,可以表示這是有用的規則模式。
最後一個注意事項,與數據有關。此分析要求將交易的所有數據包含在1行中,並且編碼方式應為one-hot編碼(了解one-Hot編碼)。了解MLxtend 的文檔對了解如何運用是非常有用:
本文的具體數據來自UCI機器學習存儲庫,數據代表了2010-2011年英國零售商的交易數據。這主要代表的是批發商的銷售數據,所以它與消費者購買模式略有不同,但仍然是一個有用的案例研究。
代碼講解
可以使用pip安裝MLxtend,隻有安裝了MLxtend下麵的代碼才能真正運行。一旦安裝完畢,下麵的代碼將會開始工作。我已經將源代碼上傳至Github,以方便你的下載。
獲取我們的Pandas和MLxtend代碼導入並讀取數據:
import pandas as pd
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
df=pd.read_excel('https://archive.ics.uci.edu/ml/machine-learning-databases/00352/Online%20Retail.xlsx')
df.head()
我們需要做一點數據處理。首先,一些數據描述中具有需要刪除的空格。我們還會刪除沒有發票編號的行,並刪除信用交易(發票編號包含C)。
df['Description'] = df['Description'].str.strip()
df.dropna(axis=0, subset=['InvoiceNo'], inplace=True)
df['InvoiceNo'] = df['InvoiceNo'].astype('str')
df = df[~df['InvoiceNo'].str.contains('C')]
數據清理完成後,我們需要將每個產品進行one-hot編碼。為了保持數據集小,我選擇隻是看法國的銷售記錄。然而,在下麵的其他代碼中,我將這些結果與德國的銷售進行比較。進一步的國家比較將會是有趣的調查。
basket = (df[df['Country'] =="France"]
.groupby(['InvoiceNo', 'Description'])['Quantity']
.sum().unstack().reset_index().fillna(0)
.set_index('InvoiceNo'))
以下是前幾列的樣子(注意,我在列中添加了一些數字來說明這個概念,這個例子中的實際數據全是0).
數據中有很多零,但是我們還需要確保將任何正則轉換為1,而將0設置為0。此步驟將完成數據的one-hot編碼,並刪除郵資列:
def encode_units(x):
if x <= 0:
return 0
if x >= 1:
return 1
basket_sets = basket.applymap(encode_units)
basket_sets.drop('POSTAGE', inplace=True, axis=1)
既然數據的結構是正確,我們可以生成支持至少7%的頻繁項目集(選擇這個數字,可以幫助我得到更多有用的例子。)
frequent_itemsets = apriori(basket_sets, min_support=0.07, use_colnames=True)
最後一步是產生相應的信心和提升的規則:
rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1)
rules.head()
這就是這個項目的一切!
現在,最棘手的部分是弄清楚我們得到的這些結論告訴我們什麼了。可能絕大多數程序猿不太關注。例如,我們可以發現很多關聯規則具有很高的提升價值,這意味著它的發生頻率可能會高於交易和產品組合數量的預期值。這部分分析是行業知識將派上用場的地方。由於我沒有,所以我隻是想找幾個說明性的例子。
我們可以使用標準的pandas code來過濾數據幀。在這種情況下,尋找一個lift(6)和高信度(.8):
rules[ (rules['lift'] >= 6) &
(rules['confidence'] >= 0.8) ]
在查看規則時,可以發現似乎綠色和紅色鬧鍾是一起購買的,紅紙杯,餐巾紙和紙板是以總體概率提高的方式一起購買的。
您可能想要看看有多大的機會可以使用一種產品的受歡迎程度來推動另一種產品的銷售。例如,我們可以看到,我們銷售340個綠色鬧鍾,但隻有316個紅色鬧鍾,所以也許我們可以通過科學的方法來推動更多的紅色鬧鍾銷售。
basket['ALARM CLOCK BAKELIKE GREEN'].sum()
340.0
basket['ALARM CLOCK BAKELIKE RED'].sum()
316.0
我們來看看德國有什麼流行的組合呢?
basket2 = (df[df['Country'] =="Germany"]
.groupby(['InvoiceNo', 'Description'])['Quantity']
.sum().unstack().reset_index().fillna(0)
.set_index('InvoiceNo'))
basket_sets2 = basket2.applymap(encode_units)
basket_sets2.drop('POSTAGE', inplace=True, axis=1)
frequent_itemsets2=apriori(basket_sets2,min_support=0.05, use_colnames=True)
rules2= association_rules(frequent_itemsets2, metric="lift", min_threshold=1)
rules2[ (rules2['lift'] >= 4) &
(rules2['confidence'] >= 0.5)]
似乎除了大衛·哈塞爾夫以外,德國人喜歡錫太太雄和林地動物的Plaster。
在非常認真的情況下,熟悉數據的分析師可能會有十幾個不同的問題,即這種類型的分析可以發揮商業價值。我沒有將此分析複製到額外的國家或客戶組合,但是由於上述基本的熊貓代碼,整個過程將相對簡單。
結論
關聯分析有一個非常好的方麵是它很容易運行,相對容易解釋。如果您沒有使用MLxtend和關聯分析,則使用基本Excel分析找到這些模式將是非常困難。使用python和MLxtend,分析過程相對簡單,如果你了解Python,你可以訪問python生態係統中的所有其他可視化技術和數據分析工具。
最後,我建議您查看MLxtend庫的其餘部分。如果您在使用scikit-learn做工作,可以了解並熟悉MLxtend,以及如何增加數據科學工具包中的一些現有工具。
本文由北郵@愛可可-愛生活老師推薦,@阿裏雲雲棲社區組織翻譯。
文章原標題《Introduction to Market Basket Analysis in Python》,
作者:Chris Moffitt審閱:
文章為簡譯,更為詳細的內容,請查看原文
最後更新:2017-07-22 16:02:48