網(wǎng)易如何做到數(shù)據(jù)指標(biāo)異常發(fā)現(xiàn)和診斷分析?
一、背景介紹
指標(biāo)與業(yè)務(wù)息息相關(guān),其價值在于發(fā)現(xiàn)問題和發(fā)現(xiàn)亮點,以便及時地解決問題和推廣亮點。隨著電商業(yè)務(wù)的進一步發(fā)展,業(yè)務(wù)迭代快、邏輯復(fù)雜,指標(biāo)的數(shù)量越來越多,而且指標(biāo)之間的差異非常大,變化非常快,如何能夠快速識別系統(tǒng)各項異常指標(biāo),發(fā)現(xiàn)問題的根因,對業(yè)務(wù)來說至關(guān)重要。如果通過手動的方式去設(shè)置報警閾值容易出現(xiàn)疏漏,且非常耗時,成本較高。我們希望構(gòu)建一套自動化方法,能夠達成以下目標(biāo):
- 自動化無需依賴用戶輸入:傳統(tǒng)的方式是需要定義異常規(guī)則、歸因維度等等,在自動化系統(tǒng)中不再需要用戶手動輸入。
- 通用性:能夠適應(yīng)多種多樣的指標(biāo)分布,不同的指標(biāo)匹配不同的方法。
- 時效性:實現(xiàn)天級、小時級的指標(biāo)異常檢測和歸因。
- 準(zhǔn)確性和主動性:實現(xiàn)數(shù)據(jù)找人的目標(biāo)。
接下來將分別介紹指標(biāo)異常檢測、指標(biāo)異常診斷。
二、指標(biāo)異常檢測
1、異常有哪些
數(shù)據(jù)科學(xué)工作的第一步是對問題進行定義。我們對異常的定義是數(shù)據(jù)指標(biāo)的異常,指標(biāo)的過高過低、大起大落都不正常,都需要進行預(yù)警和診斷。指標(biāo)的異常分為以下三種:
- 絕對值異常
指的是不遵循指標(biāo)固有的分布,在統(tǒng)計學(xué)上的離群點,它反映的是業(yè)務(wù)當(dāng)下的狀態(tài)。
- 波動異常
環(huán)比過大的突增點或者突降點,反映的是業(yè)務(wù)當(dāng)下突然的變化。
- 趨勢異常
前兩種異常是偏單點的,是短暫劇烈的,而有些異常則相對隱蔽,是在中長期呈現(xiàn)出確定性上升或者下降的趨勢,往往預(yù)示著某些潛在的風(fēng)險,所以我們也要進行趨勢的異常檢測,進行業(yè)務(wù)預(yù)警和提前干預(yù)。
這三種異常是相互獨立的,不同的場景可能對應(yīng)不同類型的異常。
比如上圖中A點同時發(fā)生了絕對值異常和波動率異常,B點因為與上一天的環(huán)比變化不大,所以只報了絕對值異常。C點和D點都只報了波動異常,但是其原因是不一樣的,C點指標(biāo)突降的原因是由B點造成,屬于指標(biāo)的正?;芈?,這種需要通過后處理邏輯解決。
2、指標(biāo)異常將測框架
為了實現(xiàn)指標(biāo)檢測的通用性、自動化以及時效性,我們設(shè)計了一套基于統(tǒng)計檢驗的無監(jiān)督檢測框架。
- 絕對值異常檢測
首先絕對值檢測主要是基于GESD 檢驗算法,它的原理是通過計算統(tǒng)計量來尋找異常點。過程如下:
假設(shè)數(shù)據(jù)集中有最多r個異常值。第一步先找到離均值最大的樣本i,然后計算統(tǒng)計量Ri,即xi 減去均值后的絕對值,除以標(biāo)準(zhǔn)差。接下來計算對應(yīng)的樣本點i的臨界值λi,其中的參數(shù),n 是總共的樣本量,i是已剔除的第幾個樣本,t是具有 n-i-1自由度的t 分布的p 百分點,而p與設(shè)定的置信度α(一般α取值為0.05)及當(dāng)前樣本量有關(guān)。
第二步是通過剔除離均值最大的樣本i,然后重復(fù)上面步驟,一共r次。
第三步尋找統(tǒng)計量 Ri 大于λi的樣本,即為異常點。
這種方法的優(yōu)點,一是無需指定異常值的個數(shù),只需要設(shè)定異常的上限,在上限范圍內(nèi),算法會自動捕捉異常點;二是克服了3Sigma檢出率過低(小于1%),只能檢出非常極端異常的問題。
在GESD算法中可以通過控制檢出率的上限去做適應(yīng),但是這個方法的前提是要求輸入的指標(biāo)是正態(tài)分布。我們目前觀測的電商業(yè)務(wù)指標(biāo)絕大多數(shù)是屬于正態(tài)分布的,當(dāng)然也有個別業(yè)務(wù)指標(biāo)(<5%)屬于非正態(tài)分布,需要采用其他方法來兜底,如quantile。
- 波動異常檢測
第二種是波動異常檢測,主要是基于波動率分布,計算分布的拐點。這里不能直接對波動率分布套用上面的辦法,主要是因為指標(biāo)波動率絕大多數(shù)不是正態(tài)分布所以不適用。找拐點的原理是基于二階導(dǎo)數(shù)和距離來尋找曲線上的最大彎曲點。增長的波動率大于 0,下降的波動率小于 0,針對在 y 軸兩側(cè)大于 0 和小于 0 的部分,分別要找兩個波動率的拐點,波動率超出拐點的范圍,就認為是波動異常。但個別情況下拐點會不存在,或者拐點來得太早,導(dǎo)致檢出率太高,所以也需要其他的方法來兜底,如quantile。一種檢驗方法不是萬能的,需要組合來使用。
- 趨勢異常檢測
第三種是趨勢異常檢測,基于Man-Kendall檢驗。先計算統(tǒng)計量S, 其中sgn 是符號函數(shù),根據(jù)指標(biāo)序列前后值的相對大小關(guān)系,兩兩配對可以得到 -1、1、0 這樣3個映射值。對統(tǒng)計量S做標(biāo)準(zhǔn)化,就得到了Z,可以通過查表的方式換算到p值。統(tǒng)計學(xué)上當(dāng) p 值小于 0.05,就認為有顯著性的趨勢。
它的優(yōu)點一是非參數(shù)檢驗,即可以適用于所有的分布,因此不需要兜底方法。優(yōu)點二是不要求指標(biāo)序列連續(xù),因為在進行趨勢異常檢測的時候,需要事先剔除絕對值異常的樣本,所以大多數(shù)指標(biāo)序列并不連續(xù),但這個方法是可以支持指標(biāo)不連續(xù)的。
- 異常檢測后處理
三種異常結(jié)束之后,需要進行后處理的工作,其目的主要是減少不必要的報警,降低對業(yè)務(wù)的打擾。
第一種是數(shù)據(jù)異常,這的數(shù)據(jù)異常不是指數(shù)據(jù)源出錯了,因為數(shù)據(jù)源是在數(shù)倉層面,由數(shù)倉團隊來保證。這里的數(shù)據(jù)異常指的是上周期的異常導(dǎo)致了本周期的波動異常,比如某個指標(biāo)昨天上漲了100%,今天又下降了50%,這種情況就需要基于規(guī)則來進行剔除,剔除的條件就是(1)上個周期存在波動或絕對值異常(2)本周期的波動屬于回歸正常的,即有波動異常但無和波動異常同向的絕對值異常。比如昨天上漲了100%,今天下降 50% ,經(jīng)后處理模塊會過濾掉,但是如果下降了99%,此時觸發(fā)了絕對值異常還是需要預(yù)警的。通過這種方式我們一共剔除了40% 以上的波動異常。
第二種后處理是基于S級大促的信息協(xié)同,這種大促中每個小時都可能會出現(xiàn)指標(biāo)的異常,大家都知道原因,因此沒有必要去進行播報。
三、指標(biāo)異常診斷
1、指標(biāo)異常診斷層次劃分
根據(jù)結(jié)論的可行域和確定性,可以將推斷分為三個層次,即確定性推斷、可能性推斷和猜測性推斷。
2、指標(biāo)異常診斷方法比較
不同推斷層次對應(yīng)著不同的診斷方法。
猜測性推斷,結(jié)論主要依賴人的經(jīng)驗,結(jié)論相對不明確,可操作空間有限,不在本文的方法討論范圍之內(nèi)。
可能性推斷,(1)可以基于機器學(xué)習(xí)去擬合指標(biāo)數(shù)據(jù),做回歸預(yù)測,計算特征的重要性,這種方法的缺點是不能解釋單次異常的原因。(2)如果想解釋單次的異常要加上一個 shap value 算法,它可以計算每一次預(yù)測值,每一個輸入特征對于目標(biāo)的貢獻值。這種方法具有一定的可解釋性,但是不夠精準(zhǔn),而且只能得出相關(guān)性,并非因果性。(3)可以通過貝葉斯網(wǎng)絡(luò)來構(gòu)建指標(biāo)間關(guān)系的圖和網(wǎng)絡(luò),但缺點是計算相對復(fù)雜,并且黑盒。
確定性推斷,主要是基于拆解貢獻度算法。拆解貢獻度算法不管是加法、乘法還是除法,都是按照拆解方式來衡量各部分指標(biāo)或者結(jié)構(gòu)的變化對整體的影響。優(yōu)點是確定性比較強,白盒化,適應(yīng)性比較強,能夠精準(zhǔn)定位到異常所在的位置。但是它也存在其天然的缺點,就是針對同一個指標(biāo),有非常多的維度可以去拆解,會帶來組合維度爆炸的問題。
3、業(yè)務(wù)現(xiàn)狀
數(shù)據(jù)科學(xué)的很多問題都需要結(jié)合業(yè)務(wù)的實際場景來選擇相應(yīng)的方法。因此在介紹我們的方法之前,先來介紹一下業(yè)務(wù)現(xiàn)狀。
我們知道,平臺電商的增長方式是由流量留存和付費轉(zhuǎn)化來驅(qū)動的。隨著人口紅利見頂,流量獲取日趨困難,網(wǎng)易嚴(yán)選進行了戰(zhàn)略升級,由平臺電商轉(zhuǎn)型成為品牌電商,將京東、淘寶等平臺電商轉(zhuǎn)變成品牌合作伙伴。
而品牌電商的增長驅(qū)動方式是通過全渠道協(xié)同爆品突圍,塑造明星品類來立住品牌。比如大家了解網(wǎng)易嚴(yán)選不一定是通過我們的APP,可能是通過淘寶、京東上買了一些商品從而了解到我們這個品牌。網(wǎng)易嚴(yán)選的增長視角從圍繞用戶的拉新、留存、付費,轉(zhuǎn)化為了圍繞爆品商品的打造和渠道的突破增長。
品牌電商的指標(biāo)分級可以分為戰(zhàn)略層、戰(zhàn)術(shù)層、執(zhí)行層。戰(zhàn)略層對應(yīng)的是一級指標(biāo),即北極星指標(biāo)。比如大盤的GMV,它衡量的是目標(biāo)的達成情況,服務(wù)于公司的戰(zhàn)略決策。戰(zhàn)術(shù)層對應(yīng)的是二級指標(biāo),是通過將一級指標(biāo)分拆到各級部門和業(yè)務(wù)線得到的,服務(wù)的是過程管理。執(zhí)行層對應(yīng)的是三級指標(biāo),是將二級指標(biāo)進一步拆分到各級類目商品以及負責(zé)人,服務(wù)具體實施。
基于目前品牌電商的這種指標(biāo)分級方式,以及需要定位到部門、人、商品這樣的需求,所以需要我們的算法具有確定性、可解釋性和白盒化。因此我們采用了基于拆解的方式,計算每一層每部分的指標(biāo)對于整體的影響占比,也就是前面提到的拆解貢獻度方法。
4、拆解貢獻度計算方法
貢獻度的計算方式包括三種,一類是加法,一類是乘法,還有一類是除法。
拆解方法如上圖中所示。Y是要進行拆解的目標(biāo)指標(biāo),比如大盤的GMV,Xi是其下某個拆分維度下第 i 個維值,比如某個省市的GMV,Xi1 代表當(dāng)前周期的指標(biāo),Xi0 表示上一個周期的原始值。
加法的拆解公式很好理解,每個維值的變化值ΔXi除以整體的原始值Y0,就是它的貢獻度。
乘法拆解采用了LMDI(Logarithmic Mean Index Method)乘積因子拆解的方式。兩邊同時取對數(shù)ln,即可得到加法形式,再按照上述方法,就可以得到各因子的貢獻度。維值的前后比率比較大,貢獻度就比較大。
除法采用雙因素拆解方法,即每一個部分、每一個維值對整體的貢獻度是由兩個因素構(gòu)成。第一個因素是波動貢獻,用AXi 表示;第二個因素是結(jié)構(gòu)變化貢獻BXi,即每部分的結(jié)構(gòu)變化貢獻。舉個例子,每個部門的毛利率都提升了但整個公司的毛利率卻下降了。原因大概率就是某個低毛利的部門銷售占比變大了,拖垮了整體,也就是我們熟知的辛普森悖論的情況。除法拆解算法中,引入BXi這部分結(jié)構(gòu)變化的貢獻,就能夠解決這個問題。
貢獻度的一個很重要的特性就是可加性,滿足 MECE 不重不漏的原則。不管哪種拆解方式,把某個拆解維度下的全部維值貢獻 CXi進行加和,都可以得到整體的變化率ΔY%。
5、指標(biāo)拆解維度爆炸問題
假設(shè)我們對某個一級指標(biāo)的異常原因進行拆解,比如銷售額或者毛利額等等,拆分的維度可以是銷售渠道或省市地區(qū),也可以按照商品的品類、新老客等。假設(shè)有 n 種拆分維度,那么就需要生成 n 個維度對應(yīng)的中間表,然后針對每個維度下面的每一個維度值Xi,去計算指標(biāo)變化,才能得到其貢獻度。
為了精準(zhǔn)地找到指標(biāo)異常的原因,面臨的問題是只拆單個維度,只能得到該維度的結(jié)論,定位不到精準(zhǔn)的問題所在。如果拆解的維度太細,比如把所有的維度都進行組合,那每一項的貢獻度又太小,還是無法得到主要的原因。所以這里需要層層的下鉆和窮舉,在各種維度組合中搜索我們想要的結(jié)論。
假設(shè)目前有 n 種拆分維度,那么就需要首先建立2n個中間表,建立中間表的過程中要確??趶揭恢?,并滿足數(shù)倉規(guī)范,工作量是非常大的。建好這些中間表之后,再分別調(diào)用拆解算法的API計算相應(yīng)的貢獻度,這就產(chǎn)生了非常大的計算和存儲消耗,即維度爆炸的問題。
6、指標(biāo)拆解維度爆炸問題優(yōu)化
為了解決維度爆炸的問題,對實現(xiàn)方案進行了以下優(yōu)化:
優(yōu)化1:把維度拆解的流程轉(zhuǎn)變?yōu)榛谪暙I度聚合。前文中提到,因為貢獻度具有可加性,首先調(diào)用一次算法計算最細粒度的末級指標(biāo)的貢獻度,然后需要哪個維度的貢獻度,就用它去做 group by 條件對貢獻度求和。這樣能夠省略中間表的 IO 過程,只需要一次算法調(diào)用,在集群上執(zhí)行求和操作也會比調(diào)用指標(biāo)拆解算法快得多。
上述是針對一級指標(biāo)進行的異常診斷,我們實際業(yè)務(wù)中還需要對二級指標(biāo)進行診斷,這種方法只需要再對貢獻度做一次歸一化即可,不需要重復(fù)計算,可以針對一級、二級指標(biāo)同時進行異常診斷。
計算效率的問題得以解決,但仍存在一個問題,即結(jié)果的空間復(fù)雜度非常大,達。假設(shè)k是平均每個維度下的維值個數(shù),單維度拆解空間
+ 雙維度拆解空間
+ 三維度拆解空間
+ n維度拆解空間
=
。
優(yōu)化2:根據(jù)實際業(yè)務(wù)需要限制維度組合實現(xiàn)剪枝,將結(jié)果的空間復(fù)雜度從降至
圖片
以內(nèi)。具體包括兩個操作,第一個是對維度進行分組,對于具有天然層次關(guān)系的維度,比如一級渠道和二級渠道,如果拆到二級渠道,其實一級渠道信息已經(jīng)有了,就不用對一級渠道和二級渠道進行冗余的組合了,只需要對于跨組的維度進行組合就可以了。第二個是限制維度組合的維數(shù),因為在歸因診斷分析的時候,實際業(yè)務(wù)不會關(guān)注到特別復(fù)雜的維度上去,一般由兩三個維度組合起來就夠用了。
優(yōu)化3:基于維度基尼系數(shù)排序,確定最佳維度,實現(xiàn)異常精準(zhǔn)定位。有了剪枝后的若干拆分度以及對應(yīng)的維值貢獻度,如何才能優(yōu)中選優(yōu),定位到主要原因呢?直觀的想法就是某個維度的粒度越細,且頭部top維值貢獻度越大,就越可能是指標(biāo)異常的最主要原因?;嵯禂?shù)是比較適合這個場景的度量方式,用1減每一部分的貢獻度的平方和越小,說明拆分維度越合理。
上圖右側(cè)舉了1個例子,針對某次銷量異常,第一種按商品維度去拆,因為每個商品的貢獻度太小,所以基尼系數(shù)非常大。第二種按照二級渠道的粒度去拆,粒度比較粗,算出來的基尼系數(shù)可能是一個比較大的值。第三種按照一級行業(yè)叉乘二級渠道去算,基尼系數(shù)很有可能更小,因為二級渠道再下鉆一層,有的部分出現(xiàn)了正的貢獻度,有的部分出現(xiàn)了負的貢獻度。正的貢獻度就是對于指標(biāo)的波動有正向積極作用的部分,負向貢獻度就是有負向作用的。在這個例子中可以看到拆分維度行業(yè)1叉乘渠道1貢獻度60%,被歸為主因,也是比較符合我們認知的。所以通過基尼系數(shù)我們能夠找到較為合理的拆分維度和導(dǎo)致指標(biāo)異常的主因。
四、QA
Q1: 請問用什么指標(biāo)評估診斷的準(zhǔn)確率?
A1: 因為我們用的是確定性診斷,結(jié)論是非常明確的。如果從單純指標(biāo)這個層面來看,是通過計算寫代碼實現(xiàn)來保證準(zhǔn)確率的。如果從業(yè)務(wù)理解的角度,比如這次異常是因為某個業(yè)務(wù)進行了某個正常的操作,或者因為其他原因?qū)е抡`報或漏報,這種情況是通過收集 badcase的方式來進行準(zhǔn)確率的評估。
Q2: 貢獻度的拆解會混合使用嗎?比如GMV的拆解,最初使用加法進行渠道拆解,后續(xù)使用乘法公式,怎樣評判使用不同拆解方式的順序?
A2: 這是一個非常好的實踐上的問題。首先,加法和乘法混合使用這個思路是可行的,可以采用貪心地方式去搜索,算出來每一步的TOP維度值對應(yīng)貢獻度及下一步拆解后的貢獻度,結(jié)合貢獻度下降的多少來確定下一步是通過加法的拆解,還是通過乘法來拆解。
另外一種思路是先按照某一個方向,比如針對電商GMV,可以先通過加法來進行拆解,不斷地拆解,拆解到最底層,比如某個商品,再對這個商品進行乘法拆解,這個商品為什么 GMV 下跌了,是流量下跌了還是轉(zhuǎn)化率下跌了等等。具體的做法需要結(jié)合實際中不同的業(yè)務(wù)需求,以及時效性、開發(fā)成本等方面的考慮。
在網(wǎng)易嚴(yán)選目前的場景中,考慮到通用性以及業(yè)務(wù)現(xiàn)狀,作為品牌電商,在外渠售賣的時候,流量、轉(zhuǎn)化率等因素對于我們來講是黑盒的,所以在我們的業(yè)務(wù)場景中,主要是以加法拆解為主。