Сравнение моделей атрибуции Директа и Метрики с помощью R
Пример выгрузки данных разных моделей атрибуции Директа и Метрики с помощью языка R и RStudio с целью сравнения итоговых значений.
Продолжаем тему различий в данных Директа и Метрики. В предыдущей публикации я описывал основные причины расхождения в подсчете итоговых значений в двух сервисах. Если не брать во внимание исторический контекст (Директ и Метрика - разные продукты, которые выпущены с интервалом в 7 лет), то главные отличия заключаются в следующем:
- Метрика фиксирует визиты на сайт, а Директ — клики по объявлениям;
- Директ и Метрика имеют разный подход к отслеживанию данных и приписыванию конверсий.
Модели атрибуции также будут применяться к визитам в Метрике и кликам в Директе. Давайте рассмотрим это на конкретном примере одного из моих клиентов. О том, как выгружать данные из Директа, используя пакет ryandexdirect Алексея Селезнева (Netpeak), я подробно писал в этой статье.
Если кратко, то сначала устанавливаем пакет и подключаем его к рабочей сессии с помощью команд:
1 2 |
install.packages("ryandexdirect") library(ryandexdirect) |
Затем проходим авторизацию и получаем токен (кто делает впервые):
1 2 |
yadirAuth (Login = "my_yandex_login", TokenPath = "C:/direct/tokens") |
, где:
Login = 'my_yandex_login'
— логин пользователя в Яндекс.Директ;TokenPath = 'C:/direct/tokens'
— путь к папке, в которой будет храниться файл с учетными данными.
После этого мы можем выгрузить данные по рекламному аккаунту. Я выгружу статистику за последний год из аккаунта Яндекс.Директа по ключевой конверсии и 4 различным моделям атрибуции, чтобы наглядно увидеть различия в подсчете.
Запрос в RStudio выглядит так:
1 2 3 4 5 6 7 8 9 10 11 |
attribution_Direct <- yadirGetReport(DateRangeType = "CUSTOM_DATE", DateFrom = "2019-05-25", DateTo = "2020-05-24", FieldNames = c("Date", "Impressions", "Clicks", "Cost", "AvgCpc", "Conversions"), Goals=c(53114646),AttributionModels = c("FC", "LC","LSC", "LYDC"), Login = "my_yandex_login", TokenPath = "C:/direct/tokens") |
, где:
- attribution_Direct – название переменной (может быть любым), которая содержит все извлекаемые данные из Яндекс.Директа;
- yadirGetReport – функция, в которой передаются различные аргументы;
- DateFrom - дата начала отчетного периода в формате ГГГГ-ММ-ДД. Аргумент используется только если DateRangeType равен CUSTOM_DATE (как в нашем случае);
- DateTo - дата завершения отчетного периода в формате ГГГГ-ММ-ДД. Аргумент используется только если DateRangeType равен CUSTOM_DATE (как в нашем случае);
- FieldNames - вектор, содержащий названия полей, по которым вы хотите получить статистику рекламных кампаний;
- Date - дата;
- Impressions - показы;
- Clicks - клики;
- Cost - стоимость (расход на рекламу);
- AvgCpc - цена за клик (CPC);
- Conversions - конверсии;
- Goals=c(53114646) - вектор, содержащий идентификаторы целей Яндекс.Метрики, по которым вы планируете получить статистики. В моем примере - это номер цели 53114646;
- AttributionModels = c('FC', 'LC', 'LSC', 'LYDC') - вектор, который содержит аббревиатуру названия 4 моделей атрибуции для расчета количества достигнутых целей (FC — первый переход, LC — последний переход, LSC — последний значимый переход, LYDC — последний переход из Яндекс.Директа).
Подробнее об этом читайте в официальной справке API Директа.
В интерфейсе со всеми предыдущими командами, включая установку пакета и авторизацией:
Выполняем запрос и получаем 255 объектов (столько записей и столько дней в году работала реклама) и 9 переменных (столбцов — дата, клики, показы, стоимость, цена за клик и конверсии по 4 разным моделям атрибуции из Яндекс.Директа).
Кликнув по объекту, откроется новая вкладка в виде обычной таблицы с нашими данными:
Теперь у нас есть наглядная картина по данным конверсий для всех моделей атрибуции, и мы можем анализировать и сравнивать статистику между собой. В Мастере отчетов Яндекс.Директа это делать гораздо сложнее, поскольку для построения такого отчета необходимо сформировать несколько отчетов, выбрав разную модель атрибуции, выгрузить все это в Excel, а потом свести все в одну таблицу.
Теперь мы можем просуммировать количество конверсий для каждой из модели атрибуции с помощью команды sum (). Получаем:
- Первый переход (FC) - 833 конверсии;
- Последний переход (LC) - 774 конверсии;
- Последний значимый переход (LSC) - 829 конверсий;
- Последний переход из Яндекс.Директа (LYDC) - 750 конверсий.
Чтобы убедиться, что мы выгрузили верные данные в RStudio, сформируем отчет в Мастере отчетов за этот период по нашей цели и любой модели атрибуции:
Как видим, конверсии по атрибуции Последний значимый переход в R и Яндекс.Директе сходятся. По остальным тоже. Но количество конверсий по четырем моделям атрибуции разное, а расход за год неизменный: 6 065 684 руб. (с НДС). Проделав простую операцию деления, получим стоимость одной конверсии для каждой модели атрибуции:
- Первый переход (FC) - 7 281 руб.;
- Последний переход (LC) - 7 836 руб.;
- Последний значимый переход (LSC) - 7 316 руб.;
- Последний переход из Яндекс.Директа (LYDC) - 8 087 руб.
Аналогично можно поступить и с конверсией сайта. Количество кликов постоянно: 118 754.
- Первый переход (FC) - 0,7%;
- Последний переход (LC) - 0,65%;
- Последний значимый переход (LSC) - 0,69%;
- Последний переход из Яндекс.Директа (LYDC) - 0,63%.
Итоговая таблица по данным Яндекс.Директа с помощью R для 4 различных моделей атрибуции:
Примечание: данные цифры носят информационный характер. В качестве примера я выгрузил статистику по одной цели. Но итоговая стоимость конверсии для моего клиента складывается не только из нее. Есть еще телефонные обращения, онлайн-чат и т.д. Все их также можно выгрузить с помощью R, потом сложить и посчитать конечное значение. Но это лишь удлинит статью, но смысла не поменяет. Поэтому я пренебрег дополнительным шагом.
Для того, чтобы выгрузить эти же данные, но только из Яндекс.Метрики, воспользуемся другим пакетом Алексея Селезнева rym. Начало:
1 2 |
install.packages('rym') library(rym) |
Если вы делаете это впервые, то вам необходимо указать рабочую директорию с помощью команды setwd или прописать путь в TokenPath. Затем пройти авторизацию, выполнив команду:
1 |
rym_auth (login="my_yandex_login", token.path="metrika_token") |
Подробнее можете ознакомиться из лекции Алексея:
В Яндекс.Метрике запрос получения нужной нам статистики в R выглядит так:
1 2 3 4 5 6 7 8 9 10 |
attribution_Metrika_LC <- rym_get_data (counters = "48989495", date.from = "2019-05-25", date.to = "2020-05-24", dimensions = "ym:s:date, ym:s:lastDirectClickOrder", metrics = "ym:s:visits,ym:s:goal53114646visits,ym:s:goal53114646conversionRate", filters="ym:s:<attribution>clickDirectClickOrder!=null" sort = "-ym:s:date", login="e-16248910", token.path="metrika_token", lang ="ru") |
, где:
- attribution_Metrika_LC - название переменной (может быть любым), которая содержит все извлекаемые данные из Яндекс.Метрики;
- rym_get_data – функция для работы с API отчетов;
- counters = "XXXXXX" - указывается идентификатор счетчика Яндекс.Метрики;
- date.from - дата начала периода выборки в формате ГГГГ-ММ-ДД. Также могут принимать значения: today, yesterday, ndaysAgo;
- date.to - дата окончания периода выборки в формате ГГГГ-ММ-ДД. Также могут принимать значения: today, yesterday, ndaysAgo;
- dimensions - группировки, разделенные запятой (ограничение - 10 группировок в запросе);
- metrics - показатели, разделенные запятой (ограничение - 20 показателей в запросе);
- filters - фильтр сегментации, с помощью которого я фильтрую данные по нужному мне источнику трафика. В данном случае исключаю кампании со статусом Не определено (на самом деле значение null) с помощью фильтра !=null;
- sort - список группировок и метрик, разделенных запятой, по которым осуществляется сортировка. В моем примере - по дате.
- lang - язык (по умолчанию ru).
Список группировок и метрик для Яндекс.Метрики представлен в официальной документации Яндекса.
API Метрики поддерживает механизм задания параметров - параметризацию. С помощью нее можно указать модель атрибуции. Параметр указывается в угловых скобках <>. Например, ym:s:<attribution>SourceEngineName.
- first —первый переход;
- last — последний переход;
- lastsign — последний значимый переход;
- last_yandex_direct_click — последний переход из Директа.
Кроме того, вы можете указать модель атрибуции в явном виде, например, ym:s:lastDirectClickOrder. Это я и сделал, указав в качестве группировки ym:s:lastDirectClickOrder (по модели атрибуции - Последний переход). Подробнее о параметризации читайте в официальной справке Яндекса.
Примечание:
- с 27 мая 2020 года в API и в Logs API Яндекс.Метрики изменится модель атрибуции по умолчанию. Для запросов, в которых явно не указана модель атрибуции, по умолчанию начнет использоваться Последний значимый переход вместо Последнего перехода.
Сделаем 4 различных запроса с каждой моделью атрибуции и группировкой ym:s:<attribution>DirectClickOrder и посчитаем итоговые значения конверсий и визитов.
Теперь мы можем объединить 4 датасета в один с помощью команды:
1 2 3 |
MetrikaAll <- full_join(attribution_Metrika_FC,attribution_Metrika_LC,by=c("Дата визита", "Кампания Яндекс.Директа")) %>% full_join(attribution_Metrika_LSC,by=c("Дата визита", "Кампания Яндекс.Директа")) %>% full_join(attribution_Metrika_LYDC,by=c("Дата визита", "Кампания Яндекс.Директа")) |
Поочередное объединение таблиц происходит с помощью функции full_join из пакета dplyr, а в качестве ключей объединения я выбрал Дата визита и Кампания Яндекс.Директа, поскольку они во всех 4 таблицах одинаковые. Открыв новый датасет, увидим, что в таблице есть значения NA (пропущенные или отсутствующие данные).
В таком виде мы не сможем сложить значения и посчитать итоговый результат. Нам необходимо заменить NA на число 0. Сделать это можно с помощью функции replace_na из пакета tidyr. К запросу выше добавим хвост:
1 |
%>% mutate_at(c("Визиты.x","Целевые визиты (Страница \"Спасибо\").x", "Конверсия (Страница \"Спасибо\").x", "Визиты.y","Целевые визиты (Страница \"Спасибо\").y", "Конверсия (Страница \"Спасибо\").y", "Визиты.x.x", "Целевые визиты (Страница \"Спасибо\").x.x", "Конверсия (Страница \"Спасибо\").x.x","Визиты.y.y", "Целевые визиты (Страница \"Спасибо\").y.y", "Конверсия (Страница \"Спасибо\").y.y"), replace_na,0) |
Примечание: API Метрики создает не совсем удобные для работы названия переменных, с пробелами, с кавычками и т.д. Чтобы запрос правильно отработал, в таких переменных как Конверсия (Страница \"Спасибо\").y и др. необходимо экранировать кавычки с двух сторон с помощью обратного слэша \.
Получаем таблицу со значениями 0 вместо NA:
После объединения таблиц названия столбцов стали менее удобочитаемыми. Например, Визиты.x, Визиты.y, Визиты.x.x и Визиты.y.y соответствуют визитам для моделей атрибуции первый переход, последний переход, последний значимый переход и последний переход из Директа. Чтобы с таблицей было легче работать, переименуем их с помощью функции rename все того же пакета dplyr.
1 2 3 |
MetrikaName <- rename (MetrikaAll,Визиты_FC = Визиты.x, Визиты_LC = Визиты.y, Визиты_LSC=Визиты.x.x, Визиты_LYDC=Визиты.y.y, "Целевые_визиты_FC"="Целевые визиты (Страница \"Спасибо\").x", "Целевые_визиты_LC"="Целевые визиты (Страница \"Спасибо\").y","Целевые_визиты_LSC"="Целевые визиты (Страница \"Спасибо\").x.x","Целевые_визиты_LYDC"="Целевые визиты (Страница \"Спасибо\").y.y", "Конверсия_FC"="Конверсия (Страница \"Спасибо\").x","Конверсия_LC"="Конверсия (Страница \"Спасибо\").y","Конверсия_LSC"="Конверсия (Страница \"Спасибо\").x.x","Конверсия_LYDC"="Конверсия (Страница \"Спасибо\").y.y") |
В RStudio:
Теперь таблица выглядит понятнее и с ней можно работать:
Не составит труда сформировать 8 запросов, чтобы просуммировать итоговые значения по визитам и целевым визитам для всех четырех моделей атрибуции:
Статистика:
- Первый переход (FC) - 833 конверсии - 99 454 визита;
- Последний переход (LC) - 774 конверсии - 89 984 визита;
- Последний значимый переход (LSC) - 829 конверсий - 93 401 визит;
- Последний переход из Яндекс.Директа (LYDC) - 759 конверсий - 82 957 визитов.
Проверим соответствие данных с отчетами Директа в Метрике. Например, для атрибуции Последний значимый переход:
Данные с выгруженными в R сходятся. Аналогично с остальными атрибуциями. Итоговая таблица по данным Яндекс.Метрики с помощью R для 4 различных моделей атрибуции:
Данные по конверсиям те же самые, что и были при выгрузке из Яндекс.Директа. Только отличается на 9 конверсий Последний переход из Яндекс.Директа. Но этим можно пренебречь, поскольку данные по модели атрибуции Последний переход из Директа доступны в Метрике с 25 июля 2019 года, а я отчет сформировал с маем 2019. А визиты и клики отличаются, как мы уже с вами поняли из моей предыдущей статьи. Соответственно, отличается и конверсия сайта и в каких-то случаях итоговая стоимость конверсии.
Сведем все полученные данные по Директу и Метрики в одну таблицу:
Более того, я брал для сравнения только платный трафик. Но на сайте помимо него могут быть и другие - органический поиск, прямые заходы, переходы из социальных сетей, мессенджеров и т.д. Если вы будете сравнивать статистику в Мастере отчетов Директа по рекламным кампаниям и данные из Метрики по всем источникам трафика и разным моделям атрибуции, итоговые цифры будут отличаться еще больше.
Надеюсь, мне удалось экспериментально доказать и наглядно показать в двух последних публикациях отличие данных в Директе и Метрике 😉