前些日子我的好哥們安琪姐扔給我一篇Adtributor的paper,盡管已經(jīng)很久沒有看算法,更久沒有讀paper;但出于對這位專業(yè)的數(shù)據(jù)科學(xué)家的致敬,我竟然看了還推導(dǎo)了一遍……
算法其實(shí)挺簡單,屬于看懂了之后就能實(shí)現(xiàn)出來。此文先簡單介紹一下算法原理,然后搭建一個數(shù)據(jù)產(chǎn)品交互界面,并以脫敏后的真實(shí)業(yè)務(wù)數(shù)據(jù)來實(shí)踐,最后探討這種數(shù)據(jù)應(yīng)用的困難與局限。
算法簡介
Adtributor根因分析算法目標(biāo)是針對多個因素影響下,快速找出影響廣告收入的root-cause維度;但我們當(dāng)然可以推廣至任務(wù)多維分析業(yè)務(wù)場景下。算法的基本思想要點(diǎn)如下:
- 只考慮單維度的作用,不考慮多維交叉的情況;即最后的root cause結(jié)果一定是某幾個單獨(dú)的維度,而不是多個維度交叉下的場景
- 設(shè)定兩個EP閾值:
T_eep用于過濾掉單維度下低解釋度的元素,T_EP用于控制維度元素集合的長度,限制低Surprise元素的加入 - 以JS散度來計(jì)算一個元素的預(yù)測值和實(shí)際值的Surprise,而一個維度下所有EP大于T_eep的元素JS散度即作為該維度的Surprise
- 最后挑選3個Surprise最大的維度,每個維度展現(xiàn)Surprise從大到小且累加后剛好超過T_EP的元素集合用于解釋造成diff的root cause
算法偽代碼如下:
偽代碼
Foreach m ∈ M // Compute surprise for all measures
Foreach Eij // all elements, all dimensions
p = Fij(m)/F(m) // Equation 5
q = Aij(m)/A(m) // Equation 6
Sij(m) = DJS(p, q) // Equation 7
ExplanatorySet = {}
Foreach i ∈ D
SortedE = Ei.SortDescend(Sij(m)) //Surprise
Candidate = {}, Explains = 0, Surprise = 0
Foreach Eij ∈ SortedE
EP = (Aij(m) ? Fij(m))/(A(m) ? F(m))
if (EP > TEEP ) // Occam’s razor
Candidate.Add += Eij
Surprise += Sij(m)
Explains += EP
if (Explains > TEP ) // explanatory power
Candidate.Surprise = Surprise
ExplanatorySet += Candidate
break
//Sort Explanatoryset by Candidate.Surprise
Final = ExplanatorySet.SortDescend(Surprise)
Return Final.Take(3) // Top 3 most surprising
數(shù)據(jù)產(chǎn)品
數(shù)據(jù)處理
第一步,仍是上傳數(shù)據(jù)——除了日期以外,10個維度交叉下的DAU數(shù)據(jù)。不過注意維度Group By和度量Sum一定要選,這個作為后續(xù)算法的輸入。

根因分析
假如我們沒有任何先驗(yàn)的業(yè)務(wù)知識情況下,該從哪個維度去拆解DAU的波動情況?這是Adtributor算法可以解答的。
在歸因分析頁面中,一共有如下參數(shù):
- 基準(zhǔn)日期范圍:用來計(jì)算指標(biāo)基準(zhǔn)平均值
- 對比日期范圍:用來計(jì)算指標(biāo)對比平均值
- 日期字段:用來計(jì)算基準(zhǔn)值和對比值
- T_eep:Adtributor算法中的T_eep,默認(rèn)值取paper里的0.1
- T_EP:Adtributor算法中的T_EP,默認(rèn)值取paper里的0.7
我們上傳的原始數(shù)據(jù)是一個帶日期的時序數(shù)據(jù),系統(tǒng)根據(jù)基準(zhǔn)日期范圍和對比日期范圍,拆分成2個子表,各自按日期聚合,計(jì)算對應(yīng)周期內(nèi)的指標(biāo)平均值;然后按照所選擇的維度,作全外連接,將各個維度粒度下的基準(zhǔn)值merge在一起比較,便于算法計(jì)算。
比如我們將基準(zhǔn)日期范圍調(diào)成:2020-05-012020-05-10,基準(zhǔn)值就是5月前10天的日均DAU;對比日期范圍調(diào)成:2020-04-012020-04-30,對比值就是整個4月內(nèi)的日均DAU。

基于輸入的參數(shù),最后輸出算法計(jì)算的結(jié)果:輸出3個超過T_EP累計(jì)Surprise最大的維度,每個維度輸出Suprise超過T_eep的元素組合。
從圖中的輸出可以得出以下的結(jié)論:
- 影響DAU波動最大的因素依次是
平臺、廠商和渠道組 - 盡管ios的EP較小,但Surprise更大,更值得關(guān)注
- 另外兩個維度同理
下鉆分析
然而,這里如果我們加上了后驗(yàn)的業(yè)務(wù)知識,就會發(fā)現(xiàn)以上算法的結(jié)果并沒有多少額外的insight:
- 這3個維度都是常見的維度,而且輸出的元素都是維度下占比較大的,本身EP較大;其實(shí)不需要算法,憑借著業(yè)務(wù)sense,也知道要拆這3個維度
- 尤其是平臺這個維度,一共才2個元素,都輸出了,累計(jì)EP直接到1
所以盡管經(jīng)過算法的計(jì)算,這3個維度的Surprise最大,但是這個結(jié)果本身并沒有surprise。
不過沒有關(guān)系,數(shù)據(jù)分析工具箱在數(shù)據(jù)處理那一步就支持篩選和聚合計(jì)算,所以我們可以切片繼續(xù)下鉆分析。
比如我們認(rèn)為ios比android更值得關(guān)注,我們就限定平臺為ios,算法重新算一遍,就會得出不同的結(jié)果:

影響IOS活躍用戶波動的3個主要維度:
- 興趣標(biāo)簽:
社會和健康/醫(yī)療是2個最令人意外的標(biāo)簽,累計(jì)的EP約為120%(這里解釋一下為什么EP能大于100%——當(dāng)然也能小于0,因?yàn)镋P的定義就是元素diff/維度diff;同一維度下,有的元素上漲,有的下跌;如果上漲或下跌的幅度超出維度總幅度,EP就會超過100%,以與反向變化的元素EP對沖) - 年齡段:30歲以上群體,變化最意外
- 活躍度:中高活的用戶群,變化最意外
當(dāng)然,也許這3個維度仍然處于已知的業(yè)務(wù)常識中;那我們可以在數(shù)據(jù)處理中,自由添加/刪除相關(guān)維度,然后算法重新計(jì)算。這里比如我們?nèi)サ裟挲g段、活躍度和性別的維度,并且限定安卓平臺,得出結(jié)果如下:

得出的結(jié)論又不一樣,這里最重要的3個維度是:首啟、廠商和渠道組。
應(yīng)用局限
以上是基于真實(shí)業(yè)務(wù)數(shù)據(jù)(敏感部分已打碼,未打碼部門為算法指標(biāo))進(jìn)行分析的過程,整個過程和結(jié)果,看起來似乎有點(diǎn)用,又似乎沒太明顯的作用;那么局限在哪里?
算法局限
這個算法的假設(shè)及計(jì)算過程本身存在局限,它只考慮單維度的作用,不考慮多維度的聯(lián)合作用;事實(shí)上,在真實(shí)業(yè)務(wù)場景中,一個復(fù)雜的綜合指標(biāo),不可能只由各個維度獨(dú)立影響。
另外,在每個維度下遍歷元素時,根據(jù)surpise排序,一旦累計(jì)Suprise達(dá)到T_EP,即不再遍歷,也可能會錯過重要的元素。
業(yè)務(wù)知識
算法本身不具有業(yè)務(wù)屬性,數(shù)據(jù)才有。所以這個算法,并沒有去計(jì)算各維度之間相關(guān)性,沒有考慮維度之間的組合作用;并不能告訴用戶,原始數(shù)據(jù)里那一堆維度,應(yīng)該把哪些輸入進(jìn)去。而對于最后的輸出結(jié)果,算法本身也不可能知道,這個結(jié)果有沒有意義,有沒有額外的surprise或者insight——它只不過是一個計(jì)算結(jié)果,而參數(shù)一旦變化,計(jì)算結(jié)果就會變。
而這個算法本身不知道參數(shù)應(yīng)該怎么選,所以歸根結(jié)底,它不能起到直接給用戶輸出結(jié)論的作用,只能起來用戶指定一個方向,輸出一個細(xì)分方向,以驗(yàn)證猜想的作用。
另外,要想給出業(yè)務(wù)建議,數(shù)據(jù)只能起來間接作用——如果能建立知識圖譜,把數(shù)據(jù)里各個維度值與業(yè)務(wù)場景和可能業(yè)務(wù)行為關(guān)聯(lián)起來,比如并不只是簡單給出華為用戶活躍下降,能結(jié)合其他維度計(jì)算,歸納出可能的業(yè)務(wù)因素,比如渠道停投、push受限等具體場景,才能真正起來直接輔助業(yè)務(wù)決策的作用。
數(shù)據(jù)體系
歸因算法的預(yù)期是從多維數(shù)據(jù)里找出影響指標(biāo)波動最關(guān)鍵的維度,那么問題來了?影響指標(biāo)的root cause維度就一定在你輸入的多維數(shù)據(jù)里嘛?如果輸入的是一堆無關(guān)緊要的維度,輸出一定是沒有意義的。
所以第一個問題,對于你所關(guān)心的業(yè)務(wù)指標(biāo),它可能受影響的因素有哪些?這些因素是不是都是可以量化的,可量化的影響因素是不是都在數(shù)據(jù)倉庫里建設(shè)完善?如果不是,想做歸因分析,自然是非常受限的。
綜上,算法只是一個技術(shù)工具,甚至可以直接引入,本身不具備關(guān)鍵困難;核心的問題是:如何從數(shù)據(jù)的角度去理解業(yè)務(wù)?業(yè)務(wù)的變化能在多大程度上在數(shù)據(jù)上表征?是否具有完善的數(shù)據(jù)體系?數(shù)據(jù)體系在具體的業(yè)務(wù)場景下能覆蓋多大程度的變化問題?數(shù)據(jù)體系之間的邏輯關(guān)鍵是否嚴(yán)密、可靠、便于分析使用,只有解決了這些問題,做出的東西才不只是不知道怎么應(yīng)用的技術(shù)工具,而是真正能幫助業(yè)務(wù)的數(shù)據(jù)產(chǎn)品。
可實(shí)際情況往往是:
- 業(yè)務(wù)上很多問題并不是可量化的,也不是數(shù)據(jù)能覆蓋和解釋的
- 很難構(gòu)建一套完整、嚴(yán)謹(jǐn)、閉環(huán)的數(shù)據(jù)分析模型,能細(xì)致地、具體地、可落地地反映業(yè)務(wù),指導(dǎo)業(yè)務(wù)
- 甚至連全面、嚴(yán)密、整潔、健壯、可靠的數(shù)據(jù)體系都很難有
這才是最難的,比推導(dǎo)、實(shí)現(xiàn)一個算法,開發(fā)幾個頁面難得多……