Анализ данных о посещении сайта роботами и людьми в Яндекс.Метрике. Часть II
Продолжение материала о том, как в Яндекс.Метрике проанализировать аудиторию собственного сайта на предмет переходов роботов и настоящих пользователей согласно алгоритмам определения самого Яндекса. Написание программы на Python. Часть вторая.
Примечание: первая часть доступна по ссылке.
Чтобы выгрузить статистику из Яндекс.Метрики по посещениям ботов и людей с помощью API, мы будем использовать API отчетов. Но перед тем, как вы начнете писать саму программу на Python, используя API Метрики, необходимо произвести подготовительные работы, а именно зарегистрировать новое приложение для Яндекс.Метрики и получить токен доступа.
Регистрация приложения
Для регистрации приложения подойдет обычная почта Яндекса. Если у вас уже есть аккаунт в Яндексе (например, на котором размещен ваш счетчик Яндекс.Метрики), вы можете использовать его, а не создавать новый. Авторизовавшись под своей учетной записью, перейдите по адресу https://oauth.yandex.ru/client/new
Заполните необходимые поля (со звездочкой *):
- Название сервиса
- Платформа приложения
- Доступ
В Название сервиса введите название приложения, которое будет использоваться. Вы можете задать произвольное имя. Например, MetrikaApp:
К приложению можно прикрепить иконку (максимальный размер не более 1Мб), но мы это делать не будем, поскольку данное приложение будет использоваться для личных целей, а не публично.
Напротив Для какой платформы нужно приложение? поставьте галочку рядом с Веб-сервисы. Появится строка Callback URL:
Нажмите на ссылку Подставить URL для разработки. В поле Callback URL автоматически подставится адрес https://oauth.yandex.ru/verification_code:
Заполнение данного раздела вам понадобится в будущем для получения токена.
В разделе Какие данные вам нужны? найдите в списке Яндекс.Метрика и поставьте галочку Получение статистики, чтение параметров своих и доверенных счётчиков:
В дополнительных настройках к приложению можно добавить описание сервиса, приложить ссылку на сайт и указать контактный адрес электронной почты, на который Яндекс будет присылать информацию, касающуюся изменений во внешней авторизации. Все эти поля являются необязательными.
В самом конце страницы нажмите на кнопку Создать приложение:
Приложение успешно создано. После этого вас автоматически перенаправит на другую страницу, где будут отображаться технические данные о вашем приложении. Они вам понадобятся через некоторое время.
Получение токена доступа
Скопируйте идентификатор вашего приложения из раздела ClientID:
Сохраните его в обычном блокноте. Он вам понадобится чуть позже в запросах для получения OAuth-токена.
Теперь авторизуйтесь под учетной записью Яндекса, на которой у вас есть доступ к счетчику Яндекс.Метрики, и перейдите по ссылке, добавив ее в адресную строку браузера:
1 |
https://oauth.yandex.ru/authorize?response_type=token&client_id=<идентификатор приложения> |
, где вместо <идентификатор приложения> вставьте идентификатор вашего приложения ClientID, скопированный на предыдущем шаге:
У вас должно открыться окно авторизации для аккаунта Яндекс.Метрики. Нажмите кнопку Войти как… и тогда ваше приложение получит доступ к использованию API Метрики.
На следующей странице отобразится ваш Oauth-токен. Он будет также добавлен в адресную строку.
Сохраните его и никому не показывайте и не передавайте. С его помощью можно получить доступ к вашим счетчикам Яндекс.Метрики.
Google Colab
Чтобы работать с API Метрики и выполнять запросы на Python, необходимо использовать специальное программное обеспечение (ПО). Такое ПО называют интегрированной средой разработки (IDE). Наиболее популярным Python IDE является PyCharm. Еще очень распространена IDE Spyder и JupyterLab.
Многие интернет-маркетологи и аналитики данных в своей работе так же используют блокнот Jupyter Notebook, который можно установить с помощью дистрибутива Anaconda, включающий набор популярных библиотек для работы с данными, таких как: NumPy, SciPy, Astropy и др. Еще есть Visual Studio Code и много других продуктов.
Как вы понимаете, выбор тех или иных программ зависит исключительно от ваших предпочтений в изучении или от тех инструментов, которые используются в вашей компании. Однако для работы с API Яндекс.Метрики я предлагаю использовать другой сервис - Google Colab.
Colaboratory (или просто Colab) - это бесплатный продукт Google Research. Он позволяет любому человеку писать и выполнять код Python прямо в браузере, без установки каких-либо программ и без дополнительной настройки. По сути, Colab - это размещенная на хостинге служба Jupyter Notebook, которая предоставляет доступ к своим вычислительным ресурсам, включая графические процессоры, благодаря которым можно заниматься не только базовой аналитикой данных, но и более сложными исследованиями в области машинного обучения. Google в Colab поддерживает актуальное состояние библиотек и их взаимную работу. Ваши проекты сохраняются не локально на компьютере, а на Google Диске. Они также могут быть загружены с GitHub. Таким образом, вы можете легко работать над одним проектом с другими людьми и делиться файлами со своей командой. Colab - отличное решение для начинающих пользователей, студентов, специалистов по обработке данных и исследователей в области искусственного интеллекта.
Создание проекта
Чтобы создать свой первый проект в Colab, авторизуйтесь в любой своей учетной записи Gmail и перейдите по ссылке. Вам откроется приветственное окно и ваши проекты:
Если вы никогда раньше не работали с Colaboratory, то никаких проектов, кроме демонстрационного, в списке вы не увидите. Для создания первого проекта нажмите на Создать блокнот:
В новом окне вы увидите только что созданный блокнот, в котором будете писать код программы на Python. При желании вы можете переименовать свой проект, задав ему понятное название, например - Боты и Пользователи в Яндекс.Метрике:
На этом первый шаг завершен. Оставьте вкладку с вашим проектом Colab открытой и переходите к следующему этапу.
Клиентская библиотека tapi-yandex-metrika
Для работы с API Яндекс.Метрики я предлагаю использовать библиотеку Павла Максимова. Она расположена по адресу https://github.com/pavelmaksimov/tapi-yandex-metrika
Поскольку библиотека является сторонней разработкой, ее необходимо установить. Она называется tapi-yandex-metrika. Для этого вернитесь на вкладку с вашим проектом Colab и в первой строке введите команду установки клиентской библиотеки:
1 |
pip install --upgrade tapi-yandex-metrika==2022.4.8 |
Нажмите иконку запуска (значок play), чтобы код в ячейке сработал. В Colab это будет выглядеть так:
Напротив строки с кодом должна появится зеленая галочка, свидетельствующая об успешном выполнении кода:
Выгрузка данных по роботам и людям
Чтобы продолжить писать программу, сверху вашего блокнота нажмите на + Код:
В новую ячейку вставьте код, а точнее его часть, из библиотеки Максимова, расположенного по адресу https://github.com/pavelmaksimov/tapi-yandex-metrika/blob/master/docs/stats.md
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import datetime as dt from tapi_yandex_metrika import YandexMetrikaStats ACCESS_TOKEN = "ваш_токен" COUNTER_ID = "идентификатор_яндекс_метрики" client = YandexMetrikaStats(access_token=ACCESS_TOKEN) params = dict( ids=COUNTER_ID, date1="2023-01-01", date2="2023-01-31", metrics="ym:s:visits", dimensions="ym:s:date, ym:s:isRobot", sort="ym:s:date", lang="en", #Другие параметры Метрики -> https://yandex.ru/dev/metrika/doc/api2/api_v1/data.html ) report = client.stats().get(params=params) |
В поле ACCESS_TOKEN вставьте ваш токен доступа, полученный на предыдущем шаге, а в поле COUNTER_ID — идентификатор счетчика Яндекс.Метрики, из которого вы хотите получить данные. Последний можно посмотреть в интерфейсе Метрики над всеми отчетами:
В поле date1 вы можете указать начальную дату выгрузки данных в формате YYYY-MM-DD (за какой период вы хотите получить статистику из счетчика Яндекс.Метрики), а в поле date2 – конечную дату отчета в формате YYYY-MM-DD, за которую желаете проанализировать роботов и реальных пользователей. Также вы можете использовать значения today (сегодня), yesterday (вчера), ndaysAgo (N дней назад).
Примечание: date1 и date2 могут принимать и строку, и тип данных datetime с перечислением через запятую атрибутов (year, month, day).
В metrics вы через запятую можете перечислить перечень показателей, которые хотите выгрузить, в поле dimensions – группировки, они же параметры. Полный список группировок и метрик API отчетов Яндекс.Метрики представлен в официальной документации Яндекса.
Не забудьте, что в Яндекс.Метрике есть разные уровни организации данных. Нельзя использовать вместе измерения или метрики, которые относятся к разным областям применения. Группировки и метрики, начинающиеся с ym:s:, имеют область действия визиты (s — session), а группировки и метрики, начинающиеся с ym:pv: относятся к хитам (pv — pageview — просмотр страницы).
Как вы знаете, Яндекс.Метрика определяет роботов по поведенческим факторам и другим техническим сигналам. В API Метрики за это отвечает параметр ym:s:isRobot. Именно его вместе с параметром ym:s:date на уровне визитов вы добавляете в запрос ym:s:isRobot, чтобы в разрезе конкретного дня видеть статистику по роботам и людям. А в metrics используется классический показатель ym:s:visits (визиты).
Строка запроса sort="ym:s:date" отвечает за сортировку, в данном случае по дате. По умолчанию сортировка производится по убыванию (указан знак «-» перед группировкой или метрикой). Чтобы отсортировать данные по возрастанию, удалите знак «-».
lang="en" – язык запроса. Подробнее о синтаксисе запроса API отчетов и о том, в каком виде вы получите ответ, читайте в документации Яндекса.
Итоговый код в Colab будет выглядеть так:
Запустите ячейку. Ошибок быть не должно. Создайте новую ячейку и добавьте в нее нижеприведенную строку:
1 |
print(report.data) |
Запустив ее, вы увидите результат выполнения программы и данные Яндекс.Метрики:
Внизу таблицы API отчетов Метрики отдали дополнительные данные по запросу:
1 |
'total_rows': 62, 'total_rows_rounded': False, 'sampled': False, 'contains_sensitive_data': False, 'sample_share': 1.0, 'sample_size': 27420, 'sample_space': 27420, 'data_lag': 0, 'totals': [27416.0], 'min': [10.0], 'max': [1437.0]} |
- total_rows – общее количество строк в ответе по всему множеству данных;
- total_rows_rounded — признак того, что общее количество строк было округлено (false – нет);
- sampled — признак семплирования. Показывает, был ли применен семплинг (false – нет, true – да);
- contains_sensitive_data — признак возможного отсутствия конфиденциальных данных в ответе. К ним относятся данные, которые рассчитываются алгоритмами Яндекса, например, социально-демографические (пол, возраст и др.), адреса страниц входа, поисковые фразы, информация о роботах. При значении true в ответе не отобразятся такие данные, если выборка составляет меньше 10 посетителей;
- sample_share — доля данных, по которым осуществлялся расчет. Доступно значение в пределах от 0 до 1;
- sample_size — количество строк в выборке данных;
- sample_space — количество строк данных;
- data_lag — задержка в обновлении данных, в секундах;
- totals — общие результаты для метрик по всему множеству данных;
- min — минимальные результаты для метрик среди попавших в выдачу ключей;
- max — максимальные результаты для метрик среди попавших в выдачу ключей.
В таком виде работать со статистикой не очень удобно. А поскольку полученные данные являются списком (type — list), вы можете преобразовать этот список в датафрейм:
1 2 3 |
result = report().to_values() print(result) print(type(result)) |
В Colab добавьте новую ячейку, вставьте туда эти строки и запустите ее:
Для этого импортируйте библиотеку pandas с помощью команды в новой ячейке:
1 |
import pandas as pd |
В программе это будет выглядеть так:
Для датафрейма в первой строке необходимо задать названия столбцов. Чтобы узнать их имена воспользуйтесь следующей командой:
1 |
print(report.columns) |
Таким образом, вы получите итоговую конструкцию для удобочитаемого отображения данных, если используйте такие же параметры и показатели (ym:s:date, ym:s:isRobot и ym:s:visits), что и я:
1 2 |
df = pd.DataFrame (result, columns = ['ym:s:date', 'ym:s:isRobot', 'ym:s:visits']) print (df) |
Результат выполнения кода в Colab (новая ячейка):
Как видите, данные в датафрейме выглядят привычнее и напоминают обычную таблицу. Каждая дата в выгруженной статистике Яндекс.Метрики делится на две строки - в одной строке в столбце ym:s:isRobot отображается количество людей (People), а в другой количество роботов (Robots). Например, 1 января 2023 года на моем сайте osipenkov.ru было зафиксировано 167 визитов от реальных пользователей и 13 визитов роботов. 31 января 2023 года визитов от реальных пользователей - 1281, а от роботов - 66. И так далее.
Визуализация данных
Теперь вы можете построить график с распределением количества посещений от ботов и обычных пользователей, чтобы статистика была более наглядной. Для этого воспользуетесь библиотекой Seaborn. Seaborn - это библиотека для создания статистических графиков на Python. Она основывается на библиотеке Matplotlib и тесно взаимодействует со структурами данных pandas.
Импортируйте ее в свой проект Colab:
1 |
import seaborn as sns |
Для создания визуализации воспользуйтесь нижеприведенным кодом в новой ячейке:
1 2 |
sns.set(style = 'whitegrid', rc={'figure.figsize':(12,4)}) sns.barplot(x='ym:s:date', y='ym:s:visits', hue='ym:s:isRobot', data= df) |
После выполнения этого кода вы увидите результат в виде столбчатой диаграмма за выбранный диапазон дат и разбивкой на два типа - Роботы (Robots) и Пользователи (People):
Если анализируемый диапазон выбран слишком большим (например, как у меня за 30 дней), то подписи под осью по умолчанию могут выглядеть нечитабельно. В этом случае рекомендуется сократить период выгрузки данных, либо же скорректировать запрос на визуализацию, используя вместо кода выше этот фрагмент:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import seaborn as sns import matplotlib.pyplot as plt sns.set(style = 'whitegrid', rc={'figure.figsize':(12,4)}) barplot = sns.barplot(x='ym:s:date', y='ym:s:visits', hue='ym:s:isRobot', data= df) barplot.axes.set_title ("Распределение роботов и пользователей по дням", fontsize=16) barplot.set_xlabel("Дата", fontsize=14) barplot.set_ylabel("Визиты", fontsize=14) plt.legend(title = "Тип пользователя") plt.xticks( rotation=45, horizontalalignment='right', fontweight='light', fontsize='12' ) |
Изменив начальный запрос, вы можете построить распределение роботов и пользователей с привязкой к другим параметрам. Например, узнать с какого браузера или города приходит больше всего роботов. Или какое количество визитов на одного пользователя совершается ботами. Вы также можете отслеживать динамику/тенденцию снижения или увеличения процента роботов по отношению к реальным посетителям.
Примечание: по умолчанию в запросе API Метрики выгружается 100 элементов на странице выдачи (поле limit). Чем будет выше у вас детализация запроса, тем итоговый датафрейм будет больше. И тогда вам нужно в теле запроса задать поле limit с конкретным значением (максимальное - 100 000).
В конце материала приложен файл с программой, в котором разобран пример с браузерами. Вы можете использовать мои наработки при решения собственных задач Метрики.
Резюме
Как видите, определять роботов и реальных пользователей можно как через интерфейс Метрики, так и с помощью API Метрики. Первый вариант разобран в первой части и является наиболее простым для веб-аналитика, поскольку ограничивается только настройками и функционалом самого счетчика аналитики. Конечно же, вы можете выгрузить данные из интерфейса Яндекс.Метрики в формате xlsx или csv, а сам анализ проводить уже внутри того же Microsoft Excel, используя функционал классических и сводных таблиц.
Второй же вариант, напротив, позволяет подойти к задаче творчески, многогранно и гибко, используя API Метрики. Вы можете не только построить распределение роботов и пользователей с помощью удобной визуализации, используя популярные библиотеки Python, но и совершить расчет дополнительных метрик и построить срезы, которых нет в самой Яндекс.Метрике, и впоследствии масштабировать ваше решение на другие счетчики аналитики, поскольку сама программа и запрос будет точно такими же. Отличие будет состоять только в идентификаторе счетчика Яндекс.Метрики.