DLA漏斗分析旨在帮助运营人员分析一个多步骤操作过程中每一步的转化与流失情况。假设购买商品过程中,需要触发一系列事件:启动 > 登录 > 搜索商品 > 查看商品 > 生成订单等。运营人员分析某段时间内(例如,2017年01月05号~2017年02月05号)所有依次触发启动 > 登录 > 搜索商品 > 查看商品 > 生成订单事件的人群的转化流失情况,即计算所有用户中触发登录事件的总人数A、A中触发搜索商品事件的总人数B、B中触发查看商品事件的总人数C以及C中触发生成订单事件的总人数D。

漏斗转化

漏斗分析中包含时间窗口的概念,即需要保证所有事件在同一个窗口期内触发。例如时间窗口为1天,用户001触发搜索商品事件的时间和触发登录事件的时间间隔在一天内,搜索商品事件才有效,否则视为无效。同理,用户001触发查看商品事件的时间和触发登录事件的时间间隔也必须在一天内。时间窗口可以为1天、3天、7天或者1小时、6小时等任意长时间段。

前提条件

本文示例中的测试数据存储在OSS中,您可以按照以下步骤将您的测试数据存储在OSS中。

  1. 开通OSS服务
  2. 创建存储空间
  3. 上传文件

    本文示例中将以下测试数据上传到OSS的funnel_data目录。

    ​ 1000002  1483258815538  收藏商品  {}  20170101
     1000002  1483274981790  启动  {}  20170101
     1000002  1483223087508  搜索商品  {"content": "computer", "page_num": 1}  20170101
     1000002  1483232016805  搜索商品  {"content": "Apple", "page_num": 2}  20170101
     1000002  1483200895552  订单付款  {}  20170101
     1000003  1483218002826  搜索商品  {"content": "computer", "page_num": 2}  20170101
     1000003  1483206471681  加入购物车  {}  20170101
     1000003  1483284553531  加入购物车  {}  20170101
     1000003  1483279891663  浏览商品  {"brand": "Apple", "price": 9500}  20170101
     1000003  1483259182702  加入购物车  {}  20170101
     1000004  1483260505099  登录  {}  20170101
     1000004  1483231995064  收藏商品  {}  20170101
     1000004  1483206318588  加入购物车  {}  20170101
     1000004  1483241973408  登录  {}  20170101
     1000004  1483202785557  收藏商品  {}  20170101
     1000005  1483214265416  收藏商品  {}  20170101
     1000005  1483206343383  收藏商品  {}  20170101
     1000005  1483229265488  浏览商品  {"brand": "HuaW", "price": 9500}  20170101
     1000005  1483244294552  生成订单  {"price_all": 5000}  20170101
     1000005  1483246988534  登录  {}  20170101
     1000006  1483207838307  收藏商品  {}  20170101​

开始使用漏斗分析之前,您需要在DLA中完成以下准备工作。

  1. 开通云原生数据湖分析服务
  2. 重置数据库账号密码

步骤一:创建OSS Schema

​CREATE Schema funnel_test_schema
WITH DBPROPERTIES (
  catalog = 'oss',
  location = 'oss://bucket-name/'
)​

步骤二:创建表

​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://bucket-name/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 '2017-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 '2017-01-20'
        GROUP BY user_id 
      );​
  • 如果需要对事件对应的JSON属性列event_attr的某个属性进行过滤,例如对10004类事件中price在3500到5000之间的数据进行过滤。

    ​  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 '2017-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);​