原來用Python實作行銷RFM model,可以那麼簡單!-【附Python程式碼】
本文以Python為主要語言進行RFM實作。在開始程式編輯之前,就讓我們來解析資料內容。
資料欄位
RFM存在至今已過半百,為何大家仍想要引進呢?
因為RFM只需要基本的銷售資料,就能做出強大的顧客分群,等同於市場區隔(Segmentation),且邏輯清晰明瞭。一般的CRM資料一定有有購買者ID、銷售ID、購買時間、購買金額,這麼少的欄位若要進行機器學習其實誤差值是非常大的,這時候RFM就派上用場了,因此本按例就預設以最少的資料欄位進行分析。
以下資料為單一顧客的購買數據(圖2),是一般銷售數據經過整理後所得的,欄位recency、frequency、recency_cate、frequency_cate是利用orderdate計算出來的,因此嚴格來說這筆資料只有三個欄位,竟然就能做出RFM!
- clientId:顧客編號。
- orderdate:顧客最後一次來購買的日期
- recency(近因):上一次購買與今天相差天數。
- gender:性別。人口變數資料,有的話更能細部分析顧客類群。
- frequency(頻率):從顧客第一次來開始,到目前共來過幾次。
- recency_cate:近因天數。
- frequency_cate:頻率天數。
- 購買量:該顧客的總購買量。
在開始實作之前,您必須要學會
Python中文顯示
範例資料中含有中文,而Python繪圖並不支援中文字。您可以參考先前文章「解決Python 3 Matplotlib與Seaborn視覺化套件中文顯示問題」,否則若您的資料或圖表中有中文,會出現如圖3情況。當然若要將其資料全部換為英文的話也可輸出,但基於一般在華人區域的CRM資料難免有中文出現,因此建議進行此修改。
FacetGrid繪圖
這是此實作最重要的基礎來源。FacetGrid是Seaborn繪圖套件下的一個繪圖類別,其與一般圖表的差異在於,能夠集合多張圖表於一身,進行多為度的比較,而這正符合三個、甚至多個維度的RFM分析,且配色精美,詳請可見官方文件。
可以先複製以下的程式碼進行試驗,利用官方提供的資料集(圖5),了解其繪圖的原理。其中可以看到FacetGrid的使用方法,分為整體圖與小圖,FacetGrid方法控制整張圖的資料來源、內容,而小圖譬如說如圖4的左邊一塊,其中的長條圖、顏色、標籤等,利用FacetGrid繪圖主要會分成這兩塊。
整體圖:sns.FacetGrid(資料來源, col=想分析欄位)
小圖:map(小圖表示方式, 小圖示名稱)
import matplotlib.pyplot as plt
import seaborn as snsthetips= sns.load_dataset("tips")
g = sns.FacetGrid(thetips, col="time")
g.map(plt.hist, "tip")
用Python實作RFM
基於以上的基礎,並以FacetGrid的特性,開發出6 X 6的RFM Model。最主要的兩個欄位是recency_cate與frequency_cate,分別控制資料在RFM圖形中的位置,因此只要資料調整到定位,可以簡單利用FacetGrid產出圖片。
比較需要注意的地方在於row_order的參數是給予frequency_label[::-1],這意思是將陣列frequency_label相反輸出,其原因在於FacetGrid的圖形排列是由左上角開始排列的,對應到frequency的「>5 freq」,因此必須將整個鎮列倒著放。
recency_label = ['0-7 day', '8-15 day', '16-22 day', '23-30 day', '31-55 day', '>55 day']frequency_label = ['1 freq', '2 freq', '3 freq', '4 freq', '5 freq', '>5 freq']g = sns.FacetGrid(purchase_list, # 來源資料表
col="recency_cate", # X資料來源欄位
row="frequency_cate" , # Y資料來源欄位
col_order= recency_label, # X資料順序
row_order= frequency_label[::-1], # Y資料順序
margin_titles=True
)#小圖表部分
小圖示中是以gender(性別)來作為分類,此能依照您不同的資料欄位調整,但建議該欄位的項目不要太多,否則會造成視覺的凌亂,反而失去了RFM Model一目瞭然的意義。
在此範例中只有gender是人口變數,若您的資料有更多相關變數(例如:地址、學歷、家庭等),RFM的分析將會更有意思。
g = g.map_dataframe(sns.barplot, # 資料顯示的模式
x= 'gender', # 小圖表X資料來源
y ='購買量', # 小圖表Y資料來源
palette = sns.color_palette("muted")) #畫布色調g = g.set_axis_labels('光顧天數','購買頻率').add_legend()
作者:楊超霆(臺灣行銷研究有限公司 資深資料科學家)
更多實戰案例及情境好文推薦
消費者跟你想的都不一樣!解析品牌在消費者心中的真實定位!(Python程式碼)
消費者跟你想的都不一樣!解析品牌在消費者心中的真實定位!(Python程式碼) 企業每年都會訂定本年度的行銷策略與品牌定位。引導後續所有行銷
FB 爬蟲可以更簡單-用Selenium自動登入FB-系列1(附Python程式碼)
FB 爬蟲可以更簡單-用Selenium自動登入FB-系列1(附Python程式碼) 歡迎來到Selenium facebook爬蟲系列的第
還在手動上字幕? Python 幫您完成「自動化上字幕」 - 案例分享(附Python程式碼)
還在手動上字幕? Python 幫您完成「自動化上字幕」 - 案例分享(附Python程式碼) 在這AI爆炸的時代,似乎什麼都要來AI一下,