RFM顧客分類模型實戰教學【附Python程式碼】

👉【行銷搬進大程式】給您更多實用文章與免費教學影片,附贈Python程式碼!

RFM顧客分類模型實戰教學【附Python程式碼】

便利商店、超市、量販店畫出來的RFM一樣嗎?

自從寫完「原來用Python實作行銷RFM model,可以那麼簡單!-【附Python程式碼】」這篇文章後,有不少朋友問我:「所以RFM切割的依據是什麼?」,以前我總是回答「要看產業」、「你應該比我了解」、「大概抓一個區間」。後來我想想,以資料科學的角度,決策必須有憑有據,不能全靠直覺判斷,因此本篇文章,將以科學的角度,告訴您「怎麼切割RFM比較好」

切割RFM資料也是一門藝術,絕對不可能是平均的切割,因為每個不同的產業,所對應的顧客購買間隔是不同的,甚至同一群顧客。由於每個顧客有自己的購買時間軸,如何精準的找到每一類顧客,購買時間的分水嶺,是我們今天要解惑的議題。

您可能要先知道RFM基本實做:

Python:
「原來用Python實作行銷RFM model,可以那麼簡單!-【附Python程式碼】」

R語言:
「常貴客?新客? 讓RFM模型簡簡單單解釋一切!(附實現程式碼)」

三種零售業差距

在進行切割前,必須先了解,您的商店有什麼特性,就算是零售業也大不同。以下圖一為例,請問便利商店、超市、量販店有什麼不同?用賣的商品來區分,肯定很難區分。而您也很常看到某間量販店的旁邊,還有兩三間便利超商(在台北更常見),如果他們沒有不同,早就互相競爭而倒閉了。

要從「解決消費者需求」的角度出發:
便利商店:解決即時所需。
超市:解決一日所需。
量販店:解決一週所需。

由此可知,本質上三種零售商店的顧客購買頻率就有很大的差別,因此若都以固定的切割模式,或時間軸來繪製RFM,是非常不合理的。就從統計學的角度來決定切割吧!

切割原理

切割的原理,其實是利用簡單的統計參數,作為切割的依據。我們會計算出每個顧客每次購買時的間隔,把這些間隔的時間做統計分析,將算出的百分位距來作為切割的依據。


盒狀圖

如上圖所示,假設要將RFM資料切分成4份,那就依照消費者的購買間隔天數,找到25百分位、50百分位、75百分位,作為切割的標準。為何要以此來區分呢?因為這符合RFM的設計原理,依照消費者的購買頻率來觀測收入,又能體現RFM無法觀測到的:流失客問題,可能該顧客很久以前是常貴客,但它其實它現在已經換了別間店消費,在分析上該顧客會變成常貴客。

經由百分位切割的結果

Python實做

完整程式碼畫面

首先利用pivot_table方法,計算出每個消費者,每次消費時,分別購買幾樣商品。另一方面,也可以順便統整該名消費者,到底來消費幾次。

orders['values'] = 1
 purchase_list = orders.pivot_table(
            index=['clientId','gender','orderdate'], #分類條件
            columns='product', # 目的欄位
            aggfunc=sum, # 計算方式,max, min, mean, sum, len
            values='values' #根據欄位
            ).fillna(0).reset_index()
執行完成pivot_table後結果

因為資料的時間是2017年,因此我們以資料最近的那天(2017/4/17)作為分析的基準日期,以就是以那天來進行相減,算出RFM中所需要的recency。

#設定今天的日期為最近一位顧客購買的日期,從那天來看過往的銷售狀況
 theToday = datetime.datetime.strptime(orders['orderdate'].max(), “%Y-%m-%d”)# 將購買清單資料中'orderdate'的欄位,全部轉換成datetime格式
 purchase_list['orderdate'] = pd.to_datetime(purchase_list['orderdate'])# 計算消費者至今再次購買與上次購買產品的時間差'
 purchase_list['recency'] =( theToday — purchase_list['orderdate'] ).astype(str)# 將'recency'欄位中的days去除
 purchase_list['recency'] = purchase_list['recency'].str.replace('days.*', #想取代的東西
                                      '', #取代成的東西
                                      regex = True)
 將'recency'欄位全部轉換成int
 purchase_list['recency'] = purchase_list['recency'].astype(int)

最後用pandas套件方法groupby,其中的diff()方法,它能幫我們計算每筆資料的數值間隔。

purchase_list['interval'] = purchase_list.groupby(
                               “clientId”, #分類條件
                               as_index = True # 分類條件是否要取代Index
                               )['orderdate'].diff()purchase_list.dropna(inplace = True)#刪除第一次來本店的資料
 purchase_list['interval'] = purchase_list['interval'].astype(str) # 將時間資料轉成字串
 purchase_list['interval'] = purchase_list['interval'].str.replace('days.*', '').astype(int) #將欄位中的days去除
間隔計算完成

到這裡所需的資料都完成了,接下來就是利用統計分析,看看消費者間隔天數(interval)的資料差異如何。可以利用pandas套件的describe()方法,列出interval欄位的總數(count)、平均(mean)、標準差(std)、最小值(min)、25百分位(25%)、50百分位(50%)、75百分位(75%)、最大值(max)。

describe方法執行結果

下圖的結果可以發現,間隔平均只有19.45天,但間隔最久的顧客甚至到達89天,由此資料繪製程圖7的圖形,可以發現整個資料大的非常極端,但其實這些資料在RFM中應該可以全部匯集成一個區塊消費者,因為這些消費者數量不多。

將interval欄位畫成盒狀圖

獲取百分位數必須使用quantile方法,在參數中以陣列輸入想要的百分位即可。例如輸入[0.25, 0.5, 0.75],就會得到結果6、14、27。因此若要將RFM切割成四等分,就能以以上三個數字做切割。

quantile執行範例
purchase_list['interval'].quantile([0.25, 0.5, 0.75])

我們以往的RFM切割,都是切成6X6,因此這裡將其區分成6份,因為切分成6份會無法整除,因此大概以16百分位為級距。最後得結果4、9、14、21、35。

purchase_list['interval'].quantile([0.16, 0.32, 0.5, 0.66, 0.82])
切割6X6依據天數

管理意含

數據可在舟,亦能覆舟

有依據的切割後結果,與前者做比較。可以發現,最明顯的差距是量販客的部份。因為量販客是最難區隔出來的客群,因為要同時符合高frequency與recency的條件,若有一邊的條件設定不佳,都會導致量販客會有空洞(如圖11 左半部)。

如果您是老闆或高階主管,在屬下向您報告RFM分析結果時,必須問他切割的依據。經由這項調整後,會發現這間門市的量販客其實也不少;因此整個切割的小變化,會引導整個決策的風向。

調整結果前後比較

下載完整程式碼-請點我


👉想看更多Python實作教學影片【免費】👈

📌Python基礎課程

📌Line Bot 聊天機器人

📌行銷人轉職爬蟲王實戰|5大社群+2大電商

📌Telegram Bot 聊天機器人

📌實用工具

▶ 點此:https://marketingliveincode.com/

查看更多Python工具技巧、商業分析、教學影片

滿意我們餐點嗎?給點 Claps 吧👏👏

1. 我學習到了新的概念與工具 1–10+

2. 我理解了這篇內容所講述的工具與技巧 20–30+

3. 我可以將這篇的內容運用到學習和工作上20–30+

作者:楊超霆(行銷搬進大程式 創辦人)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容