在实践中使用Google Analytics(分析)中的原始数据

长期以来,我们一直认为标准的Google Analytics(分析)工具是获取有用信息的最佳方法。有时,我不得不应对一些局限性和相当奇怪的结果,而且似乎没有止境,直到一些分析师发现Google Analytics 360和将原始数据导出到Google BigQuery的机制。

在使用更高级的工具和SQL查询仅几个小时之后,我们仅使用Google Analytics(分析)的汇总报告就能够提取出我们从未收到的信息。从那时起,我们专注于研究原始(“原始”)数据的功能以及网络专家可以从中获得哪些实际好处。

本文回答以下问题:

  • 原始数据和摘要数据有什么区别?
  • 使用原始数据有什么好处?
  • 如何访问原始数据?
  • 如何使用这些新数据(实践示例)?

Google Analytics(分析)中的原始数据和摘要数据有什么区别


使用免费版本的Google Analytics(分析),您只能获取摘要数据。也就是说,将无法获得有关特定访问和事件的完整查看信息。当然,“用户资源管理器”报告包含Web分析可以使用的许多有用信息。但是,此文件受到一定的限制:它不能缩放并且不能下载。

在大多数情况下,仅具有摘要数据就足以获取常见问题的答案:

  • 哪个广告系列带来最多的转化?
  • Feature X的机器学习技术有多普遍(其用户群正在增长)?
  • 访客来自哪里(主要流量来源)?
  • 用户从哪里去什么设备?



您无需分析原始数据即可获得上述问题的答案。Google Analytics(分析)中的自定义或默认报告工具可以轻松实现此目的。摘要数据的主要问题是汇总数据。您映射了许多类型的用户操作,这些操作可用于隐藏非常有用的信息。我们以一个会话中几个页面的视图为例。我们有两个来源,共有六个会话,并且在一个会话中浏览了以下页面:

  • 来源A:1、1、2、2、2、10;
  • 来源B:2、2、3、3、4、4。

使用统计离群值方法,可以确定源A以较低的参与度来表征用户。但是,如果仅考虑平均数据,则由于两个页面的数量相同(中位数可以是任意值),因此可以得出两个来源涉及相同的结论。

为什么标准分析报告不包含此数据?主要原因是计算成本。仅提供选择性摘要数据,就无需处理报告中包含的数百万行。因此,免费版Google Analytics(分析)不包含用于免费执行高级计算的工具。

可以从原始数据中提取哪些信息


了解摘要数据的局限性,是时候找出如何使用原始数据了。考虑其应用的几种选择。

活动时间


任何使用标准Google Analytics(分析)工具的网络分析师都面临的局限性之一是,您无法确定将商品放入购物车与进行购买之间的时间间隔,无论此操作是否在单个会话中进行。当然,为此,您可以使用cookie并进行自己的计算。但这毫无意义,特别是因为Google Analytics(分析)已经为我们完成了这项工作。

分析原始数据之后,您可以轻松确定特定用户发生事件的确切时间,并针对同一用户与另一个事件进行比较分析。您还可以根据自己的判断汇总数据,获得平均,中位数或百分位数分布,或使用其他高级统计模型。20%的用户在2分钟内执行目标操作,而10%的用户在整个一周内执行此操作是否无关紧要?有了这些知识,您将使用各种方法来与这两类用户进行交互。

受众规模分析


Google Analytics(分析)报告和Google Analytics(分析)360报告均包含过去90天内的访问者细分数据。通常,为了获得可靠的数据,需要进行更长距离的分析(尤其是对于大型公司)。根据原始数据的分析,您可以获得以下问题的答案:

  1. 假期中所涉及的用户是否更有可能在9月份购买该产品,而不是同月其他类别的用户进行购买的可能性?
  2. 全年观看视频有什么影响?这对转化次数有何影响?

使用原始数据,您可以无限期地存储事件日志,并且仅在该数据已经过时的情况下才将其删除。

数据之间的关系


引入相关系数以确定两个变量值之间的统计关系。分析大量数据时,可以确定两种类型的用户行为之间的关系:

  • 网页浏览量如何影响目标操作的效果?
  • 消费的内容类型与用户最终获得的产品之间是否存在联系?
  • 有相关产品吗?例如,如果有人购买了产品A,则与哪个产品类别相关联?

第三方资料


最后但并非最不重要的一点是,如果连接其他数据源,原始数据将使您获得更多信息。以下是一些说明性示例:

电子商务数据。如果您将客户ID保存在Google Analytics(分析)中,该工具会执行添加到购物车或下订单的所有操作,则该工具最有用。即使Google Analytics(分析)工具无法运作,这仍可让您计算转换率的确切值(由于客户使用的广告拦截器,付款页面缺乏重定向,页面加载等待时间长以及其他原因)。此外,根据您自己的数据,您可以排除已取消的目标操作并返回以重新计算实际利润。它还允许您计算更复杂和封闭的指标,例如,用保证金代替收入。

CRM数据。比起大量线索包含大量不相关线索的事实,还有什么比这更糟的呢?这是B2B在线服务的常见问题。通过导出具有唯一潜在客户标识符(使用SHA-256电子邮件加密的客户标识符,生成的标识符等)的CRM数据,您可以轻松地将它们与Google Analytics(分析)中的客户标识符相关联。这样,您不仅可以计算生成的销售线索的百分比,还可以计算转化率。多通道分析将需要更复杂的查询,但是您可以完全控制计算过程。

离线活动。在线业务受到许多外部因素的影响:假期,天气情况,罢工,致命病毒,这些病毒使世界一半的人口自我隔离。 Google Analytics(分析)不提供引入新参数进行一定时间学习的功能。至于注解,它们不参与计算,仅用作用户界面元素。但是,了解假期如何影响销售数量会很有用。



为了进行这样的分析,有必要收集信息并以可读格式提供它。这样,您将获得相关的数据。

广告,搜索机器人,日志 -所有这些数据都应存储在单个存储库中。
通过学习将它们与分析数据进行比较,您可以实现最疯狂的梦想:

  • 较长的内容会吸引用户吗?通过选择合适的搜索机器人(例如Screaming Frog),您可以在文本内容的长度和页面浏览量之间建立关系。
  • 搜索引擎的行为会影响SEO优化吗?使用BigQuery日志数据,您可以确定对搜索机器人的访问频率如何影响搜索结果。

您的企业真正的盈利能力是什么?在归因计算算法中进行设置后,您可以针对所有使用的平台来衡量广告系列的投资回报率。

原始数据提取工具


上面提供的信息有利于原始数据。但是如何获得它们呢?考虑一些最常见的方法。

Google Analytics 360


如果您很幸运可以使用此服务,或者您有足够的预算支付使用该服务的费用,那么您将拥有从Google BigQuery提取原始数据的最佳工具。它允许您导出任何信息,包括高级电子商务数据。每行对应一个特定的会话,您可以使用大量的参数和指标。

Google Analytics(分析)App +网络和Firebase


最近,Web分析已经能够将数据导出到Google BigQuery,而不必购买Google Analytics(分析)360。Firebase是Google Analytics(分析)App + Web的核心,支持导出到Google BigQuery的功能。 Blaze将向您收取费用,后者使用即付即用的方式。如果您有大型的Internet门户,则必须跟踪预算。对于小型网站,费用从零到每月仅几美元。

每行对应一个包含屏幕或网页浏览的事件。您将不得不习惯于这种非常具体的数据呈现方式,这与Google Analytics(分析)中使用的方式不同。但是,对于想要使用原始数据的用户来说,此服务可能是最佳的解决方案。

其他免费工具:Yandex.Metrica和Matomo


我无法尝试所有工具,因为其中很多都是有偿的。它们每个都包含用于导出原始数据的功能。但是,有两种完全免费的在线服务,它们提供相同的功能,并且不收取使用费用。

Yandex.Metrica是绝对免费的工具,可通过其日志的API提供对原始数据的访问。Matomo是一个开源分析工具,需要直接安装在站点文件所在的服务器上。它将原始数据直接导出到您的数据库。

数据管道


将Google Analytics(分析)数据直接上传到数据仓库的另一种方法是通过数据管道。 OWOX BI在Google Analytics(分析)和BigQuery之间组织了强大的数据流。要实现此功能,您需要在Google Analytics(分析)中创建自定义任务。它创建Google Analytics(分析)有效负载的副本,并将其传输到最终数据仓库。

拥有足够的经验,您将能够独立创建自己的端点,以使用云服务的功能并基于日志分析来上传数据。以下是两个有用的资源可帮助您解决这一问题:
Simo Ahab-“如何构建GTM监视器”。阅读本文之后,您将学习如何使用云功能将数据发送到BigQuery。传输的数据量限制为每秒100,000行,可以将其集成到BigQuery服务中。如果行数超过上述最大值,则必须将多个日志中的数据分组。

Google云端帮助中心-无服务器像素跟踪架构 本资料讨论了创建自己的跟踪像素,然后将其集成到BigQuery中的机制。

使用BigQuery的示例和特例


现在您知道了使用原始数据的好处以及如何访问原始数据。现在,让我们看一些示例,这些示例清楚地说明使用此数据的原理。

在Google Analytics(分析)360中建立主题与目标操作之间的关系该
分析是针对具有在线订户的新闻站点进行的。分析的主要目的是在用户阅读的新闻主题与执行的目标操作之间建立一种关系(相关性)。

结果与结论:

corr_culture 0.397
corr_opinion 0.305
corr_lifestyle 0.0468
corr_sport 0.009

订阅该网站的人中最有可能的类别是对“文化”和“意见”部分感兴趣的用户。另一方面,如果用户对标题“生活方式”或“运动”感兴趣,则订阅它们的可能性很小。

查询BigQuery
SELECT
CORR(culture,transac) AS corr_culture,
CORR(opinion,transac) AS corr_opinion,
CORR(lifestyle,transac) AS corr_lifestyle,
CORR(sport,transac) AS corr_sport
FROM(
SELECT
  SUM(IF(hit.page.pagePath LIKE'/culture%',
      1,
      0)) AS culture,
  SUM(IF(hit.page.pagePath LIKE'/opinion%',
      1,
      0)) AS opinion,
  SUM(IF(hit.page.pagePath LIKE'/lifestyle%',
      1,
      0)) AS lifestyle,-
  SUM(IF(hit.page.pagePath LIKE'/sport%',
      1,
      0)) AS sport,      
  COUNT(hit.transaction.transactionId) AS transac
FROM
  `mydatabase.view_id.ga_sessions_*`,
  UNNEST(hits) AS hit
WHERE
  _TABLE_SUFFIX BETWEEN '20191201' AND '20200301'
GROUP BY
  fullVisitorId
ORDER BY
  transac DESC
)


使用Firebase进行同类群组分析


分析了内容定期更新且季节性较高的应用程序。进行分析以找到以下问题的答案:
首次安装此应用程序的用户的行为如何?

吸引定期使用该应用程序的客户的最佳时间是什么?

结果和结论:



从收到的数据来看,该应用程序最受9月和12月首次下载该应用程序的客户使用。

查询BigQuery
# change my-app.analytics_123456789 to your ID
WITH cohorte_september
AS
(
WITH
user_september AS
(
SELECT DISTINCT user_pseudo_id AS user
FROM `my-app.analytics_123456789.events_*`
WHERE
_table_suffix between '20190901' AND '20190930'
AND
event_name="first_open"
)
SELECT sessions, month
FROM
(
(SELECT COUNT(DISTINCT user_pseudo_id) AS sessions,"201909" AS month
FROM `my-app.analytics_123456789.events_*`
WHERE
_table_suffix between '20190901' AND '20190930'
AND event_name="session_start"
AND user_pseudo_id IN (SELECT user FROM user_september)
)
UNION ALL
(SELECT COUNT(DISTINCT user_pseudo_id),"201910"
FROM `my-app.analytics_123456789.events_*`
WHERE
_table_suffix between '20191001' AND '20191031'
AND event_name="session_start"
AND user_pseudo_id IN (SELECT user FROM user_september)
)
UNION ALL
(
SELECT COUNT(DISTINCT user_pseudo_id),"201911"
FROM `my-app.analytics_123456789.events_*`
WHERE
_table_suffix between '20191101' AND '20191130'
AND event_name="session_start"
AND user_pseudo_id IN (SELECT user FROM user_september)
)
UNION ALL
(
SELECT COUNT(DISTINCT user_pseudo_id),"201912"
FROM `my-app.analytics_123456789.events_*`
WHERE
_table_suffix between '20191201' AND '20191231'
AND event_name="session_start"
AND user_pseudo_id IN (SELECT user FROM user_september)
)
UNION ALL
(
SELECT COUNT(DISTINCT user_pseudo_id),"202001"
FROM `my-app.analytics_123456789.events_*`
WHERE
_table_suffix between '20200101' AND '20200131'
AND event_name="session_start"
AND user_pseudo_id IN (SELECT user FROM user_september)
)
UNION ALL
(
SELECT COUNT(DISTINCT user_pseudo_id),"202002"
FROM `my-app.analytics_123456789.events_*`
WHERE
_table_suffix between '20200201' AND '20200229'
AND event_name="session_start"
AND user_pseudo_id IN (SELECT user FROM user_september)
)
UNION ALL
(
SELECT COUNT(DISTINCT user_pseudo_id),"202003"
FROM `my-app.analytics_123456789.events_*`
WHERE
_table_suffix between '20200301' AND '20200331'
AND event_name="session_start"
AND user_pseudo_id IN (SELECT user FROM user_september)
)
)
ORDER BY month ASC
),

#october

cohorte_october AS
(
WITH
user_october AS
(
SELECT DISTINCT user_pseudo_id AS user
FROM `my-app.analytics_123456789.events_*`
WHERE
_table_suffix between '20191001' AND '20191031'
AND
event_name="first_open"
)
SELECT sessions, month
FROM
(
(SELECT COUNT(DISTINCT user_pseudo_id) AS sessions,"201909" AS month
FROM `my-app.analytics_123456789.events_*`
WHERE
_table_suffix between '20190901' AND '20190930'
AND event_name="session_start"
AND user_pseudo_id IN (SELECT user FROM user_october )
)
UNION ALL
(SELECT COUNT(DISTINCT user_pseudo_id),"201910"
FROM `my-app.analytics_123456789.events_*`
WHERE
_table_suffix between '20191001' AND '20191031'
AND event_name="session_start"
AND user_pseudo_id IN (SELECT user FROM user_october )
)
UNION ALL
(
SELECT COUNT(DISTINCT user_pseudo_id),"201911"
FROM `my-app.analytics_123456789.events_*`
WHERE
_table_suffix between '20191101' AND '20191130'
AND event_name="session_start"
AND user_pseudo_id IN (SELECT user FROM user_october )
)
UNION ALL
(
SELECT COUNT(DISTINCT user_pseudo_id),"201912"
FROM `my-app.analytics_123456789.events_*`
WHERE
_table_suffix between '20191201' AND '20191231'
AND event_name="session_start"
AND user_pseudo_id IN (SELECT user FROM user_october )
)
UNION ALL
(
SELECT COUNT(DISTINCT user_pseudo_id),"202001"
FROM `my-app.analytics_123456789.events_*`
WHERE
_table_suffix between '20200101' AND '20200131'
AND event_name="session_start"
AND user_pseudo_id IN (SELECT user FROM user_october )
)
UNION ALL
(
SELECT COUNT(DISTINCT user_pseudo_id),"202002"
FROM `my-app.analytics_123456789.events_*`
WHERE
_table_suffix between '20200201' AND '20200229'
AND event_name="session_start"
AND user_pseudo_id IN (SELECT user FROM user_october )
)
UNION ALL
(
SELECT COUNT(DISTINCT user_pseudo_id),"202003"
FROM `my-app.analytics_123456789.events_*`
WHERE
_table_suffix between '20200301' AND '20200331'
AND event_name="session_start"
AND user_pseudo_id IN (SELECT user FROM user_october)
)
)
ORDER BY month ASC
),

#november

cohorte_november AS
(
WITH
user_november AS
(
SELECT DISTINCT user_pseudo_id AS user
FROM `my-app.analytics_123456789.events_*`
WHERE
_table_suffix between '20191101' AND '20191130'
AND
event_name="first_open"
)
SELECT sessions, month
FROM
(
(SELECT COUNT(DISTINCT user_pseudo_id) AS sessions,"201909" AS month
FROM `my-app.analytics_123456789.events_*`
WHERE
_table_suffix between '20190901' AND '20190930'
AND event_name="session_start"
AND user_pseudo_id IN (SELECT user FROM user_november )
)
UNION ALL
(SELECT COUNT(DISTINCT user_pseudo_id),"201910"
FROM `my-app.analytics_123456789.events_*`
WHERE
_table_suffix between '20191001' AND '20191031'
AND event_name="session_start"
AND user_pseudo_id IN (SELECT user FROM user_november )
)
UNION ALL
(
SELECT COUNT(DISTINCT user_pseudo_id),"201911"
FROM `my-app.analytics_123456789.events_*`
WHERE
_table_suffix between '20191101' AND '20191130'
AND event_name="session_start"
AND user_pseudo_id IN (SELECT user FROM user_november )
)
UNION ALL
(
SELECT COUNT(DISTINCT user_pseudo_id),"201912"
FROM `my-app.analytics_123456789.events_*`
WHERE
_table_suffix between '20191201' AND '20191231'
AND event_name="session_start"
AND user_pseudo_id IN (SELECT user FROM user_november )
)
UNION ALL
(
SELECT COUNT(DISTINCT user_pseudo_id),"202001"
FROM `my-app.analytics_123456789.events_*`
WHERE
_table_suffix between '20200101' AND '20200131'
AND event_name="session_start"
AND user_pseudo_id IN (SELECT user FROM user_november )
)
UNION ALL
(
SELECT COUNT(DISTINCT user_pseudo_id),"202002"
FROM `my-app.analytics_123456789.events_*`
WHERE
_table_suffix between '20200201' AND '20200229'
AND event_name="session_start"
AND user_pseudo_id IN (SELECT user FROM user_november )
)
UNION ALL
(
SELECT COUNT(DISTINCT user_pseudo_id),"202003"
FROM `my-app.analytics_123456789.events_*`
WHERE
_table_suffix between '20200301' AND '20200331'
AND event_name="session_start"
AND user_pseudo_id IN (SELECT user FROM user_november )
)
)
ORDER BY month ASC
),

#decembre


cohorte_decembre AS
(
WITH
user_decembre AS
(
SELECT DISTINCT user_pseudo_id AS user
FROM `my-app.analytics_123456789.events_*`
WHERE
_table_suffix between '20191201' AND '20191231'
AND
event_name="first_open"
)
SELECT sessions, month
FROM
(
(SELECT COUNT(DISTINCT user_pseudo_id) AS sessions,"201909" AS month
FROM `my-app.analytics_123456789.events_*`
WHERE
_table_suffix between '20190901' AND '20190930'
AND event_name="session_start"
AND user_pseudo_id IN (SELECT user FROM user_decembre )
)
UNION ALL
(SELECT COUNT(DISTINCT user_pseudo_id),"201910"
FROM `my-app.analytics_123456789.events_*`
WHERE
_table_suffix between '20191001' AND '20191031'
AND event_name="session_start"
AND user_pseudo_id IN (SELECT user FROM user_decembre  )
)
UNION ALL
(
SELECT COUNT(DISTINCT user_pseudo_id),"201911"
FROM `my-app.analytics_123456789.events_*`
WHERE
_table_suffix between '20191101' AND '20191130'
AND event_name="session_start"
AND user_pseudo_id IN (SELECT user FROM user_decembre  )
)
UNION ALL
(
SELECT COUNT(DISTINCT user_pseudo_id),"201912"
FROM `my-app.analytics_123456789.events_*`
WHERE
_table_suffix between '20191201' AND '20191231'
AND event_name="session_start"
AND user_pseudo_id IN (SELECT user FROM user_decembre  )
)
UNION ALL
(
SELECT COUNT(DISTINCT user_pseudo_id),"202001"
FROM `my-app.analytics_123456789.events_*`
WHERE
_table_suffix between '20200101' AND '20200131'
AND event_name="session_start"
AND user_pseudo_id IN (SELECT user FROM user_decembre  )
)
UNION ALL
(
SELECT COUNT(DISTINCT user_pseudo_id),"202002"
FROM `my-app.analytics_123456789.events_*`
WHERE
_table_suffix between '20200201' AND '20200229'
AND event_name="session_start"
AND user_pseudo_id IN (SELECT user FROM user_decembre  )
)
UNION ALL
(
SELECT COUNT(DISTINCT user_pseudo_id),"202003"
FROM `my-app.analytics_123456789.events_*`
WHERE
_table_suffix between '20200301' AND '20200331'
AND event_name="session_start"
AND user_pseudo_id IN (SELECT user FROM user_decembre  )
)
)
ORDER BY month ASC
)

SELECT cohorte_september.sessions AS september_cohort,  
 cohorte_october.sessions AS october_cohort,  
 cohorte_november.sessions AS november_cohort,  
 cohorte_decembre.sessions AS december_cohort,  
 month

FROM cohorte_september
JOIN  cohorte_october USING (month)
JOIN  cohorte_november USING (month)
JOIN  cohorte_decembre USING (month)
ORDER BY month ASC


发现


最有可能的是,不久的将来将会发生重大变化,并且Google App + Web将会成为行业标准。这种方法可在Marketing Platform和Google Cloud Platform等Google服务(尤其是BigQuery)之间提供更紧密的集成。如果您失去了创建SQL查询(一种用于DBMS的语言)的能力,我强烈建议您刷新内存中的信息并进行实践。

由于易于访问原始数据,快速高效的计算过程以及良好的信息可视化,高级数字数据分析正变得越来越强大。在不久的将来,将实现与其他类型的业务数据的更紧密集成。

多年来,专家一直认为,数字分析和业务分析必须协同工作。我们正在缓慢但有信心地将这一想法变为现实。

All Articles