社区编辑申请
注册/登录
可视化神器Plotly玩转漏斗图
大数据 数据可视化
从搜索人数开始到支付成功,每个阶段用户都存在一定的流失,漏斗图就能很好地将这种流失和转化情况显示出来。除去柱状图、饼图、折线图,漏斗图应该是自己在工作画的最为频繁的一种图表。下面我们通过模拟某个电商网站的用户行为来绘制漏斗图。

本文转载自微信公众号「尤而小屋」,作者Peter  。转载本文请联系Peter的公众号。

认识漏斗图

漏斗图是网站销售领域一种十分常用的图表,主要是用来分析在各个阶段的流失和转化情况。比如在某个商城中,我们统计用户在不同阶段的人数来分析转化率:

  • 商城UV:商城每天的访问人数
  • 搜索人数:在商城有过搜索行为的用户数
  • 加购人数:有加购行为的用户数
  • 提交订单:有多少用户提交订单
  • 点击支付:提交订单之后有多少用户点击支付按钮
  • 支付成功:最终支付成功的用户数

从搜索人数开始到支付成功,每个阶段用户都存在一定的流失,漏斗图就能很好地将这种流失和转化情况显示出来。

除去柱状图、饼图、折线图,漏斗图应该是自己在工作画的最为频繁的一种图表。下面我们通过模拟某个电商网站的用户行为来绘制漏斗图。

整体效果

看一个漏斗图的整体效果:

视频

导入库

基于两种方式实现:

  • plotly_express :px
  • plotly.graph_objects:go
  1. import pandas as pd 
  2. import numpy as np 
  3.  
  4. # plotly两个绘图接口 
  5. import plotly_express  as px 
  6. import plotly.graph_objects as go 

基于px实现

基础漏斗图

模拟一份商城数据:

  1. data1 = pd.DataFrame({ 
  2.     "number": [1200,900,700,400,180,100], 
  3.     "stage": ["浏览网站","搜索","加购","提交订单","点击支付","支付成功"]} 
  4. data1 

绘制一个基础漏斗图:

  1. # 绘图 
  2. fig = px.funnel( 
  3.     data1,  # 待绘图数据 
  4.     x="number",  # x轴的数据 
  5.     y="stage"  # y轴的数据 
  6.  
  7. fig.show() 

我们还可以加上一个颜色参数color:

  1. # 加上颜色参数color 
  2.  
  3. fig = px.funnel( 
  4.   data1, 
  5.   x="number"
  6.   y="stage"
  7.   color="number"  # 颜色参数 
  8.  
  9. fig.show() 

如果我们的颜色设置成number列,用数值意义似乎不准确,更好地应该是不同的阶段表示,换成stage:

  1. # 加上颜色参数color 
  2.  
  3. fig = px.funnel( 
  4.   data1, 
  5.   x="number"
  6.   y="stage"
  7.   color="stage"   # !!!改成stage 
  8.  
  9. fig.show() 

看生成的漏斗图:最上面的是支付成功,通常我们希望的是数值最大的在最上面,于是我们将传入的数据翻转一下:

  1. # 加上颜色参数color 
  2.  
  3. fig = px.funnel( 
  4.   data1[::-1],   # !!!数据翻转 
  5.   x="number"
  6.   y="stage"
  7.   color="stage"   # !!!改成stage 
  8.  
  9. fig.show() 

分组漏斗

分组漏斗表示的含义将不同组别的漏斗图放在一个画布中,比如:看今年3月和2020年3月的数据对比情况,这叫做同比

同比:相同时期的对比,比如:2021年3月和2020年3月

环比:相邻时期的对比,比如:2021年3月和2021年2月

1、2020年3月份数据

2、2021年3月份数据

3、使用concat函数合并两组数据

4、绘制漏斗图

  1. # 绘图 
  2.  
  3. fig = px.funnel(df3,x="number",y="stages",color="time"
  4. fig.show() 

绘制面积漏斗图

还是使用最上面的数据:

  1. fig = px.funnel_area( 
  2.     data1, 
  3.     names = "stage"
  4.     values = "number"
  5.  
  6. fig.show() 

我们观察到:面积漏斗图默认绘制的百分比,而普通漏斗图是数值

基于go实现

绘制基础漏斗图

  1. from plotly import graph_objects as go 
  2.  
  3. fig = go.Figure(go.Funnel( 
  4.     x=[1000,800,400,100], 
  5.     y=["浏览网站","加购","点击支付","支付成功"
  6. )) 
  7.  
  8. fig.show() 

改变漏斗图的颜色和边框

  1. from plotly import graph_objects as go 
  2.  
  3. fig = go.Figure(go.Funnel( 
  4.     x=[1000,800,400,100],  # 数据 
  5.     y=["浏览网站","加购","点击支付","支付成功"], # 每个阶段的名称 
  6.     textposition = "inside",  #  文本位置:['inside''outside''auto''none']  
  7.     textinfo = "value + percent initial",   # 显示文本信息 ['label''text''percent initial''percent previous''percent total''value'] 前面选项的任意组合 
  8.     opacity = 0.65,  
  9.     marker = {"color": ["deepskyblue""lightsalmon""tan""silver"], 
  10.               "line": {"width": [4, 2, 3, 1, 1],  
  11.                        "color": ["wheat""wheat""blue""yellow"]}}, 
  12.     connector = {"line": {"color""royalblue""dash""dot""width": 3}}) 
  13.     ) 
  14.  
  15. fig.show() 

我们需要注意textinfo参数的使用,它有3种使用方式:

  • percent initial:相对于初始值
  • percent previous:相对于前一个值
  • percent total:相对于整体数值

上面这个漏斗图使用的是percent initial(相对于初始值),百分比是这样来的:

  1. 1000/1000 = 100% 
  2. 800 / 1000 = 80% 
  3. 400 / 1000 = 40% 
  4. 100 / 1000 = 10% 

如果是percent previous:

  1. 1000/1000 = 100% 
  2. 800 / 1000 = 80% 
  3. 400 / 800 = 50% 
  4. 100 / 400 = 25% 

如果是percent total:

我们看看第一个百分比是如何计算的:

分组漏斗

  1. from plotly import graph_objects as go 
  2.  
  3. stage = ["浏览网站","加购","点击支付","支付成功"
  4.  
  5. fig = go.Figure() 
  6.  
  7. fig.add_trace(go.Funnel( 
  8.     name = "2020年3月",  # 图形轨迹名称 
  9.     x = [1000,800,400,200],  # 数据 
  10.     y = stage, # 每个阶段名称 
  11.     orientation = "h",  # 方位 
  12.     textposition = "inside",  # 文本内容的位置 
  13.     textinfo = "value+percent previous"  # 显示文本内容 
  14. )) 
  15.  
  16.  
  17. fig.add_trace(go.Funnel( 
  18.     name = "2021年2月",   # 名称和数据需要改变 
  19.     x = [1200,900,500,240],   
  20.     y = stage,  
  21.     orientation = "h",   
  22.     textposition = "inside",   
  23.     textinfo = "value+percent total"   
  24. )) 
  25.  
  26. fig.add_trace(go.Funnel( 
  27.     name = "2021年3月",  # 名称和数据需要改变 
  28.     x = [1500,1000,450,300],   
  29.     y = stage,  
  30.     orientation = "h",   
  31.     textposition = "inside",   
  32.     textinfo = "label+percent initial"   
  33. )) 
  34.  
  35.  
  36. fig.show() 

在上面的图中,既可以观察到同比情况(2020年3月和2021年3月),也可以观察到环比情况(2021年3月和2月)

面积漏斗

  1. from plotly import graph_objects as go 
  2.  
  3. fig = go.Figure(go.Funnelarea( 
  4.     text = ["浏览网站","加购","点击支付","支付成功"], 
  5.     values = [5000, 2000, 800, 500], 
  6.  
  7. )) 
  8.  
  9. fig.show() 

设置面积漏斗的颜色和边框

  1. from plotly import graph_objects as go 
  2.  
  3. fig = go.Figure(go.Funnelarea( 
  4.     values = [3000, 2000, 800, 500],  
  5.     text = ["浏览网站","加购","点击支付","支付成功"], 
  6.     marker = {"colors": ["deepskyblue""lightsalmon""teal""silver"],  # 颜色 
  7.               "line": {"color": ["red""blue""wheat""wheat"],   # 边框颜色和线条宽度 
  8.                        "width": [0, 1, 3, 5]}}, 
  9.     textfont = {"family""Old Standard TT, serif""size": 13,   # 字体设置 
  10.                 "color""black"},  
  11.     opacity = 0.65))  # 透明度 
  12. fig.show() 

多组面积漏斗

不同组别的漏斗图我们也可以分开放,将它们放在一个大的画布中:

  1. from plotly import graph_objects as go 
  2.  
  3. fig = go.Figure() 
  4.  
  5. # 添加四组数据:第一季度到第四季度 
  6. fig.add_trace(go.Funnelarea( 
  7.     scalegroup = "first",   # 组别名称 
  8.     text = ["浏览网站","搜索","加购","提交订单","点击支付","支付成功"], 
  9.     values = [500, 450, 340, 230, 220, 110],  # 数据 
  10.     textinfo = "value",  # 显示文本信息 
  11.     title = {"position""top center",  # 标题顶部居中 
  12.              "text""第一季度"  # 标题内容 
  13.             }, 
  14.     domain = {"x": [0, 0.5], # 图形位置 
  15.               "y": [0, 0.5] 
  16.              })) 
  17.  
  18. fig.add_trace(go.Funnelarea( 
  19.     scalegroup = "first",  
  20.     text = ["浏览网站","搜索","加购","提交订单","点击支付","支付成功"], 
  21.     values = [600, 500, 400, 300, 200, 100],  
  22.     textinfo = "value"
  23.     title = {"position""top center",  
  24.              "text""第二季度"}, 
  25.     domain = {"x": [0, 0.5],  
  26.               "y": [0.55, 1]})) 
  27.  
  28. fig.add_trace(go.Funnelarea( 
  29.     scalegroup = "second",  
  30.     text = ["浏览网站","搜索","加购","提交订单","点击支付","支付成功"], 
  31.     values = [510, 480, 440, 330, 220, 100],  
  32.     textinfo = "value"
  33.     title = {"position""top left",  
  34.              "text""第三季度"}, 
  35.     domain = {"x": [0.55, 1],  
  36.               "y": [0, 0.5]})) 
  37.  
  38. fig.add_trace(go.Funnelarea( 
  39.     scalegroup = "second",  
  40.     text = ["浏览网站","搜索","加购","提交订单","点击支付","支付成功"], 
  41.     values = [360, 250, 240, 130, 120, 60], 
  42.     textinfo = "value",  
  43.     title = {"position""top right",  
  44.              "text""第四季度"}, 
  45.     domain = {"x": [0.55, 1],  
  46.               "y": [0.55, 1]})) 
  47.  
  48. fig.update_layout( 
  49.     margin = {"l": 100, "r": 100},   # 整个图形到左右边框的距离 
  50.     shapes = [ 
  51.             {"x0": 0, "x1": 0.5, "y0": 0, "y1": 0.5},   # 添加4组位置 
  52.             {"x0": 0, "x1": 0.5, "y0": 0.55, "y1": 1}, 
  53.             {"x0": 0.55, "x1": 1, "y0": 0, "y1": 0.5}, 
  54.             {"x0": 0.55, "x1": 1, "y0": 0.55, "y1": 1} 
  55.     ]) 
  56.  
  57. fig.show() 

漏斗图真的很好用,能够观察到数据在不同阶段的转化情况。

 

责任编辑:武晓燕 来源: 尤而小屋
相关推荐

2020-03-23 14:55:52

Python可视化Plotly

2022-06-20 22:37:25

Linux操作系统命令

2022-06-05 21:09:47

Python办公自动化

2022-06-15 11:02:40

网络安全运营

2022-06-28 09:34:24

可视化Python代码

2022-06-15 08:25:07

Python天气数据可视化分析

2022-06-20 09:45:48

Python开源可视化库

2022-06-28 22:13:33

Polars数据处理与分析

2022-06-16 15:42:16

攻击面管理ASM

2022-06-07 09:59:21

网络安全安全漏洞

2022-07-01 15:46:20

网络安全数字化智能制造

2022-05-07 10:14:07

Python数据可视化

2022-06-29 09:19:09

静态代码C语言c代码

2022-06-03 09:41:03

DockerKubernetes容器

2022-06-28 09:26:25

Python配置文件

2022-07-01 14:25:27

机器学习人工智能工业4.0

2022-06-22 09:19:55

HDC鸿蒙ADB命令

2022-06-29 09:58:53

物联网供应链

2022-06-10 07:45:09

CentOS国产操作系统

2022-06-17 18:49:25

pythonexcel

同话题下的热门内容

如何设计数据可视化平台Python进行数据可视化,你会用什么库来做呢?

编辑推荐

R语言相关关系可视化函数梳理(附代码)22个免费的数据可视化和分析工具推荐让传达更有效!7个提升数据可视化的实用技巧数据可视化发现[吃鸡]秘密推荐!数据可视化的十种优秀JavaScript图表库
我收藏的内容
点赞
收藏

51CTO技术栈公众号