Моделирование атрибуции с таблицей путей

Таблица *_paths позволяет анализировать взаимодействия пользователей с рекламой, которой вы управляете через Дисплей и Видео 360 и Менеджер кампаний 360. Эти взаимодействия, также известные как точки взаимодействия, соединяются в пути событий, которые показывают, как группа пользователей движется по воронке конверсии. В таблицах *_paths содержатся те же сведения, которые доступны с помощью передачи данных, но уже собранные в пути. Пути событий доступны для пользователей., совершивших и не совершивших конверсию, и могут включать несколько конверсий.

Как и все пользовательские данные в Ads Data Hub, данные в таблицах *_paths должны соответствовать требованиям к агрегированию.

Техническая информация

Каждая строка таблицы paths содержит один путь к покупке за период в 30 дней. Данные обновляются ежедневно и всегда охватывают этот период. Поскольку пути событий строятся с использованием файлов cookie, они включают только одно устройство. В некоторых случаях (например, когда пользователь отказался от персонализации рекламы) значение идентификатора пользователя будет равно 0. Обычно таки пользователи заносятся в разные строки, то есть два разных пути конверсии, связанные с идентификатором пользователя 0, будут приведены в отдельных строках. Однако в некоторых случаях, например при группировке по user_id = 0, несколько путей конверсии могут объединяться в один, что может привести к расхождениям в данных. Подробнее об идентификаторах пользователей, равных 0

Каждая строка столбца *_paths.events содержит массив структур, где каждая структура – отдельное событие на пути пользователя. Структуры, входящие в путь, упорядочены по временным меткам. Первом в массиве будет самое давнее событие.

Примеры запросов

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

  • По первому взаимодействию: вся ценность присваивается первой точке взаимодействия.
  • По последнему взаимодействию: вся ценность присваивается последней точке взаимодействия.
  • Линейная: ценность равномерно распределяется между точками взаимодействия.

Пример данных

Строка user_id *_paths.events.event_time *_paths.events.event_type *_paths.events.placement_id
1 1 1563384139 FLOODLIGHT null
1563384129 CLICK 11
1563384119 VIEW 22
2 2 1563384139 FLOODLIGHT null
1563384129 VIEW 11
1563384119 FLOODLIGHT null
1563384109 VIEW 11

Примеры запросов

По первому взаимодействию

/* Substitute *_paths for the specific paths table that you want to query. */
SELECT
  (
  SELECT
    attributed_event_metadata.placement_id
  FROM (
    SELECT
      AS STRUCT attributed_event.placement_id,
      ROW_NUMBER() OVER(ORDER BY attributed_event.event_time ASC) AS rank
    FROM
      UNNEST(t.*_paths.events) AS attributed_event
    WHERE
      attributed_event.event_type != "FLOODLIGHT"
      AND attributed_event.event_time < conversion_event.event_time
      AND attributed_event.event_time > (
      SELECT
        IFNULL( (
          SELECT
            MAX(prev_conversion_event.event_time) AS event_time
          FROM
            UNNEST(t.*_paths.events) AS prev_conversion_event
          WHERE
            prev_conversion_event.event_type = "FLOODLIGHT"
            AND prev_conversion_event.event_time < conversion_event.event_time),
          0)) ) AS attributed_event_metadata
  WHERE
    attributed_event_metadata.rank = 1) AS placement_id,
  COUNT(*) AS credit
FROM
  adh.*_paths AS t,
  UNNEST(*_paths.events) AS conversion_event
WHERE
  conversion_event.event_type = "FLOODLIGHT"
GROUP BY
  placement_id
HAVING
  placement_id IS NOT NULL
ORDER BY
  credit DESC

По последнему взаимодействию

/* Substitute *_paths for the specific paths table that you want to query. */
SELECT
  (
  SELECT
    attributed_event_metadata.placement_id
  FROM (
    SELECT
      AS STRUCT attributed_event.placement_id,
      ROW_NUMBER() OVER(ORDER BY attributed_event.event_time DESC) AS rank
    FROM
      UNNEST(t.*_paths.events) AS attributed_event
    WHERE
      attributed_event.event_type != "FLOODLIGHT"
      AND attributed_event.event_time < conversion_event.event_time
      AND attributed_event.event_time > (
      SELECT
        IFNULL( (
          SELECT
            MAX(prev_conversion_event.event_time) AS event_time
          FROM
            UNNEST(t.*_paths.events) AS prev_conversion_event
          WHERE
            prev_conversion_event.event_type = "FLOODLIGHT"
            AND prev_conversion_event.event_time < conversion_event.event_time),
          0)) ) AS attributed_event_metadata
  WHERE
    attributed_event_metadata.rank = 1) AS placement_id,
  COUNT(*) AS credit
FROM
  adh.*_paths AS t,
  UNNEST(*_paths.events) AS conversion_event
WHERE
  conversion_event.event_type = "FLOODLIGHT"
GROUP BY
  placement_id
HAVING
  placement_id IS NOT NULL
ORDER BY
  credit DESC

Линейная

/* Substitute *_paths for the specific paths table that you want to query. */
SELECT
  attributed_event_metadata.placement_id AS placement_id,
  /* Give equal credit to all attributed events */
  SUM(SAFE_DIVIDE(1, ARRAY_LENGTH(attributed_events_metadata)))
FROM (
  SELECT
    ARRAY(
    SELECT
      AS STRUCT attributed_event.placement_id,
      ROW_NUMBER() OVER(ORDER BY attributed_event.event_time DESC) AS rank
    FROM
      UNNEST(t.*_paths.events) AS attributed_event
    WHERE
      attributed_event.event_type!="FLOODLIGHT"
      AND attributed_event.event_time < conversion_event.event_time
      AND attributed_event.event_time > (
      SELECT
        MAX(prev_conversion_event.event_time) AS event_time
      FROM
        UNNEST(t.*_paths.events) AS prev_conversion_event
      WHERE
        prev_conversion_event.event_type="FLOODLIGHT"
        AND prev_conversion_event.event_time < conversion_event.event_time)) AS attributed_events_metadata
  FROM
    adh.*_paths AS t,
    UNNEST(*_paths.events) AS conversion_event
  WHERE
    conversion_event.event_type="FLOODLIGHT" ),
  UNNEST(attributed_events_metadata) AS attributed_event_metadata
GROUP BY
  1
HAVING
  placement_id IS NOT NULL
ORDER BY
  2 DESC

Результаты

Если вы запустите запрос для примера данных, то получите следующие результаты:

По первому взаимодействию

Строка placement_id Доля ценности
1 11 2
2 22 1

По последнему взаимодействию

Строка placement_id Доля ценности
1 11 3

Линейная

Строка placement_id Доля ценности
1 11 2,5
2 22 0,5