Математический расчет целевых показателей в Яндекс Метрике
В предыдущем материале вы узнали, как с помощью Logs API математически рассчитать поведенческие показатели, которые отображаются в интерфейсе вашего счетчика - Показатель отказов (Отказы), Глубина просмотра, Время на сайте. В этой публикации я продолжаю освещать тему математического расчета показателей Яндекс Метрики, но уже для целевых метрик - Целевые визиты, Целевые посетители, Конверсия и Достижение цели.
Определение
Перед тем, как произвести математический расчет целевых метрик, нам необходимо разобраться с определениями этих показателей. Что они из себя представляют и какую практическую значимость несут?
Наверняка вы знаете, что в Яндекс Метрике есть разные показатели для оценки достигнутых целей. Как правило, для этого используют отчет Конверсии:
Или любой стандартный отчет с выбранной целью, рядом с которой будут отображаться такие показатели, как Конверсия, и Достижение цели:
Согласно официальной документации Яндекса:
- Конверсия - доля целевых визитов в общем числе визитов;
- Достижение цели - количество выполнений целевого условия во всех визитах. В ходе одного целевого визита можно достигнуть цели несколько раз (или достигнуть нескольких целей).
Получается, чтобы рассчитать конверсию, нам необходимо знать как рассчитываются Целевые визиты?
Давайте разбираться. Согласно официальному ответу от техподдержки Яндекса:
Целевой визит - это визит, в ходе которого была достигнута цель (или несколько целей) один и/или более раз.
Есть и другая, схожая метрика - Целевой посетитель. Это посетитель, который совершил целевой визит. Один посетитель за определенный период времени может совершить несколько целевых визитов.
Таким образом:
- Конверсия - доля целевых визитов в общем числе визитов (формула: Целевые визиты / Визиты);
- Достижение цели - все действия пользователя, которые для вас важны и которые вы обозначили как Цели. Если пользователь выполнил одну и ту же цель несколько раз в рамках одного визита, то все они будут засчитаны;
- Целевые визиты - визиты, в ходе которых была достигнута цель (или несколько целей) один и/или более раз (формула: Достижение цели > 0);
- Целевые посетители - посетители, которые совершил целевые визиты. Один посетитель за определенный период времени может совершить несколько целевых визитов.
Примечание: ситуация, при которой достижений цели больше целевых визитов, количество которых больше количества целевых посетителей, является нормальной. Точно так же, как и количество достижений целей может быть больше, чем целевых визитов.
Если перейти в официальную документацию Яндекса и посмотреть список группировок и метрик Logs API, то там вы не увидите показателей Целевые посетители, Целевые визиты, Конверсия и Достижение цели. Как же они рассчитываются?
Я не буду вдаваться в теоретический экскурс и еще раз писать о том, что такое Logs API, сырые данные Яндекс Метрики и чем они отличаются от агрегированной статистики, которую вы видите в стандартных отчетах в интерфейсе. Все это подробно описано в первой части математического расчета. Обязательно прочитайте эту статью, а также:
- Введение в API Яндекс Метрики
- Загрузка собственных данных Яндекс Метрики в ClickHouse
- Воронки и когортный анализ на данных Яндекс Метрики
- Ассоциированные конверсии в Яндекс Метрике
- Подключение Яндекс Метрики к Yandex DataLens
В них дается исчерпывающий ответ на обозначенные выше вопросы. Ниже сосредоточимся на практической реализации и расчете показателей Целевые посетители, Целевые визиты, Конверсия и Достижение цели.
Запрос к Logs API
Для использования API Яндекс Метрики вам необходимо создать приложение и пройти авторизацию с помощью OAuth-токена. Для этого обязательно прочтите оба эти материала в таком порядке и выполните все шаги, описанные в них:
Примечание: сохраните свой OAuth-токен и никому не показывайте и не передавайте его.
Получив токен, вы сможете использовать его для выгрузки статистики своего счетчика программным способом. Сделайте это, воспользовавшись шаблоном моего проекта в Google Colab. Авторизовавшись под своей учетной записью Gmail, откройте его по ссылке. Сохраните проект к себе на Диск с помощью команды Файл - Сохранить копию на Диске:
Перейдите ко второй ячейке и добавьте свои данные в поля ACCESS_TOKEN и COUNTER_ID.
- ACCESS_TOKEN - ваш токен доступа;
- COUNTER_ID - идентификатор вашего счетчика Яндекс Метрики.
Запрос, который мы будем использовать, написан на языке программирования Python с использованием библиотеки Павла Максимова. Она расположена по адресу https://github.com/pavelmaksimov/tapi-yandex-metrika
Поскольку библиотека является сторонней разработкой, ее необходимо установить. Она называется tapi-yandex-metrika. Для этого теперь уже в вашем проекте Colab рядом с первой ячейкой нажмите иконку запуска (значок play), чтобы код в ячейке сработал. В Colab это будет выглядеть так:
После установки библиотеки перейдите ко второй ячейке программы, где вы задали токен и указали идентификатор вашего счетчика Яндекс Метрики. Все, что останется вам изменить - это диапазон дат в переменных date1 и date2. Я буду проводить математический расчет целевых метрик за сентябрь 2024 года, поэтому в поле date1 указано значение "2024-09-01", а в date2 "2024-09-30".
В моем запросе к Logs API используется максимальное количество допустимых полей:
1 |
"fields": "ym:s:visitID,ym:s:counterID,ym:s:watchIDs,ym:s:date,ym:s:dateTime,ym:s:dateTimeUTC,ym:s:isNewUser,ym:s:startURL,ym:s:endURL,ym:s:pageViews,ym:s:visitDuration,ym:s:bounce,ym:s:ipAddress,ym:s:regionCountry,ym:s:regionCity,ym:s:regionCountryID,ym:s:regionCityID,ym:s:clientID,ym:s:counterUserIDHash,ym:s:networkType,ym:s:goalsID,ym:s:goalsSerialNumber,ym:s:goalsDateTime,ym:s:goalsPrice,ym:s:goalsOrder,ym:s:goalsCurrency,ym:s:lastTrafficSource,ym:s:lastAdvEngine,ym:s:lastReferalSource,ym:s:lastSearchEngineRoot,ym:s:lastSearchEngine,ym:s:lastSocialNetwork,ym:s:lastSocialNetworkProfile,ym:s:referer,ym:s:lastDirectClickOrder,ym:s:lastDirectBannerGroup,ym:s:lastDirectClickBanner,ym:s:lastDirectClickOrderName,ym:s:lastClickBannerGroupName,ym:s:lastDirectClickBannerName,ym:s:lastDirectPhraseOrCond,ym:s:lastDirectPlatformType,ym:s:lastDirectPlatform,ym:s:lastDirectConditionType,ym:s:lastCurrencyID,ym:s:from,ym:s:UTMCampaign,ym:s:UTMContent,ym:s:UTMMedium,ym:s:UTMSource,ym:s:UTMTerm,ym:s:openstatAd,ym:s:openstatCampaign,ym:s:openstatService,ym:s:openstatSource,ym:s:hasGCLID,ym:s:lastGCLID,ym:s:firstGCLID,ym:s:lastSignificantGCLID,ym:s:browserLanguage,ym:s:browserCountry,ym:s:clientTimeZone,ym:s:deviceCategory,ym:s:mobilePhone,ym:s:mobilePhoneModel,ym:s:operatingSystemRoot,ym:s:operatingSystem,ym:s:browser,ym:s:browserMajorVersion,ym:s:browserMinorVersion,ym:s:browserEngine,ym:s:browserEngineVersion1,ym:s:browserEngineVersion2,ym:s:browserEngineVersion3,ym:s:browserEngineVersion4,ym:s:cookieEnabled,ym:s:javascriptEnabled,ym:s:screenFormat,ym:s:screenColors,ym:s:screenOrientation,ym:s:screenWidth,ym:s:screenHeight,ym:s:physicalScreenWidth,ym:s:physicalScreenHeight,ym:s:windowClientWidth,ym:s:windowClientHeight,ym:s:purchaseID,ym:s:purchaseDateTime,ym:s:purchaseAffiliation,ym:s:purchaseRevenue,ym:s:purchaseTax,ym:s:purchaseShipping,ym:s:purchaseCoupon,ym:s:purchaseCurrency,ym:s:purchaseProductQuantity,ym:s:productsPurchaseID,ym:s:productsID,ym:s:productsName,ym:s:productsBrand,ym:s:productsCategory,ym:s:productsCategory1,ym:s:productsCategory2,ym:s:productsCategory3,ym:s:productsCategory4,ym:s:productsCategory5,ym:s:productsVariant,ym:s:productsPosition,ym:s:productsPrice,ym:s:productsCurrency,ym:s:productsCoupon,ym:s:productsQuantity,ym:s:impressionsURL,ym:s:impressionsDateTime,ym:s:impressionsProductID,ym:s:impressionsProductName,ym:s:impressionsProductBrand,ym:s:impressionsProductCategory,ym:s:impressionsProductCategory1,ym:s:impressionsProductCategory2,ym:s:impressionsProductCategory3,ym:s:impressionsProductCategory4,ym:s:impressionsProductCategory5,ym:s:impressionsProductVariant,ym:s:impressionsProductPrice,ym:s:impressionsProductCurrency,ym:s:impressionsProductCoupon,ym:s:offlineCallTalkDuration,ym:s:offlineCallHoldDuration,ym:s:offlineCallMissed,ym:s:offlineCallTag,ym:s:offlineCallFirstTimeCaller,ym:s:offlineCallURL,ym:s:parsedParamsKey1" |
Важно: в запросе должно обязательно присутствовать поле ym:s:counterUserIDHash. Это идентификатор посетителя (в рамках одного браузера), с помощью которого производится подсчет уникальных посетителей сайта в интерфейсе Метрики
Но если вы разбираетесь в том, как составлять запросы, то можете оставить только поля, необходимые для расчета целевых визитов и целевых посетителей привязкой к уникальному идентификатору пользователя и дате, если выгружаете статистику за диапазон дат.
Списки полей с различными уровнями организации данных доступны здесь:
- События (hits) - https://yandex.ru/dev/metrika/ru/logs/fields/hits
- Визиты (visits) - https://yandex.ru/dev/metrika/ru/logs/fields/visits
Нам нужна группировка именно по визитам. Благодаря этому вы получается неагрегированную информацию в виде большой таблицы со столбцами и строками, где каждая запись содержит уникальное действие конкретного пользователя. И тогда у нас получится рассчитать показатели Целевые посетители, Целевые визиты, Конверсия и Достижение цели.
Запустите вторую ячейку аналогичным образом. С помощью него мы проверяем, возможно ли вообще создание такого запроса. Если создание запроса возможно (метод evaluate), то мы получим соответствующий ответ:
- log_request_evaluation – параметр оценки возможности создания запросов логов;
- possible – возможность создания запроса логов (true – да, false – нет);
- max_possible_day_quantity - максимальное количество дней периода, который можно указать в запросах логов, с учетом текущей квоты. В данном примере – 6223 дня.
Подробнее об оценки возможности создания запроса читайте в официальной документации разработчиков Яндекса.
Теперь перейдите к третьей ячейке программы и запустите ее. На этом этапе происходит создание запроса с помощью метода created. Как только он будет создан, вам будет возвращен идентификатор запроса requestId (в моем примере - 38225457):
На скриншоте выше статус запроса – created (создан). В этом статусе запрос еще не готов, на его подготовку может уйти какое-то время (несколько секунд и более, если количество выгружаемых данных велико).
Скопируйте идентификатор запроса и перейдите к следующей ячейке, вставив ваш идентификатор в поле requestId= и запустив ее:
Посмотрите на статус запроса. Он должен быть processed (подготовлен). Если это так, то теперь вы можете перейти к следующей ячейке. В противном случае запустите ее столько раз, пока статус запроса не изменится на processed.
В следующей ячейке снова измените идентификатор запроса на свой и запустите ее:
Отчет можно будет скачать, когда он станет доступен на сервере Яндекса. Он может состоять из нескольких частей. Параметр part_number указывает номер части отчета, которую вы хотите загрузить. Чтобы узнать номер части, взгляните выше на запрос с командой info. В part_number (номер части) будет указано данное значение. Если отображается число 0, то отчет можно скачать за один раз. В параметре size указан размер файла в байтах.
Воспользуемся функцией part().to_dicts() для преобразования словаря в датафрейм. Выполните команду list = part().to_dicts() в следующей ячейке:
И следующей командой создайте датафрейм, импортировав библиотеку pandas и задав столбцам названия (для всего того большого списка полей, что были заданы в теле запроса):
Выведите статистику на экран с помощью простой команды df с названием самого датафрейма, запустив предпоследнюю ячейку программы:
Отлично! Вы только что получили сырые данные Яндекс Метрики. На скриншоте выше - это статистика моего счетчика за сентябрь 2024 с заданным набором полей. Осталось только сохранить эти данные на компьютер, чтобы провести окончательный расчет показателей.
Выгрузка данных
Запустите последнюю ячейку. Команда df.to_csv("logs_api.csv") сохраняет полученный датафрейм в таблицу с названием logs_api в формате .csv. Но по умолчанию он сохраняется не на вашем компьютере, а в проекте Colab. Чтобы найти итоговой файл, в левом меню навигации нажмите на иконку с папкой. Там вы должны увидеть свой сохраненный файл:
Наведите на него курсор мыши, а затем нажмите на иконку с тремя точками и выберите Скачать:
Файл со статистикой Logs API будет сохранен на вашем компьютере. Открыв его в обычном Microsoft Excel, вы увидите все данные в первом столбце:
Выполнив стандартную функцию Текст по столбцам с разделителем запятая, вы получите удобочитаемую статистику в виде набора выгруженных столбцов (=полей), над которым можно будет проводить вычисления целевых визитов, целевых посетителей, конверсии и достижение цели:
Примечание: если у вас слетела кодировка в столбцах ym:s:counterUserIDHash и ym:s:ClientID, воспользуйтесь редактором Power Query, изменив формат всего столбца на текстовый:
Тогда вся таблица преобразится и станет выглядеть примерно так:
Столбец ym:s:counterUserIDHash ни в коем случае нельзя удалять из таблицы, поскольку на основе него мы будем рассчитывать целевые показатели. Пришло время это сделать!
Расчет целевых визитов
Обратимся к определению:
Целевые визиты - визиты, в ходе которых была достигнута цель (или несколько целей) один и/или более раз.
Как вы понимаете, в выгруженной таблице нет такого показателя, поскольку это сырые, неагрегированные данные. Но в нашем запросе присутствовало поле ym:s:goalsID, которое показывает номера целей, достигнутых за данный визит. Тип данных этого поля - массив (Array(UInt32)).
Применив для таблицы фильтр, вы должны увидеть в квадратных скобках идентификаторы целей, которые были достигнуты в рамках конкретных визитов. Пустые [] означают, что ни одна цель не была достигнута в рамках этого визита:
Чтобы рассчитать показатели Целевые визиты и Целевые посетители, необходимо определиться с конкретной целью, для которой вы будете это делать, а затем отфильтровать столбец по соответствующему вхождению идентификатора этой цели.
В качестве примера я буду рассчитывать две метрики для цели GTM24 book download, идентификатор которой можно узнать в интерфейсе Яндекс Метрики в разделе Цели (столбец Номер цели):
Скопировав номер цели, отфильтруйте по этому значению столбец ym:s:goalsID. После этого выделите столбец ym:s:goalsID и посчитайте общее количество строк. Оно должно быть ровно количеству целевых визитов, то есть 57 (для моего примера), так как каждая запись (=строка) в таблице привязана к конкретному визиту и уникальному идентификатору пользователя:
Количество строк = количеству целевых визитов
Как видите, данные по целевым визитам совпадают в интерфейсе Метрики со статистикой из Logs API.
Расчет целевых посетителей
Обратимся к определению:
Целевые посетители - посетители, которые совершил целевые визиты. Один посетитель за определенный период времени может совершить несколько целевых визитов.
Поскольку мы уже отфильтровали данные по столбцу ym:s:goalsID и рассчитали целевые визиты для заданной цели, нам осталось только посчитать количество уникальных значений в поле ym:s:counterUserIDHash:
Для этого скопируйте все значения из столбца, вставьте их на отдельный лист и удалите дубликаты. В результате вы должны получить итоговое количество целевых посетителей:
Рассчитывая целевые визиты (см. выше), мы считали количество отфильтрованных строк в нашей таблице. А из определения целевых посетителей следует, что один посетитель за определенный период времени может совершить несколько целевых визитов. Следовательно, удалив дубликаты, мы получим уникальное количество идентификаторов пользователей, которые совершили 57 целевых визитов. И их в данном случае получилось меньше - 53. Данная цифра за выбранный период точно совпадает с интерфейсным значением в Яндекс Метрике.
Таким же несложным способом вы можете рассчитать целевые визиты и целевых посетителей для любой другой цели вашего счетчика. Нужно только отфильтровать данные в таблице по соответствующему номеру цели.
Расчет конверсии
Обратимся к определению:
Конверсия - доля целевых визитов в общем числе визитов (формула: Целевые визиты / Визиты).
Количество целевых визитов мы уже рассчитали. Это фильтр по полю ym:s:goalsID с соответствующим номером цели. А визиты в выгруженной таблице - общее количество строк без каких-либо фильтров.
Просто выделите все строки в таблице (без первой строки с заголовками) и посмотрите на итоговое значение:
В моем примере - 33 228. Это и есть общее количество визитов за выбранный диапазон дат. Для расчета конверсии воспользуемся формулой: Целевые визиты / Визиты = 53 / 33 228 * 100% = 0,159. В интерфейсе Яндекс Метрики это значение округлено в ближайшую сторону:
Оно совпадает с нашим расчетным.
Расчет достижений цели
Обратимся к определению:
Достижение цели - все действия пользователя, которые для вас важны и которые вы обозначили как цель. Если пользователь выполнил одну и ту же цель несколько раз в рамках одного визита, то все они будут засчитаны.
Расчет схож с целевыми визитами, только мы считаем не количество отфильтрованных строк по номеру цели, а количество вхождений этой цели в отфильтрованных визитах. Другими словами, вам необходимо отфильтровать столбец ym:s:goalsID по номеру цели, скопировать все значения и далее посчитать количество встречающихся идентификаторов. Вполне вероятно, что их будет больше, чем самих строк.
В моем примере так и получилось. Сначала я отфильтровал столбец ym:s:goalsID по значению идентификатора цели 333536276.
Полученные значения я перенес на соседний лист, разделил текст по столбцам с разделителем запятая, а потом с помощью функции Найти нашел все значения по номеру цели. Их получилось 59.
Оно сходится с интерфейсным значением достижения цели в моем счетчике Яндекс Метрики:
Все остальные данные в табличных отчетах Яндекс Метрики рассчитываются точно так же, на основе сырых данных, только с привязкой к конкретному срезу и группировке.
Теперь вы не просто знаете, чем отличаются целевые визиты от достижений цели, что такое целевые посетители и как рассчитывается конверсия в интерфейсе Метрике, но и умеете самостоятельно выполнять расчет всех перечисленных показателей с использованием Logs API и неагрегированных данных.