商业数据分析-用户行为分析案例-桑吉图- Python

最近为了更好的看出用户访问APP的路径,我研究了桑吉图,网上虽然有很多文章,但是都只是片面的讲解,实战过程有很多坑需要避免,所以,我总结了画桑吉图的血泪经验,给大家分享。下面先看看桑吉图的效果吧:

图片

通过上面的图,我们能很清楚的看到,大部分用户是主动访问某宝首页,然后在首页分别访问了聚划算以及使用了搜索功能,在聚划算之后又访问了直播、每日大牌,最后跳出了。是不是很清晰?

访问路径和数据都是虚拟的,为了做这个案例而已,大家后面可以使用自己公司的数据。

什么是桑吉图

桑基图(Sankey diagram),即桑基能量分流图,也叫桑基能量平衡图。它是一种特定类型的流程图,右图中延伸的分支的宽度对应数据流量的大小,通常应用于能源、材料成分、金融等数据的可视化分析。因1898年Matthew Henry Phineas Riall Sankey绘制的“蒸汽机的能源效率图”而闻名,此后便以其名字命名为“桑基图”

在互联分析的主要意义是,其可以很清楚的看清楚用户访问APP的路径,可视化用户访问和跳出的重要节点。

如何画桑吉图

画桑吉图主要有以下几步

第一步:数据源

我习惯是数据先处理成以下结构:


数据结构

附上数据源代码用作练习:


# 导入包
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pyecharts.charts import Sankey
from pyecharts import options as opts
import pyecharts

#数据源
df = pd.DataFrame({
'第一个页面':  ['某宝首页',  '某宝首页',  '某宝首页',  '某宝首页',  '某宝首页',  '某宝首页',  '某宝首页',  '某宝首页',  '某宝首页',  '某宝消息页',  '某宝消息页',  '某宝消息页'],
'第二个页面':  ['搜索',  '搜索',  '搜索',  '搜索',  '聚划算',  '聚划算',  '聚划算',  '聚划算',  '聚划算',  '交易物流',  '交易物流',  '活动优惠'],
'第三个页面':  ['历史搜索',  '历史搜索',  '搜索发现',  '搜索发现',  '每日大牌',  '每日大牌',  '直播',  '直播',  '直播',  '物流详情',  '物流详情',  '权益过期提醒'],
'第四个页面':  ['搜索结果页',  '跳出',  '搜索结果页',  '跳出',  '物品详情页',  '跳出',  '观看直播',  '跳出',  '我的页面',  '某旗舰店',  '跳出',  '跳出'],
'用户量-万':   [77,    706,    56,    981,    871,    348,    638,    698,    912,    651,    627,    380] 
 
})

第二步:定义节点

什么节点呢?其实就是所有用户访问页面的名称,用户从页面A到页面B,再到C。把所有页面都列出来。(可以看出使用了unique(),进行去重,这个地方需要注意,后面会说)
代码:


nodes = []
for i in range(0,4):
    values = df.iloc[:,i].unique()
    for value in values:
        dic = {}
        dic['name'] = value
        nodes.append(dic)

结果:


nodes

第三步:定义边和流量

什么是定义边和流量呢?其实就是把A到B和B到C具体的转化量计算出来。
代码一:代码一的意义在于,用户访问路径是复杂的,可能有10步如果,我们需要看前四步流转情况的话,就要先聚合前四步。


first = df.groupby(['第一个页面','第二个页面'])['用户量-万'].sum().reset_index()
b = df.groupby(['第二个页面','第三个页面',])['用户量-万'].sum().reset_index()
c = df.groupby(['第三个页面','第四个页面',])['用户量-万'].sum().reset_index()

first.columns = ['source','target','value']
b.columns = ['source','target','value']
c.columns = ['source','target','value']

result = pd.concat([first,b,c])
result.head(10)

代码二:
如果就是看所有页面的话,直接使用这个代码就好。此时把result换成df就好了

linkes=[]
for i in result.values:
    dic={}
    dic['source']=i[0]
    dic['target']=i[1]
    dic['value']=i[2]
    linkes.append(dic)

结果:
从这个结果就能看到每一步的流转,source是上一个页面,target是下一个页面,value是从上一个页面到下一个页面的用户量,比如红色框代表从消息页到交易物流页面的用户量是1278

linkes

第四步:画图

代码:
画图就直接使用下面代码就可以了,我们解释一下:

  • init_opts=opts.InitOpts(width="1300px", height="500px"),控制整个画图的大小,如果页面比较多,那就需要比较大的画图区域,使用整个代码进行调参。
  • label_opts=opts.LabelOpts(position='right'),是页面名称的显示位置,比如上面的1处聚划算,目前显示在右侧。
  • node_gap=10,代表2处,聚划算和搜索之间的间距,页面少的时候,可以调大间距。
  • node_width = 35,代表3处,是搜索柱子的粗细。
  • focus_node_adjacency ='allEdges'。是鼠标悬停上面显示高亮,可以看看开篇时候鼠标的效果。


pic=(
    Sankey(init_opts=opts.InitOpts(width="1300px", height="500px"))
    .add(
        '',#图例名称
        nodes,#传入节点数据
        linkes,#传入边和流量数据
        #设置透明度、弯曲度、颜色
        linestyle_opt=opts.LineStyleOpts(opacity=0.3,curve=0.5,color='source'),
        #标签显示位置
        label_opts=opts.LabelOpts(position='right'),
        #节点之间的距离
        node_gap=10,
        #orient="vertical",#查看垂直图片的操作
        node_width = 35,
        
        # 桑基图中节点的对齐方式,默认是双端对齐,可以设置为左对齐或右对齐,对应的值分别是:# left: 节点左对齐。# right: 节点右对齐。# justify: 节点双端对齐。
        node_align = 'right',
        # 距离右侧的距离
        #pos_right = "10%",
        # 距离左侧的距离
       # pos_left = '1%',
        
        #鼠标悬停时,节点高亮
        focus_node_adjacency ='allEdges'
      
    )
    .set_global_opts(title_opts=opts.TitleOpts(title='用户行为'))
)
pic.render('app_act.html')

注意点

  • 主要是需要注意一点是第二步定义节点时,使用的unique(),这个是去重所有的页面,但是有个场景就不能满足,并且是90%以上不满足:
    • 比如用户在第一个页面访问之后就跳出了,那么为了保证数据结构,必须后面几个页面够赋值跳出。数据如下,此时你使用上面的代码是不能画出图。
      数据源2

      数据源代码

df1 = pd.DataFrame({
'第一个页面':  ['某宝首页',  '某宝首页',  '某宝消息页',  '某宝消息页'],
'第二个页面':  ['搜索',  '跳出',  '交易物流',  '跳出'],
'第三个页面':  ['历史搜索',  '跳出',  '物流详情',  '跳出'],
'第四个页面':  ['搜索结果页',  '跳出',  '跳出',  '跳出'],
'用户量-万':   [145,    313,    699,    520] 
})

那么我们需要进行处理:

for i in range(0,4):
     df.iloc[:,i] = df.iloc[:,i] + str(i)

结果:

然后就能使用后面的几步:定义节点--定义边和流量--画图


#定义节点
nodes = []
for i in range(0,4):
    values = df1.iloc[:,i].unique()
    for value in values:
        dic = {}
        dic['name'] = value
        nodes.append(dic)
    
            
#定义边和流量  
first = df1.groupby(['第一个页面','第二个页面'])['用户量-万'].sum().reset_index()
b = df1.groupby(['第二个页面','第三个页面',])['用户量-万'].sum().reset_index()
c = df1.groupby(['第三个页面','第四个页面',])['用户量-万'].sum().reset_index()

first.columns = ['source','target','value']
b.columns = ['source','target','value']
c.columns = ['source','target','value']

result = pd.concat([first,b,c])

linkes=[]
for i in result.values:
    dic={}
    dic['source']=i[0]
    dic['target']=i[1]
    dic['value']=i[2]
    linkes.append(dic)


#画图
pic=(
    Sankey(init_opts=opts.InitOpts(width="1300px", height="500px"))
    .add(
        '',#图例名称
        nodes,#传入节点数据
        linkes,#传入边和流量数据
        #设置透明度、弯曲度、颜色
        linestyle_opt=opts.LineStyleOpts(opacity=0.3,curve=0.5,color='source'),
        #标签显示位置
        label_opts=opts.LabelOpts(position='right'),
        #节点之间的距离
        node_gap=10,
        #orient="vertical",#查看垂直图片的操作
        node_width = 35,
        
        # 桑基图中节点的对齐方式,默认是双端对齐,可以设置为左对齐或右对齐,对应的值分别是:# left: 节点左对齐。# right: 节点右对齐。# justify: 节点双端对齐。
        node_align = 'right',
        # 距离右侧的距离
        #pos_right = "10%",
        # 距离左侧的距离
       # pos_left = '1%',
        
        #鼠标悬停时,节点高亮
        focus_node_adjacency ='allEdges'
      
        
    
    )
    .set_global_opts(title_opts=opts.TitleOpts(title='用户行为'))
)
pic.render('app_act.html')
  

结果:

结果

写在最后:
大家一定要使用上面的数据进行训练,体会其中的坑。。。
大家一定要使用上面的数据进行训练,体会其中的坑。。。
大家一定要使用上面的数据进行训练,体会其中的坑。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容

  • ![Flask](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAW...
    极客学院Wiki阅读 7,241评论 0 3
  • 不知不觉易趣客已经在路上走了快一年了,感觉也该让更多朋友认识知道易趣客,所以就谢了这篇简介,已做创业记事。 易趣客...
    Physher阅读 3,414评论 1 2
  • 双胎妊娠有家族遗传倾向,随母系遗传。有研究表明,如果孕妇本人是双胎之一,她生双胎的机率为1/58;若孕妇的父亲或母...
    邺水芙蓉hibiscus阅读 3,699评论 0 2
  • 今天理好了行李,看到快要九点了,就很匆忙的洗头洗澡,(心存一份念想,你总会打给我的🐶)然后把洗头液当成沐浴液了😨,...
    bevil阅读 2,770评论 1 1
  • 那年我们15,像阳光一样温暖的年纪。每天我都会骑自行车上学,路过田野,工厂,医院,村庄,有微风,有阳光,有绿...
    木偶说爱你阅读 2,521评论 0 3