使用DLA轻松实现漏斗数据分析

简介: 概述漏斗分析是帮助运营人员分析一个多步骤过程中每一步的转化与流失情况。假设我们在购买商品的过程中,需要触发的事件包括 “启动”,“登陆”,“搜索商品”,“查看商品”,“生成订单”等。运营人员需要分析某段时间内(比如2017年1月5号到2017年2月5号),在全部用户中依次有序触发 “登陆” —> “搜索商品” —> “查看商品” —> “生成订单“ 事件的人群的转化流失情况,即计算全部用户中触发了“登陆”事件的总人数A,A中触发“搜索商品”事件的总人数B,B中触发“查看商品”事件的总人数C,以及C中触发“生成订单”事件的总人数D。

概述

漏斗分析是帮助运营人员分析一个多步骤过程中每一步的转化与流失情况。
假设我们在购买商品的过程中,需要触发的事件包括 “启动”,“登陆”,“搜索商品”,“查看商品”,“生成订单”等。
运营人员需要分析某段时间内(比如2017年1月5号到2017年2月5号),在全部用户中依次有序触发 “登陆” —> “搜索商品” —> “查看商品” —> “生成订单“ 事件的人群的转化流失情况,即计算全部用户中触发了“登陆”事件的总人数A,A中触发“搜索商品”事件的总人数B,B中触发“查看商品”事件的总人数C,以及C中触发“生成订单”事件的总人数D。展现形式如下:
同时,漏斗分析中包含“时间窗口”的概念,即需要保证所有事件在同一个窗口期内发生。比如时间窗口为1天,用户001触发“搜索商品”事件的时间和触发“登陆”事件的时间间隔在一天内,“搜索商品”事件才有效,否则视为无效。同理,用户001触发“查看商品”事件的时间和触发“登陆”事件的时间间隔也必须在一天内。时间窗口可以为1天、3天、7天或者1小时、6小时等任意长时间段。

image.png

最后,在漏斗分析中,可以设置事件属性。比如“搜索商品”事件,可以设置只计算“搜索商品”事件的属性中“content”字段为“computer”的用户。具体见详细数据。

数据模型描述

本文以如下数据示例来进行漏斗分析函数的使用说明,数据为文本文件格式,具体包含字段有:
(1)用户ID,字符串类型
(2)时间戳,毫秒级别,Long类型
(3)事件ID,Int类型,包含10001到10010十个事件
(4)事件名称,字符串类型,包含启动、登陆、搜索商品等十个事件
(5)事件属性,Json串格式
(6)日期,字符串类型
字段之间用以Tab('t')进行分割,数据总条数6亿左右,日期范围:2017/01/01到2017/02/28。Demo数据:

image.png

第一步:数据准备

DLA支持多种数据源融合查询分析,您的原始数据可以在数据库中,也可以是日志数据文件,上传到OSS中。本文以上述日志数据文件为例,假设传到OSS中,数据文件路径目录为:

oss://your_data_bucket/funnel_data/

第二步:DLA建表映射数据目录

首先创建schema,如果已经创建过schema,可跳过此步骤:

CREATE DATABASE `funnel_test_schema`
WITH DBPROPERTIES (
    catalog = 'oss',
    location = 'oss://your_data_bucket/'
)
COMMENT ''

建表:

CREATE EXTERNAL TABLE IF NOT EXISTS funnel_test ( 
     user_id bigint NOT NULL COMMENT '',
     event_time bigint NOT NULL COMMENT '',
     event_id int NOT NULL COMMENT '',
     event_name varchar NOT NULL COMMENT '',
     event_attr varchar NOT NULL COMMENT '',
     event_date date NOT NULL COMMENT ''
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' 
STORED AS TEXTFILE 
LOCATION 'oss://your_data_bucket/funnel_data/';

第三步:使用漏斗分析函数进行分析

假设,定义转化路径:
“启动” —> “登陆” —> “搜索商品” —> “浏览商品” —> “生成订单”
对应的事件ID为:
10001 —> 10002 —> 10003 —> 10004 —> 10007

如下示例,使用funnel_count函数,查询1月1号到20号20天, 时间窗口为7天, 事件个数为5个的漏斗,同时能够保存路径各节点的人群。注意:第二个参数的时间窗口的单位是毫秒级别。

SELECT user_id,
       funnel_count(event_time,
                    7 * 86400000,
                    event_id,
                    '10001,10002,10003,10004,10007') AS xwho_state
FROM funnel_test
WHERE event_id IN (10001, 10002, 10003, 10004, 10007)
  AND event_date BETWEEN '2017-01-01' AND '2019-01-20'
GROUP BY user_id;

再上述funnel_count函数的基础上,再使用funnel_sum函数,可以得出定义的转化路径的总体转化率:

SELECT funnel_sum(xwho_state, 5)
FROM (
  SELECT user_id,
         funnel_count(event_time,
                      7 * 86400000,
                      event_id,
                      '10001,10002,10003,10004,10007') AS xwho_state
  FROM funnel_test
  WHERE event_id IN (10001, 10002, 10003, 10004, 10007)
    AND event_date BETWEEN '2017-01-01' AND '2019-01-20'
  GROUP BY user_id 
);


-->
[4000000, 3999999, 3999864, 3989623, 3584579]

如果需要对事件对应的json属性列event_attr的某个属性进行过滤,如下,对10004类事件中price属性在3500到5000之间数据进行过滤,对应的Sample SQL为:

SELECT funnel_sum(xwho_state, 5)
FROM (
  SELECT user_id,
         funnel_count(event_time,
                      7 * 86400000,
                      event_id,
                      '10001,10002,10003,10004,10007') AS xwho_state
  FROM funnel_test
  WHERE event_id IN (10001, 10002, 10003, 10004, 10007)
    AND event_date BETWEEN '2017-01-01' AND '2019-01-20'
     OR (
              event_id = 10004 AND
              json_extract_scalar(event_attr, '$.price') BETWEEN 3500 AND 5000
        )
  GROUP BY user_id 
);

上述路径和事件都是通过id进行表征的,实际场景中,可能只有事件的名称(字符串),而没有事件对应的id,目前DLA也支持直接使用事件名称(字符串,比如本例中的event_name列)进行路径事件的表征,如:

SELECT funnel_sum(xwho_state, 7) AS funnel
FROM (SELECT user_id,
             funnel_count(event_time,
                          7 * 86400000,
                          event_name,
                          '启动,登陆,搜索商品,浏览商品,生成订单,订单付款,评价商品') 
             AS xwho_state
      FROM funnel_test
      WHERE event_name 
         IN ('启动', '登陆', '搜索商品', '浏览商品', '生成订单', '订单付款', '评价商品')
      GROUP BY user_id
     );

说明

关于漏斗问题和数据模型描述,部分内容转自:https://www.jianshu.com/p/2ffb4b6b54f5

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
相关文章
|
数据可视化 数据挖掘 Python
Python骚操作:一行代码实现探索性数据分析
Python骚操作:一行代码实现探索性数据分析
Python骚操作:一行代码实现探索性数据分析
|
机器学习/深度学习 传感器 算法
【数据分析】基于matlab实现齿轮箱振动数据分析
【数据分析】基于matlab实现齿轮箱振动数据分析
【数据分析】基于matlab实现齿轮箱振动数据分析
|
机器学习/深度学习 传感器 算法
【数据分析】基于有限差分时域(FDTD)方法实现微带结构的全波分析附Matlab代码
【数据分析】基于有限差分时域(FDTD)方法实现微带结构的全波分析附Matlab代码
【数据分析】基于有限差分时域(FDTD)方法实现微带结构的全波分析附Matlab代码
|
移动开发 JSON 前端开发
数据透视表上线!如何在纯前端实现这个强大的数据分析功能?(2)
数据透视表上线!如何在纯前端实现这个强大的数据分析功能?
501 0
数据透视表上线!如何在纯前端实现这个强大的数据分析功能?(2)
|
移动开发 前端开发 数据可视化
数据透视表上线!如何在纯前端实现这个强大的数据分析功能?(1)
数据透视表上线!如何在纯前端实现这个强大的数据分析功能?
201 0
数据透视表上线!如何在纯前端实现这个强大的数据分析功能?(1)
|
机器学习/深度学习 运维 算法
【数据分析】基于核主成分分析 (KPCA)实现 信号降维、重构、特征提取、故障检测附matlab代码
【数据分析】基于核主成分分析 (KPCA)实现 信号降维、重构、特征提取、故障检测附matlab代码
【数据分析】基于核主成分分析 (KPCA)实现 信号降维、重构、特征提取、故障检测附matlab代码
|
存储 SQL 前端开发
基于分布式关系型数据库,实现轻松应对百亿级数据分析场景解决方案
MyCat是什么? 从定义和分类来看,它是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库读写分离,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。也可以指定多个写库多个读库。 MyCat发展到目前的版本,已经不是一个单纯的MySQL代理了,它的后端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流数据库
基于分布式关系型数据库,实现轻松应对百亿级数据分析场景解决方案
|
数据挖掘 Python
数据分析----numpy数组实现对图片的翻转与裁剪
数据分析----numpy数组实现对图片的翻转与裁剪
259 0
数据分析----numpy数组实现对图片的翻转与裁剪
|
数据采集 数据挖掘 数据安全/隐私保护
数据分析实战——EXCEL实现复购率计算
复购率指消费者对该品牌产品或者服务的重复购买次数,重复购买率越多,则反应出消费者对品牌的忠诚度就越高,反之则越低。
2852 1
数据分析实战——EXCEL实现复购率计算
|
SQL 分布式计算 Cloud Native
在阿里云中实现EMR离线数据分析
E-MapReduce(简称“EMR”)是云原生开源大数据平台,向客户提供简单易集成的Hadoop、Hive、Spark、Flink、Presto、Clickhouse、Delta、Hudi等开源大数据计算和存储引擎。EMR计算资源可以根据业务的需要调整。EMR可以部署在阿里云公有云的ECS和ACK、专有云平台。产品文档地址:https://www.aliyun.com/product/emapreduce
384 0
在阿里云中实现EMR离线数据分析