用戶路徑分析之利器:“?;鶊D”
編輯導語:對用戶路徑的了解可以讓團隊更了解用戶行為與使用習慣,進而推動產品迭代優化,在具體方面有所改進,提升用戶的使用體驗。?;鶊D是分析用戶路徑的有效方法之一,本篇文章里,作者對?;鶊D進行了介紹,一起來看一下。
本文約4千字,讀完需要20分鐘,后半部分有實操,可以拿出小本本練習。
一、引言
作為一名產品經理,我們經常會聽到這樣的描述:“用戶進入xx頁面后,點擊這里,跳轉到xx頁面,然后再點擊xxx 跳轉到xx頁面?!?/p>
產品是這樣設計的,但是用戶是否真如你設計的那樣走?
未必。
那么用戶到底是怎么使用產品的,真實世界中的用戶的旅程是什么樣子,你需要一張?;鶊D。
名字聽起來有些陌生??沒關系,本文就帶你走一遭,講講?;鶊D的前世今生,?;鶊D在互聯網產品分析領域的應用,?以及如何用python將一個常見埋點數據CSV文件做出漂亮的?;鶊D。
二、?;鶊D的前世
提起?;鶊D,要感謝以下這兩個人,可以說是?;鶊D的爺爺和爸爸。
左查爾斯.約瑟夫.米納德,法國工程師,數據可視化大師;馬修·亨利·菲尼亞斯·里亞爾·?;?,愛爾蘭人,蒸汽機引擎設計工程師。
1869年,查爾斯·米納德(Charles Minard)繪制了《1812年拿破侖東征圖》。這張圖形象地描繪了拿破侖在1812到1813年進攻俄國時所遭受的災難性損失。
圖片來源于網絡
圖中黃色為進軍路線,黑色為撤退路線,線條的寬度代表拿破侖的軍隊人數變化。從圖中可以清楚地看到,在深入寒冷的俄國腹地時,拿破侖軍隊的人數在逐漸地減少,到黑色線條撤退返回時,線條細得都快看不見了(活著返回法國的只有1萬余人)。這張圖也被認為是“數據可視化”的經典之作。
然而,讓?;鶊D廣泛應用于科學工程領域的,還是要感謝馬修·亨利·菲尼亞斯·里亞爾·?;∕atthew Henry Phineas Riall Sankey)。桑基圖(Sankey chart)也是以此人命名。
1898年,?;谝黄枋瞿芰啃实奈恼轮挟嬃诉@樣一張圖。
圖片來源于網絡
在文中,他對這張圖是這樣解釋的:當能量在蒸汽機的各個部件中傳輸時,都會有能量損失,要提高能量傳遞效率,需要知道哪些步驟中流失比較嚴重。
熱量傳遞如下圖箭頭所示,其中箭頭的寬度代表能量的大小,可以從圖中看到每個步驟中能量損失。
從此以后?;鶊D被應用于各個領域,比如農業領域中追溯農產品的走向、社會學領域研究人口的流向、醫學領域研究病例發展的流向。
而在互聯網產品中,?;鶊D也被廣泛采納,主要用于用戶路徑分析。比如,用戶在首頁開始,分別流向了哪些頁面,之后又流向了哪里。
以下圖為例,非常直觀地表現了用戶從Play song or video開始向其他頁面的流轉以及過程中的跳失量(跳失量由黑色表示)。
自然而然,我們不由地要提一個問題,有時候我們也想知道,達到某頁面或者執行某行為的用戶都從哪里來,于是就有了?;鶊D的變種,可以理解為“逆向?;鶊D”。即設定一個終點,看看用戶從哪里來,如下圖所示。
三、?;鶊D的價值
可以看到,桑基圖能非常直觀地展現用戶旅程,尤其是用戶旅程紛繁復雜的時候,桑基圖能很直觀地表現出用戶的使用習慣,幫助我們了解用戶行為,從而進一步提高產品體驗。
根據個人經驗,桑基圖可以在以下幾個方面提高產品和用戶的契合度:
- 找到主流流程,幫助確定轉化漏斗中的關鍵步驟。
- 看用戶主要流向了哪里,發現用戶的興趣點,尋找新的機會。
- 發現被用戶忽略的產品價值點,修正價值點曝光方式。
- 發現用戶的流失點。
- 找到有價值的用戶群體。
1. 找到主流流程,幫助確定轉化漏斗中的關鍵步驟
比如下圖(仔細看圖)中,我們將每一步占比最高的流程摘出來,得到最最主流的步驟,即Play Song or Video → Favorite Song or Video → Share Song or Video → Search Song or Video → Select Song or Video。
2. 發現被用戶忽略的產品價值點,修正價值點曝光方式
在上圖中,我們發現執行了Seach song 的用戶持續走到下一步的可能性會更大,然而在第二步并沒有search song 操作,在第三步,也只有9.48%的用戶選擇了search song,是不是可以考慮加強Search song功能的曝光。
3. 看用戶主要流向了哪里,發現用戶的興趣點,尋找新的機會
比如上圖中,我們發現Concert landing Screen中執行Purchase ticket動作的比例高達75.13%, 可以看出用戶是對Concert landing Screen到Purchase ticket的轉化率是極高的,可以發現用戶對Purchase Concert ticket的興趣是很高的,后續產品可以考慮增強這一塊的投入。
4. 發現用戶的流失點
上圖可以看出,每一步用戶的累計跳失率是:15.82%, 29.61%, 41.64%, 52.19%,每一步的凈跳失率就是:
15.82%,13.79%(29.61%-15.82%),12.03%(41.64%-29.61%),10.55%(52.19%-41.64%)。
第一步的的跳失率是最高的,結合之前的分析,產品側可以考慮通過search song來降低跳失率。
5. 尋找新的價值潛力點
share song是app實現裂變拉新的一個渠道。
我們可以看到share song之后的群體一大部分去了Search song,但是search song之后,卻沒有share song,到底是因為search song 沒有快捷分享通道,還是因為用戶不愿意分享,就要結合具體情況分析了。是不是可以在search song后鼓勵用戶分享,達到拉新的目的。
當然,?;鶊D主要適用于用戶路徑相對復雜的應用,如果只是簡單路徑的分析,則有點大炮打蒼蠅的感覺了。
四、怎么做?;鶊D
?;鶊D這么好,那么?;鶊D怎么做呢?
首先來剖析一下?;鶊D的組成,?;鶊D想要表達的是流向問題,那么就需要知道從哪里(起點)到哪里(終點),流了多少(流量)。
這句話中有三個要素,我個人稱之為點、線、面:
- 點:即流向的起點和終點。
- 線:即哪些起點和終點間有流量。
- 面:這些的量有多大(用面寬表示)。
以我的知乎文章頁面為例,我想知道進入到文章頁面的人都流向了哪里,?這里我把知乎頁面做了簡化,假設該頁面只有以下三個鏈接。
那么這里點就是:
- 起點:知乎個人主頁文章;
- 終點:是A文章, B 文章, C文章。
線就是:
- 主頁 → A文章;
- 主頁 → A文章;
- 主頁 → A文章。
假設到A、B、C文章的人數分別是100、200、300,那么面(寬)就是100、200、300。所以要做出?;鶊D,就是尋找點、線、面的問題。
目前市面上有很成熟的工具做出?;鶊D,比如神策數據的用戶路徑分析就可以完成。
但如果沒有成熟的工具支持,我們只能自己動手、豐衣足食了,不過前提是需要有完備的埋點數據,如果連埋點都沒有,只能是巧婦難為無米之炊,快快把自己項目的埋點體系建立起來【參考文章:數據人該知道的埋點體系】。
接下來我們就看一下如何從最原始的埋點數據中自己動手造出桑基圖。
以下內容比較枯燥,需要大家仔細看圖,也可以準備好小本本寫一寫、畫一畫。
如下圖,我們的PV(Page visits)埋點原始數據(已做脫敏處理)有三列(其他不相關的列已隱藏):
表格中的幾列分別是:
- 當前頁面的URL: 即有哪些起點或者終點。
- session_id: 用于確認屬于同一會話的PV頁面訪問。關于session(會話)的定義自行百度。
- 訪問順序:即同一會話中頁面訪問的順序。
舉個例子,表格前兩行的意思是某次會話中(16094237690031612632975|64)用戶第一次訪問的頁面是xxx.com/home,第二次訪問的頁面是:xxx.com/company/home。
我們來從這個表中找到點、線、面。
1)點
以起點為例,我們需要找到用戶第一次訪問的頁面都有哪些?,那么用excel過濾出訪問順序==1的頁面,去重,就得到第一次被訪問的頁面的集合。
同理得出第二次被訪問的頁面的集合。這樣就得到了頭兩次被訪問的頁面節點:
2)線&面
接下來我們需要知道兩個步驟節點之間是否有聯系。
以第一個頁面xxx.com/home為例,需要知道第一次訪問頁面xxx.com/home,并且第二次訪問xxx.com/company/home有幾個session。
這其實就是一個數學集合問題, 先找到以xxx.com/home為第一次訪問頁面的sessionID集合A, 再找到以xxx.com/company/home為第二次訪問頁面的sessionID集合B, 取集合A和集合B的交集中元素的個數,就得到這個“面”的寬度,即流量。
照此,我們可以得出第一次訪問頁面xxx.com/home,并且第二次訪問xxx.com/company/home有3個session, 如下圖:
那么這兩個頁面之間的連接就是3。
以此類推,得到以xxx.com/home為起點的session,對這些session中,第二次被訪問的頁面進行計數,就可以得到對應的訪問流量分布,如下圖:
同理,再分別計算出以xxx.com/order/manage/list, xxx.com/traffic/serving, xxx.com/fund/fund-withdraw 為起點的流量分布,從而得出一張不怎么好看的?;鶊D:
而這張圖的背后就是如下的數據:其中traffic就是對應的流量大小,也就是?;鶊D中線的寬度。
這樣,意味著我們要實現源數據到?;鶊D數據的轉化:
接下來我們就用python 代碼實現這一轉變。
五、用Python實現桑基圖
1. 點
#讀取PV數據
filepath = ‘/Users/jigege/Desktop/sankey/PV_data.csv’
pvData = pd.read_csv(filepath)
#獲取前兩步?;鶊D的節點,首先定義一個數組,數組元素是每一步對應的節點數組
SankeyNodes = []
#作為示意,我們僅考慮訪問順序==1和2的數據
for i in range(2):
#過濾出訪問順序為i的頁面,用drop_duplicates()去重得到節點
SankeyNodes.append(pvData[pvData[‘Sequence’] == i+1][‘CurrentPage’].drop_duplicates().values)
SankeyNodes
得到?;鶊D點的數組如下:
[array([‘xxx.com/home’, ‘xxx.com/order/manage/list’,
‘xxx.com/traffic/serving’, ‘xxx.com/fund/fund-withdraw’],
dtype=object),
array([‘xxx.com/company/home’, ‘xxx.com/product/manage/list’,
‘xxx.com/traffic/serving’, ‘xxx.com/order/manage/list’,
‘xxx.com/fund/account-statement’, ‘xxx.com/home’,
‘xxx.com/fund/fund-home’], dtype=object)]
2. 獲取線&面
#獲取?;鶊D的線&面
#初始化?;鶊D數據,列名分別為’source’:流量起點,’target’:流量終點,’traffic’:流量大小
sankeyTraffic =pd.DataFrame(columns = [‘source’,’target’,’traffic’])
#遍歷第一步的節點
for i in range(len(SankeyNodes[0])):
#得出第一步中各個節點對應的session_id列表
sourceSessionList = pvData[(pvData[‘CurrentPage’]==SankeyNodes[0][i])&(pvData[‘Sequence’]==1)][‘session_id’]
#遍歷第二步的節點
for j in range(len(SankeyNodes[1])):
#得出第二步中各個節點對應的session_id列表
targetSessionList = pvData[(pvData[‘CurrentPage’]==SankeyNodes[1][j])&(pvData[‘Sequence’]==2)][‘session_id’]
#算出同時訪問過第一個頁面和第二個頁面的session個數,即為流量;用isin函數判斷第二個頁面的session列表是否在第一個頁面的session列表中
Traffic = targetSessionList.isin(sourceSessionList)[lambda x: x==True].count()
#用append函數將算出的’source’:流量起點,’target’:流量終點,’traffic’:流量大小添加到?;鶊D數據中
sankeyTraffic=sankeyTraffic.append({‘source’:SankeyNodes[0][i],’target’:SankeyNodes[1][j],’traffic’:Traffic}, ignore_index=True)
3. 繪制?;鶊D
#繪制桑基圖有兩個包,一個是pyecharts.charts, 另外一個是holoviews,我們選擇了holoviews。
#但holoviews不允許source 和target當中有重復項,所以將source和target分別加上后綴,避免兩列中的重復項
sankeyTraffic[‘source’] = sankeyTraffic[‘source’].apply(lambda x: x+’_source’)
sankeyTraffic[‘target’] = sankeyTraffic[‘target’].apply(lambda x: x+’_target’)
#引入相關的python 包,需要預先安裝holoviews,plotly等package
import holoviews as hv
import plotly.graph_objects as go
import plotly.express as pex
#導入對應的擴展組件hv.extension(‘bokeh’)
#繪制?;鶊D,一步完成!
hv.Sankey(sankeyTraffic,kdims=[“source”, “target”], vdims=[“traffic”] )
當然,如果你有興趣,在一個最簡單的只描述的一步的桑基圖完成之后,可以探尋更加完整復雜的多步?;鶊D。其實原理都是一樣的,本文就不再贅述。
大家也可以參考文章:
How to Plot Sankey Diagram in Python Jupyter Notebook [holoviews & plotly]? by Sunny Solanki
(https://coderzcolumn.com/tutorials/data-science/how-to-plot-sankey-diagram-in-python-jupyter-notebook-holoviews-and-plotly)
六、總結
今天我們從?;鶊D的前世今生講起,聊了聊桑基圖在互聯網中研究用戶路徑的應用,以及業務價值,最后講了?;鶊D的繪制原理和python實操。
在?;鶊D的繪制原理和python實操部分,是有點枯燥的,甚至需要大家拿出小本本在紙上畫一畫、寫一寫,仔細看看所附的圖片,然后上手練習一下。
如果你們的工作中有現成的?;鶊D工具,本文可以幫你知道?;鶊D是怎么來的,如果沒有,試試今天的方法,做出一個酷酷的?;鶊D來擴大你的影響力吧!
參考文章
1. 維基百科:http://en.wikipedia.org/wiki/Sankey_diagram
2.google?charts:?https://developers.google.com/chart/interactive/docs/gallery/sankey
3.?How to Plot Sankey Diagram in Python Jupyter Notebook [holoviews & plotly]
4.?利用Python繪制誘人的?;鶊D_數據森麟-CSDN博客
5. Amplitude help center:Get the most out of Amplitude’s Funnel Analysis chart
6.?the art of consequences
作者:Simba,IBM資深商業分析師;IT老兵,終生學習者;“一個數據人的自留地”創作者聯盟成員
本文由@一個數據人的自留地 原創發布于人人都是產品經理。未經許可,禁止轉載
題圖來自Unsplash,基于CC0協議
這個圖是誰做的?產品經理?運營?還是數據分析師?感覺埋點數據就夠用了吧,這個桑葚圖分析的這么精確,有必要嗎?;谑裁磮鼍耙鲞@個圖,看數據流向哪里了。以前就是投個球,現在還要看球落在哪里了(手機啥時候消失)
mark
挺好的呀 講得很詳細 只是自己還不會用python ~
感覺像在看百科,而且很亂。另外,什么時候產品行業已經內卷成要用python來做圖了?
這也算卷?多一種能力,讓產品數據分析和表達更清晰有問題嗎
那你要不要考慮下用什么CAD去做?;鶊D啊?要不要再考慮下三維的C4D啊,3Dmax來做三維的?;鶊D啊?啊你要不要試下???