背景
留存分析(群組分析,cohort analysis)是以一段時(shí)間窗內(nèi)的研究對(duì)象,觀察其在后續(xù)若干個(gè)時(shí)間窗內(nèi)有指定行為的比例變化趨勢(shì)。
留存率是一個(gè)與DAU強(qiáng)相關(guān)的核心指標(biāo),是反映產(chǎn)品生命力的重要風(fēng)向標(biāo),如果留存率高、衰減速度慢,那就說(shuō)明產(chǎn)品生命力強(qiáng)勁,反之則衰弱。近來(lái)在用戶增長(zhǎng)領(lǐng)域出現(xiàn)一種論調(diào):AARRR已過(guò)時(shí),RARRA才是更好的增長(zhǎng)模型。也強(qiáng)調(diào)了留存率的重要性——如果用戶都不留下來(lái),就不會(huì)給你機(jī)會(huì)做運(yùn)營(yíng)。
與此同時(shí),留存分析也是一種非常常見(jiàn)的數(shù)據(jù)分析模型,基本上各個(gè)業(yè)務(wù)線都會(huì)研究其特定的用戶留存(當(dāng)然留存分析模型不一定僅限于用戶,比如我以前在某自行車(chē)公司就研究過(guò)自行車(chē)的留存,雖然我現(xiàn)在已經(jīng)忘了當(dāng)時(shí)是在研究啥……),比如:
- 做了一個(gè)運(yùn)營(yíng)活動(dòng),想看參加活動(dòng)的用戶留存
- 做了一個(gè)AB試驗(yàn),想對(duì)比實(shí)驗(yàn)組和對(duì)照組的用戶留存
- 產(chǎn)品做了一次改動(dòng),想看影響范圍下的用戶留存
……
如果來(lái)一個(gè)這樣的需求,就跑一次數(shù),那就顯得有點(diǎn)不夠優(yōu)雅。正是因?yàn)樗匾?,又常?jiàn),且模型本質(zhì)和計(jì)算邏輯比較通用,所以可以把數(shù)據(jù)處理和計(jì)算的部分抽象在數(shù)據(jù)平臺(tái)上,以便用戶能夠快速高效地進(jìn)行留存分析。
本文的目標(biāo)在于連通底層明細(xì)數(shù)據(jù),并支持用戶在前端上組合篩選條件來(lái)自定義群組,然后自動(dòng)計(jì)算群組的日、周、月留存,并在此基礎(chǔ)上擬合一個(gè)留存率衰減模型,以此來(lái)預(yù)測(cè)群組在任意一天的留存值。整體思路如下:

數(shù)據(jù)分析方法
留存率計(jì)算方法
在數(shù)據(jù)倉(cāng)庫(kù)日常生產(chǎn)調(diào)度中,有一種計(jì)算留存率的方法,即拿1個(gè)分區(qū)的基準(zhǔn)明細(xì)數(shù)據(jù)不斷左關(guān)聯(lián)后續(xù)N個(gè)時(shí)間窗分區(qū)的明細(xì)數(shù)據(jù),以計(jì)算重合數(shù),進(jìn)而計(jì)算留存率——這是一種穩(wěn)妥的數(shù)據(jù)生產(chǎn)調(diào)度方法,卻有失靈活。
本文計(jì)算的方法如下:
基準(zhǔn)表與行為表按id關(guān)聯(lián),日期不作限制,即同id按日期作笛卡爾積,得到的中間表如下示意——
| 基準(zhǔn)日 | 用戶id | 行為日 | 日期差 |
|---|---|---|---|
| 2019-09-01 | user1 | 2019-09-02 | 1 |
| 2019-09-01 | user1 | 2019-09-03 | 2 |
| 2019-09-01 | user1 | 2019-09-04 | 3 |
| 2019-09-01 | user2 | 2019-09-02 | 2 |
| 2019-09-01 | user3 | 2019-09-05 | 4 |
先去重,然后按基準(zhǔn)朱和日期差分組統(tǒng)計(jì)行數(shù),得到的中間表如下示意——
| 基準(zhǔn)日 | 日期差 | 用戶數(shù) |
|---|---|---|
| 2019-09-01 | 0 | 1000 |
| 2019-09-01 | 1 | 500 |
| 2019-09-01 | 2 | 300 |
| 2019-09-02 | 0 | 900 |
| 2019-09-02 | 1 | 400 |
再作行列轉(zhuǎn)換——
| 基準(zhǔn)日 | 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| 2019-09-01 | 1000 | 500 | 300 | 200 | 100 |
| 2019-09-02 | 900 | 400 | 250 | 150 | 90 |
| 2019-09-03 | 1200 | 600 | 400 | 200 | 100 |
其中0那一列則是基準(zhǔn)值,也是分母,后面各列除以基準(zhǔn)值則可得到留存率;例如1列除以0列則是次日留存率,7列除以0列則是7日留存率。向量化計(jì)算,則可快速得出每一天的留存率。
周、月留存率計(jì)算同理。
留存冪函數(shù)擬合
就拿新增活躍舉例,一個(gè)正常的互聯(lián)網(wǎng)產(chǎn)品,觀察某一天的新增用戶,在后續(xù)N天的留存率,它總體上一定是以斜率逐步下降的速率在逐步衰減,然后到達(dá)平衡——如果把散點(diǎn)圖畫(huà)出來(lái)看,很容易看到長(zhǎng)得很像冪小于0的函數(shù)曲線。

于是就可以用冪函數(shù)來(lái)擬合留存率模型,然后就可以用戶預(yù)測(cè)留存率了。
其中y是留存率,x是往后的天數(shù),a是次日留存率(當(dāng)x=1時(shí),y = a),b是衰減冪。
從這個(gè)公式中可以看出:
- 次日留存率很重要,它決定了留存衰減曲線的起點(diǎn)和整體高度
- 衰減冪b小于0,b越大(越接近0)則衰減越慢,留存越穩(wěn)定;b越?。ń^對(duì)值越大),則衰減越快,越容易流失。
在這個(gè)公式中,x,y和a在訓(xùn)練集中都是已知的,就只需要擬合b;兩邊取對(duì)數(shù),就能把這個(gè)冪函數(shù)模型轉(zhuǎn)化成線性模型,然后用線性模型的擬合方法即可,十分簡(jiǎn)單。
> get_fit_power <- function(x,y){
+ a <- log(x)
+ b <- log(y) - log(y[1])
+ fit <- lm(b~a)
+ return(fit$coefficients[2])
+ }
>
> # 構(gòu)造樣例數(shù)據(jù)來(lái)驗(yàn)證一下
> x <- 1:100
> y <- rnorm(1)*x^(-0.56234) # 系數(shù)怎么取不重要,冪隨便瞎寫(xiě)一個(gè)
> get_fit_power(x,y)
a
-0.56234
拿完全的冪函數(shù)樣本數(shù)據(jù)去擬合,擬合的結(jié)果完全吻合樣本上的冪,毫無(wú)誤差,哈哈哈。
有了上述2個(gè)數(shù)據(jù)分析方法,就可以進(jìn)行數(shù)據(jù)產(chǎn)品建設(shè)了。
數(shù)據(jù)產(chǎn)品示意
(本文中的示例數(shù)據(jù)來(lái)自于網(wǎng)絡(luò)上某產(chǎn)品的數(shù)據(jù),其中用戶id作去隱私處理。)
上傳基準(zhǔn)明細(xì)數(shù)據(jù)
第一步?jīng)]有別的,還是上傳數(shù)據(jù)。上傳一份用戶粒度的新增明細(xì)數(shù)據(jù),其中日期和用戶id必備,其他維度可加可不加,主要用來(lái)篩選用。

控件說(shuō)明
- 第1個(gè)上傳框用于上傳行為明細(xì)數(shù)據(jù)
- 第2個(gè)日期區(qū)間選擇器用于選定一段基準(zhǔn)日期,即只看這一段日期以?xún)?nèi)新增的留存率情況
- 第3個(gè)和第4個(gè)下拉框只有當(dāng)2份數(shù)據(jù)都上傳后才能篩選,取值范圍為2個(gè)表列名的交集(所以2個(gè)表的日期和ID必須同名),通過(guò)用戶篩選,用來(lái)告訴用戶哪個(gè)字段是日期,哪個(gè)字段是ID,才能讓系統(tǒng)正確地關(guān)聯(lián)計(jì)算
- 第5個(gè)是統(tǒng)計(jì)周期,有
daily(默認(rèn))、weekly和monthly3個(gè)值可選,分別對(duì)應(yīng)日留存、周留存和月留存 - 最后一個(gè)日期單選器,用于在留存冪函數(shù)模型擬合出來(lái)以后,指定1天,計(jì)算基準(zhǔn)日期內(nèi)的新增在指定天的留存預(yù)測(cè)值

留存率熱力圖
2份數(shù)據(jù)都上傳后,指定日期字段為day,關(guān)聯(lián)ID為userid,統(tǒng)計(jì)周期為daily,則可自動(dòng)計(jì)算并以熱圖形式可視化出統(tǒng)計(jì)周期內(nèi)每1天的新增在后續(xù)的逐日留存率。這是一個(gè)標(biāo)準(zhǔn)的下三角形,每一個(gè)熱塊代表著某一個(gè)基準(zhǔn)日在后續(xù)時(shí)間窗的留存率,顏色從淺到深表示留存率從小到大,鼠標(biāo)移到一個(gè)熱塊上,可以顯示對(duì)應(yīng)的基準(zhǔn)日期、時(shí)間窗間隔,以及對(duì)應(yīng)的留存率。

當(dāng)然你可能覺(jué)得這樣會(huì)逼死密集恐懼癥,沒(méi)有關(guān)系,可以縮小要觀察的基準(zhǔn)日期范圍,比如我只想看8月內(nèi)的留存率——

當(dāng)然你可能還是覺(jué)得密集,不想看那么多天,沒(méi)有關(guān)系,可以在圖上通過(guò)縮放截取,只看你關(guān)心范圍內(nèi)的留存情況——

同樣地,你可以通過(guò)切換統(tǒng)計(jì)周期,來(lái)觀察周留存和月留存。


通過(guò)這幾個(gè)功能,可以對(duì)留存率作全局分析,也可以發(fā)現(xiàn)一些異常的現(xiàn)象。比如下圖所示,這款產(chǎn)品整體留存率偏低,6月5號(hào)這一天的新增用戶,在80+天內(nèi)留存率都很高(約40%+以上的水平),在88天后驟然恢復(fù)到正常水平,所以這一天的新增用戶是什么情況?是數(shù)據(jù)出問(wèn)題了,還是持續(xù)活躍了80+天的水軍?

留存衰減冪函數(shù)模型
留存熱力圖下方有2部分,左下方是留存冪函數(shù)擬合曲線,這個(gè)是基于用戶所篩選(如果沒(méi)有選則不篩選)的基準(zhǔn)日日期范圍內(nèi)的新增用戶的留存率數(shù)據(jù)作擬合,藍(lán)色的點(diǎn)為實(shí)際留存率數(shù)值,黑色的虛線為擬合的冪函數(shù)模型曲線,圖上有擬合的模型結(jié)果;右下方是預(yù)測(cè)留存數(shù),是基于擬合后的冪函數(shù)模型,在用戶指定的預(yù)測(cè)留存日期(上方最后一個(gè)日期選擇器控件篩選結(jié)果)預(yù)測(cè)的數(shù)值,比如第1行的結(jié)果表示,2019-07-17這1天有999個(gè)新增用戶,在經(jīng)過(guò)57天之后(即2019-09-12)將會(huì)衰減至3.78個(gè)。從曲線圖中可以看到散點(diǎn)的分布并不是嚴(yán)格符合冪函數(shù)模型,所以擬合的模型效果不會(huì)很好。

當(dāng)然,用戶切換基準(zhǔn)日日期范圍后,訓(xùn)練集會(huì)變化,擬合的模型結(jié)果也會(huì)跟著變。比如我這里限定基準(zhǔn)日期范圍為7月下半月(2019-07-16 - 2019-07-31),來(lái)預(yù)測(cè)這一段時(shí)期內(nèi)的新增用戶在8.1號(hào)的留存值。
從下面的曲線來(lái)看,這次的擬合結(jié)果較好?;谛聰M合的模型預(yù)測(cè)結(jié)果,可以看到7.30號(hào)新增了147個(gè)用戶,預(yù)期2天后能留存15個(gè)。

切片留存分析
我把數(shù)據(jù)處理放在左側(cè)導(dǎo)航欄,表示著數(shù)據(jù)處理結(jié)果可以適用于任何模型,包括這里的篩選,就意味著任何一個(gè)模型不僅能作用于全體數(shù)據(jù),還能作用于用戶任意自定義的切片。比如我只想觀察“來(lái)自于渠道3,用brand_2品牌的男性用戶”的留存情況,只需在左側(cè)輸入篩選條件channel == 'channel_3', brand == 'brand_2', gender == 'male',系統(tǒng)則會(huì)自動(dòng)計(jì)算展現(xiàn)這個(gè)群組的留存率和留存模型。

總結(jié)
本文以留存分析為主題,提供了一種高效的留存率計(jì)算邏輯和留存率冪函數(shù)擬合方法,并將之產(chǎn)品化——只需要指定2份數(shù)據(jù)集,即可自動(dòng)計(jì)算出日、周和月留存,并支持自由篩選群體范圍、觀測(cè)周期、以及時(shí)間窗長(zhǎng)度,同時(shí)還能基于留存率數(shù)據(jù)自動(dòng)擬合留存率冪函數(shù)衰減模型,并基于這個(gè)模型預(yù)測(cè)一段時(shí)間的群組在任意1天的留存情況、
不過(guò)后續(xù)仍有2個(gè)問(wèn)題需要考慮——
- 由于這套系統(tǒng)是在單機(jī)內(nèi)存上運(yùn)行,所以試驗(yàn)用的是小樣本量數(shù)據(jù)。但在一款成熟產(chǎn)品的數(shù)據(jù)倉(cāng)庫(kù)中,用戶明細(xì)數(shù)據(jù)可是很龐大的,且關(guān)于日期作笛卡爾運(yùn)算,會(huì)很消耗集群計(jì)算資源——所以真正在生產(chǎn)環(huán)境中,系統(tǒng)的穩(wěn)定性、計(jì)算效率是需要考慮的問(wèn)題。
- 其實(shí)留存冪函數(shù)衰減模型再往下挖,就應(yīng)該是DAU預(yù)測(cè)模型了,不過(guò)這個(gè)我現(xiàn)在還拿不準(zhǔn),所以這次先不搞。