基於Spark的用戶行爲路徑分析的產品化實踐

前言:本文爲網上轉載內容,由於跟公司做的項目相似,copy一份,細細品味。



--------------------------------------------華麗分割線------------------------------------


1.  什麼是用戶行爲路徑

用戶行爲路徑分析是互聯網行業特有的一類數據分析方法,它主要根據每位用戶在App或網站中的點擊行爲日誌,分析用戶在App或網站中各個模塊的流轉規律與特點,挖掘用戶的訪問或點擊模式,進而實現一些特定的業務用途,如App核心模塊的到達率提升、特定用戶羣體的主流路徑提取與瀏覽特徵刻畫,App產品設計的優化與改版等。

2. 路徑分析業務場景

用戶行爲路徑分析的一個重要終極目的便是優化與提升關鍵模塊的轉化率,使得用戶可以便捷地依照產品設計期望的主流路徑直達核心模塊。具體在分析過程中還存在着以下的應用場景:

i.用戶典型路徑識別與用戶特徵分析

用戶特徵分析中常常使用的都是一些如性別、地域等人口統計數據或訂單價、訂單數等運營數據,用戶訪問路徑數據爲我們瞭解用戶特徵打開了另一扇大門。例如對於一款圖片製作上傳分享的應用,我們可以通過用戶的App使用操作數據,來劃分出樂於製作上傳的創作型用戶,樂於點贊評論的互動型用戶,默默瀏覽看圖的潛水型用戶,以及從不上傳只會下載圖片的消費型用戶。

ii.產品設計的優化與改進

路徑分析對產品設計的優化與改進有着很大的幫助,可以用於監測與優化期望用戶路徑中各模塊的轉化率,也可以發現某些冷僻的功能點。

一款視頻創作分享型App應用中,從開始拍攝製作視頻到視頻的最終發佈過程中,用戶往往會進行一系列的剪輯操作;通過路徑分析,我們可以清晰的看到哪些是用戶熟知並喜愛的編輯工具,哪些操作過於冗長繁瑣,這樣可以幫助我們針對性地改進剪輯操作模塊,優化用戶體驗。

如果在路徑分析過程中用戶的創作數量與用戶被點贊、評論以及分享的行爲密切相關,就可以考慮增強這款App的社交性,增強用戶黏性與創作慾望。

iii.產品運營過程的監控

產品關鍵模塊的轉化率本身即是一項很重要的產品運營指標,通過路徑分析來監測與驗證相應的運營活動結果,可以方便相關人員認識瞭解運營活動效果。

說到這裏不得不提及一下漏斗模型與路徑分析的關係

以上提到的路徑分析與我們較爲熟知的漏斗模型有相似之處,廣義上說,漏斗模型可以看作是路徑分析中的一種特殊情況,是針對少數人爲特定模塊與事件節點的路徑分析。換句話說是一種高度的抽象邏輯。

漏斗模型通常是對用戶在網站或App中一系列關鍵節點的轉化率的描述,這些關鍵節點往往是我們人爲指定的。例如我們可以看到某購物App應用的購買行爲的漏斗轉化情況。

這款購物App平臺上,買家從瀏覽到支付成功經歷了4個關鍵節點,商品瀏覽、加入購物車、結算、付款成功,從步驟1到步驟4,經歷了其關鍵節點的人羣越來越少,節點的轉化率呈現出一個漏斗狀的情形,我們可以針對各個環節的轉化效率、運營效果及過程進行監控和管理,對於轉化率較低的環節進行針對性的深入分析與改進。

36大數據

路徑分析與漏斗模型存在不同之處,它通常是對每一個用戶的每一個行爲路徑進行跟蹤與記錄,在此基礎上分析挖掘用戶路徑行爲特點,涉及到每一步的來源與去向、每一步的轉化率。

可以說,漏斗模型是事先的、人爲的、主動的設定了若干個關鍵事件節點路徑,而路徑分析是探索性的去挖掘整體的行爲路徑,找出用戶的主流路徑,甚至可能發現某些事先不爲人知的有趣的模式路徑。從技術手段上來看,漏斗模型簡單直觀計算並展示出相關的轉化率,路徑分析會涉及到一些更爲廣泛的層面。

這塊有一個對大部分產品問題初步判定實踐,首先我們會通過用戶行爲路徑大概的瞭解一下用戶是否依照產品設計期望的主流路徑直達核心模塊。 然後結合具體的業務場景建立漏斗細看轉化。最後通過用戶細查詳細的查看具體用戶的行爲。實際在具體實踐中反覆結合這三步,我們可以得到許多有價值的信息。

36大數據

3. 諸葛用戶行爲自動化報告實踐

Sunburst Partition可視化分析探索

通過解析布點獲得的用戶行爲路徑數據,我們可以用最簡單與直接的方式將每個用戶的事件路徑點擊流數據進行統計,並用數據可視化方法將其直觀地呈現出來。

D3.js是當前最流行的數據可視化庫之一,我們可以利用其中的Sunburst Partition來刻畫用戶羣體的事件路徑點擊狀況。從該圖的圓心出發,層層向外推進,代表了用戶從開始使用產品到離開的整個行爲統計;Sunburst事件路徑圖可以快速定位用戶的主流使用路徑。通過提取特定人羣或特定模塊之間的路徑數據,並使用Sunburst事件路徑圖進行分析,可以定位到更深層次的問題。

36大數據

4. 用戶行爲路徑算法

較常用的用戶行爲路徑算法有基於關聯分析的序列路徑挖掘方法和社會網絡分析

i.基於關聯分析的序列路徑挖掘方法

提到關聯規則分析,必然免不了數據挖掘中的經典案例“啤酒與尿布”。暫且不論“啤酒與尿布”是不是Teradata的一位經理胡編亂造吹噓出來的“神話故事”,這個案例在一定程度上讓人們理解與懂得了購物籃分析(關聯分析)的流程以及背後所帶來的業務價值。

將超市的每個客戶一次購買的所有商品看成一個購物籃,運用關聯規則算法分析這些存儲在數據庫中的購買行爲數據,即購物籃分析,發現10%的顧客同事購買了尿布與啤酒,且在所有購買了尿布的顧客中,70%的人同時購買了啤酒。於是超市決定將啤酒與尿布擺放在一起,結果明顯提升了銷售額。

我們在此不妨將每個用戶每次使用App時操作所有事件點看成“購物籃”中的“一系列商品”,與上面提到的購物籃不同的是,這裏的所有事件點擊行爲都是存在嚴格的前後事件順序的。

我們可以通過改進關聯規則中的Apriori或FP-Growth算法,使其可以挖掘存在嚴格先後順序的頻繁用戶行爲路徑,不失爲一種重要的用戶路徑分析思路。我們可以仔細考量發掘出來的規則序列路徑所體現的產品業務邏輯,也可以比較分析不同用戶羣體之間的規則序列路徑。

ii.社會網絡分析(或鏈接分析)

早期的搜索引擎主要基於檢索網頁內容與用戶查詢的相似性或者通過查找搜索引擎中被索引過的頁面爲用戶查找相關的網頁,隨着90年代中後期互聯網網頁數量 的爆炸式增長,早期的策略不再有效,無法對大量的相似網頁給出合理的排序搜索結果。

現今的搜索引擎巨頭如Google、百度都採用了基於鏈接分析的搜索引擎算法來作爲這個問題的解決方法之一。網頁與網頁之間通過超鏈接結合在一起,如同微博上的社交網絡通過關注行爲連接起來,社交網絡中有影響力很大的知名權威大V們,互聯網上也存在着重要性或權威性很高的網頁。將權威性較高的網頁提供到搜索引擎結果的前面,使得搜索的效果更佳。

我們將社交網絡中的人看作一個個節點,將互聯網中的網頁看作一個個節點,甚至可以將我們的App產品中的每一個模塊事件看作一個個節點,節點與節點之間通過各自的方式連接組成了一個特定的網絡圖,以下將基於這些網絡結構的分析方法統稱爲社會網絡分析。

社會網絡分析中存在一些較爲常見的分析方法可以運用到我們的路徑分析中來,如節點的中心性分析,節點的影響力建模,社區發現等。通過中心性分析,我們可以去探索哪些模塊事件處於中心地位,或者作爲樞紐連接了兩大類模塊事件,或者成爲大多數模塊事件的最終到達目的地。通過社區發現,我們可以去探索這個社會網絡中是否存在一些“小圈子”,即用戶總是喜歡去操作的一小部分行爲路徑,而該部分路徑又與其他大部分模塊相對獨立。

5. 用戶行爲路徑產品化實踐

下面是一個大致的用戶行爲路徑產品需求導圖

36大數據

我們大體目標要完成基於人數和次數的用戶行爲路徑,可以支持從任意事件起下查後續行爲或者上查來源行爲,並且要支持任意30天時間行爲路徑的查看。最重要的一點是強調用戶體驗需要較實時處理獲得結果。根據上述這些需求,我們給出基於Spark的用戶行爲路徑實踐。

6. 基於Spark的用戶行爲路徑

Spark是一個基於內存計算的開源集羣計算系統,目的是更快速的進行數據分析

下面是一個Spark的套件圖

36大數據

伯克利將Spark的整個生態系統稱爲伯克利數據分析棧(BDAS)。其核心框架是Spark,同時BDAS涵蓋支持結構化數據SQL查詢與分析的查詢引擎Spark SQL,提供機器學習功能的系統MLbase及底層的分佈式機器學習庫MLlib、並行圖計算框架GraphX,流計算框架Spark Streaming。這些子項目在Spark上層提供了更高層、更豐富的計算範式。

下面簡單介紹一下Spark的 Yarn-Cluster任務提交流程

36大數據

1. Spark Yarn Client向YARN中提交應用程序,包括ApplicationMaster程序、啓動ApplicationMaster的命令、需要在Executor中運行的程序等;

2. ResourceManager收到請求後,在集羣中選擇一個NodeManager,爲該應用程序分配第一個Container,要求它在這個Container中啓動應用程序的ApplicationMaster,其中ApplicationMaster進行SparkContext等的初始化;

3. ApplicationMaster向ResourceManager註冊,這樣用戶可以直接通過ResourceManage查看應用程序的運行狀態,然後它將採用輪詢的方式通過RPC協議爲各個任務申請資源,並監控它們的運行狀態直到運行結束;

4. 一旦ApplicationMaster申請到資源(也就是Container)後,便與對應的NodeManager,要求它在獲得的Container中啓動啓動CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend啓動後會向ApplicationMaster中的SparkContext註冊並申請Task。這一點和Standalone模式一樣,只不過SparkContext在Spark Application中初始化時,使用CoarseGrainedSchedulerBackend配合YarnClusterScheduler進行任務的調度,其中YarnClusterScheduler只是對TaskSchedulerImpl的一個簡單包裝,增加了對Executor的等待邏輯等;

5. ApplicationMaster中的SparkContext分配Task給CoarseGrainedExecutorBackend執行,CoarseGrainedExecutorBackend運行Task並向ApplicationMaster彙報運行的狀態和進度,以讓ApplicationMaster隨時掌握各個任務的運行狀態,從而可以在任務失敗時重新啓動任務;

6. 應用程序運行完成後,ApplicationMaster向ResourceManager申請註銷並關閉自己。

下面給出我們整體行爲路徑的數據流向以及請求過程

36大數據

數據收集:

互聯網行業對數據的獲取有着得天獨厚的優勢,路徑分析所依賴的數據主要就是服務器中的日誌數據。用戶在使用App過程中的每一步都可以被記錄下來,這時候需要關注的便是優秀的布點策略,它應當與我們所關心的業務息息相關。事實上,在每個App裏,不是所有事件都有着同樣的價值,基於對核心事件的深度分析需求,推薦大家使用層級化的自定義事件布點方式,每一個事件由三個層次組成的:事件(Event)、屬性(Key)和屬性值(Value)。

數據清洗:

在ETL階段我們會把收集到的Android/IOS/JS SDK數據進行統一的處理,從上述的JSON格式裏面取出預定義好的字段(我們需要的一些信息)寫入本地文件中。

數據獲取:

將寫好的本地文件通過定時加載程序加載到Inforbright裏面,得到一系列的基礎表。然後從這些基礎表裏通過跑批程序跑出方便查詢和使用的一些彙總表。

爲了減少Spark實時內存計算壓力我們將用戶行爲路徑核心算法過程分爲離線部分和線上請求部分。如下:

中間結果計算:

回溯之前第五節說到產品需求,要完成這些需要(人數,次數,後續行爲,來源行爲,30天時間內任意查詢),我們需要從數據庫裏獲取事件ID,會話ID,事件觸發時間,設備ID,用戶ID這些信息。如圖所示:

36大數據

下面重點來了,首先我們會將上述信息做一些處理。

原則就是將一個會話ID下面的同一個用戶ID的所有事件按照事件發生的順序進行排序。這塊爲了進一步減少之後Spark內存使用我們會將所有超長ID進行一次map。 例如下圖中最後一列的1表示的就是map過後的會話ID。第三列表示的是用戶ID第五列和第六列表示的是這個會話ID內事件對發生的順序。第一列和第二列表示的是具體的事件對。

36大數據

具體解讀一下圖中的信息:

用戶ID爲16351的用戶在其map過後ID爲1的會話中的事件

正序順序 8532810 -> 7232351 -> 7232351 -> 8532810 -> 8532810 -> 7232351 -> 8532810 -> 8532810 -> 565 -> 8532810 -> 6907797 -> 565

逆序順序 565 -> 6907797 -> 8532810 -> 565 -> 8532810 -> 8532810 -> 7232351 -> 8532810 -> 8532810 -> 7232351 -> 7232351 -> 8532810

你會發現按照上述的過程,我們將獲取到的原始數據進行離線轉化後,新的數據就會天然的支持我們的產品需求:人數,次數,後續行爲,來源行爲。對於30天內任意時間查詢,我們也做了特殊的處理。我們會將每天的數據存放在一個文件裏面,這樣就會有30個用天數命名的文件,這樣每天的離線計算只需要進行增量的部分。這種做法會大大節省我們離線部分計算的開銷。

數據計算:

由於在離線部分準備的充分,故在Spark實時計算階段我們只需要將數據Load到內存後通過一系列的Spark RDD算子查出我們需要的結果即可。當然按照離線計算後數據格式的特點結合我們的具體產品需求,在Spark處理過程中也是有不少小技巧可循,例如查詢某個條件的用戶行爲路徑可以只使用filter算子就可以得到結果,今天就不多贅述了。

數據請求:

前端的請求會通過Redis的訂閱和發佈機制告訴Spark提交相應的任務到集羣。

下面是諸葛用戶行爲路徑的demo數據

36大數據

文章部分參考諸葛io吳揚的《新技能get | 如何做用戶行爲路徑分析》.

Q&A

Q1:上面可視化分析的圖好難看懂。能仔細解釋一下嗎?

李亮:這個圖其實是轉自我司CS團隊的經驗,是來對大部分產品問題初步判定的一個實踐。具體的操作是結合用戶行爲路徑,漏斗,用戶細查這三個功能的結合,看出問題端倪。

Q2:您說到用戶行爲路徑算法有兩類算法: 關聯分析 和 社會網絡分析 從您的講座來看,貌似使用的關聯分析的算法,然後因爲大數據量的問題,使用了很多方法減少內存數據量。 是的嗎? 您能大體說一下這類算法在功能上的優缺點嗎?

李亮:其實我的用的方法不算是關聯規則,關聯規則在用戶行爲路徑的實踐更多的是挖掘存在嚴格先後順序的頻繁用戶行爲路徑,而我將整個過程分成離線部分和線上部分完全是來滿足我司產品苛刻要求下的一些想法。不過通過這樣的分離確實能起到減少後面Spark的內存使用量。

Q3:中間結果計算,關於數據的時序組裝能否再細緻說一下?

李亮:在同一個會話中,所有事件都是按照事件排序組關聯,所以一組會話值,從前到後是正序時序,從後到前是逆序時序。



李亮,諸葛io創新產品部 架構師。前Intel 移動事業部算法成員,在Intel期間,獲得4項專利授權。5年機器學習和數據挖掘經驗。現關注點爲大規模機器學習算法,流式機器學習算法,場景化數據分析。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章