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

Зачем нужны модели атрибуции?

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

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

Пример сравнения моделей атрибуции «первое взаимодействие» и «последнее взаимодействие» в оценке привлеченных продаж.

Такие счетчики аналитики, как, Яндекс Метрика и Google Analytics дают возможность в сразу в интерфейсе отчетов оценить эффективность точки касания. Но если работать с сырыми данными (неважно по какой причине), оценку модели атрибуции надо рассчитывать самому.

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

Подготовка данных

Для расчета моделей атрибуции, из экспортируемых в BigQuery сырых данных Google Analytics 4 понадобится создать предварительные таблицы с данными.

Таблица с транзакциями

В таблице будут поля:

  • ID совершенной транзакции
  • Дата и время транзакции
  • ID пользователя совершившего транзакцию
  • ID сессии в течении которой была совершена транзакция

Сразу надо определиться со сроком, за который собираются транзакции.

Запрос:

/* Срок, за который собираются транзакции */
DECLARE transactions_period INT64 DEFAULT 30;

SELECT
  /* Transaction ID */
  ecommerce.transaction_id AS transaction_id,
  /* Transaction timestamp */
  MAX(event_timestamp) AS transaction_timestamp,
  /* User ID */
  user_pseudo_id AS user_pseudo_id,
  /* Session ID
  event_params.value.int_value AS session_id
FROM
  `<google_cloud_project>.<google_analytics_dataset>.<table>_*`
  CROSS JOIN UNNEST(event_params) AS event_params
WHERE
  _TABLE_SUFFIX BETWEEN FORMAT_DATE(
    "%Y%m%d",
    DATE_SUB(CURRENT_DATE(), INTERVAL transactions_period DAY)
  )
  AND FORMAT_DATE(
    "%Y%m%d",
    DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)
  )
  AND event_name = 'purchase'
  AND ecommerce.transaction_id IS NOT NULL
  AND event_params.key = 'ga_session_id'
GROUP BY
  transaction_id,
  user_pseudo_id,
  session_id

Результат:

Результат сбора таблицы со списком транзакций

Таблица с сеансами

В таблице будут поля:

  • ID сессии
  • Дата и время начала сессии
  • ID пользователя
  • Источник и канал, с которого началась пользовательская сессия

Сразу надо определиться с размером окна атрибуции, так как при сборе этой таблицы важно чтобы сессии брались за срок, равный сумме периода сбора транзакций и окна атрибуции. То есть, если мы считаем модель атрибуции для транзакций за последние 30 дней, и определили окно атрибуции в 90 дней, то сессии надо брать за 120 дней. Это делается для правильного учета всех точек касаний, совершенных в период окна атрибуции.

Окно атрибуции — период между первым контактом с пользователем и целевым действием этого пользователя.

Запрос:

/* Declaring a variable with the number of days
   for which transactions are collected */
DECLARE transactions_period INT64 DEFAULT 30;

/* Declaring a variable with the number of days of the attribution window */
DECLARE attribution_window INT64 DEFAULT 30;

SELECT
  /* Session ID */
  event_params.value.int_value AS session_id,
  /* Start session timestamp */
  MAX(event_timestamp) AS session_start_timestamp,
  /* User ID */
  user_pseudo_id AS user_pseudo_id,
  /* Session source and channel */
  CONCAT(
    traffic_source.source,
    ' / ',
    traffic_source.medium
  ) AS session_source_medium
FROM
  `vipavenue-6f9d1.analytics_267479041.events_*`
  CROSS JOIN UNNEST(event_params) AS event_params
WHERE
  /* Make selection of sessions taking into account
      the transaction collection period plus the attribution window */
  _TABLE_SUFFIX BETWEEN FORMAT_DATE(
    "%Y%m%d",
    DATE_SUB(
      CURRENT_DATE(),
      INTERVAL attribution_window + transactions_period DAY
    )
  )
  AND FORMAT_DATE(
    "%Y%m%d",
    DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)
  )
  AND event_name = 'session_start'
  AND event_params.key = 'ga_session_id'
GROUP BY
  user_pseudo_id,
  session_source_medium,
  session_id

Результат:

Результат сбора таблицы со списком сессий

Объединение и доработка таблиц

  1. Расчет атрибуции предполагает параллельное взаимодействие с данными о сессиях и транзакциях, поэтому таблицы с транзакциями и с сессиями можно сразу объединить в одну.
  2. Чтобы не тратить ресурсы на обработку ненужных данных, в итоговой таблице лучше оставить сессии только от тех пользователей, которые в итоге совершили транзакцию. А также оставить только те сессии, которые предшествовали совершению транзакции или в течении которых транзакция была совершена.
  3. Часть моделей атрибуции требует информации о том, сколько всего сессий совершил пользователь перед транзакцией, и какая по счету сессия была с транзакцией, поэтому добавим в итоговую таблицу соответствующие колонки.

Полный запрос подготовки данных:

/* Declaring a variable with the number of days
    for which transactions are collected */
DECLARE transactions_period INT64 DEFAULT 30;

/* Declaring a variable with the number of days of the attribution window */
DECLARE attribution_window INT64 DEFAULT 30;

/* Table with transactions */
WITH transactions AS (
  SELECT
    /* Transaction ID */
    ecommerce.transaction_id AS transaction_id,
    /* Transaction timestamp */
    MAX(event_timestamp) AS transaction_timestamp,
    /* User ID */
    user_pseudo_id AS user_pseudo_id,
    /* Session ID */
    event_params.value.int_value AS session_id
  FROM
    `vipavenue-6f9d1.analytics_267479041.events_*`
    CROSS JOIN UNNEST(event_params) AS event_params
  WHERE
    _TABLE_SUFFIX BETWEEN FORMAT_DATE(
      "%Y%m%d",
      DATE_SUB(CURRENT_DATE(), INTERVAL transactions_period DAY)
    )
    AND FORMAT_DATE(
      "%Y%m%d",
      DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)
    )
    AND event_name = 'purchase'
    AND ecommerce.transaction_id IS NOT NULL
    AND event_params.key = 'ga_session_id'
  GROUP BY
    transaction_id,
    user_pseudo_id,
    session_id
),

/* Table with sessions */
sessions AS (
  SELECT
    /* Session ID */
    event_params.value.int_value AS session_id,
    /* Start session timestamp */
    MAX(event_timestamp) AS session_start_timestamp,
    /* User ID */
    user_pseudo_id AS user_pseudo_id,
    /* Session source and channel */
    CONCAT(
      traffic_source.source,
      ' / ',
      traffic_source.medium
    ) AS session_source_medium
  FROM
    `vipavenue-6f9d1.analytics_267479041.events_*`
    CROSS JOIN UNNEST(event_params) AS event_params
  WHERE
    /* Make selection of sessions taking into account
       the transaction collection period plus the attribution window */
    _TABLE_SUFFIX BETWEEN FORMAT_DATE(
      "%Y%m%d",
      DATE_SUB(
        CURRENT_DATE(),
        INTERVAL attribution_window + transactions_period DAY
      )
    )
    AND FORMAT_DATE(
      "%Y%m%d",
      DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)
    )
    AND event_name = 'session_start'
    AND event_params.key = 'ga_session_id'
    /* Make selection of sessions from users who have made a transaction */
    AND user_pseudo_id IN (
      SELECT
        DISTINCT user_pseudo_id
      FROM
        transactions
    )
  GROUP BY
    user_pseudo_id,
    session_source_medium,
    session_id
),

/* Joined table with sessions and transactions */
sessions_with_transactions AS (
  SELECT
    st.*,
    tt.*
  EXCEPT
(session_id, user_pseudo_id),
  FROM
    sessions AS st
    LEFT JOIN transactions AS tt ON st.user_pseudo_id = tt.user_pseudo_id
    AND st.session_id = tt.session_id
),

/* Final table with additional data and filetring */
combined_table AS (
  SELECT
    *,
    /* Count of sessions by users */
    COUNT(1) OVER(PARTITION BY user_pseudo_id) AS total_sessions,
    /* Serial number of session */
    RANK() OVER (
      PARTITION BY user_pseudo_id
      ORDER BY
        TIMESTAMP_MILLIS(session_start_timestamp) ASC
    ) AS session_number
  FROM
    sessions_with_transactions AS swt
  WHERE
    /* Removing the sessions that occurred after the transaction */
    session_start_timestamp <= (
      SELECT
        MAX(transaction_timestamp)
      FROM
        sessions_with_transactions
      WHERE
        swt.user_pseudo_id = user_pseudo_id
    )
    /* Making a selection of sessions that fall into the attribution window */
    AND TIMESTAMP_MICROS(session_start_timestamp) >= TIMESTAMP_ADD(
      TIMESTAMP_MICROS(
        (
          SELECT
            MAX(transaction_timestamp)
          FROM
            sessions_with_transactions
          WHERE
            swt.user_pseudo_id = user_pseudo_id
        )
      ),
      INTERVAL - attribution_window DAY
    )
  ORDER BY
    user_pseudo_id,
    session_id
)

/* Result */
SELECT
  *
FROM
  combined_table

Результат:

Итоговая таблица с информацией о сессиях и транзакциях

Модели атрибуции

Модель «Последнее взаимодействие» / Last Interaction:

Модель “Последнее взаимодействие” / Last Interaction

Модель последнего взаимодействия — моноканальная модель атрибуции присваивающая 100% вклада точке, с которой началась сессия, в течении которой была совершена конверсия.

Моноканальная модель атрибуции — модель атрибуции, при которой 100% вклада присваивается одной точке касания с пользователем. Цель модели определить правила, на основании которых будет выбрана точка, которой будет присвоен вклад.

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

Для подсчета достаточно вывести источник и канал, с которых началась сессия, в течении которой была совершена транзакция.

Запрос:

/* CTE with attribution weight calculating
   for every transaction */
WITH last_click_table AS (
  SELECT
    /* User ID */
    user_pseudo_id AS user_pseudo_id,
    /* Transaction ID */
    transaction_id AS transaction_id,
    /* Source and channel from which
       the transaction session started */
    session_source_medium AS source_medium,
    /* Attribution weight */
    1 AS attribution_weight
  FROM
    combined_table
  WHERE
    transaction_id IS NOT NULL
)

/* Final aggregation of all weights */
SELECT
  source_medium AS source_medium,
  SUM(attribution_weight) AS last_click
FROM
  last_click_table
GROUP BY
  source_medium;

Результат:

Результат работы модели атрибуции «Последнее взаимодействие»

Модель «Первое взаимодействие» / First Interaction:

Модель «Первое взаимодействие» / First Interaction

Модель первого взаимодействия — моноканальная модель атрибуции которая присваивает 100% вклада точке, с которого началась первая сессия пользователя в обозначенное окно атрибуции.

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

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

Запрос:

/* CTE with attribution weight calculating
   for every transaction */
WITH first_click_table AS (
  SELECT
    /* User ID */
    user_pseudo_id AS user_pseudo_id,
    /* Transaction ID */
    transaction_id AS transaction_id,
    /* Source and medium of first users session */
    FIRST_VALUE(session_source_medium) OVER (
      PARTITION BY user_pseudo_id
      ORDER BY
        session_start_timestamp
    ) AS source_medium,
    /* Attribution weight */
    1 AS attribution_weight
  FROM
    combined_table
  WHERE
    transaction_id IS NOT NULL
)

/* Final aggregation of all weights */
SELECT
  source_medium AS source_medium,
  SUM(attribution_weight) AS first_click
FROM
  first_click_table
GROUP BY
  source_medium;

Результат:

Результат работы модели атрибуции «Первое взаимодействие»

Модель «Последний значимый переход» / Last Non-Direct Click

Последний значимый переход / Last Non-Direct Click

Модель последнего значимого перехода — моноканальная модель атрибуции, которая присваивает 100% вклада последней точке, при условии, что это был значимый источник. Если конверсия совершена при заходе с незначимого источника, 100%  вклада присвоится предшествующему, в заданное окно атрибуции, источнику. Если другого источника нет, вклад отдается незначимому источнику.

К незначимым источникам относятся: прямые заходы, переходы с сохраненных страниц и сессии, начавшиеся прямо на сайте после завершения предыдущей сессии (в Яндекс.Метрика такой источник сессии называется “Внутренние переходы”). Источник и канал: ((direct) / (none)).

Как и модель «Последний переход», используется для оценки источников конверсии для продуктов с коротким циклом продажи. Но считается более точным, так как учитывает только значимые источники

Для подсчета модели необходимо проверить:

  • Если источник и канал с которых началась сессия, в течении которой была совершена транзакция не является незначимым’, оставить источник и канал с которой началась эта сессия как есть;
  • Если сессия, в течении которой была совершена транзакция не является первой у пользователя, при этом источник и канал является незначимым, проверить источник и канал предыдущей сессии и подставить ее, если она не является незначимойя4
  • Во всех остальных случаях подставить источник и канал ‘(none) / (direct)’.

Запрос:

/* CTE with attribution weight calculating
   for every transaction */
WITH last_non_direct_click_table AS (
  SELECT
    /* User ID */
    user_pseudo_id AS user_pseudo_id,
    /* Transaction ID */
    transaction_id AS transaction_id,
    CASE
      /* If the source and channel of the session
         do not match '(direct) / (none)', leave it as it is */
      WHEN session_source_medium != '(direct) / (none)' THEN session_source_medium
      /* If the user has more than one session,
         and the source and channel of the session with
         the transaction corresponds to '(direct) / (none)',
         check the source and channel of the previous sessions */
      WHEN session_number > 1
      AND session_source_medium = '(direct) / (none)' THEN LAG (session_source_medium) OVER (
        ORDER BY
          user_pseudo_id
      )
      /* In other cases, put the source and channel '(direct) / (none)' */
      ELSE '(direct) / (none)'
    END AS source_medium,
    /* Attribution weight */
    1 AS attribution_weight
  FROM
    combined_table
  WHERE
    transaction_id IS NOT NULL
)

/* Final aggregation of all weights */
SELECT
  source_medium AS source_medium,
  SUM(attribution_weight) AS last_non_direct_clickclick
FROM
  last_non_direct_click_table
GROUP BY
  source_medium;

Результат:

Результат работы модели атрибуции «Последний значимый переход»

«Последний переход из определенного канала» (на примере Яндекс.Директа) / Last <Name> Click

Последний переход из определенного канала (на примере Яндекс.Директа) / Last Click

Модель последнего перехода из определенного канала — моноканальная модель, 100% ценности которая присваивает последнему переходу из определенного источника и канал.

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

Для подсчета модели:

  • Проверить что источник и канал, с которого началась сессия, в течении которой была совершена транзакция является целевым источником и каналом. Если это так, подставить его.
  • Проверить что у пользователя совершившего транзакцию, источник и канал предыдущей сессии является целевым и подставить его.
  • В остальных случаях оставить источник и канал как есть.

Запрос:

/* Declaring variable with target source and medium */
DECLARE attribution_source_medium STRING DEFAULT 'yandex / cpc';

/* CTE with attribution weight calculating
   for every transaction */
WITH last_yansdex_direct_table AS (
  SELECT
    /* User ID */
    user_pseudo_id AS user_pseudo_id,
    /* Transaction ID */
    transaction_id AS transaction_id,
    CASE
      /* If the source and channel of the transaction
         session correspond to the target source and channel,
         leave it as it is */
      WHEN session_source_medium = attribution_source_medium THEN session_source_medium
      /* If the user has more than one session,
         and the source and channel of the session with
         the transaction do not corresponds to target source and medium,
         check the source and channel of the previous sessions */
      WHEN session_number > 1
      AND session_source_medium != attribution_source_medium
      AND attribution_source_medium IN (
        SELECT
          DISTINCT session_source_medium
        FROM
          combined_table
        WHERE
          ct.user_pseudo_id = user_pseudo_id
      ) THEN attribution_source_medium
      /* In other cases, leave the source and channel as is */
      ELSE session_source_medium
    END AS source_medium,
    /* Attribution weight */
    1 AS attribution_weight
  FROM
    combined_table AS ct
  WHERE
    transaction_id IS NOT NULL
)

/* Final aggregation of all weights */
SELECT
  source_medium AS source_medium,
  SUM(attribution_weight) AS last_yansdex_direct_click
FROM
  last_yansdex_direct_table
GROUP BY
  source_medium;

Результат:

Результат работы модели атрибуции «Последний переход из Яндекс Директа»

Модель «Линейная» / Linear

Линейная модель / Linear

Линейная модель — мультиканальная модель атрибуции, которая распределяется вклад в равных долях между всеми точками взаимодействия в окне атрибуции до совершенной конверсии.

Мультиканальная модель атрибуции — модель атрибуции, которая распределяет вклад между разными точками касаний с пользователем. Цель модели определить правила распределения вклада между точками касания.

Используется для оценки эффективности каждой точки взаимодействия.

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

Запрос:

/* CTE with attribution weight calculating
   for every transaction */
WITH linear_table AS (
  SELECT
    /* User ID */
    user_pseudo_id AS user_pseudo_id,
    /* Source and medium of every session */
    session_source_medium AS source_medium,
    /* Users transaction ID for sessions without transaction */
    LAST_VALUE(transaction_id) OVER (
      PARTITION BY user_pseudo_id
      ORDER BY
        transaction_timestamp ASC ROWS BETWEEN CURRENT ROW
        AND UNBOUNDED FOLLOWING
    ) AS transaction,
    /* Share equally the contribution between
       sources and channels of previous user sessions */
    1 / (
      SELECT
        MAX(session_number)
      FROM
        combined_table
      WHERE
        transaction_id IS NOT NULL
        AND ct.user_pseudo_id = user_pseudo_id
    ) AS attribution_weight
  FROM
    combined_table AS ct
)

 /* Final aggregation of all weights */
SELECT
  source_medium AS source_medium,
  CAST(ROUND(SUM(attribution_weight), 0) AS INTEGER) AS linear_model
FROM
  linear_table
GROUP BY
  source_medium;

Результат:

Результат работы модели атрибуции «Линейная модель»

Модель с учетом давности взаимодействий / Time Decay

Модель с учетом давности взаимодействий / Time Decay

Модель с учетом давности взаимодействия — мультиканальная модель атрибуции, которая распределяет ценность между всеми источниками и каналами взаимодействия в окне атрибуции до совершенной конверсии с учетом давности. Чем ближе к конверсии, тем большую ценность получается источник и канал.

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

Для подсчета модели используется условия:

  • Если была 1 сессия, 100% ценности отдается источнику и каналу, с которого началась эта сессия;
  • Если сессий более одной, используется формула временного распада: 2 ^ (Номер сессии / Количество сессий). Полученные результаты приводятся к 100%.

Запрос:

/* CTE with attribution weight calculating
   for every transaction */
WITH time_decay_table AS (
  SELECT
    /* User ID */
    user_pseudo_id AS user_pseudo_id,
    /* Source and medium of every session */
    session_source_medium AS source_medium,
    /* Users transaction ID for sessions without transaction */
    LAST_VALUE(transaction_id) OVER (
      PARTITION BY user_pseudo_id
      ORDER BY
        transaction_timestamp ASC ROWS BETWEEN CURRENT ROW
        AND UNBOUNDED FOLLOWING
    ) AS transaction,
    /* Calculating the weight for each source and channel */
    (
      CASE
        /* If the user has only 1 session, the contribution
           from the source and channel of this session is 1 */
        WHEN total_sessions = 1 THEN 1
        /* In other cases , the contribution of sources
           and channels is distributed according to the formula */
        ELSE SAFE_DIVIDE(
          POWER(2, session_number / total_sessions),
          (
            SUM(POWER(2, session_number / total_sessions)) OVER(PARTITION BY user_pseudo_id)
          )
        )
      END
    ) AS attribution_weight
  FROM
    combined_table
)

/* Final aggregation of all weights */
SELECT
  source_medium AS source_medium,
  CAST(ROUND(SUM(attribution_weight), 0) AS INTEGER) AS time_decay_click
FROM
  time_decay_table
GROUP BY
  source_medium;

Результат:

Результат работы модели атрибуции «Модель с учетом давности взаимодействий»

U-модель / Position Based

U-модель / Position Based

U-модель — мультиканальная модель атрибуции, которая присваивает по 40% вклада источнику и каналу первой и последней сессии, а оставшиеся 20% вклада распределяет равномерно между источниками и каналами, которые находились посередине.

Используется для оценки точек знакомства и совершения конверсии.

Для подсчета модели:

  • Если была 1 сессия, 100% ценности отдается источнику и каналу, с которого началась эта сессия.
  • Если было 2 сессии, каждому из источников и каналов сессий присваивается по 50% вклада.
  • Если сессий более 2, источникам и каналам первой и последней сессии присваивается по 40% вклада, а оставшиеся 20% вклада распределяются между источникам и каналами между первой и последней сессиями.

Запрос:

/* CTE with attribution weight calculating
   for every transaction */
WITH u_shape_table AS (
  SELECT
    /* User ID */
    user_pseudo_id AS user_pseudo_id,
    /* Source and medium of every session */
    session_source_medium AS source_medium,
    /* Users transaction ID for sessions without transaction */
    LAST_VALUE(transaction_id) OVER (
      PARTITION BY user_pseudo_id
      ORDER BY
        transaction_timestamp ASC ROWS BETWEEN CURRENT ROW
        AND UNBOUNDED FOLLOWING
    ) AS transaction,
    /* Share equally the contribution between
       sources and channels of previous user sessions */
    (
      CASE
        /* If the user has only 1 session, the contribution
           from the source and channel of this session is 1 */
        WHEN total_sessions = 1 THEN 1
         /* If the user has 2 sessions, then the contribution
            at the source and the channel of each session is 0.5 */
        WHEN total_sessions = 2 THEN 0.5
         /* If the user has more than 2 sessions, the source and
            channel of the first and last sessions receive 0.4 points,
            and 0.2 points are distributed between the sources and
            channels of the remaining sessions */
        WHEN total_sessions > 2 THEN (
          CASE
            WHEN session_number = 1 THEN 0.4
            WHEN session_number = total_sessions THEN 0.4
            ELSE 0.2 / (total_sessions - 2)
          END
        )
      END
    ) AS attribution_weight
  FROM
    combined_table AS ct
)

/* Final aggregation of all weights */
SELECT
  source_medium AS source_medium,
  CAST(ROUND(SUM(attribution_weight), 0) AS INTEGER) AS u_shape_click
FROM
  u_shape_table
GROUP BY
  source_medium;

Результат:

Результат работы модели атрибуции «U-модель»

Заключение

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

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

Полезные ссылки

Категории: