Мы долго считали, что стандартные инструменты Google Analytics – лучший способ получить полезную информацию. Временами приходилось сталкиваться с некоторыми ограничениями и весьма странными результатами, и казалось, этому нет конца и края, пока некоторые аналитики не открыли для себя Google Analytics 360 и механизмы экспорта необработанных данных в Google BigQuery.

Спустя всего несколько часов работы с более продвинутыми инструментами и SQL-запросами, мы смогли извлечь информацию, которую бы никогда не получили, используя только сводные отчеты Google Analytics. С того момента мы сосредоточились на изучении особенностей необработанных («сырых») данных и на том, какую практическую пользу из них могут извлечь специалисты в области веб-аналитики.

В этой статье есть ответы на следующие вопросы:

  • В чем разница между необработанными и сводными данными?
  • Какую пользу можно извлечь от использования необработанных данных?
  • Как получить доступ к необработанным данным?
  • Как использовать эти новые данные (практические примеры)?

Чем отличаются raw и сводные данные в Google Analytics


Используя бесплатную версию сервиса Google Analytics, можно получать только сводные данные. То есть, полная информация о просмотрах для конкретного визита и события будет недоступна. Разумеется, отчет User Explorer содержит много полезной информации, которую могут использовать веб-аналитики. Однако на этот файл наложены определенные ограничения: он не масштабируется и недоступен для скачивания.

В большинстве случаев наличия лишь сводных данных достаточно для получения ответов на распространенные вопросы:

  • Какая кампания приносит наибольшее число конверсий?
  • Насколько распространенной является технология машинного обучения Feature X (растет ли число ее пользователей)?
  • Откуда приходят посетители (основные источники трафика)?
  • С каких устройств пользователи переходят на сайт?



Вам не нужно анализировать необработанные данные, чтобы получить ответы на вопросы выше. С этим легко справятся кастомизированные или настроенные по умолчанию инструменты для формирования отчетов в Google Analytics. Основная проблема сводных данных состоит в том, что они агрегированы. Вы сопоставляете множество типов пользовательских действий, за которыми может скрываться весьма полезная информация. Приведем пример с просмотрами нескольких страниц за один сеанс. Имеем два источника с шестью сеансами со следующим количеством просмотренных страниц за один сеанс:

  • Источник А: 1, 1, 2, 2, 2, 10;
  • Источник Б: 2, 2, 3, 3, 4, 4.

Методом статистического выброса можно определить, что источник А характеризует пользователя с меньшей степенью вовлеченности. Но если учитывать только усредненные данные, можно сделать вывод об одинаковой вовлеченности для обоих источников, так как число страниц совпадает (медиана может быть любой).

Почему стандартные отчеты Google Analytics не содержат этих данных? Основная причина заключается в вычислительных затратах. Предоставляя только выборочные сводные данные, отпадает необходимость в обработке миллионов строк, содержащихся в отчете. Поэтому бесплатная версия Google Analytics не содержит инструментов для выполнения расширенных вычислений на бесплатной основе.

Какую информацию можно извлечь из необработанных данных


Понимая ограниченность сводных данных, пришло время узнать, как можно использовать необработанные данные. Рассмотрим несколько вариантов их применения.

Длительность ивентов


Одно из ограничений, с которым сталкивается любой веб-аналитик, использующий стандартные инструменты Google Analytics – нельзя определить временной интервал между помещением товара в корзину и оформлением покупки, независимо от того, происходит это действие в рамках одного сеанса или нет. Разумеется, для этого можно использовать cookies и проводить собственные расчеты. Но это бессмысленно, тем более что Google Analytics уже проделали эту работу за нас.

Проведя анализ необработанных данных, можно легко определить точное время возникновения события для конкретного пользователя, провести сравнительный анализ с другим событием для этого же пользователя. Также можно агрегировать данные на свое усмотрение, получив среднее, медианное или процентильное распределение, или использовать другую продвинутую статистическую модель. Разве тот факт, что 20% пользователей выполняют целевое действие за 2 минуты, а 10% — в течение целой недели, не имеет никакого значения? С этими знаниями вы будете использовать различные подходы для взаимодействия с этими двумя категориями пользователей.

Анализ объема аудитории


В отчетах как Google Analytics, так и Google Analytics 360 содержатся данные о сегментации посетителей на протяжении последних 90 дней. Зачастую для получения достоверных данных требуется проведение анализа на более длинных дистанциях (особенно это касается крупных компаний). На основе анализа необработанных данных можно получать ответы на следующие вопросы:

  1. Выше ли вероятность того, что пользователи, привлеченные в сезон праздников, будут приобретать продукт в сентябре, чем вероятность совершения покупки другими категориями пользователей в этом же месяце?
  2. Каков эффект от просмотра видеороликов на протяжении года и как это отражается на количестве конверсий?

Используя необработанные данные, вы сможете хранить логи событий на протяжении неограниченного времени и удалять их только тогда, когда эти данные уже безнадежно устареют.

Взаимосвязи между данными


Коэффициент корреляции вводят для определения статистической взаимосвязи между двумя переменными значениями. При анализе больших объемов данных можно определять взаимоотношения между двумя типами поведения пользователей:

  • Как влияют просмотры тематических страниц на выполнение целевого действия?
  • Существует ли связь между типом потребляемого контента и продуктом, который приобретает пользователь в конечном итоге?
  • Существуют ли связанные товары? Например, если кто-то покупает продукт А, какая категория продуктов связана с ним?

Сторонние данные


Последнее, но не менее важное, — необработанные данные позволяют получать намного больше информации, если подключить другие источники данных. Ниже приведены несколько наглядных примеров:

Данные электронной коммерции. Инструмент приносит наибольшую пользу в том случае, если вы сохраняете идентификатор клиента в Google Analytics, выполнявшим любые действия по добавлению в корзину или оформлению заказа. Это позволит рассчитать точное значение коэффициента конверсии, даже если инструменты Google Analytics не сработали (из-за используемых клиентами блокировщиков рекламы, отсутствия редиректа со страницы оплаты, длительного времени ожидания загрузки страницы и прочих причин). Кроме того, основываясь на собственных данных, вы сможете исключить отмененные целевые действия и возвраты для перерасчета реальной прибыли. Также это позволяет рассчитывать более сложные и закрытые показатели, например, маржу вместо дохода.

Данные CRM. Что может быть хуже, чем то, что в огромном множестве лидов содержится большое количество нерелевантных лидов? Это распространенная проблема для B2B онлайн сервисов. Экспортируя данные CRM с уникальными идентификаторами лидов (идентификатор клиента, зашифрованный с помощью SHA-256 e-mail, сгенерированный идентификатор и прочие), можно легко связывать их с идентификаторами клиентов в Google Analytics. Это позволит рассчитывать не только процент сгенерированных лидов, а и коэффициент конверсии. Для многоканального анализа потребуются более сложные запросы, однако вы сможете полностью контролировать процессы вычислений.

Оффлайн события. Бизнес в сфере онлайн подвержен влиянию множества внешних факторов: праздники, погодные условия, забастовки, смертельный вирус, который отправил на самоизоляцию половину населения планеты. Google Analytics не предусматривает возможность введения новых параметров для изучения на определенный промежуток времени. Что касается аннотаций, они не участвуют в вычислениях и используются исключительно как элемент пользовательского интерфейса. Однако было бы полезно узнать, как праздники влияют на число продаж.



Для проведения такого анализа необходимо собрать информацию и предоставить ее в удобочитаемом формате. Выполнив это, вы будете обладать актуальными и востребованными данными.

Объявления, поисковые роботы, логи – все эти данные следует хранить в едином хранилище.
Научившись сопоставлять их с аналитическими данными, вы сможете воплотить в реальность самые смелые мечты:

  • Способствует ли более длинный контент привлечению пользователей? Правильно подобрав поискового робота (например, Screaming Frog) можно установить взаимосвязь между длиной текстового контента и числом просмотров страниц.
  • Влияет ли поведение поисковых роботов на SEO-оптимизацию? Используя данные лога BigQuery, можно установить, как влияет частота посещения поискового робота на поисковую выдачу.

Какова реальная рентабельность вашего бизнеса? Внеся настройки в алгоритм расчета атрибуции, можно измерить отдачу от инвестиций в рекламные кампании по всем используемым платформам.

Инструменты для извлечения необработанных данных


Информация, представленная выше, говорит в пользу необработанных данных. Но как их получить? Рассмотрим несколько наиболее распространенных способов.

Google Analytics 360


Если вам повезло получить доступ к этому сервису или вы располагаете достаточным бюджетом для оплаты стоимости его использования, в ваших руках находится лучший инструмент для извлечения необработанных данных в Google BigQuery. Он позволяет экспортировать любую информацию, включая расширенные данные электронной коммерции. Каждой строке соответствует определенный сеанс, и вы сможете использовать огромное количество параметров и метрик.

Google Analytics App+Web и Firebase


С недавнего времени веб-аналитики получили возможность экспортировать данные в Google BigQuery без необходимости покупки Google Analytics 360. Firebase, который является ядром Google Analytics App+Web, поддерживает функционал экспорта в Google BigQuery. Вам будет выставлен счет Blaze, который использует подход «оплата по мере использования». Если у вас крупный интернет портал, вам придется следить за своим бюджетом. Для небольших сайтов затраты составят от совсем ничего до всего нескольких долларов в месяц.

Каждой строке соответствует событие, содержащее скрин или просмотр страницы. Вам придется привыкнуть к этому весьма специфическому способу представления данных, который отличается от используемого в Google Analytics. Однако, этот сервис может стать лучшим решением для тех, кто желает использовать необработанные данные.

Прочие бесплатные инструменты: Яндекс.Метрика и Matomo


Я не смог опробовать каждый инструмент, поскольку многие из них являются платными. Каждый из них содержит функционал экспорта необработанных данных. Однако, существует два абсолютно бесплатных онлайн сервиса, которые предлагают тот же функционал и не взимают плату за их использование.

Яндекс.Метрика – абсолютно бесплатный инструмент, который предоставляет доступ к необработанным данным через API его логов. Matomo – инструмент аналитики с открытым исходным кодом, который необходимо устанавливать непосредственно на ваш сервер, на котором находятся файлы сайта. Он экспортирует необработанные данные непосредственно в вашу БД.

Конвейер данных


Еще один способ выгрузки данных Google Analytics непосредственно в ваше хранилище данных – конвейер данных. OWOX BI организовывает мощный поток данных между Google Analytics и BigQuery. Для реализации функционала необходимо создать кастомную задачу в Google Analytics. Он формирует копии полезной нагрузки Google Analytics и переносит в конечное хранилище данных.

Имея достаточный опыт, вы сможете самостоятельно создать собственную конечную точку выгрузки данных с использованием функционала облачного сервиса и на основе анализа лога. Ниже приведены два полезных ресурса, которые помогут вам разобраться в этом:
Симо Ахава – «Как сформировать GTM-монитор». После прочтения этой статьи вы узнаете, как отправлять данные в BigQuery с помощью облачных функций. Объемы передаваемых данных ограничены 100000 строк в секунду, которые можно интегрировать в сервис BigQuery. Если количество строк превышает указанное выше максимальное значение, вам придется группировать данные из нескольких логов.

Справочный центр Google Cloud – «Serverless Pixel Tracking Architecture». В этом источнике рассмотрен механизм создания собственного пикселя отслеживания с последующей интеграцией в 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


Для проведения анализа было взято приложение с регулярно обновляемым контентом и высоким показателем сезонности. Анализ проводится для поиска ответов на следующие вопросы:
Как ведут себя пользователи, которые впервые установили это приложение?

Какой момент времени является наилучшим для привлечения клиентов, которые будут использовать приложение на регулярной основе?

Полученный результат и выводы:



Судя по полученным данным, приложение чаще всего используют клиенты, которые загрузили его впервые в сентябре и декабре.

Запрос для 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 станет чем-то вроде отраслевого стандарта. Этот подход обеспечивает более тесную интеграцию между сервисами Google, такими как Marketing Platform и Google Cloud Platform, и особенно BigQuery. Если вы утратили навыки по созданию SQL-запросов (язык для работы с СУБД), я настоятельно рекомендую вам освежить информацию в своей памяти и потренироваться на практике.

Расширенная цифровая аналитика данных становится все более мощным инструментом благодаря простому доступу к необработанным данным, быстрым и эффективным вычислительным процессам, а также хорошей визуализации информации. В ближайшем будущем будет реализована еще более тесная интеграция с другими типами бизнес-данных.

Уже на протяжении многих лет эксперты утверждают, что цифровая и бизнес аналитика должны работать сообща. Медленно, но уверенно мы идем по пути воплощения этой идеи в реальность.