在 BigQuery Google Analytics 数据中的两个页面之间提取用户旅程数据

Posted

技术标签:

【中文标题】在 BigQuery Google Analytics 数据中的两个页面之间提取用户旅程数据【英文标题】:Extract user journey data between two pages in BigQuery Google Analytics data 【发布时间】:2019-11-16 08:29:37 【问题描述】:

如何在 Google Analytics BigQuery 导出数据中提取两个特定页面之间的用户旅程数据?

示例:

网站有 100 个页面:hits.page.pagePath=/page_1hits.page.pagePath=/page_100

目标是从/page_13/page_22 提取用户旅程数据,包括所有中间页面。

挑战在于旅程不是连续的,例如/page_13 -> /page14 -> ... -> /page_22

但可能是/page13 -> /page_5 -> /page_41 -> /page_99 -> /page_22

【问题讨论】:

请展示一些示例数据。 类似于 Google 在 BigQuery 中的 Google Analytics 示例数据集。 SELECT DISTINCT page.pagePath FROM bigquery-public-data.google_analytics_sample.ga_sessions_20170801, UNNEST(hits) limit 100; 假设用户从/store.html/basket.html 的旅程。介于两者之间的用户可能查看过/google+redesign/apparel/womens/womens+outerwear/google+redesign/wearables/men+s+t-shirts/home/google+redesign/bags/backpacks/google+laptop+tech+backpack+black.axd。谢谢! 【参考方案1】:

您可以使用array_agg()。如果我理解正确,您希望一个组在第一次到达 page_13 时存在,并在到达 page_22 时结束。

让我假设对于每个用户,您希望 first 命中 13 到 first 命中 22。您可以通过以下两个特征来识别组:

select h.*
from (select h.*,
             countif( page like '%/page_13' ) over (partition by user order by hit_time) as hit_13,
             countif( page like '%/page_22' ) over (partition by user order by hit_time) as hit_22,
             countif( page like '%/page_22' ) over (partition by user) as has_22
      from hits h
     ) h
where has_22 and
      hit_13 > 0 and
      (hit_22 = 0 or page like '%/page_22);

这会返回以 13 开头、以 22 结尾的页面,并确保用户两者都有。

现在对于旅程,只需使用聚合。但是,唉,BQ 不允许对数组进行聚合——如果您随后想通过旅程进行总结。所以,我会改用string_agg()

select h.user,
       string_agg(page order by hit_time, ' -> ')
from (select h.*
      from (select h.*,
                   countif( page like '%/page_13' ) over (partition by user order by hit_time) as hit_13,
                   countif( page like '%/page_22' ) over (partition by user order by hit_time) as hit_22,
                   countif( page like '%/page_22' ) over (partition by user) as has_22
            from hits h
           ) h
      where has_22 and
            hit_13 > 0 and
            (hit_22 = 0 or page like '%/page_22)
     ) h
group by user;

【讨论】:

非常感谢您抽出宝贵的时间!【参考方案2】:

Google Analytics 示例dataset 有一本食谱,其中包含一些示例,例如点击序列一个here。使用STRING_AGG(hits.page.pagePath),您可以构建所需的userJourney 命中序列。

要仅过滤两个所需的页面,我们可以使用诸如答案here 之类的方法。但是,在我们的例子中,我们希望将一个设置为origin,将另一个设置为destination。此外,我们可以在用户到达目标页面后进行剪切,从而使这两条路径相似:

/page13 -> /page_5 -> /page_41 -> /page_99 -> /page_22

/page13 -> /page_5 -> /page_41 -> /page_99 -> /page_22 -> page_37

还请注意,我们可以使用新的scripting 功能(目前处于测试阶段)来更改脚本顶部的页面对并构建动态正则表达式。作为使用可用公共数据检查/home/google+redesign/shop+by+brand/youtube 之间旅程的示例:

#standardSQL
-- Script to change origin and destination pages with dynamic regex.
DECLARE origin, destination, regex STRING;

SET origin = '/home';
SET destination = '/google+redesign/shop+by+brand/youtube';
SET regex = CONCAT('(', REPLACE(origin, '+', '\\+'), '.*?', REPLACE(destination, '+', '\\+'), ')');

-- Run query
SELECT
  pagePath AS userJourney,
  COUNT(1) AS frequency
FROM (
  SELECT
    visitId,
    REGEXP_EXTRACT(STRING_AGG(hits.page.pagePath), regex) AS pagePath
  FROM
    `bigquery-public-data.google_analytics_sample.ga_sessions_*`,
    UNNEST(hits) AS hits
  WHERE
    _TABLE_SUFFIX BETWEEN '20170701'
    AND '20170731'
    AND hits.type="PAGE"
  GROUP BY
    visitId)
WHERE
  pagePath IS NOT NULL
GROUP BY
  pagePath
ORDER BY
  COUNT(1) DESC
LIMIT
  10

返回以下结果:

为了进一步优化它,我们可以只选择最后一次出现的origin,但也许您想将诸如此类的东西算作不同的路径:

/page13 -> /page_99 -> /page_22

/page13 -> /page_5 -> /page_13 -> /page_99 -> /page_22

【讨论】:

非常感谢您的详细回答,它真的很有帮助。由于脚本需要在 prod 中运行,我将等待正式发布。

以上是关于在 BigQuery Google Analytics 数据中的两个页面之间提取用户旅程数据的主要内容,如果未能解决你的问题,请参考以下文章

在 Google Apps 脚本中使用 BigQuery 连接到 Google 电子表格

Google 标准 SQL UDF - 写入 BigQuery

在 Google 表格中使用 BigQuery,如何授予其他用户按“刷新”的权限?

如何在 Google 的 Bigquery 中获取最频繁的值

如何使用 AppScript 在 BigQuery 中将 Google 工作表持久化为表格

BigQuery 中缺少 Google 广告系列