電商網站263萬筆購買資料之RFM用戶分群(Python)
本文選自2020年某電子產品電商網站,共263萬筆之購買資料進行用戶分析。在探索性資料分析(EDA)當中,我們發現三星與蘋果這兩大品牌分別以34%和30%的占了最大的市場份額。另外用戶的成交時間主要以上午9點到10點之間為最高峰。在RFM分析中,最重要的「重要價值客戶」僅僅佔10%,而最不重要的「一般挽留客戶」則佔了最大宗,達到43%。
RFM用戶分群
根據 Larry Lien( HubSpot 數位行銷專家)定義,RFM 分析的核心概念是以三個關鍵指標來衡量客戶的價值和忠誠度,分別是:
Recency : 最近一次購買
評估客戶最近一次購買的時間。較短的時間間隔意味著客戶目前與你的關係活躍。
Frequency : 購買頻率
計算客戶在特定時間範圍內的購買次數。購買次數越多,代表客戶對產品或服務的興趣和忠誠度越高。
Monetary : 消費金額
評估客戶在特定時間範圍內的總消費金額。消費金額越高,代表客戶的價值和財力狀況較好。
資料來源
Kaggle資料集: eCommerce purchase history from electronics store
此為2020 年 4 月到 2020 年 11 月間,來自一家大型家電和電子產品網店的購買數據,共263萬3520筆。欄位說明如下:
event_time
: 每位消費者當下消費時間order_id
: 訂單編號product_id
: 產品編號category_id
: 類別編號category_code
: 產品類別(包含平板、手機、筆電以及洗衣機、冰箱等家電,以及五金商品)brand
: 品牌名稱price
: 產品金額user_id
: 使用者編號,由於每位使用者可能不只買一次,所以並非唯一值
資料清洗
刪除重複值
df = df.drop_duplicates()
檢查缺失值
df.isna().sum()
可以觀察到有許多缺失值,尤其在重要的變數如UserID與購買金額的缺失值多,但RFM模型主要會利用該欄位進行用戶分層,無法用統計方法進行填充,因此刪除缺失值之資料。
df = df.dropna(subset = ['user_id','price','brand','category_code'])
檢查異常值
異常值多發生在日期與金額上,因此一併檢查。在此先用describe()函數掃過一遍,發現日期的最小值有"1970–01–01",屬於異常值必須刪除之。
df = df[df['event_time'].dt.year != 1970]
而產品的金額多半集中在$2000美元以下,亦有售價$8000~$10000的商品,然而該資料集包含家電如洗衣機、冰箱、洗碗機等,因此並不算異常值。
經資料清洗後,最後剩下41萬9390筆,共90780位消費者之購買資料進行分析。
探索式資料分析(EDA)
Q:前十大品牌銷售金額排名?
top_10_GMV = df.groupby('brand')['price'].sum().reset_index().sort_values('price', ascending = False).head(10)
2020年,三星(Samsung)以34%的銷售額佔比奪冠! 而第二名的蘋果(Apple)以30%的成績緊追在後。
Q:前十大產品類別銷售金額排名?
top_10_cate = df.groupby('category_code')['price'].sum().reset_index().sort_values('price', ascending = False).head(10)
智慧型手機以46%的銷售佔比穩居第一名! 而筆電僅佔16%落後第二名。
Q:用戶在哪個時段最活躍?
user_purchase_time_GMV = df.groupby(df['event_time'].dt.strftime('%H'))['price'].sum().reset_index()
橫軸代表一天24小時,可觀察到上午9點到上午10點這段時間是購買金額加總後的最高峰,非常有趣! 營運團隊或許可針對該時段推出限時促銷活動。
Q:用戶在哪些月份購買量最高?
主要集中在2020年的下半年,以2020年8月的$26M銷售金額為最高,這也是非常有趣的現象!
RFM模型建立
RFM模型有非常多種變化,有的模型會用四分位數來分類,因此客戶能被分為4³=64種。有的則分為5類,因此有125種組合。本文採用較直觀的二元分類法,即高於或小於平均值。因此客戶能被分為2³= 8種。RFM模型建立如下:
r = df_rfm.groupby('user_id')['days_up_to_now'].min().reset_index()
f = df_rfm.groupby('user_id')['order_id'].count().reset_index()
m = df_rfm.groupby('user_id')['price'].sum().reset_index()
rfm = r.merge(f, on='user_id').merge(m, on='user_id')
rfm.columns = ['user_id','R','F','M']
rfm
以上我們已經獲得了所有的R, F, M參數,將每個參數根據其均值進行二分類,大於均值則標記為1,小於均值則標記為0。
因此能將用戶分成八大類,其中重要價值客戶(R↑, F↑, M↑)也被稱為最佳客戶(Champions)。Cheers快樂工作人表示 :
"....該用戶能為企業帶來大量價值和貢獻,應持續以特別活動維繫關係。例如:週年慶時推出教練課折扣活動,或是包月會員享有每個月一次免費InBody體脂測量。"
而最低價值的一般挽留客戶(R↓, F↓, M↓):也被稱為冬眠客戶(Hibernating customers)。Cheers快樂工作人表示:
"...R、F、M三項指標皆偏低,表示這些客戶其實已經流失,對企業少有貢獻,需要展開針對性的客戶回流策略。
R (Recency : 最近一次購買)的分布圖:
大部分人最近一次購買在100天內較多,而200天以上反而較少。
F (Frequency : 購買頻率) 的分布圖:
2020年間,大部分人集中在5次內最多,或許是因為3C與家電、五金商品的特性,本身就不會讓人頻繁購買。
M (Monetary : 消費金額)的分布圖:
大部分人花的總金額集中在$500美元以下,極少數人能花到$50000美元以上,呈現相當明顯的右尾分配,這與我之前做過的醫療支出專案、黑五消費專案等的分配都非常接近。
最後將八大類用戶的分佈視覺化:
# 計算總數
total_count = rfm_dist['user_count'].sum()
# 計算百分比並新增到 DataFrame 中
rfm_dist['percentage'] = rfm_dist['user_count'] / total_count * 100
# 繪製條形圖
fig = px.bar(
rfm_dist,
x='user_type',
y='user_count',
text='percentage', # 使用 text 參數來顯示百分比
labels={'percentage': 'Percentage'}, # 設定標籤
color_discrete_sequence=['orange'],
title='RFM分析'
)
# 格式化百分比標籤
fig.update_traces(texttemplate='%{text:.2f}%', textposition='outside')
# 顯示圖表
fig.show()
可以觀察到價值低的「一般挽留客戶」佔比最高,達43%,而最高價值的「重要價值客戶」佔比僅僅為10%。
結論
- 三星與蘋果這兩大品牌,分別以34%和30%的占了最大的市場份額。
- 用戶的成交時間主要以上午9點到10點之間為最高峰。
- 「一般挽留客戶」佔43%為數最多 : 該用戶對企業少有貢獻,需要展開針對性的客戶回流策略,例如在促銷時發送通知,給予一定的優惠券即可,不需要額外的活動支持。
- 「重要價值客戶」佔10% : 可以看做VIP客戶,應提供更多的重點關注,傾斜更多資源並定期回訪。制定VIP一對一服務,例如享有免費的贈禮、客製化的問候等等。
- 「重要保持客戶」佔2%:這些客戶已成為企業的忠實客戶,但最近一次的購買時間比較久遠。應當主動寄發電子郵件,找出他們不再消費的原因,或是否在其他地方找到更好的選擇等等,做為日後持續改善的根據。又或者通過email推送打折與促銷訊息,藉此喚回該用戶。
- 「一般發展客戶」佔27% : 也被稱為新客戶(New customers),即最近剛開始購買產品或服務,尚未替企業帶來太多價值或貢獻,但這代表了網站有著不錯的拉新效果,可以頻繁發放優惠券刺激消費。
參考資料
- 范仕仰(2023),「如何找出你的VIP客群?RFM模型幫你做好分眾行銷的第一步」, Cheers快樂工作人
- Larry Lien(2024), 「RFM 模型這樣用 (Recency、Frequency、Monetary):客戶真實價值的關鍵密碼」, Learning Hub
- Ron Kohavi(2004), "Visualizing RFM Segmentation", Stanford Artificial Intelligence Laboratory