在 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_1
到 hits.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 中获取最频繁的值