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