掃二維碼與項(xiàng)目經(jīng)理溝通
我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
本文從RFM模型概念入手,結(jié)合實(shí)際案例,詳解Python實(shí)現(xiàn)模型的每一步操作,并提供案例同款源數(shù)據(jù),以供同學(xué)們知行合一。

創(chuàng)新互聯(lián)建站是一家專業(yè)提供柳江企業(yè)網(wǎng)站建設(shè),專注與成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、H5建站、小程序制作等業(yè)務(wù)。10年已為柳江眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計(jì)公司優(yōu)惠進(jìn)行中。
注:想直接下載代碼和數(shù)據(jù)的同學(xué)可以空降文末
看這篇文章前源數(shù)據(jù)長這樣:
學(xué)完后只要敲一個(gè)回車,源數(shù)據(jù)就變成了這樣:
是不是心動(dòng)了?OK,閑話少敘,我們來開動(dòng)正餐!
RFM,是一種經(jīng)典到頭皮發(fā)麻的用戶分類、價(jià)值分析模型,同時(shí),這個(gè)模型以直白著稱,直白到把需要的字段寫在了臉上,讓我們再念一遍:“R!F!M!”:
這三個(gè)維度,是RFM模型的精髓所在,幫助我們把混雜一體的客戶數(shù)據(jù)分成標(biāo)準(zhǔn)的8類,然后根據(jù)每一類用戶人數(shù)占比、金額貢獻(xiàn)等不同的特征,進(jìn)行人、貨、場三重匹配的精細(xì)化運(yùn)營。
用Python建立RFM模型,整體建模思路分為五步,一言蔽之——“五步在手,模型你有”,分別是數(shù)據(jù)概覽、數(shù)據(jù)清洗、維度打分、分值計(jì)算和客戶分層。
01 數(shù)據(jù)概覽
我們的源數(shù)據(jù)是訂單表,記錄著用戶交易相關(guān)的字段:
有個(gè)細(xì)節(jié)需要注意,訂單每一行代表著單個(gè)用戶的單次購買行為,什么意思呢?如果一個(gè)用戶在一天內(nèi)購買了4次,訂單表對應(yīng)記錄著4行,而在實(shí)際的業(yè)務(wù)場景中,一個(gè)用戶在一天內(nèi)的多次消費(fèi)行為,應(yīng)該從整體上看作一次。
比如,我今天10點(diǎn)在必勝客天貓店買了個(gè)披薩兌換券,11點(diǎn)又下單了飲料兌換券,18點(diǎn)看到優(yōu)惠又買了兩個(gè)冰淇淋兌換券。這一天內(nèi)雖然我下單了3次,但最終這些兌換券我會一次消費(fèi)掉,應(yīng)該只算做一次完整的消費(fèi)行為,這個(gè)邏輯會指導(dǎo)后面F值的計(jì)算。
我們發(fā)現(xiàn)在訂單狀態(tài)中,除了交易成功的,還有用戶退款導(dǎo)致交易關(guān)閉的,那還包括其他狀態(tài)嗎?Let me see see:
只有這兩種狀態(tài),其中退款訂單對于我們模型價(jià)值不大,需要在后續(xù)清洗中剔除。
接著再觀察數(shù)據(jù)的類型和缺失情況:
訂單一共28833行,沒有任何缺失值,Nice!類型方面,付款日期是時(shí)間格式,實(shí)付金額、郵費(fèi)和購買數(shù)量是數(shù)值型,其他均為字符串類型。
02 數(shù)據(jù)清洗
剔除退款
在觀察階段,我們明確了第一個(gè)清洗的目標(biāo),就是剔除退款數(shù)據(jù):
關(guān)鍵字段提取
剔除之后,覺得我們訂單的字段還是有點(diǎn)多,而RFM模型只需要買家昵稱,付款時(shí)間和實(shí)付金額這3個(gè)關(guān)鍵字段,所以提取之:
關(guān)鍵字段構(gòu)造
上面的基礎(chǔ)清洗告一段落,這一步關(guān)鍵在于構(gòu)建模型所需的三個(gè)字段:R(最近一次購買距今多少天),F(xiàn)(購買了多少次)以及M(平均或者累計(jì)購買金額)。
首先是R值,即每個(gè)用戶最后一次購買時(shí)間距今多少天。如果用戶只下單過一次,用現(xiàn)在的日期減去付款日期即可;若是用戶多次下單,需先篩選出這個(gè)用戶最后一次付款的時(shí)間,再用今天減去它。
需要提醒的是,時(shí)間洪流越滾越兇,對應(yīng)在時(shí)間格式中,就是距離今天越近,時(shí)間也就越“大”,舉個(gè)例子,2019年9月9日是要大于2019年9月1日的:
因此,要拿到所有用戶最近一次付款時(shí)間,只需要按買家昵稱分組,再選取付款日期的最大值即可:
為了得到最終的R值,用今天減去每位用戶最近一次付款時(shí)間,就得到R值了,這份訂單是7月1日生成的,所以這里我們把“2019-7-1”當(dāng)作“今天”:
接著來搞定F值,即每個(gè)用戶累計(jì)購買頻次。
在前面數(shù)據(jù)概覽階段,我們明確了“把單個(gè)用戶一天內(nèi)多次下單行為看作整體一次”的思路,所以,引入一個(gè)精確到天的日期標(biāo)簽,依照“買家昵稱”和“日期標(biāo)簽”進(jìn)行分組,把每個(gè)用戶一天內(nèi)的多次下單行為合并,再統(tǒng)計(jì)購買次數(shù):
上一步計(jì)算出了每個(gè)用戶購買頻次,這里我們只需要得到每個(gè)用戶總金額,再用總金額除以購買頻次,就能拿到用戶平均支付金額:
最后,萬劍歸宗,三個(gè)指標(biāo)合并:
至此,我們完成了模型核心指標(biāo)的計(jì)算,算是打掃干凈了屋子再請客。
03 維度打分
維度確認(rèn)的核心是分值確定,按照設(shè)定的標(biāo)準(zhǔn),我們給每個(gè)消費(fèi)者的R/F/M值打分,分值的大小取決于我們的偏好,即我們越喜歡的行為,打的分?jǐn)?shù)就越高:
以R值為例,R代表了用戶有多少天沒來下單,這個(gè)值越大,用戶流失的可能性越大,我們當(dāng)然不希望用戶流失,所以R越大,分值越小。
F值代表了用戶購買頻次,M值則是用戶平均支付金額,這兩個(gè)指標(biāo)是越大越好,即數(shù)值越大,得分越高。
RFM模型中打分一般采取5分制,有兩種比較常見的方式,一種是按照數(shù)據(jù)的分位數(shù)來打分,另一種是依據(jù)數(shù)據(jù)和業(yè)務(wù)的理解,進(jìn)行分值的劃分。這里希望同學(xué)們加深對數(shù)據(jù)的理解,進(jìn)行自己的分值設(shè)置,所以講述過程中使用的是第二種,即提前制定好不同數(shù)值對應(yīng)的分值。
R值根據(jù)行業(yè)經(jīng)驗(yàn),設(shè)置為30天一個(gè)跨度,區(qū)間左閉右開:
F值和購買頻次掛鉤,每多一次購買,分值就多加一分:
我們可以先對M值做個(gè)簡單的區(qū)間統(tǒng)計(jì),然后分組,這里我們按照50元的一個(gè)區(qū)間來進(jìn)行劃分:
這一步我們確定了一個(gè)打分框架,每一位用戶的每個(gè)指標(biāo),都有了與之對應(yīng)的分值。
04 分值計(jì)算
分值的劃分邏輯已經(jīng)確定,看著好像有點(diǎn)麻煩。下面我們有請潘大師(Pandas)登場,且看他如何三拳兩腳就搞定這麻煩的分組邏輯,先拿R值打個(gè)樣:
滄海橫流,方顯潘大師本色,短短一行代碼就搞定了5個(gè)層級的打分。Pandas的cut函數(shù),我們復(fù)習(xí)一下:
接著,F(xiàn)和M值就十分容易了,按照我們設(shè)置的值切分就好:
第一輪打分已經(jīng)完成,下面進(jìn)入第二輪打分環(huán)節(jié)。
客官不要緊臟,面試都還不止兩輪呢,倫家RFM模型哪有那么隨便的。
現(xiàn)在R-SCORE、F-SCORE、M-SCORE在1-5幾個(gè)數(shù)之間,如果把3個(gè)值進(jìn)行組合,像111,112,113...這樣可以組合出125種結(jié)果,過多的分類和不分類本質(zhì)是一樣的。所以,我們通過判斷每個(gè)客戶的R、F、M值是否大于平均值,來簡化分類結(jié)果。
因?yàn)槊總€(gè)客戶和平均值對比后的R、F、M,只有0和1(0表示小于平均值,1表示大于平均值)兩種結(jié)果,整體組合下來共有8個(gè)分組,是比較合理的一個(gè)情況。我們來判斷用戶的每個(gè)分值是否大于平均值:
Python中判斷后返回的結(jié)果是True和False,對應(yīng)著數(shù)值1和0,只要把這個(gè)布爾結(jié)果乘上1,True就變成了1,F(xiàn)alse變成了0,處理之后更加易讀。
05 客戶分層
回顧一下前幾步操作,清洗完之后我們確定了打分邏輯,然后分別計(jì)算每個(gè)用戶的R、F、M分值(SCORE),隨后,用分值和對應(yīng)的平均值進(jìn)行對比,得到了是否大于均值的三列結(jié)果。至此,建模所需的所有數(shù)據(jù)已經(jīng)準(zhǔn)備就緒,剩下的就是客戶分層了。
RFM經(jīng)典的分層會按照R/F/M每一項(xiàng)指標(biāo)是否高于平均值,把用戶劃分為8類,我們總結(jié)了一下,具體像下面表格這樣:
由于傳統(tǒng)的分類,部分名稱有些擰巴,像大多數(shù)分類前都冠以“重要”,“潛力”和“深耕”到底有什么區(qū)別?“喚回”和“挽回”有什么不一樣?
本著清晰至上原則,我們對原來的名稱做了適當(dāng)?shù)母倪M(jìn)。強(qiáng)調(diào)了潛力是針對消費(fèi)(平均支付金額),深耕是為了提升消費(fèi)頻次,以及重要喚回客戶其實(shí)和重要價(jià)值客戶非常相似,只是最近沒有回購了而已,應(yīng)該做流失預(yù)警等等。這里只是拋磚引玉,提供一個(gè)思路,總之,一切都是為了更易理解。
對于每一類客戶的特征,我們也做了簡單的詮釋,比如重要價(jià)值客戶,就是最近購買我們的產(chǎn)品,且在整個(gè)消費(fèi)生命周期中購買頻次較高,平均每次支付金額也高。其他的分類也是一樣邏輯,可以結(jié)合詮釋來強(qiáng)化理解。下面,我們就用Python來實(shí)現(xiàn)這一分類。
先引入一個(gè)人群數(shù)值的輔助列,把之前判斷的R\F\M是否大于均值的三個(gè)值給串聯(lián)起來:
人群數(shù)值是數(shù)值類型,所以位于前面的0就自動(dòng)略過,比如1代表著“001”的高消費(fèi)喚回客戶人群,10對應(yīng)著“010”的一般客戶。
為了得到最終人群標(biāo)簽,再定義一個(gè)判斷函數(shù),通過判斷人群數(shù)值的值,來返回對應(yīng)的分類標(biāo)簽:
最后把標(biāo)簽分類函數(shù)應(yīng)用到人群數(shù)值列:
客戶分類工作的完成,宣告著RFM模型建模的結(jié)束,每一位客戶都有了屬于自己的RFM標(biāo)簽。
RFM模型結(jié)果分析
其實(shí)到上一步,已經(jīng)走完了整個(gè)建模流程,但是呢,一切模型結(jié)果最終都要服務(wù)于業(yè)務(wù),所以,最后我們基于現(xiàn)有模型結(jié)果做一些拓展、探索性分析。
查看各類用戶占比情況:
探究不同類型客戶消費(fèi)金額貢獻(xiàn)占比:
結(jié)果可視化之(可視化代碼留給大家自行嘗試):
從上面結(jié)果,我們可以快速得到一些推斷:
再結(jié)合金額進(jìn)行分析:
至此,我們基于訂單源數(shù)據(jù),按照五步法用Python完成了RFM模型的建立,并對結(jié)果進(jìn)行了簡單的分析。最后,只要把上述代碼封裝成函數(shù),對于新的數(shù)據(jù)源,只要一個(gè)回車就能夠擼出模型,So Easy!
整個(gè)案例、數(shù)據(jù)和完整代碼精心花了N周的時(shí)間準(zhǔn)備,覺得有用的旁友動(dòng)動(dòng)小手來一波評論 or 在看吧~

我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流