復(fù)購分析實戰(zhàn) | Pandas遇到了大難題..(附40000+數(shù)據(jù)源和代碼)

文章來源:數(shù)據(jù)不吹牛
作者:小z
在電商等消費場景下,復(fù)購率是最耳熟能詳?shù)闹笜酥涣?。上到平臺、下到品牌、店鋪,各種復(fù)盤分析一定繞不開復(fù)購率,今天我們就從實戰(zhàn)的角度聊聊復(fù)購率。
本文是Pandas實戰(zhàn)系列的番外篇,是小z特意總結(jié)的案例,對于pandas操作是一個很大的考驗。
食用建議:略硬略干,建議食用前先喝杯水
初識復(fù)購率
實際業(yè)務(wù)經(jīng)常會遇到以下場景:
“哈,我們的復(fù)購率同比/環(huán)比提升了XXX!”臺下一片欣然..
“哎,近XX時間復(fù)購率有明顯下降趨勢”Boss臉色變得難看...
小z發(fā)現(xiàn),復(fù)購率的討論很容易陷入雞同鴨講,明面上都在說復(fù)購率,但實際連指標計算邏輯都是不同的:
有留存角度的,A時間段購買人數(shù),在其后B時間段重復(fù)購買人數(shù)占比
有客戶生命周期角度的,A時間段購買人數(shù),在整個生命周期中,重復(fù)購買人數(shù)占比
有截斷角度的,A時間(這個時間一般比較長)段購買人數(shù),在A時間段重復(fù)購買人數(shù)的占比
還有自定義角度的....
各種眼花繚亂的復(fù)購計算方法,及其延伸的復(fù)購分析體系,以后會詳細展開講解。這次,我們先以一種計算邏輯切入,搞清楚如何用Pandas計算客戶復(fù)購率。
復(fù)購率計算
本文采用一種比較簡單,但非??简濸andas技巧的口徑來定義(可能是一些同學(xué)用pandas遇到的最大挑戰(zhàn))
復(fù)購率:一段時期內(nèi),購買兩次及以上的客戶占總?cè)藬?shù)的比重
比如最近半年,有10000個客戶購買我們的產(chǎn)品,在這半年內(nèi),有1000個客戶重復(fù)購買(購買2次及以上),那半年期復(fù)購率就是1000 / 10000 = 10%
有同學(xué)會說“訂單去重之后,按照客戶ID來groupby一下不就行了,有啥好講的!”
Too young too simple~
一般拿到的訂單是產(chǎn)品維度的,像這樣:
一個客戶同時購買了A、B、C三款產(chǎn)品,后臺會生成三筆產(chǎn)品訂單,如果直接按照ID來分組統(tǒng)計,這種連帶性質(zhì)的訂單都會被統(tǒng)計,結(jié)果指標一定非常浮夸。
“那按照日期和買家ID來去重,把當(dāng)天購買的行為歸為一次,再按照ID來分組統(tǒng)計唄”
在一些場景中,這是相對簡單的計算方法,但還是不夠嚴謹,也沒有充分觸達到復(fù)購的本質(zhì)。
這種計算方式很容易受到特定活動和特殊產(chǎn)品的影響:
比如品牌在活動期連續(xù)三天搞大型秒殺活動,很多客戶連續(xù)三天參與購買,這個口徑下的復(fù)購率會大大注水。
比如大促期間消費者搶購一波,結(jié)果第二天發(fā)現(xiàn)還想購買配套產(chǎn)品..
對于復(fù)購的分析,我們真正在意的是客戶正常的消耗周期,比如一款脫毛膏,就算全身上下涂個遍,也夠用15天,那A客戶1號首次購買,在3號又來購買,嚴格意義上是不算復(fù)購的,只能算第一次購買的補充(連帶購買)
我們應(yīng)該根據(jù)業(yè)務(wù)實際情況制定一個規(guī)則,即客戶前后購買行為間隔超過多少天,算作復(fù)購。
下面的實戰(zhàn)場景中,這個值定義為2:即客戶后一次和前一次購買時間間隔必須大于2天,才算復(fù)購行為。
舉個栗子
概念晦澀,栗子清晰:
某客戶,第一次購買時間是5月1日,隨后5月2日又產(chǎn)生了購買行為,這里間隔時間只有1天,所以不算復(fù)購。
順延下一次購買時間,5月3日和5月1日的間隔正好是2天,不滿足我們大于2天算復(fù)購的定義,也不能算復(fù)購。
時間繼續(xù)朝后推,5月6日和5月1日時間差整整有5天,這次購買間隔符合復(fù)購定義。記作該客戶第一次復(fù)購,于是5月6日變成了新的錨點,以對比計算后續(xù)購買行為的時間差。
客戶最后一次購買行為發(fā)生于5月9日,和最近的錨點5月6日有3天的間隔,亦滿足我們對復(fù)購的定義,因此最后一次消費也算作復(fù)購。
總的來說,客戶在5月1日-5月3日是一次購買行為,在5月6日的消費是第二次購買行為,5月9日則是第三次購買行為,整體復(fù)購了兩次。
Pandas看了這個計算邏輯,感覺遇到了嚴峻的挑戰(zhàn)....
Pandas實戰(zhàn)
讀取我們的案例源數(shù)據(jù):
時間范圍是2020年5月-6月兩個月的數(shù)據(jù),一共40270條,目標是計算兩月期的復(fù)購率。
先對客戶ID和付款時間做升序排列,方便后續(xù)計算:
復(fù)購計算是建立在按客戶ID分組的基礎(chǔ)之上,下面的重點工作是搞定apply里面的函數(shù)。
首先,用一個空列 lst 來記錄客戶的復(fù)購間隔時間。當(dāng)客戶在時間范圍內(nèi)購買次數(shù)大于1時,再對客戶的購買時間進行循環(huán)遍歷,否則返回空列表:

接著,重點研究購買次數(shù)大于1的客戶,為了有一個錨定的日期,我們引入變量anchor,當(dāng)客戶第二次購買時間間隔在2天以內(nèi),則用第三次購買時間和anchor做計算,依次遍歷,直到找到購買時間間隔大于2的消費行為或者循環(huán)匹配完客戶所有訂單信息:
為了避免索引超出范圍,在while循環(huán)內(nèi)部,當(dāng) i 等于len(x) - 2時,跳出內(nèi)部循環(huán),否則index + 1
一旦客戶兩次購買行為間隔超過2天,則判定為復(fù)購行為,并且把復(fù)購時間間隔記錄在lst列表
一遍復(fù)購間隔計算完之后,進行下次的循環(huán)(這里判斷index同樣是為了避免超出索引),最終得到的是每個客戶符合定義的間隔時間列表。
把定義好的函數(shù)應(yīng)用到我們的數(shù)據(jù)集上,結(jié)果如絲般順滑:
大功已經(jīng)告成。計算復(fù)購率已然是信手拈來,只需要統(tǒng)計復(fù)購次數(shù)大于等于1的:
以2天作為我們的復(fù)購時間間隔,最終復(fù)購率是17.76%。
apply強大不止于此,我們對count函數(shù)略加修改,加入一個變量作為間隔,就可以自定義復(fù)購時間間隔,想大于3天就大于3天,想大于7天就大于7天,完全實現(xiàn)復(fù)購率的靈活計算。
整個復(fù)購計算到此為止,問題的關(guān)鍵在于count函數(shù),如何把規(guī)則用函數(shù)復(fù)現(xiàn),以及索引怎樣遞進,需要花一些時間來思考。
為了方便大家使用,我把本文介紹的完整數(shù)據(jù)源和代碼整理上傳到了百度云,避免文件失效,需要的可以掃碼添加我的個人微信,發(fā)送消息“復(fù)購率”,獲取下載鏈接~
