復(fù)購(gòu)分析實(shí)戰(zhàn) | Pandas遇到了大難題..(附40000+數(shù)據(jù)源和代碼)
在電商等消費(fèi)場(chǎng)景下,復(fù)購(gòu)率是最耳熟能詳?shù)闹笜?biāo)之一了。上到平臺(tái)、下到品牌、店鋪,各種復(fù)盤(pán)分析一定繞不開(kāi)復(fù)購(gòu)率,今天我們就從實(shí)戰(zhàn)的角度聊聊復(fù)購(gòu)率。
本文是Pandas實(shí)戰(zhàn)系列的番外篇,特意總結(jié)的案例,對(duì)于pandas操作是一個(gè)很大的考驗(yàn)。
食用建議:略硬略干,建議食用前先喝杯水
初識(shí)復(fù)購(gòu)率
實(shí)際業(yè)務(wù)經(jīng)常會(huì)遇到以下場(chǎng)景:
“哈,我們的復(fù)購(gòu)率同比/環(huán)比提升了XXX!”臺(tái)下一片欣然..
“哎,近XX時(shí)間復(fù)購(gòu)率有明顯下降趨勢(shì)”Boss臉色變得難看...
我們發(fā)現(xiàn),復(fù)購(gòu)率的討論很容易陷入雞同鴨講,明面上都在說(shuō)復(fù)購(gòu)率,但實(shí)際連指標(biāo)計(jì)算邏輯都是不同的:
有留存角度的,A時(shí)間段購(gòu)買(mǎi)人數(shù),在其后B時(shí)間段重復(fù)購(gòu)買(mǎi)人數(shù)占比
有客戶生命周期角度的,A時(shí)間段購(gòu)買(mǎi)人數(shù),在整個(gè)生命周期中,重復(fù)購(gòu)買(mǎi)人數(shù)占比
有截?cái)嘟嵌鹊?,A時(shí)間(這個(gè)時(shí)間一般比較長(zhǎng))段購(gòu)買(mǎi)人數(shù),在A時(shí)間段重復(fù)購(gòu)買(mǎi)人數(shù)的占比
還有自定義角度的....
各種眼花繚亂的復(fù)購(gòu)計(jì)算方法,及其延伸的復(fù)購(gòu)分析體系,以后會(huì)詳細(xì)展開(kāi)講解。這次,我們先以一種計(jì)算邏輯切入,搞清楚如何用Pandas計(jì)算客戶復(fù)購(gòu)率。
復(fù)購(gòu)率計(jì)算
本文采用一種比較簡(jiǎn)單,但非??简?yàn)Pandas技巧的口徑來(lái)定義(可能是一些同學(xué)用pandas遇到的最大挑戰(zhàn))
復(fù)購(gòu)率:一段時(shí)期內(nèi),購(gòu)買(mǎi)兩次及以上的客戶占總?cè)藬?shù)的比重
比如最近半年,有10000個(gè)客戶購(gòu)買(mǎi)我們的產(chǎn)品,在這半年內(nèi),有1000個(gè)客戶重復(fù)購(gòu)買(mǎi)(購(gòu)買(mǎi)2次及以上),那半年期復(fù)購(gòu)率就是1000 / 10000 = 10%
有同學(xué)會(huì)說(shuō)“訂單去重之后,按照客戶ID來(lái)groupby一下不就行了,有啥好講的!”
Too young too simple~
一般拿到的訂單是產(chǎn)品維度的,像這樣:

一個(gè)客戶同時(shí)購(gòu)買(mǎi)了A、B、C三款產(chǎn)品,后臺(tái)會(huì)生成三筆產(chǎn)品訂單,如果直接按照ID來(lái)分組統(tǒng)計(jì),這種連帶性質(zhì)的訂單都會(huì)被統(tǒng)計(jì),結(jié)果指標(biāo)一定非常浮夸。
“那按照日期和買(mǎi)家ID來(lái)去重,把當(dāng)天購(gòu)買(mǎi)的行為歸為一次,再按照ID來(lái)分組統(tǒng)計(jì)唄”
在一些場(chǎng)景中,這是相對(duì)簡(jiǎn)單的計(jì)算方法,但還是不夠嚴(yán)謹(jǐn),也沒(méi)有充分觸達(dá)到復(fù)購(gòu)的本質(zhì)。
這種計(jì)算方式很容易受到特定活動(dòng)和特殊產(chǎn)品的影響:
比如品牌在活動(dòng)期連續(xù)三天搞大型秒殺活動(dòng),很多客戶連續(xù)三天參與購(gòu)買(mǎi),這個(gè)口徑下的復(fù)購(gòu)率會(huì)大大注水。
比如大促期間消費(fèi)者搶購(gòu)一波,結(jié)果第二天發(fā)現(xiàn)還想購(gòu)買(mǎi)配套產(chǎn)品..
對(duì)于復(fù)購(gòu)的分析,我們真正在意的是客戶正常的消耗周期,比如一款脫毛膏,就算全身上下涂個(gè)遍,也夠用15天,那A客戶1號(hào)首次購(gòu)買(mǎi),在3號(hào)又來(lái)購(gòu)買(mǎi),嚴(yán)格意義上是不算復(fù)購(gòu)的,只能算第一次購(gòu)買(mǎi)的補(bǔ)充(連帶購(gòu)買(mǎi))
我們應(yīng)該根據(jù)業(yè)務(wù)實(shí)際情況制定一個(gè)規(guī)則,即客戶前后購(gòu)買(mǎi)行為間隔超過(guò)多少天,算作復(fù)購(gòu)。
下面的實(shí)戰(zhàn)場(chǎng)景中,這個(gè)值定義為2:即客戶后一次和前一次購(gòu)買(mǎi)時(shí)間間隔必須大于2天,才算復(fù)購(gòu)行為。
舉個(gè)栗子
概念晦澀,栗子清晰:

某客戶,第一次購(gòu)買(mǎi)時(shí)間是5月1日,隨后5月2日又產(chǎn)生了購(gòu)買(mǎi)行為,這里間隔時(shí)間只有1天,所以不算復(fù)購(gòu)。
順延下一次購(gòu)買(mǎi)時(shí)間,5月3日和5月1日的間隔正好是2天,不滿足我們大于2天算復(fù)購(gòu)的定義,也不能算復(fù)購(gòu)。
時(shí)間繼續(xù)朝后推,5月6日和5月1日時(shí)間差整整有5天,這次購(gòu)買(mǎi)間隔符合復(fù)購(gòu)定義。記作該客戶第一次復(fù)購(gòu),于是5月6日變成了新的錨點(diǎn),以對(duì)比計(jì)算后續(xù)購(gòu)買(mǎi)行為的時(shí)間差。
客戶最后一次購(gòu)買(mǎi)行為發(fā)生于5月9日,和最近的錨點(diǎn)5月6日有3天的間隔,亦滿足我們對(duì)復(fù)購(gòu)的定義,因此最后一次消費(fèi)也算作復(fù)購(gòu)。
總的來(lái)說(shuō),客戶在5月1日-5月3日是一次購(gòu)買(mǎi)行為,在5月6日的消費(fèi)是第二次購(gòu)買(mǎi)行為,5月9日則是第三次購(gòu)買(mǎi)行為,整體復(fù)購(gòu)了兩次。
Pandas看了這個(gè)計(jì)算邏輯,感覺(jué)遇到了嚴(yán)峻的挑戰(zhàn)....
Pandas實(shí)戰(zhàn)
讀取我們的案例源數(shù)據(jù):

時(shí)間范圍是2020年5月-6月兩個(gè)月的數(shù)據(jù),一共40270條,目標(biāo)是計(jì)算兩月期的復(fù)購(gòu)率。
先對(duì)客戶ID和付款時(shí)間做升序排列,方便后續(xù)計(jì)算:

復(fù)購(gòu)計(jì)算是建立在按客戶ID分組的基礎(chǔ)之上,下面的重點(diǎn)工作是搞定apply里面的函數(shù)。

首先,用一個(gè)空列 lst 來(lái)記錄客戶的復(fù)購(gòu)間隔時(shí)間。當(dāng)客戶在時(shí)間范圍內(nèi)購(gòu)買(mǎi)次數(shù)大于1時(shí),再對(duì)客戶的購(gòu)買(mǎi)時(shí)間進(jìn)行循環(huán)遍歷,否則返回空列表:

接著,重點(diǎn)研究購(gòu)買(mǎi)次數(shù)大于1的客戶,為了有一個(gè)錨定的日期,我們引入變量anchor,當(dāng)客戶第二次購(gòu)買(mǎi)時(shí)間間隔在2天以內(nèi),則用第三次購(gòu)買(mǎi)時(shí)間和anchor做計(jì)算,依次遍歷,直到找到購(gòu)買(mǎi)時(shí)間間隔大于2的消費(fèi)行為或者循環(huán)匹配完客戶所有訂單信息:

為了避免索引超出范圍,在while循環(huán)內(nèi)部,當(dāng) i 等于len(x) - 2時(shí),跳出內(nèi)部循環(huán),否則index + 1
一旦客戶兩次購(gòu)買(mǎi)行為間隔超過(guò)2天,則判定為復(fù)購(gòu)行為,并且把復(fù)購(gòu)時(shí)間間隔記錄在lst列表

一遍復(fù)購(gòu)間隔計(jì)算完之后,進(jìn)行下次的循環(huán)(這里判斷index同樣是為了避免超出索引),最終得到的是每個(gè)客戶符合定義的間隔時(shí)間列表。
把定義好的函數(shù)應(yīng)用到我們的數(shù)據(jù)集上,結(jié)果如絲般順滑:

大功已經(jīng)告成。計(jì)算復(fù)購(gòu)率已然是信手拈來(lái),只需要統(tǒng)計(jì)復(fù)購(gòu)次數(shù)大于等于1的:

以2天作為我們的復(fù)購(gòu)時(shí)間間隔,最終復(fù)購(gòu)率是17.76%。
apply強(qiáng)大不止于此,我們對(duì)count函數(shù)略加修改,加入一個(gè)變量作為間隔,就可以自定義復(fù)購(gòu)時(shí)間間隔,想大于3天就大于3天,想大于7天就大于7天,完全實(shí)現(xiàn)復(fù)購(gòu)率的靈活計(jì)算。

整個(gè)復(fù)購(gòu)計(jì)算到此為止,問(wèn)題的關(guān)鍵在于count函數(shù),如何把規(guī)則用函數(shù)復(fù)現(xiàn),以及索引怎樣遞進(jìn),需要花一些時(shí)間來(lái)思考。
最后,我已經(jīng)把數(shù)據(jù)源和代碼打包好,趕緊動(dòng)手試試吧~
注:后臺(tái)回復(fù)“復(fù)購(gòu)率”,即可獲取完整數(shù)據(jù)源和代碼。
