Математический расчет поведенческих факторов в Яндекс.Метрике

17 марта, 2023

Показатель отказов (Отказы), Глубина просмотра, Время на сайте - как много в интернете написано про поведенческие факторы Яндекс.Метрики, критерии активности пользователей на сайте и степень их влияния на эффективность продвижения в различных источниках. Но при этом никто и никогда не рассматривал способы их математического расчета. Ну что ж, сделаем это сейчас!

Вступление

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

Отказы, Глубина просмотра, Время на сайте в Яндекс.Метрике

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

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

Итак, давайте начнем технический маркетинг.

Агрегированные данные

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

Пример сводки в Яндекс.Метрике

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

"Итого и средние" - агрегированные данные

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

Агрегированные данные рассчитываются для определенной группы визитов. Например, метрика Время на сайте вычисляется для всех переходов из какого-либо источника трафика, всех визитов от посетителей мужского пола или всех визитов с планшетов. Именно с агрегированными данными вы всегда работаете в интерфейсе Яндекс.Метрики.

Сырые данные

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

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

Пример неагрегированных (сырых) данных

Таблицу с такими записями можно получить через Logs API. Вы делаете запрос на те данные, которые хотите выгрузить, и вам выдается список тех посещений пользователей, которые были на вашем сайте. Можно увидеть идентификатор визита, Client ID пользователя, время его пребывания на сайте, просмотры страниц, регион, источник перехода, достижение целей, браузер, модель мобильного телефона и многое другое.

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

  • отслеживать сложные воронки продаж (даже для каждого посетителя в отдельности);
  • создавать собственные модели атрибуции и анализировать вклад разных маркетинговых каналов в конверсии;
  • объединять данные из разных источников (связывать статистику из Метрики с данными из других систем - CRM, рекламой и т.д.);
  • контролировать расхождения в статистике.

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

Но нас сейчас интересует не это, а то, как Яндекс.Метрика рассчитывает Показатель отказов (Отказы), Глубина просмотра и Время на сайте. И поможет нам в этом API Яндекс.Метрики.

API Метрики

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

Каждый раз, когда вы переходите в свой счетчик Яндекс.Метрики, сверху в меню видите эту аббревиатуру:

Меню API в интерфейсе Яндекс.Метрики

API Яндекс.Метрики состоит из:

  • API управления – позволяет управлять счетчиками, целями, фильтрами и другими объектами Яндекс.Метрики (создать счетчик, отредактировать его настройки, создать цель, выдать права доступа и т.п.).
  • API отчетов – позволяет получать информацию о статистике посещений сайта и другие данные, не используя интерфейс Яндекс.Метрики. Поддерживает все возможности отчетов Яндекс.Метрики: сегментацию, полный набор группировок и метрик, сравнение сегментов и т.п.
  • API, совместимый с Google Analytics Core Reporting API – поддерживает все возможности Google Analytics Core Reporting API (v3), но набор группировок и метрик (параметров и показателей) ограничен.
API отчетов

API отчетов – это агрегированные или суммарные данные. Это означает то, что вы не сможете посмотреть отчеты в разрезе отдельных посещений. С помощью API отчетов не получится получить информацию о времени визита, уникального идентификатора пользователя (Client ID этого визита), времени визита и т.д. Вы увидите только суммарные (итоговые и средние) данные, статистика по конкретному посещению или пользователю будет недоступна.

Агрегированные данные в отчетах Метрики (API отчетов)

Когда вы заходите в интерфейс Яндекс.Метрики, отчеты, которые вы анализируете – это и есть те самые агрегированные данные.

Logs API

А для получения сырых данных используется Logs API.

Сырые данные (Logs API)

Сырые данные можно загрузить в свою базу данных и далее гибко ими управлять, а также объединять данные Яндекс.Метрики с другими источниками. Например, для построения сквозной аналитики. Именно с помощью Logs API мы и будем производить математический расчет поведенческих факторов.

Начало расчета

В качестве примера я предлагаю выгрузить данные за один день и посчитать для него Показатель отказов (Отказы), Глубина просмотра и Время на сайте, а затем сравнить наше расчетное значение со значением в интерфейсе Яндекс.Метрики. Например, статистика моего сайта за 15 марта 2023 года в отчете Источник, сводка будет выглядеть так:

Статистика за 15 марта 2023 года

В строке Итого и средние я получил такие данные:

  • Визиты - 1627
  • Посетители - 1379
  • Показатель отказов (Отказы) - 8,73%
  • Глубина просмотра - 1,66
  • Время на сайте - 3:22

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

Запрос к Logs API

Для использования API Яндекс.Метрики вам необходимо создать приложение и пройти авторизацию с помощью OAuth-токена. Для этого обязательно прочтите оба эти материала в таком порядке и выполните все шаги, описанные в них:

  1. Создание приложения
  2. Получение 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 это будет выглядеть так:

Установка клиентской библиотеки tapi-yandex-metrika для работы с Logs API

После установки библиотеки перейдите ко второй ячейке программы, где вы задали токен и указали идентификатор вашего счетчика Яндекс.Метрики. Все, что останется вам изменить - это диапазон дат в переменных date1 и date2. Поскольку я буду проводить математический расчет поведенческих факторов за конкретный день (15 марта 2023 года), то в этих полях задам значение "2023-03-15".

В моем запросе к Logs API используется максимальное количество допустимых полей:

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

Списки полей с различными уровнями организации данных доступны здесь:

Нам нужна группировка именно по визитам.

Одним из ключевых отличий API отчетов от Logs API Яндекс.Метрики является то, что в Logs API можно использовать идентификатор пользователя (ym:s:clientID или ym:pv:clientID), который привязывается к уникальному устройству и браузеру пользователя. Его еще называют Client ID, и он берется из файла cookie _ym_uid браузера.

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

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

Оценка возможности создания запроса

  • log_request_evaluation – параметр оценки возможности создания запросов логов;
  • possible – возможность создания запроса логов (true – да, false – нет);
  • max_possible_day_quantity - максимальное количество дней периода, который можно указать в запросах логов, с учетом текущей квоты. В данном примере – 3747 дней.

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

Теперь перейдите к третьей ячейке программы и запустите ее. На этом этапе происходит создание запроса с помощью метода created. Как только он будет создан, вам будет возвращен идентификатор запроса requestId (в моем примере - 30338503):

Создание запроса и получение идентификатора

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

Скопируйте идентификатор запроса и перейдите к следующей ячейке, вставив ваш идентификатор в поле requestId= и запустив ее:

Проверка готовности запроса

Посмотрите на статус запроса. Он должен быть processed (подготовлен). Если это так, то теперь вы можете перейти к следующей ячейке. В противном случае запустите ее столько раз, пока статус запроса не изменится на processed.

В следующей ячейке снова измените идентификатор запроса на свой и запустите ее:

Размер отчета и количество частей

Отчет можно будет скачать, когда он станет доступен на сервере Яндекса. Он может состоять из нескольких частей. Параметр part_number указывает номер части отчета, которую вы хотите загрузить. Чтобы узнать номер части, взгляните выше на запрос с командой info. В part_number (номер части) будет указано данное значение. Если отображается число 0, то отчет можно скачать за один раз. В параметре size указан размер файла в байтах.

Воспользуемся функцией part().to_dicts() для преобразования словаря в датафрейм. Выполните команду list = part().to_dicts() в следующей ячейке:

Функция преобразования

И следующей командой создайте датафрейм, импортировав библиотеку pandas и задав столбцам названия (для всего того большого списка полей, что были заданы в теле запроса):

Импорт библиотеки pandas и создание датафрейма

Выведите статистику на экран с помощью простой команды df с названием самого датафрейма, запустив предпоследнюю ячейку программы:

Сырые данные вашего счетчика Яндекс.Метрики

Поздравляю! Вы только что получили свои первые сырые данные Яндекс.Метрики. На скриншоте выше - это статистика моего счетчика за 15 марта 2023 года с заданным набором полей. Осталось только сохранить эти данные на компьютер, чтобы провести окончательный расчет показателей.

Запустите последнюю ячейку. Команда df.to_csv("logs_api.csv") сохраняет полученный датафрейм в таблицу с названием logs_api в формате .csv. Но по умолчанию он сохраняется не на вашем компьютере, а в проекте Colab. Чтобы найти итоговой файл, в левом меню навигации нажмите на иконку с папкой. Там вы должны увидеть свой сохраненный файл:

Сохраненный .csv файл

Наведите на него курсор мыши, а затем нажмите на иконку с тремя точками и выберите Скачать:

Сохранение файла с данными Logs API

Файл со статистикой Logs API будет сохранен на вашем компьютере. Открыв его в обычном Microsoft Excel, вы увидите все данные в первом столбце:

Выгруженная статистика из Logs API

Выполнив стандартную функцию Текст по столбцам с разделителем запятая, вы получите удобочитаемую статистику в виде набора выгруженных столбцов (=полей), над которым можно будет проводить вычисления показателя отказов, глубины просмотра и времени на сайте:

Текст по столбцам с разделителем "запятая"

В столбцах ym:s:clientID, ym:s:visitID и некоторых других данные могут отображаться некорректно. В этом случае измените в них формат ячеек на числовой. Столбец ym:s:clientID ни в коем случае нельзя удалять из таблицы, поскольку на основе него мы будем рассчитывать поведенческие метрики.

Пришло время это сделать!

Отказы (Показатель отказов)

Обратимся к определению в Яндекс.Метрике:

Отказы - это доля визитов, в рамках которых состоялся лишь один просмотр страницы, продолжавшийся менее 15 секунд.

Как вы понимаете, в выгруженной таблице нет показателя отказов, поскольку это сырые, неагрегированные данные. Но в нашем запросе присутствовал параметр ym:s:bounce, который принимает значения Yes (1 - да, отказ) и No (0 - нет, не отказ). Он показывает, был ли данный визит отказом с учетом точного показателя отказов (если страница просматривалась больше 15 секунд, то визит не считается отказом).

Параметр "Отказность" (ym:s:bounce)

Зная это, очень легко рассчитать показатель отказов. Для этого выделите столбец ym:s:bounce и посчитайте общее количество строк. Оно должно быть ровно количеству визитов, то есть 1627 (для моего примера), так как каждая запись (=строка) в таблице привязана к конкретному визиту и уникальному идентификатору пользователя:

Количество строк = количеству визитов (visits)

Как видите, данные по визитам совпадают в интерфейсе Метрики и статистики из Logs API. Теперь с помощью фильтров в Excel вы можете подсчитать количество строк, которые содержат 0, и количество строк, содержащих 1. Для моего примера за 15 марта 2023 года получились следующие значения:

  • строк с 0 (не отказ) - 1485
  • строк 1 (отказ) - 142
  • всего строк - 1627

Сумма 0 и 1 как раз должны давать общее количество визитов (=строк) в таблице. Таким образом, чтобы посчитать показатель отказов, необходимо разделить отказы (строки с 1) на общее количество визитов, то есть 142 / 1627 * 100% = 8,727% ~ 8,73%. Это число и отображается в строке Итого и средние:

Показатель в интерфейсе Яндекс.Метрики - 8,73%

Наш расчет на основе данных Logs API сошелся с интерфейсным значением Яндекс.Метрики. Теперь перейдем к следующему показателю.

Глубина просмотра

Обратимся к определению в Яндекс.Метрике:

Глубина просмотра - количество страниц, просмотренных посетителем во время визита

Как вы догадались, в выгруженной таблице нет сразу же подсчитанного показателя Глубина просмотра, поскольку это сырые, неагрегированные данные. Но в нашем запросе присутствовал параметр ym:s:pageViews, который принимает числовое значение и показывает количество просмотров во время визита (просмотры исключают обновления страницы в интервале менее 15 секунд):

Параметр "Количество просмотров" (ym:s:pageViews)

Чтобы рассчитать глубину просмотра, надо просто просуммировать все значения в этом столбце и поделить на общее количество визитов за выбранный диапазон дат. Выделив сам столбец, вы получите оба этих значения, поскольку сумма всех визитов - это строки в таблице (1627):

Общее количество просмотров

Фактически, это просто среднее значение (среднее арифметическое), которое в Excel отображается в графе Среднее.

Таким образом, чтобы посчитать глубину просмотра, необходимо разделить количество просмотров на общее количество визитов, то есть 2699 / 1627 = 1,658 ~ 1,66. Это число и отображается в строке Итого и средние:

Показатель в интерфейсе Яндекс.Метрики - 1,66

Наш расчет на основе данных Logs API сошелся с интерфейсным значением Яндекс.Метрики. Перейдем к последнему показателю.

Время на сайте

Обратимся к определению в Яндекс.Метрике:

Время на сайте - средняя продолжительность визита в минутах и секундах

Как вы поняли и в третий раз, в выгруженной таблице нет показателя Время на сайте, поскольку это все те же сырые, неагрегированные данные. Но в нашем запросе присутствовал параметр ym:s:visitDuration, который принимает числовое значение и регистрирует продолжительность визита в секундах:

Параметр "Продолжительность визита в секундах" (ym:s:visitDuration)

Чтобы рассчитать время на сайте, необходимо просто просуммировать все значения в этом столбце и поделить на общее количество визитов за выбранный диапазон дат. Выделив сам столбец, вы получите оба этих значения, поскольку сумма всех визитов - все строки таблицы (1627):

Общее количество секунд

Фактически, это просто среднее значение (среднее арифметическое), которое в Excel отображается в графе Среднее.

Таким образом, чтобы посчитать время на сайте, необходимо разделить полученную сумму в секундах на общее количество визитов, то есть 328181 / 1627 = 201,709 ~ 202 секунды. Это число и отображается в строке Итого и средние, только пересчитанное в минуты и секунды (202 секунды - это 3 минуты 22 секунды):

Показатель в интерфейсе Яндекс.Метрики - 3:22

Еще один расчет на основе сырых данных Logs API сошелся с интерфейсным агрегированным значением Яндекс.Метрики.

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

Резюме

Теперь вы понимаете, что умение работать с API Метрики - очень важно. Эти навыки дают вам возможность заглянуть под капот Яндекс.Метрики и увидеть гораздо глубже и дальше, чем позволяет интерфейс самого счетчика аналитики, а также понять природу расчетов различных показателей. Зная то, как работать с Logs API и выгружать статистику на уровне визитов или конкретных хитов, вы не просто выходите на новый уровень работы с аналитическим инструментом и можете решать сверхсложные задачи, но и становитесь гораздо ценнее на рынке труда, а также существенно опережаете своих коллег по цеху в техническом маркетинге.

Но одних знаний программирования недостаточно. В любом аналитическом инструменте, будь то это Яндекс.Метрика или Google Analytics, ключевую роль играют параметры и показатели, поскольку все отчеты состоят из разного набора метрик. Если вы не знаете какие параметры и показатели заложены в систему, как они сочетаются друг с другом, какие области действия имеют, ваш анализ данных будет очень поверхностным. Поэтому про них знать тоже нужно.

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

Получайте бесплатные уроки и фишки

По контекстной, таргетированной рекламе и аналитике