用戶路徑分析之利器:“?;鶊D”

2 評論 7538 瀏覽 32 收藏 22 分鐘

編輯導語:對用戶路徑的了解可以讓團隊更了解用戶行為與使用習慣,進而推動產品迭代優化,在具體方面有所改進,提升用戶的使用體驗。?;鶊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)。?;鶊D(Sankey chart)也是以此人命名。

1898年,?;谝黄枋瞿芰啃实奈恼轮挟嬃诉@樣一張圖。

圖片來源于網絡

在文中,他對這張圖是這樣解釋的:當能量在蒸汽機的各個部件中傳輸時,都會有能量損失,要提高能量傳遞效率,需要知道哪些步驟中流失比較嚴重。

熱量傳遞如下圖箭頭所示,其中箭頭的寬度代表能量的大小,可以從圖中看到每個步驟中能量損失。

從此以后?;鶊D被應用于各個領域,比如農業領域中追溯農產品的走向、社會學領域研究人口的流向、醫學領域研究病例發展的流向。

而在互聯網產品中,?;鶊D也被廣泛采納,主要用于用戶路徑分析。比如,用戶在首頁開始,分別流向了哪些頁面,之后又流向了哪里。

以下圖為例,非常直觀地表現了用戶從Play song or video開始向其他頁面的流轉以及過程中的跳失量(跳失量由黑色表示)。

自然而然,我們不由地要提一個問題,有時候我們也想知道,達到某頁面或者執行某行為的用戶都從哪里來,于是就有了?;鶊D的變種,可以理解為“逆向?;鶊D”。即設定一個終點,看看用戶從哪里來,如下圖所示。

三、?;鶊D的價值

可以看到,?;鶊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想要表達的是流向問題,那么就需要知道從哪里(起點)到哪里(終點),流了多少(流量)。

這句話中有三個要素,我個人稱之為點、線、面:

  1. 點:即流向的起點和終點。
  2. 線:即哪些起點和終點間有流量。
  3. 面:這些的量有多大(用面寬表示)。

以我的知乎文章頁面為例,我想知道進入到文章頁面的人都流向了哪里,?這里我把知乎頁面做了簡化,假設該頁面只有以下三個鏈接。

那么這里點就是:

  • 起點:知乎個人主頁文章;
  • 終點:是A文章, B 文章, C文章。

線就是:

  • 主頁 → A文章;
  • 主頁 → A文章;
  • 主頁 → A文章。

假設到A、B、C文章的人數分別是100、200、300,那么面(寬)就是100、200、300。所以要做出?;鶊D,就是尋找點、線、面的問題。

目前市面上有很成熟的工具做出?;鶊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實現?;鶊D

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

#繪制?;鶊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完成之后,可以探尋更加完整復雜的多步?;鶊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在互聯網中研究用戶路徑的應用,以及業務價值,最后講了?;鶊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協議

給作者打賞,鼓勵TA抓緊創作!
4人打賞
更多精彩內容,請關注人人都是產品經理微信公眾號或下載App
評論
評論請登錄
  1. 挺好的呀 講得很詳細 只是自己還不會用python ~

    回復
  2. 感覺像在看百科,而且很亂。另外,什么時候產品行業已經內卷成要用python來做圖了?

    回復