作者 | 沅沅
點選檢視視訊連結
大家好,我是來自阿裡巴巴集團阿裡雲計算平台事業部Dataworks團隊的劉樂元,花名叫沅沅,很榮幸能在第十五屆D2大會上和大家做一次分享 。我此次分享的主題是《深入剖析海量資料場景下的使用者行為分析方案》。
什麼是使用者行為分析?
我們認為使用者行為分析是一系列發現問題、定位分析問題以及驗證結果的一個過程。舉例來說,有時一個産品的新功能上線,通過使用者的流失漏鬥我們能夠發現使用者在某一步操作的時候使用者流失很大,這個時候就發現問題了。你會考慮使用者為什麼流失了,流失去了哪裡,這個時候通過行為分析可以去定位并且分析問題。最後通過流失漏鬥手段驗證問題得到了解決。這樣的一整個過程就是使用者行為分析。這個時候如果僅僅通過人肉去做使用者行為分析,不僅成本高而且容易出現錯誤或者疏漏,是以我們需要通過工具來輔助我們來完成這個事情。
業界現狀
接下來我們先來了解一下業界使用者行為分析工具的現狀。
先來看一下谷歌分析,谷歌分析作為行業内的泰鬥,它在使用者行為分析上提供了使用者的轉化漏鬥和使用者路徑桑基圖兩個功能。
然後是Growing IO, Growing IO是國内知名的資料增長平台,它在使用者行為分析上提供了使用者的轉化漏鬥和基于轉化的簡易路徑圖兩個功能。
最後是神策資料,神策資料也是國内知名的資料分析平台,它也提供了轉化漏鬥和使用者路徑的桑基圖。
以上是對三種産品的初略介紹,有興趣的也可以再深入的進行了解,基于之前說的行為分析有發現問題、定位分析分析問題和驗證問題的能力,但聽完之後大家是不是總覺得他們少點什麼?是的,他們具有初步定位問題和驗證結果的能力,但是缺乏深入分析問題的能力。其實使用者為什麼流失、流失去了哪裡才是解決問題最需要關注的。好比你去醫院看病,醫生告訴你你有病,但是就是不告訴你哪裡有病,這樣是治不了病的。
講了三個優秀的産品,那我們有什麼呢?
下面簡單看一下我們平台的示意圖,這個是漏鬥圖和輔助柱狀圖。通過漏鬥圖可以很直覺的看到使用者在每個環節的到達情況,能幫助我們快速的發現問題。柱狀圖展現的是操作之間的耗時和操作的次數,因為有些時候單從轉化是看不出問題的。這兩個名額也是我剛剛提到的更多名額的其中兩個。這兩個也是對使用者行為分析很重要的兩個名額,但往往會被大家忽視。
接下來是鍊路圖,問題的發現不僅僅可以在漏鬥圖中可以展現,在鍊路圖中同樣可以展現,并且我們在鍊路圖提供了分析問題的能力。比如你發現在某一步使用者流失極大,可以基于該節點進行節點下鑽,分析使用者流失去了哪裡。
技術剖析
看完平台的小部分示意圖之後該對我們的能力進行剖析。
行為分析的核心難點有很多,這裡主要就分析兩個,海量資料分析和鍊路的可視化展示。
首先是海量資料分析,資料分析場景是非常複雜的,我們先講一個最簡單的場景。
假設我們期望使用者的使用鍊路是A到B到C,然而使用者的實際鍊路五花八門,單從提供的這兩份資料,我們最基本的需求,是要得到的是到A的有多少,從A到B的有多少,最後從A到B到C的有多少,這是計算轉化率最基本的場景,在隻有十幾條或者幾百條資料的情況下,你說你可以通過nodejs,java等傳統的開發語言用循環等可以得到啊,這有什麼難的?
我想說事情沒有想的那麼簡單哦!使用者行為往往一天都有好幾十億的資料量,你再寫循環,你的性能還能不能頂得住?更何況還需分析連續好幾天甚至一個月的資料,而且光分析轉化是不夠的,有時候步長、時長、轉化方差标準差等多種名額是很必要的,我們通過複雜的運算提供了十多項的資料名額,這些複雜的運算在海量資料場景下,計算效率和性能值得考究,是以我們需要用大資料開發體系,來支撐這些複雜的場景。
接下來我分析一下我們這套系統的一個簡易大資料體系架構,因為這個實際的架構太過複雜我做了簡化,幫助大家了解。我們從下往上看,首先在資料的采集層需要将使用者的行為資料進行采集之後,進入資料的持久化層,在這一層需要進行資料的預處理和資料的存儲,然後到了資料的應用層,首先需要對存儲的資料進行分析和計算,具體需要通過開源大資料引擎,hadoop或者阿裡雲maxcompute大資料引擎對資料進行分析計算,這邊我們提供了實時計算和離線計算生成報表,然後将資料導到mysql或者阿裡雲的rds,提供對外的資料節後。最後上層應用通過接口的調用實作一些可視化展示的工作等。
基于這一套大資料體系架構的優勢主要有四點,第一能夠支援海量資料的計算和存儲;第二是能夠滿多種時效性的要求,可以實作實時和離線的計算,第三通過多租戶的架構實作資料的實體隔離,第四提供優秀的資料的整合能力。
接下來看一下資料的流程圖,我們從左往右看,首先是是資料的采集,這一部分我們提供了兩種資料采集的方式全自動采集和發送自定義事件;然後對資料進行一個規範和過濾,接下來開始和使用者定義的第一個節點進行比對,比對上的資料需要做兩部分工作,第一部分工作是進行鍊路的比對,比對又分為單次比對和多次比對,比對上的資料需要計算一些名額,這些名額主要是為漏鬥圖做資料支撐。第二部分工作是需要共建使用者的行為樹,最後也需要計算一些名額,這些名額是給鍊路圖做資料支撐。基于這套體系我會就鍊路比對和我建構使用者行為樹展開說明。
先看鍊路的比對,這個鍊路的比對主要給漏鬥圖、柱狀圖等做資料支撐。這裡會涉及到兩份資料,一份是定義的主鍊路資料,假設你定義的使用者使用路徑是a-b-c,另一份是使用者實際使用的鍊路,這裡舉了兩條鍊路。第一步需要對主鍊路的每個節點添加辨別,添加辨別的目的是為了簡化使用者的操作,節約計算資源,對于主鍊路的三個節點按照順序添加數字辨別,對于使用者的實際使用的鍊路要先進行資料的預處理,包括了字段的規範和資料的過濾等等,然後再添加數字辨別别,這個時候能把和主鍊路無關的節點排除過濾掉,就像第二條鍊路的D操作,在主鍊路是沒有的,是以後面肯定也比對不到,是以可以進行排除。然後就可以準備比對了,實際鍊路去比對主鍊路,要做這個事情通過單純的sql很難做到,是以需要借助udtf函數,要用這種函數需要把參數也就是這裡的主鍊路資料和實際使用鍊路的資料進行多行轉一行的操作。然後再把處理好的這兩份資料傳進udtf裡面進行主鍊路比對。最後比對出的結果這樣的一份資料,這裡紅色數字就是代表使用者的操作在這條鍊路的位置。接下來需要将一行轉多行獲得最終的比對資料,通過鍊路、操作和位置可以準确的定位一次操作,最後基于這份資料可以和操作的原始資料進行關聯,進而可以計算出步長、時長的一些名額。
講完鍊路的比對的實作接下來講一下如何建構使用者的行為樹。這個使用者行為樹主要是給鍊路圖的深入分析能力做資料支撐。現在有兩個使用者,他們的操作分别是A-B-C-D,A-B-D-C,我們需要将這兩個使用者操作進行關聯,具體來說需要對同一層的同一個節點進行合并并且統計數量,比如這兩個使用者的前兩部操作都是ab是以前兩層節點應該合并,并且統計一下數量,是以建構出的使用者行為樹的邏輯圖如圖所示。
具體的也是用sql來實作的,第一也是要對每個節點建立辨別,建立辨別之後需要通過節點的順序建立父子關系。對于一棵樹而言路徑是必不可少的,是以需要通過父子關系建構路徑,有了父子關系和路徑就可以進行合并和統計數量了,最後就會得到一棵樹的資料。
在MaxCompute大資料引擎中使用者資料超191億的場景下,計算各種名額的時間隻需7分鐘,是以可以說在百億級别的資料量實時計算隻需要幾分鐘。基于第一部分海量資料分析的剖析就到這裡結束。
接下來是鍊路的可視化展示的技術。在這一塊做了大量的嘗試,踩了很多坑,接下來給大家講講我們的心路曆程。
這個是我們最初版本的鍊路圖的效果。還有基于某個節點下鑽展開的示意圖。
别看剛剛那個圖比較簡陋,但是完成這樣的效果需要大量的工作。在這之前我先給大家科普一下幾種圖的分類。第一,分層圖,分層圖是一種帶有層級關系的有向五環圖。第二,複合圖,複合圖是有組級關系的一種圖。第三是分層複合圖,它是一種既有分層結構有組級關系的一種圖,我們的鍊路圖就是一種複雜的分層複合圖。要實作一個比較好的分層複合圖,需要完成三部分工作。節點分層、層内排序還有整體的優化。下面我會挑幾個有意思的點和大家進分享。
先來看節點分層中的圓形去環路,去環是因為環路的存在會導緻分層結果多樣化,既不利于分層,又會導緻結果的不穩定。通過下圖的案例來展示該問題,從圖中可以看到A-B-C-A構成了一條環路,那麼生成的分層圖可以以A為頂層,也可以以B為頂層,又或者以C為頂層,得到三種不同的結果。當環路增多時,那麼結果集可能會更多。從過程來看,環路不利于對分層結果的優化,容易在分層過程中陷入循環。從互動體驗上來看,每次布局結果都不同會造成不好的使用者體驗。了解了去環操作的必要性之後,開始對有向圖進行去環,去環過程主要包括(1) 檢測環路 (2) 打破環路 。第一,檢測環路,從任意起點深度優先搜尋,如果已通路的節點被再次通路,則說明有環。第二,打破環路。打破環路有許多方法:可以把環内節點收縮為一個節點,或者把環内節點排布在同一層級。收縮成一個節點會誤認為是屬于同一個分組,排列在同一層級則丢失了環路的層級結構。是以我們這邊提出的是一種反轉環路中的邊去打破環路的方法,具體來說吧檢測到環路的節點的的之前的一條邊方向反置,如這個圖的B-A,反轉成A-B,這樣環路就打破了。然後就能生成固定的分層結構。在最終渲染的時候把之前反轉的邊再反轉回去就可以了。
再來看節點分層的一個層級配置設定的處理,對于有向圖來說,要形成一種層級圖的方式有很多,我們這邊首先采用長邊路徑的算法能快速的給每個節點配置設定初始層級。比如現在這個圖最長邊是a-g-h-i-l,然後從最下一層依次往上按照層級排列上去,這樣做的目的是能夠快速的畫出層級。但這這個的缺點有兩個,第一會産生不必要的長邊,第二節點會堆積在底層。是以還需要使用網絡單純算法疊代的切割長邊,用來産生更緊湊的圖。
接下來是層内排序中的長邊切割的處理,從圖上可以看出,現在A-L的這條邊已經影響到了G的一個展示,是以需要對這條長邊進行切割,具體的需要引入虛拟節點,将AL之間的邊斷開,然後引入虛拟節點,再将al和虛拟節點進行連接配接,就能得到最終切割的效果圖。
最後再分享一個層内排序中的節點排序,雖然通過長邊切割等方法,能夠有效的去除層級之間的一些交錯邊,但是對于節點之間還是會有很多交錯的情況,如這個圖所示。是以需要對節點重新進行排序。我們采用的是一種啟發式的算法來逐漸優化交錯。首先給出每一層節點的初始化順序。然後執行一系列疊代嘗試改進這個順序。每次疊代從第一層周遊到最後一層。涉及到兩種資料,權重排序,每一層的權重來源于上一層的排序。比如第一步頂點A 的權重是0,他的兩個子節點的權重也是0,但是同一層有先後順序,這裡D的順序是0,G的順序是1.然後看下一層。也就是第三層,第三層每個節點的權重和父節點的排序相同,因為D的排序是0,是以D的兩個子節點F和B的權重都是0,而H的權重等于G的排序,也就是1.是以需要将B和h換個位置。依次類推,看第四層。第四層每個節點的權重等于父節點的排序。這裡的I來源于H,是以他的權重是2,C來源于F和B兩個節點,是以權重是排序的平均值,是0.5,是以最後c和i需要調換位置。最後一層e隻需放在父節點下面即可,這樣就能達到交錯大大減少的一種渲染圖。
經過我們不懈的努力,在複雜場景下的效果圖如上,很明顯這個圖效果不佳,不能滿足我們快速分析鍊路的需求。
後來經過我們的深入分析,使用者操作的不确定性和複雜性,是以要通過一張鍊路圖全部進行展示,達到分析問題的能力是不現實的,是以我們轉換了思路,将節點下鑽的能力重新設計和簡化,實作的效果如圖所示, 當我們對一個節點進行下鑽時,不會把所有的鍊路進行展示,而隻是展示第一層,并且将層内流量最多的6層展示出來,甯外我們會将未回到主鍊路的這些,也就是流失的操作放在節點底下進行區分,基于這種設計實作了兩個效果,第一通過将主鍊路的流程和流失的流程進行拆分,這個時候你隻需要關注你該關注的地方,讓分析更加清晰。第二,我們在展示子鍊路的時候隻展示流量最大的前六個,這樣能讓分析更加聚焦在流量最大的鍊路上。通過澤陽一個過程,我們也想告訴大家其實有時候碰到難題不一定要執着用技術去解,我們要找到問題的核心訴求,從全面的角度去分析問題。
未來展望
至于未來我們會往智能鍊路的道路發展 。
語雀,它的産品模式比較特殊,同樣一個建立文檔的流程會有很多的入口,我可以直接從首頁的建立口子去建立,可以進到文檔庫裡去建立,也可以進入知識庫裡去建立,等等,這種場景下如果去指定鍊路進行分析,一個是成本高,一個是容易出現遺漏。
那如果有智能鍊路分析,我們就能實作三個點:
- 我隻需要設定某個操作點,或者設定開始和結束點,我就可以分析出使用者比較常用的鍊路,分析成本很低,而且非常完整,不容易出現遺漏
- 判斷這些鍊路是否符合我們的預期,可以從全局的角度更有效地去發現問題,解決問題。舉個栗子,比如某條鍊路我們認為是非常重要的,也是我們認為的主流程,但經過分析我們發現,這條鍊路幾乎沒人走,大家更多走了另一條鍊路,這個時候就可以去分析是主鍊路出現了問題,還是說使用者走的鍊路就是一條更優的鍊路,進而可以幫助做決策。
- 通過這些常用鍊路,我們就可以将使用者比較常用的功能或者入口放到更醒目的位置,來提升使用者體驗
小福利
最後因為這個工具在阿裡内部(阿裡體驗管理平台AEM)廣泛使用,目前還未對外公開,是以在分享的最後我們有個福利。
我們會把一整套的分析能力整理成一個大資料的經典案例,放到阿裡雲上供大家免費使用,屆時大家隻需要根據我們的需要采集到使用者資料存到指定的表内,然後通過我們提供的資料分析能力進行行為分析,産出結果資料,大家可以自己拿到結果,通過可視化方式展現結果,進而搭建整套使用者行為分析平台。
這裡有一個釘釘群的二維碼,有興趣的同學可以掃碼進群,我們一起讨論研究。
🔥第十五屆 D2 前端技術論壇 PPT 集合已放出,馬上擷取
關注「Alibaba F2E」
回複 「PPT」一鍵擷取大會完整PPT