實打實購物籃分析! 使用因素分析(Factor Analysis)找出顧客消費組合

產品應用顧問Andy
8 min readDec 27, 2022

--

每個人在購物消費的時候,一定都有習慣的消費組合,找出那些消費組合就能主動挖掘潛在需求,並透過推薦、交叉銷售等策略來擴大消費者購買金額。

購物籃分析(Market Basket Analysis),泛指根據交易紀錄探索產品關聯性的所有方法。今天介紹用探索性因素分析(Exploratory Factor Analysis)來找出前幾名的購物籃組合。

資料準備

這次分析,專注在女性消費者的消費紀錄上。在分析購物籃之前,最好可以根據幾個購買角色,如家庭主婦、單身女性、男性、學生等等先進行分群,以免太多雜訊影響消費的關聯性。

將消費紀錄整合成每位客戶,在觀察期間內各消費的消費次數,如果有經常在一起消費的購物紀錄的話,就比較容易形成購物籃。

探索性因素分析

因素分析的概念與主成分分析(PCA)很相似,差別在於主成分分析是以資料變異最大的方向將多維數遽降至少數幾維;因素分析則是以資料之間的關聯性將資料降至特定數量的維度,例如10個欄位的資料降至3個欄位,並以係數的方式呈現這10個欄位在3個欄位中的關聯性。

以購物籃的概念來解釋,商場上有1000種商品,這麼多的商品到了收銀台中收銀員發現大家固定會將食物種類一起購買、家具類一起購買、文具類一起購買,這時侯就可以將1000種產品縮減為3個購物籃,在促銷時就可以針對購物籃中某一商品促銷,帶動其餘商品的買氣。

挑選因子個數

在做因素分析前需要先設定目標的因子數量,設定的方式可依每因子的特徵值(Eigenvalue)設定。特徵值的意思簡單來說就是解釋變異量,大家把它想成購物籃中如果只有一個商品那就失去購物籃的意義了對吧,所以我們只需挑選特徵值大於1的因子數量即可。另外,特徵值越大表示此因子越能解釋資料的相關性程度,意思就是此購物籃出現的頻率越多次,越能相信此消費組合是客戶偏好的組合,特徵值就會越大

以下程式可以快速產出12個因子與特徵值,選擇4個因子做購物籃分析。

import pandas as pd
import matplotlib.pyplot as plt
from factor_analyzer import FactorAnalyzer

data = pd.read_csv("購物籃ver1.csv")
data = data.drop(columns="刷卡日期 年/月/日")

data.columns = ["Education_fee", "Insurance", "Donation", "Public", "Grocery", "Quality goods", "Food",
"Pharmacy", "Consumer Electronic", "SuperMarket", "Transportation", "Travel", "Casual", "Other"]

print(data.head())
fa = FactorAnalyzer(12, rotation="varimax") #依據資料有幾個欄位設定
fa.fit(data)

ev, v = fa.get_eigenvalues()


plt.scatter(range(1, data.shape[1]+1), ev)
plt.plot(range(1, data.shape[1]+1), ev)
plt.title('Scree Plot')
plt.xlabel('Factors')
plt.ylabel('Eigenvalue')
plt.grid()
plt.show()
選擇特徵值(eigenvalue)大於1的因子個數

因素分析

決定好購物籃個數後,就可以直接跑因素分析,以下程式碼可以直接套用。跑完後,用熱力圖(heatmap)來觀察一下每個因子(購物籃)所代表的含意

import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from factor_analyzer import FactorAnalyzer

data = pd.read_csv("購物籃ver1.csv")
data = data.drop(columns="刷卡日期 年/月/日")

data.columns = ["Education_fee", "Insurance", "Donation", "Public", "Grocery", "Quality goods", "Food",
"Pharmacy", "Consumer Electronic", "SuperMarket", "Transportation", "Travel", "Casual", "Other"]

print(data.head())

fa = FactorAnalyzer(4, rotation="varimax") #因子個數
fa.fit(data)


df_cm = pd.DataFrame(np.abs(fa.loadings_), index=data.columns)
fig, ax = plt.subplots(figsize=(12, 10))

sns.heatmap(df_cm, ax=ax, annot=True, cmap='BuPu')
ax.tick_params(axis='x', labelsize=15)
ax.set_title("Factor Analysis", fontsize=12)
ax.set_ylabel("consume_type")
plt.show()

X軸代表4個購物籃,Y軸代表原始的商品或消費的服務。從第一個購物籃可以看到精品消費(Quality goods)、食物(Food)、休閒消費(Casual)三個消費係數最高,應為代表休假出遊時的購物消費;第二個購物籃為百貨購物(Grocery)、量販(SuperMarket)、交通(Transportation)係數最高,應為家庭購物消費;第三個購物籃為藥妝(Pharmacy)、交通(Transportation);第四個購物籃為其它(Other)、居家電信(Consumer Eletronic)。

結合上一張Scree Plot,這四個購物籃的強度是依照特徵值大小排序的,代表女性更傾向以信用卡進行精品休閒消費與量販購物消費,較不傾向進行藥妝消費與居家電信消費,在進行購物籃推薦時建議以前兩名購物欄進行推薦效果會更顯著。

購物籃強度

每個購物籃皆為不同消費的組合,因此我們可以將原始的消費數據精簡至購物籃的強度分數,強度分數為標準化後的數據(0表示平均水準),越高表示此客戶越偏好此購物籃的消費組合,以下程式碼可將轉換後的購物籃強度分數與原始消費數據做一個比較。

factor = pd.DataFrame(fa.transform(df))
df["客戶"] = data["客戶id"]

final_data = pd.concat([df, factor], axis=1, ignore_index=True)

final_data.columns = ["Insurance", "Public", "Grocery", "Quality goods", "Food",
"Pharmacy", "Consumer Electronic", "SuperMarket", "Transportation", "Travel", "Casual", "Other", "客戶", "購物籃0", "購物籃1", "購物籃2", "購物籃3"]
print(final_data.head())

final_data.to_csv("轉換後.csv")

偏好精品、食物、休閒客戶

將第一個購物籃強度分數由高排至低,並列出高於平均水準的客戶。可以看到的確前幾名客戶在精品、休閒、食物的消費次數遙遙領先

偏好百貨、量販、交通客戶

小結

購物籃分析的理論方法有很多種,此提供依據商品服務相關性進行數據降維的方法。另外有根據客戶相似性進行推薦、Apriori演算法等等購物籃分析方法。在分析完後還是要根據資料的市場區隔評估結果是否恰當,能解釋得通,並回到資料面反覆檢查,才不會出現不合邏輯的結果。

若喜歡以上內容再幫忙按個拍手、追蹤,我會持續更新相關內容,感謝!

延伸閱讀

分析消費者行為,找出利基市場!用K-means進行市場區隔(STP)分析

如何得知品牌定位?以品牌知覺定位圖視覺化消費者內心

用Power BI建立即時資料串流視覺化/即時監控看板!

聯絡方式

信箱:skps30808@gmail.com

Line:260391760

IG:cfp_andy

--

--

產品應用顧問Andy

台大國企系畢業,目前擔任AI產品應用顧問。分享領域AI應用與資料故事、視覺化方法。希望能帶給大家簡單易學的工具與分析方法應用在自身工作領域中。