2018 年 12 月

第 33 卷 12

人工智慧-購物籃分析

藉由Frank La La

Frank La Vigne有一點的人工智慧 (AI),無可否認,發生,特別是為假日購物旺季期間正在進行中-建議的採購單。幾乎每個線上零售商會顯示額外的產品建議,有時在標頭 「 人氣組合,「 或 」 購買的客戶也購買 Y 的 X。 」 根據 2013年中的一項研究的作者: McKinsey (bit.ly/2yK3Bu8),取用者購買在 Amazon 上 35%來自產品建議演算法。不僅如此,這種做法也不再限於零售商,Netflix 和 YouTube 等線上串流服務會使用複雜的建議演算法來保留較長的調整檢視器。

很明顯地,建議系統會將影響對日常生活中。您可以說它們最顯著的取用者會遇到的 AI 形式。在本專欄中,我將探討稱為購物籃分析的建議系統的基本形式。

購物籃分析

購物籃分析,也稱為親和性分析,是理論上,若您購買特定項目群組,就比較可能購買的項目數的另一個群組為基礎的模型化技術。比方說,有人購買 peanut 奶油和 bread 是更有可能也想要購買 jelly。不過,並非所有的關聯性為顯而易見的。取用者行為需要預知可以提高銷售量,並且給予零售商對抗競爭對手的重大優勢。嚴格來說,購物籃分析是關聯分析技巧,只要應用程式,雖然許多線上文件和教學課程可能混淆。若要將它放在檢視方塊的其他機器學習的技術,我寫了解購物籃分析是一個非監督式的學習工具之前,需要只會特徵工程設計和數量有限的資料清理和準備。在實務上,從購物籃分析收集的深入解析可以進一步探索的其他 AI 或資料科學工具。

儘管能夠發現隱藏的模式,購物籃分析會是相當容易說明,而且不需要了解進階統計資料或微積分。不過,有少數的條款及慣例標記法,以檢閱。首先,原因與效果的概念被指前項和後續。在範例中我先前所述,peanut 奶油和 bread 前項而且 jelly 後續。此關聯性的型式表示法會是 {Peanut 奶油,Bread}]-> [{Jelly} 表示沒有這些項目之間的連線。也記下前項和 consequents 可以包含多個項目。

有三個重要的數學量值所需的購物籃分析:支援、 增益和信心。支援代表前項一起出現在資料中的次數。若要簡化範例,假設有下列關聯性: {Peanut 奶油}]-> [{grape 處理 Jelly}。指定 100 名客戶 (和每個客戶的一筆交易),請考慮下列案例:

  • 15 的客戶購買 Peanut 奶油
  • 13 購買 grape 處理 Jelly
  • 11 購買 Peanut 奶油和 grape 處理 Jelly

支援表示次數的項目會出現在一起,交易也在此範例中就是 11 共 100 或 0.11。若要使用統計的條款,則機率是百分之 11 Peanut 奶油和 grape 處理 Jelly,會包含任何特定的交易。信心會支援的值 (。 11),並除以交易的 grape 處理 Jelly,等於 0.846 值的機率。這表示,幾乎 85%的時間 grape 處理 Jelly 購買,購買以及 Peanut 奶油。最後,還有增益,它信心 (0.846),並除以 Peanut 奶油的機率。這等同於 5.64 (四捨五入成兩個小數位數)。

所有這可能會更清楚簡單的圖中,如中所示**[圖 1**。

[圖 1 支援信心和增益值

量值 公式
支援 P (Peanut 奶油 & Grape Jelly) .011
信心 支援 / P (Grape Jelly) 0.846
增益 信心 / P (Peanut 奶油) 5.64 (無條件)

 

作用中的購物籃分析

記住先前的計量,就可以試用真實的資料集上的 [購物籃分析。第一個步驟是取得要分析的零售資料。幸運的是,University of California,Irvine,提供包含交易英國為基礎的網站的資料集。資料集的詳細資訊位於bit.ly/2DgATFl。在您慣用的平台上建立 Python 3 notebook (我討論了在前一個資料行中的 Jupyter notebook msdn.com/magazine/mt829269)。建立空的資料格,輸入下列的程式碼,以下載範例資料,並執行資料格:

! curl http://archive.ics.uci.edu/ml/machine-learning-databases/00352/Online%20Retail.xlsx -o retail.xlsx

完成之後,請載入 Pandas 資料框架中的 Excel 試算表,並列印出資料集的資料行的新儲存格中輸入下列程式碼:

import pandas as pd
df = pd.read_excel('retail.xlsx')
print( df.columns)
The output will look something like this:
Index(['InvoiceNo', 'StockCode', 'Description', 'Quantity', 'InvoiceDate',
       'UnitPrice', 'CustomerID', 'Country'],
      dtype='object')

購物籃分析不需要嚴格的資料轉換,就沒有道理移除多餘的記錄,例如那些具有 null 發票號碼和取消訂單。也很有用的產品描述中移除多餘的空格,並將所有發票號碼都轉換成字串。您可以藉由執行下列程式碼來這麼做:

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')]

現在請輸入下列程式碼,彙總資料,並檢視從國家 (地區) 層級:

df.groupby('Country').count().reset_index().sort_values(
  'InvoiceNo', ascending = False).head()

接下來,我將會重新排列與其中一個最忙碌的編碼每個產品的資料和一筆交易,每個資料列。一個熱編碼是 1 的資料轉換技術,將類別值轉換成資料行,輸入類別的值所在的值。我也會限制在此情況下法國,來比較在個別的市場中的取用者行為的一個國家/地區,將資料集範圍。輸入並執行下列程式碼,若要這麼做 (請注意 basket_uk 資料框架中的儲存格輸出的圖形; 一種的熱編碼方式展開 4175 8 的資料行):

basket_fr = (df[df['Country']=="France"]
          .groupby(['InvoiceNo', 'Description'])['Quantity']
          .sum().unstack().reset_index().fillna(0)
          .set_index('InvoiceNo'))
basket_fr.head(10)

快速概覽結果會顯示我熱編碼的問題。第六個項目往下移其值為 24.0,第二個資料行中。我的用意是要有一個或零,以在資料中,不數量。因此,我需要找出任何非零值,並將它們轉換為 1。若要修正此問題,執行下列程式碼並注意 24.0,已轉換成 1:

def sum_to_boolean(x):
  if x<=0:
    return 0
  else:
    return 1
basket_fr_final = basket_fr.applymap(sum_to_boolean)
basket_fr_final.head(10)

我將使用 MLXTEND (rasbt.github.io/mlxtend) 若要進一步分析資料。MLXTEND 是 Python 程式庫的常見資料科學工作,包括購物籃分析有用的工具。若要安裝此程式庫從 notebook,執行下列程式碼:

! pip install mlxtend

已安裝 MLXTEND 套件,就可以開始從 MLXTEND,匯入相關的程式庫,就像這樣:

from mlxtend.frequent_patterns import association_rules
from mlxtend.frequent_patterns import apriori

在新的資料格中,輸入下列的程式碼,以檢視具有至少 %6 的項目集支援:

frequent_itemsets_fr = apriori(basket_fr_final, min_support = 0.06,
  use_colnames = True)
frequent_itemsets_fr.sort_values('support', ascending = False).head()

使用識別項目索引鍵集,我現在可以套用關聯的規則文件庫,來探索客戶的購買行為。輸入下列程式碼,並執行它:

a_rules = association_rules(frequent_itemsets_fr, metric = "lift",
  min_threshold = 1)
a_rules.sort_values('lift',ascending = False)

增益,依排序的結果看起來應該類似於**[圖 2**,顯示在網站上的法國客戶的購買模式。快速概覽結果會顯示購買 CHILDRENS 和餐具 SPACEBOY 客戶也購買 CHILDRENS 和餐具 DOLLY GIRL,和購買一種色彩中的警示時鐘的客戶也購買鬧鐘,在另一種色彩。只要移付諸行動的深入解析,我可能建議提供特定性別和餐具,套件組合提供優惠,以及提供多重色彩鬧鐘配套的站台擁有者。

法國客戶的關聯規則
[圖 2 法國客戶的關聯規則

不過,請注意,這份清單會依照原形移轉不相符項目。它可能不會加入新的套件組合或產品供應項目如果它不熱門程度足夠的意義。若要取得的熱門程度的這些和餐具項目是檢視,請輸入下列 Python 程式碼:

print( basket_fr_final['CHILDRENS CUTLERY SPACEBOY'].sum())
print( basket_fr_final['CHILDRENS CUTLERY DOLLY GIRL'].sum())

結果不大有可為;只有 SPACEBOY 和 28 DOLLY GIRL 27。使用極小的探索,找到的關聯規則與一些更多項承諾。開啟關聯的規則索引 50 (集合/20 RED RETROSPOT 紙張 NAPKINS) 是紅色的紙張 cup 和紅色紙張盤子前項。輸入下列程式碼,請參閱會在銷售單位數量:

basket_fr_final['SET/20 RED RETROSPOT PAPER NAPKINS'].sum()

低的數字時,它代表購買可處置的 cup 客戶想要比對文件盤子和 napkins 的原因。精通零售商可以輕鬆地將封裝到至誘使客戶購買的套件組合供應項目。

手快讀者會注意到產生的資料框架中有兩個其他計量:運用和定罪。這些是執行購物籃分析時所考量的其他值。可以找到相關的詳細資訊,藉由瀏覽所謂 「 替代的量值的 「 有趣 」。 」 Wikipedia 是實用的起點 (bit.ly/2AECRNh)。

當我的國家 (地區) 層級彙總資料,沒有比其他任何國家/地區的大幅更多發票來自英國的重新叫用。可能是多個無法檢查客戶行為的更多的原始資料可用來學習。讓我們來探索這藉由在新的儲存格中輸入下列程式碼,並執行它,就像這樣:

basket_uk = (df[df['Country']=="United Kingdom"]
          .groupby(['InvoiceNo', 'Description'])['Quantity']
          .sum().unstack().reset_index().fillna(0)
          .set_index('InvoiceNo'))
basket_final_uk = basket_uk.applymap(sum_to_boolean)
frequent_itemsets_uk = apriori(basket_final_de, min_support = 0.06,
  use_colnames = True)
a_rules_uk = association_rules(frequent_itemsets_uk, metric = "lift",
  min_threshold = 1)
a_rules_uk.sort_values('lift',ascending = False).head()

英國的執行時間會更長,因為較大的資料集。也請注意結果會大不相同。這可能是更多的資料變更分析或只是不同客戶的喜好設定,在不同的市場中的函式的結果嗎?或者,這可能是零售商,提供不同的產品,在不同的市場中銷售?這些是您必須了解當您完成您的分析的變數的類型。在此情況下,我們有一點點的內容,除了此線上零售店居住在英國。不過,在真實世界的專案中,向商務的主題專家的 engagement 是資料分析專案成功的重要項目。

總結

在本文中,我探討了使用購物籃分析,以發掘資料取用者的行為模式。購物籃分析所屬的親和性分析,哪些主要的公司使用,讓產品和串流平台上的更多時間花更多的錢的客戶較大的欄位。

購物籃分析人員和組織想要探索的資料科學,提供絕佳的進入點。障礙不足以數學技術。事實上,數學運算不超越簡單的除法和基本的機率理論。它是探索適用於初學者的簡單的問題空間,並提供將 AI 套用到企業的絕佳起點。話雖如此,不要不受騙而誤以為這不是功能強大的工具來進行資料科學,或顯示公司的領導的值。營收的影響會很可觀。


Frank La Vigne適用於在 Microsoft 擔任他能協助公司在 AI 技術解決方案專家來達到更充分運用他們的資料分析與 AI。他也共同主機何處播客。他的部落格定期位於 FranksWorld.com,您可以觀看他在他的 YouTube 頻道,"Frank 的世界電視 」 (FranksWorld.TV)。

非常感謝下列技術專家檢閱這篇文章:Andy Leonard (企業資料與分析)


MSDN Magazine 論壇中的這篇文章的討論