Python-玩转数据-漏斗图绘制

一、漏斗分析模型应用场景举例

漏斗分析是一套流程式数据分析,它能够科学反映用户行为状态以及从起点到终点各阶段用户转化率情况的重要分析模型。

漏斗分析是互联网行业常用的数据分析模型,数据分析师们经常将漏斗模型运用于流量监控、用户转化等场景中,以此来辅助运营的决策。作为数据行业的初学者,你可能听过很多次漏斗分析模型,但是却不知道漏斗分析模型如何应用于业务分析。

1.什么是漏斗分析

漏斗分析可以直观地呈现用户行为步骤以及各步骤之间的转化率,分析各个步骤之间的转化率,可以为运营提供辅助决策的意见;减少“漏掉”的用户数量,可以提升业务规模,提高业务成交量。以电商转化为例进行说明,用户从浏览商品到支付订单有一个转化路径,可以把这个转化路径看成一个漏斗,因为每一个步骤都会漏掉一批用户,据不完全统计支付订单的用户不足4%。如果想要提升支付订单的用户比例,那么毫无疑问需要减少每个步骤漏掉的用户,分析用户在每一关键步骤漏掉的原因,针对每一个原因逐一对产品进行改进,从而提升用户转化率。
在这里插入图片描述

2.漏斗分析的核心步骤

漏斗分析的四大关键要素分别是研究对象、时间、节点以及指标。

研究对象即我们分析的维度,对于电商来说常用的维度有人、货、场、订单等;时间即事件从何时开始到何时结束,也就是我们应用漏斗模型进行研究的时间段;节点即从事件开始到事件结束所经历的各个流程,每一步流程都是事件的关键节点,包括起点、终点和过程性节点,并且涵盖这些节点的命名、标识;指标则是对整个事件流程进行分析的工具,也是对漏斗的描述与刻画,它是从数据的角度对漏斗模型进行描述,可以全面解读漏斗模型,有助于发现业务问题,指导业务流程优化。

对应着漏斗分析的四大要素,我们将漏斗分析的核心步骤总结如下:

1.确定研究对象,选定分析维度,即选定数据统计的角度,电商常用人、货、场、订单等。

2.确定事件的开始和结束时间,即想要把漏斗模型应用于业务的哪个时间段。

3.拆解用户路径,明确关键节点,即明确用户在该业务中的每一个步骤节点。

4.指定关键指标,全面刻画业务,指导业务优化,即通过数据指标诠释业务现状和监控业务发展。
在这里插入图片描述

3.淘宝逆向物流案例

对于什么是漏斗分析,漏斗分析的流程你肯定已经了如指掌了,但是漏斗分析方法论在实际业务中如何用就得通过实际案例来说明了。我们会以淘宝逆向上门取件换货业务为例,使用漏斗分析的方法分析业务问题并给出一定的解决方案!

3.1 业务背景介绍淘宝逆向包括的三种不同形态的业务

对于消费者来说,包括上门取件退货和上门取件换货业务;而对于商家来说则是拦截件业务。消费者端的上门取件退货业务已经发展成熟,而上门取件换货业务则刚刚开始,所以需要对改模块的业务进行系统地分析以发现业务问题,优化现有业务,提升换货成功率以及上门取件换货渗透率!上门取件换货业务路径较长,涉及到两段物流,其业务路径的核心指标有两个,第一个是换货成功率,即成功完结的订单量与买家寄出量的比值;第二个是菜鸟裹裹渗透率,也叫上门取件换货渗透率,换货业务中选择上门取件的寄出量与买家寄出量的比值。
在这里插入图片描述
3.2 业务指标体系建立对于一块新业务来说,第一个步骤就是建立一套完整的指标体系以反映业务现状和监控业务长期发展趋势。

对于淘宝逆向上门取件换货业务来说,指标体系的建立也是根据业务流程进行拆解,提炼核心指标监控业务发展和变化。上门取件换货业务的指标体系包括从换货发起到订单完结各个环节的核心指标,同时也包括了整个业务的核心监控指标,例如,换货成功率及上门取件换货渗透率。具体的指标体系如下图所示。
在这里插入图片描述
3.3 业务现状概括及业务问题探索有了指标体系,我们就能看到业务漏斗中每一步的数据,并且发现业务现有的业务问题。

对于上门取件换货业务来说,主要存在两个核心问题。
在这里插入图片描述

问题1:换货成功率虽然高达94.5%,但仍有提升的空间换货业务的成功率高达94.5%,但是在整个转化路径中还是有5.5%的用户漏掉,这部分用户或许经过流程优化、产品调整等可以挽回。

问题2:上门取件换货渗透率与同类业务相比仍有一定差距同类业务上门取件退货业务的渗透率高达55.86%,而上门取件换货业务渗透率仅有45.78%,两者差距高达10.08%

3.4 漏斗分析定位上门取件换货业务问题面对现有的两个业务问题,我们需要通过漏斗分析定位影响换货成功率以及换货上门取件渗透率的关键环节和因素,以做出相应改进措施,提高换货成功率和换货上门取件渗透率。

首先,我们以订单维度进行分析,绘制了用户换货路径全漏斗。这个漏斗既包括了换货路径的主线流程,也包括了商家和买家在换货路径上的支线路径。漏斗的主线流程和支线流程环环相扣,前面的步骤会影响后续的步骤,上个步骤的结果会影响下个步骤的表现。通过这个用户换货路径漏斗,我们清晰地看到各个重要节点之间的关联关系,更容易理清影响到换货成功率和换货上门取件渗透率的因素。

其次,我们将换货成功率和换货上门取件渗透率这两个关键指标拆解到用户路径漏斗当中。根据换货成功率的定义,如果“商家拒绝收货”以及“买家拒绝收货”的订单量能转换为“成功完结的订单量”的话,那么就能提升换货成功率;而根据换货上门取件渗透率的定义,如果“买家取消”以及“超时未寄出”的订单量能够使用上门取件的方式寄出的话,那么换货上门取件渗透率就能得到提升。到此为止,我们定位到了影响两个关键指标的因素。因此,后续分析我们将着手研究“商家拒绝收货”以及“买家拒绝收货”的原因以及“买家取消”以及“超时未寄出”的原因,以此来找到提升换货成功率和换货上门取件渗透率的切入点。
在这里插入图片描述

3.5 基于经验及假设,验证影响两个关键指标的具体原因-影响换货成功率的因素商家拒绝发货的单量是换货成功率的影响因素,找出商家拒绝收货的具体原因并采取对应的措施可以提升换货成功率。商家拒绝发货的主要原因是货物破损、商标不全、换货物品非全新品,也有部分原因是快递单号错误。对于货品原因,我们建议推出验货服务;而对于快递单号错误问题,我们建议推出单号校验服务。买家拒绝收货也是影响换货成功率的因素之一,于是我们分析了拒绝收货的买家发生复购的比率,发现复购率高达54.31%,由此我们推测买家相比于换货更喜欢退货重买。
在这里插入图片描述

影响换货上门取件渗透率的因素取消换货和超时未寄出是影响换货上门取件渗透率的主要因素。我们对买家取消换货的原因进行深入探讨,发现取消换货的用户发生复购的比率依然高达68.92%,也说明买家相比于换货,消费者更喜欢退货重买;其次,我们发现取消换货的订单运费险覆盖率只有26.79%,由此我们推测运费险覆盖不足也是买家取消换货的原因之一。

3.6 根据数据分析结反馈意见及建议

为了提升换货成功率和换货上门取件渗透率,我们通过漏斗分析定位了影响这两个关键指标的因素并且分析了具体原因,最终根据具体原因提出改进的意见和建议。

商品损坏、商标不全、非新品等商品问题以及物流单号错误造成商家拒绝收货,从而影响了换货成功率。于是我们建议推出末端快递员验货服务以及平台提供单号检验服务以减少商家拒绝收货的单量,进而提升换货成功率。

买家相比于换货更喜欢退货重买,具体表现是买家取消换货以及拒绝收货后选择复购,为此我们建议推出一款类似于退货重买的换货服务,即双向物流极速换货服务,买家申请换货的同时商家即刻发货。

买家超时未寄出的主要原因是运费险覆盖率低,由此我们建议提高运费险的覆盖率,同时发放上门取件优惠券给到换货用户并通过短信提醒用户及时寄件。

4.总结漏斗分析是数据分析中最常用的方法

本文介绍了漏斗分析的定义、漏斗分析的核心步骤以及通过换货上门取件业务为例逐步展示漏斗分析如何在业务中应用。值得注意的是,漏斗分析不仅需要理清漏斗的主线流程,而且需要将主线流程涉及到的分支流程也一并梳理,因为每一个时间节点、每一个分支步骤都可能是影响到下一步的结果;其次,根据漏斗路径制定关键的监控指标并定位影响关键指标的具体原因是漏斗分析的核心,因为只有找出这些原因才能找到业务优化的落脚点;最后,在寻找影响核心监控指标的因素时候,大部分情况是基于业务经验以及假设验证的,这就很难避免得到的结论与假设不符,需要从多个角度、不同维度多方假设验证才能找到落脚点。

二、几种漏斗编码绘制方法

1、pyecharts

pyecharts有漏斗图的模板(点击链接),套用即可。

代码

from pyecharts import options as opts
from pyecharts.charts import Funnel

data = [13543, 11413, 7909, 1366, 918, 151]
phase = ['总访客数量  ', '活跃访客数量', '注册用户数量', '预定用户数量', '支付用户数量', '复购用户数量']

c = (
    Funnel()
    .add("阶段", [list(z) for z in zip(phase, data)])
    .set_global_opts(title_opts=opts.TitleOpts(title="漏斗图"))
    .render("funnel.html")
  )


在这里插入图片描述
虽然绘制方便,但是美观程度一般。

2、matplotlib

使用matplotlib绘制的思路是,绘制两个横向柱状图,其中一个设置成背景色遮住另一个的部分柱长,再绘制多边形填充两个柱子之间的间隔。

代码

import pandas as pd 
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib.patches import Polygon  # Polygon()可以用来传入按顺序组织的多边形顶点,从而生成出多边形
from matplotlib.collections import PatchCollection

plt.style.use('seaborn-dark')  # 设置主题
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

visitor_num = 135043
data = [135043, 113413, 74909, 10366, 9018, 4151]
phase = ['总访客数量  ', '活跃访客数量', '注册用户数量', '预定用户数量', '支付用户数量', '复购用户数量']
data1 = [visitor_num/2 - i/2 for i in data]
data2 = [i+j for i,j in zip(data, data1)]
color_list = [ '#5c1d1d', '#892c2c','#994a4a', '#c56161', '#d48989', '#e2b0b0']  # 柱子颜色

fig,ax = plt.subplots(figsize=(16, 9),facecolor='#f4f4f4')
ax.barh(phase[::-1], data2[::-1], color = color_list, height=0.7)  # 柱宽设置为0.7
ax.barh(phase[::-1], data1[::-1],  color = '#f4f4f4', height=0.7)  # 设置成背景同色
ax.axis('off')

polygons = []
for i in range(len(data)):
    # 阶段
    ax.text(
      0,  # 坐标
      i,  # 高度
      phase[::-1][i],  # 文本
      color='black', alpha=0.8, size=16, ha="right")
    
    # 数量
    ax.text(
      data2[0] / 2 ,  
      i, 
      str(data[::-1][i]) +'(' +str(round(data[::-1][i] / data[0] * 100, 1)) + '%)', 
      color='black', alpha=0.8, size=18, ha="center")
    
    if i < 5:
        # 比例
        ax.text(
          data2[0] / 2 ,  
          4.4 - i, 
          str(round(data[i+1] / data[i], 3) * 100) + '%', 
          color='black', alpha=0.8, size=16, ha="center")
        
        # 绘制多边形
        polygons.append(Polygon(xy=np.array([(data1[i+1], 4+0.35-i),   # 因为柱状图的宽度设置成了0.7,所以一半便是0.35
                                             (data2[i+1], 4+0.35-i), 
                                             (data2[i], 5-0.35-i), 
                                             (data1[i], 5-0.35-i)])))
        
# 使用add_collection与PatchCollection来向Axes上添加多边形
ax.add_collection(PatchCollection(polygons, 
                                  facecolor='#e2b0b0',
                                  alpha=0.8));

plt.show()


在这里插入图片描述
看起来马马虎虎,但代码繁琐

3、ploty

ploty有现成的库,较为美观,漏斗图的模板([点击链接])。

Plotly 是一款用来做数据分析和可视化的在线平台,功能非常强大,可以在线绘制很多图形比如条形图、散点图、饼图、直方图等等。而且还是支持在线编辑,以及多种语言python、javascript、matlab、R等许多API。它在python中使用也很简单,直接用pip install plotly就可以了。使用Plotly可以画出很多媲美Tableau的高质量图:

基础漏斗图

import plotly.express as px
data = dict(
    number=[39, 27.4, 20.6, 11, 2],
    stage=["Website visit", "Downloads", "Potential customers", "Requested price", "invoice sent"])
fig = px.funnel(data, x='number', y='stage')
fig.show()


在这里插入图片描述

堆积漏斗图

import plotly.express as px
import pandas as pd
stages = ["Website visit", "Downloads", "Potential customers", "Requested price", "invoice sent"]
df_mtl = pd.DataFrame(dict(number=[39, 27.4, 20.6, 11, 3], stage=stages))
df_mtl['office'] = 'Montreal'
df_toronto = pd.DataFrame(dict(number=[52, 36, 18, 14, 5], stage=stages))
df_toronto['office'] = 'Toronto'
df = pd.concat([df_mtl, df_toronto], axis=0)
fig = px.funnel(df, x='number', y='stage', color='office')
fig.show()


在这里插入图片描述

带有各项指标的漏斗图

from plotly import graph_objects as go

fig = go.Figure(go.Funnel(
    y = ["Website visit", "Downloads", "Potential customers", "Requested price", "invoice sent"],
    x = [39, 27.4, 20.6, 11, 2]))

fig.show()


在这里插入图片描述

鼠标悬浮在图上可以看到当前阶段的各项占比

漏斗图自定义颜色

from plotly import graph_objects as go

fig = go.Figure(go.Funnel(
    y = ["Website visit", "Downloads", "Potential customers", "Requested price", "Finalized"],
    x = [39, 27.4, 20.6, 11, 2],
    textposition = "inside",
    textinfo = "value+percent initial",
    opacity = 0.65, marker = {"color": ["deepskyblue", "lightsalmon", "tan", "teal", "silver"],
    "line": {"width": [4, 2, 2, 3, 1, 1], "color": ["wheat", "wheat", "blue", "wheat", "wheat"]}},
    connector = {"line": {"color": "royalblue", "dash": "dot", "width": 3}})
    )

fig.show()


在这里插入图片描述
带有各项指标的堆积漏斗图

from plotly import graph_objects as go

fig = go.Figure()

fig.add_trace(go.Funnel(
    name = 'Montreal',
    y = ["Website visit", "Downloads", "Potential customers", "Requested price"],
    x = [120, 60, 30, 20],
    textinfo = "value+percent initial"))

fig.add_trace(go.Funnel(
    name = 'Toronto',
    orientation = "h",
    y = ["Website visit", "Downloads", "Potential customers", "Requested price", "invoice sent"],
    x = [100, 60, 40, 30, 20],
    textposition = "inside",
    textinfo = "value+percent previous"))

fig.add_trace(go.Funnel(
    name = 'Vancouver',
    orientation = "h",
    y = ["Website visit", "Downloads", "Potential customers", "Requested price", "invoice sent", "Finalized"],
    x = [90, 70, 50, 30, 10, 5],
    textposition = "outside",
    textinfo = "value+percent total"))

fig.show()


在这里插入图片描述
比较漂亮,代码也比较简单清晰

三、总结

数据分析离不开数据可视化。我们最常用的就是pandas,matplotlib,pyecharts,plotly当然还有Tableau,具体怎么应用,可根据需求和实际情况进行选择

  • 10
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值