【问题标题】:Building a basic funnel using Google Big Query使用 Google Big Query 构建基本漏斗
【发布时间】:2018-07-09 16:16:17
【问题描述】:

我注意到有很多使用 Google BigQuery 的 Google Analytics 用户,但文档非常有限。是否可以帮助生成一个简单的渠道来显示访问过 /pageA 然后 /pageB 然后 /pageC 的用户

我见过很多不同的方法 - 我不清楚“正确”的方法是什么。

【问题讨论】:

    标签: google-analytics google-bigquery


    【解决方案1】:

    您可以先使用 array_concat_agg() 连接用户点击,然后根据新的用户范围表进行计算。当然,这在很大程度上取决于您选择的时间范围。

    这里以来自 Google 的虚拟数据为例:

    #standardSQL
    WITH arrAgg AS (
      SELECT
        fullvisitorid,
        -- concatenate arrays over multiple sessions
        ARRAY_CONCAT_AGG(hits ORDER BY visitstarttime ASC) userHits
      FROM
        `google.com:analytics-bigquery.LondonCycleHelmet.ga_sessions_20130910`
      GROUP BY 1
    )
    , journey AS (
      SELECT 
        fullvisitorId,
        -- get a proper running index with combination of unnest and offset of aggregated hits array
        ARRAY( (SELECT AS STRUCT index+1 as hitNumber, page FROM UNNEST(userHits) WITH OFFSET AS index)) as hits
      FROM arrAgg
    )
    
    SELECT * FROM journey
    

    当您运行它时,您可以看到新的“原材料”。在第一步中,我连接命中,在第二步中,我为页面建立一个适当的索引,并将 eerything 放回“命中”数组中。

    您可以使用交叉连接并比较页面的步骤和顺序来构建您的用户旅程:

    #standardSQL
    WITH arrAgg AS (
      SELECT
        fullvisitorid,
        SUM(totals.visits) sessions,
        -- concatenate arrays over multiple sessions
        ARRAY_CONCAT_AGG(hits ORDER BY visitstarttime ASC) userHits
      FROM
        `google.com:analytics-bigquery.LondonCycleHelmet.ga_sessions_20130910`
      GROUP BY 1
    )
    , journey AS (
      SELECT 
        fullvisitorId,
        sessions,
        -- get a proper running index with combination of unnest and offset of aggregated hits array
        ARRAY( (SELECT AS STRUCT index+1 as hitNumber, page FROM UNNEST(userHits) WITH OFFSET AS index WHERE type='PAGE')) as hits
      FROM arrAgg
    )
    -- funnel: homepage: /, login: /login.html, basket: /basket.html, confirm: /confirm.html
    SELECT 
      SUM(sessions) allSessions,
      COUNT(1) allUsers,
      -- check if any page was home page
      SUM( (SELECT IF( LOGICAL_OR(page.pagePath='/'), 1, 0) FROM j.hits) ) step1_home,
      -- cross join hits array with itself: combination of all pages with all pages: any of those combinations our two pages? came home before login?: if yes for any given amount add up 1
      SUM( (SELECT IF( LOGICAL_OR(a.page.pagePath='/' AND b.page.pagePath='/login.html' AND a.hitNumber < b.hitNumber) ,1, 0 ) FROM j.hits a CROSS JOIN j.hits b) ) step2_login,
      -- extend cross join principle to a third page
      SUM( (SELECT IF( LOGICAL_OR(
          a.page.pagePath='/' AND b.page.pagePath='/login.html' AND c.page.pagePath='/basket.html' AND
          a.hitNumber < b.hitNumber AND b.hitNumber < c.hitNumber 
          ) ,1, 0 ) FROM j.hits a CROSS JOIN j.hits b CROSS JOIN j.hits c) ) step3_basket,
      -- extend cross join principle to a fourth page
      SUM( (SELECT IF( LOGICAL_OR(
          a.page.pagePath='/' AND b.page.pagePath='/login.html' AND c.page.pagePath='/basket.html' AND d.page.pagePath='/confirm.html' AND
          a.hitNumber < b.hitNumber AND b.hitNumber < c.hitNumber AND c.hitNumber < d.hitNumber
          ) ,1, 0 ) FROM j.hits a CROSS JOIN j.hits b CROSS JOIN j.hits c CROSS JOIN j.hits d) ) step4_confirm
    FROM journey j
    

    由于所有操作都使用数组上的子查询进行操作,因此由于并行化,它应该可以很好地扩展。 请在使用前对其进行测试 - 我没有;)但它应该指向正确的方向。

    【讨论】:

    • 马丁看起来棒极了 - 谢谢。我会尝试更多地理解它并进行测试。
    • 好的,如果您有任何问题,请告诉我
    • 抱歉 - 很慢,我找到了一种更简单的方法 - 但我想探索你的解决方案,看看它是否更好(更准确)只是需要更多的代码来理解
    • @MobileBloke 您能否发布更简单的解决方案作为答案?只是为了让所有人都可以使用它。
    • 100% 会这样做——如果它更好的话。我不得不跳到另一个问题上,所以我把它标记为正确的。
    【解决方案2】:

    在这里查看:https://online-behavior.com/analytics/funnel-analysis

    或者,如果您想手动操作:

    1. 选择所有登陆起始页的会话(记录最小点击数)
    2. LEFT JOIN 并选择下一页上的所有会话,其中命中数大于起始页的命中数(匹配会话 ID)
    3. 重复第 2 步,直到漏斗完成
    4. 统计所有按页面名称分组的会话以进行汇总

    【讨论】:

    • 是的 - 所有这些似乎都专注于基于会话的渠道 - 而不是真正基于“用户”的渠道
    • 您可以轻松地按visitorid 或自定义用户定义进行计数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多