Ассоциированные конверсии в Яндекс Метрике Про
Думали, что в Яндекс Метрике нет ассоциированных конверсий? Ошибаетесь! Это руководство написано с целью опровержения данного заблуждения.
Все нижеприведенное актуально для Яндекс Метрики Про, но в дальнейшем постараюсь подготовить руководство и для обычной Метрики. Материал основан на репозитории GitHub (автор: zhdanchik), в котором содержится код на Python, предназначенный для формирования ассоциированных конверсий на данных Яндекс Метрики, с моими комментариями и подробными скриншотами каждого шага настройки.
Рекомендуется к прочтению:
- Введение в API Яндекс Метрики
- Математический расчет поведенческих факторов в Яндекс Метрике
- Воронки и когортный анализ на данных Яндекс Метрики
- Ассоциированные конверсии на базе Google Analytics 4 и BigQuery
Я не буду в этом руководстве давать определение ассоциированным конверсиям и описывать их роль в аналитике. Предполагается, что если вы читайте/нашли этот материал, то уже знакомы с данной темой. Или хотя бы познакомились с этим постом Яндекса. Мы с вами сосредоточимся на технической стороне вопроса.
Начало работы
Владелец сайта после установки счетчика Яндекс Метрики, как правило, работает в интерфейсе сервиса. Он использует отчеты, просматривает графики, анализирует данные в таблицах, меняет параметры и показатели, накладывает фильтры, сравнивает сегменты и аудитории за разные диапазоны дат, и многое другое.
Однако работа в интерфейсе Яндекс Метрики возможна только с тем набором инструментов и опций, которые заложили в него сами разработчики Яндекса. И ассоциированных конверсий в нем нет.
Именно поэтому интернет-маркетологи и веб-аналитики используют в своей работе API. Для получения неагрегированных данных, так называемых «сырых данных» Яндекс Метрики, используется Logs API. Вы делаете запрос на те данные, которые хотите загрузить из Logs API, и вам выдается список тех посещений пользователей, которые были на вашем сайте. Можно увидеть Client ID посещения, время пребывания на сайте, просмотры страниц, регион пользователя, источник перехода и многое другое.
Как раз Logs API позволяет строить различные воронки, пути пользователей по вашему сайту, включая данные по страницам, карту событий/целей, по источникам трафика, проводить когортный анализ, создавать собственные модели атрибуции, прогнозировать будущие показатели на основе исторических данных счетчика Метрики и многое другое.
Именно благодаря выгрузке данных с помощью Logs API и языка программирования Python мы и будем строить ассоциированные конверсии на данных Яндекс Метрики, используя Yandex Cloud, Yandex DataSphere и ClickHouse.
Итак, чтобы начать работу, вам необходимо зарегистрироваться в Yandex Cloud, настроить сообщество в DataSphere и привязать к нему платежный аккаунт. Перейдите по ссылке и нажмите на кнопку Попробовать бесплатно:
Войдите с помощью Яндекс ID или рабочего аккаунта в федерации (SSO). Поскольку мы будем работать с данными Яндекс Метрики, то используйте для входа свою учетную запись, на которой размещен счетчик.
Если вы впервые используете Yandex Cloud, то после входа в Yandex DataSphere для вас будет создана новая организация с префиксом organization- и названием вашего аккаунта.
Создание платежного аккаунта
Вам также необходимо создать платежный аккаунт и привязать его к сообществу DataSphere. Для этого перейдите по ссылке и создайте новый аккаунт:
На шаге Общая информация придумайте имя аккаунта, выберите организацию, для которой будет использоваться платежный аккаунт, а также задайте страну, резидентом которой вы являетесь, и укажите плательщика.
В рамках одного пользовательского аккаунта все плательщики должны осуществлять оплату в одной и той же валюте. При выборе другой страны возникнет ошибка. Подробнее об этом читайте в официальной документации Яндекс Облака.
Выбрав Новый плательщик и Тип аккаунта (Физическое лицо или Юридическое лицо/ИП), нажмите Вперед. Если вы выбрали физическое лицо, то на следующем шаге заполните свои персональные данные - имя и фамилию.
На шаге платежных данных привяжите свою банковскую карту. Укажите 16-значный номер, срок действия, код CVV (с обратной стороны карты):
Заполнив данные, нажмите кнопку Привязать. Для проверки валидности карты на вашем счету будет заблокирована незначительная сумма (~ 11 рублей). Эти средства не списываются и будут снова доступны после завершения проверки и разблокировки. Срок разблокировки несписанных средств зависит от условий работы вашего банка.
Если карта прошла валидацию, вы увидите ее в списке привязанных:
На последнем шаге заполните контактные данные – электронную почту и телефон:
Эта информация нужна не только для связи с вами, но и для выставления счетов и финансовых документов.
Если это ваш первый платежный аккаунт в Yandex Cloud, вам будет доступно подключение пробного периода и гранта. Для этого обязательно поставьте галочку Включить пробный период:
Грант - скидка, которая предоставляется ИП, организации или физическому лицу на использование любых сервисов Yandex Cloud. Он будет начислен при создании первого платежного аккаунта, если ранее вы никогда не приобретали услуг Yandex Cloud и не активировали пробный период. Стартовый грант действует 60 дней. Размер и валюта гранта зависят от страны, в которой вы проживаете:
- для резидентов Российской Федерации (РФ), а также налоговых резидентов Республики Беларусь (РБ) размер гранта составляет не менее 4000 ₽, с учетом НДС;
- для резидентов Республики Казахстан (РК) размер гранта составляет не менее 24 000 ₸, с учетом НДС;
- для нерезидентов Российской Федерации и Республики Казахстан размер гранта составляет не менее 50 $, без учета налогов и сборов.
Если вы выбрали тип Юридическое лицо или ИП, тогда вам потребуется указать данные плательщика (название организации, почтовый индекс, фактический и юридический адреса, ИНН, КПП, БИК, расчетный счет). При выборе способа оплаты Банковский перевод платежный аккаунт будет создан в статусе «Не подтвержден». На вашу почту, указанную в аккаунте Яндекса или Яндекс Коннекта, будет отправлено письмо с описанием дальнейших действий. Активация платежного аккаунта может занять до трех рабочих дней.
Также для юридических лиц предусмотрен пробный период. Пробный период - это разовое ознакомительное предложение для юридических лиц. Вы можете воспользоваться пробным периодом, если вы:
- никогда не приобретали услуги Yandex Cloud;
- ранее не активировали пробный период.
Пробный период позволяет бесплатно использовать ресурсы Yandex Cloud в ограниченном режиме. При этом потребленные ресурсы оплачиваются из средств стартового гранта. После завершения пробного периода ресурсы будут сохранены, но остановлены. Для возобновления работы с Yandex Cloud в полном объеме потребуется перейти на платную версию.
Примечание: включение пробного периода происходит только на этапе создания первого платежного аккаунта для юридического лица в сервисе Yandex Cloud Billing.
В завершение нажмите кнопку Создать. После этого вас перенаправит на страницу Биллинга, на которой будут отображены ваши платежные реквизиты. Убедитесь, что ваш аккаунт активен:
Привязка платежного аккаунта к DataSphere
Теперь вернитесь в Yandex DataSphere, перейдите в раздел Сообщества и выберите сообщество организации по умолчанию:
Привяжите платежный аккаунт к сообществу DataSphere, в котором вы будете работать. Для это прокрутите страницу чуть вниз и в блоке 1. Привяжите платежный аккаунт нажмите на кнопку Привязать:
В открывшемся окне выберите свой платежный аккаунт и нажмите Привязать:
Через некоторое время вы получите уведомление об успешной привязке платежного аккаунта к сообществу DataSphere.
Подключение ClickHouse
ClickHouse позволяет работать с неагрегированными статистическими данными Яндекс Метрики, полученными с помощью Logs API. Для этого вы можете арендовать место в Yandex Cloud. Но сразу хотелось бы сказать, что это решение является платным и будет зависеть от выбранного вами кластера и итоговой конфигурации (настроек).
Для работы с ClickHouse в Яндекс Облаке вам понадобится проект. Если вы никогда не работали в Yandex Cloud, то перейдите по ссылке и создайте свое первое облако. Выберите вашу организацию и введите название облака:
После его создания вас перенаправит в консоль управления:
Теперь в созданном каталоге для создания кластера ClickHouse выберите меню Managed Service for ClickHouse:
В открывшемся окне нажмите Создать кластер ClickHouse:
Укажите настройки кластера ClickHouse:
- в блоке Базовые параметры укажите произвольное имя кластера или оставьте его по умолчанию;
- в блоке Ресурсы выберите платформу Intel Cascade Lake, тип burstable и класс хоста b2.medium;
Примечание: не рекомендуется использовать конфигурации ВМ типа burstable в продакшн-среде. В руководстве Yandex Cloud они используются в качестве примера. Для продакшн-решений используйте конфигурации standard или memory-optimized.
- в блоке Размер хранилища оставьте значение 10 ГБ;
- в блоке Хосты нажмите значок карандаша (редактирования);
Включите опцию Публичный доступ и нажмите кнопку Сохранить.
В блоке Настройки СУБД выключите управление пользователями через SQL, укажите имя пользователя, пароль и имя БД:
В блоке Сервисные настройки включите опции:
- доступ из DataLens
- доступ из WebSQL
- доступ из Метрики и AppMetrica
- доступ из Serverless
- доступ из Yandex Query
Они не будут нам все нужны для ассоциированных конверсий, но могут пригодиться вам в других задачах (работе с БД ClickHouse и визуализации данных в Yandex DataLens).
После всех проведенных настроек вы можете оценить итоговую конфигурацию вашего кластера ClickHouse и ежемесячную стоимость аренды перед тем, как его создать. Как вы уже знаете, стоимость аренды хранилища зависит от выбранного ресурса, его размера и других настроек. Согласно тому, что написано в документации Yandex Cloud, примерная стоимость аренды для текущего решения и работы с Logs API Яндекс Метрики будет составлять 3000 руб./месяц:
В завершение нажмите кнопку Создать кластер.
Подключение DataSphere
Откройте главную страницу DataSphere. В разделе Сообщества выберите сообщество, в котором вы хотите создать проект. В правом верхнем углу нажмите кнопку Создать проект:
В открывшемся окне укажите имя и (опционально) описание проекта. Требования к имени:
- Длина - от 3 до 63 символов;
- Может содержать строчные буквы латинского алфавита, цифры и дефисы;
- Первый символ - буква. Последний символ - не дефис.
Нажмите кнопку Создать. После создания проекта нажмите кнопку Открыть проект в JupyterLab:
Перед вами откроется среда разработки JupyterLab, в которой вы будете работать дальше:
Клонирование репозитория в DataSphere
В меню Git выберите Clone a Repository:
Для работы с ассоциированными конверсиями Яндекс Метрики воспользуемся решением от zhdanchik. В открывшемся окне укажите URI репозитория https://github.com/zhdanchik/yandex_metrika_connector_cases.git и нажмите кнопку CLONE:
Нажмите кнопку OK. Если все прошло успешно, то в правом нижнем углу вы увидите надпись Successfully cloned на зеленом фоне, а в вашем проекте в папке yandex_metrika_connector_cases будут присутствовать следующие файлы:
- 0. check clickhouse connection.ipynb - проверка, есть ли доступ до ClickHouse;
- 1. prepare visits table.ipynb - необязательный пункт, загрузка визитов в нужном формате, если коннектора пока нет, а данные были получены с помощью Logs API;
- 2. analysis of channels chains.ipynb - основной NoteBook для работы. В нем будет инициализирован экземпляр класса, будут собраны визиты в нужном формате из ClickHouse таблиц, создание цепочек и их анализ;
- README.md - описание проекта;
- YandexInternalRootCA.crt - сертификат безопасности для взаимодействия с кластером ClickHouse;
- analyse_channels_chain.py - основная программа, которая содержит реализацию класса DataPreparer, необходимого для обработки данных о визитах пользователей и построении ассоциированных конверсий;
- some_funcs.py - код, содержащий клиент для работы с базой данных ClickHouse и визуализации данных с помощью пакета Plotly (библиотека на Python для визуализации данных). Он включает функции для выполнения запросов к базе данных, преобразования результатов в датафрейм (DataFrame) и создания различных типов графиков, таких как воронки и линейные графики. Также присутствует функциональность для загрузки файлов с Яндекс Диска;
- source_names.csv - файл сопоставления источников трафика (SourceName) по кодам (SourceCode).
Создание приложения и получение токена доступа
Чтобы выгрузить данные из своего счетчика Яндекс Метрики, вам необходимо сначала создать приложение, а затем получить токен доступа. В рамках данного руководства я не буду подробно описывать эти шаги настройки. Вы можете прочитать две статьи ниже на контентной платформе lib.osipenvkov.ru:
В них подробно разобраны все этапы. В завершение не забудьте сохранить полученный токен доступа.
Проверка подключения к базе ClickHouse
В корневой директории создайте новый текстовый файл с названием _chpass.txt. Запишите в него пароль заведенного пользователя, который вы задали при создании кластера ClickHouse (см. выше).
Перейдите в папку yandex_metrika_connector_cases и откройте файл 0. check clickhouse connection.ipynb. Он нужен для проверки вашего подключения к созданному кластеру ClickHouse.
Автор репозитория любезно оставил для нас комментарии к каждому шагу и фрагменту кода. Нам необходимо изменить настройки на свои. Для этого перейдите ко второй ячейке проекта и введите значения для трех переменных:
- CH_HOST_NAME - имя хоста;
- CH_USER - имя пользователя;
- CH_DB_NAME - имя БД.
Чтобы узнать имя хоста своего кластера ClickHouse, в консоли управления перейдите в уже созданный кластер ClickHouse. Дождитесь, когда у кластера появится статус Alive.
После этого откройте кластер, кликнув на сам кластер. Выберите из списка слева Хосты. На вкладке Обзор скопируйте FQDN хоста:
Вставьте это значение в переменную CH_HOST_NAME. CH_USER и CH_DB_NAME - это имена пользователя и БД соответственно.
После этого запустите код программы. Сделать это можно, нажав на соответствующую иконку Run или же с помощью сочетания клавиш Shift + Enter:
Если вы все сделали правильно, то в самом конце программы вы должны увидеть версию сервера ClickHouse:
Она должна совпадать с версией вашего кластера, которую можно посмотреть на вкладке Обзор в настройках ClickHouse:
Подготовка данных с визитами
Для того, чтобы построить ассоциированные конверсии на данных Яндекс Метрики, вам потребуется таблица с визитами.
Требуемые поля таблицы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
"CounterID" "UserIDHash" "VisitID" "VisitVersion" "Sign" "StartDate" "UTCStartTime" "Duration" "TrafficSource.Model" "TrafficSource.StartTime" "TrafficSource.ID" "TrafficSource.SearchEngineID" "TrafficSource.AdvEngineID" "TrafficSource.SocialSourceNetworkID" "TrafficSource.ClickBannerID" "TrafficSource.ClickTargetType" "TrafficSource.RecommendationSystemID" "TrafficSource.MessengerID" "EPurchase.ID" "EPurchase.Revenue" "Goals.ID" "Goals.Price" |
Подробнее о полях Logs API, их типе и описании читайте в официальной документации Яндекса.
Формат получаемых данных такой:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
{ "CounterID": 73226638, "UserIDHash": "8436703211547595681", "VisitID": "3727003746415349418", "VisitVersion": 19, "Sign": 1, "StartDate": "2020-07-01", "UTCStartTime": "2020-07-01 16:16:31", "Duration": 95, "TrafficSource.Model": [3,2,1], "TrafficSource.StartTime": ["2020-07-01 16:16:31","2020-07-01 16:16:31","2020-07-01 16:16:31"], "TrafficSource.ID": [3,3,3], "TrafficSource.SearchEngineID": [0,0,3], "TrafficSource.AdvEngineID": [2,2,2], "TrafficSource.SocialSourceNetworkID": [0,0,0], "TrafficSource.ClickBannerID": ["0","0","0"], "TrafficSource.ClickTargetType": [0,0,0], "TrafficSource.RecommendationSystemID": [0,0,0], "TrafficSource.MessengerID": [0,0,0], "EPurchase.ID": [], "EPurchase.Revenue": [], "Goals.ID": [], "Goals.Price": [] } |
О том, как получить такую таблицу с нужными полями, читайте в этом руководстве. В нем подробно описан процесс интеграции Яндекс Метрики с базой данных ClickHouse, созданной в Yandex Cloud, чтобы вы смогли получать неагрегированные данные вашего счетчика с рядом преимуществ по сравнению с Logs API. Основная настройка, которую вам необходимо сделать, находится в разделе Создание трансфера (Yandex Data Transfer).
Если таблицы с таким списком полей у вас еще нет, и вы не используете Метрику Про, а работаете в обычном счетчике Яндекс Метрики, то таблицу с визитами вам нужно сформировать самостоятельно. Этот этап выходит за рамки данного руководства, поскольку статья посвящена именно ассоциированным конверсиям для Яндекс Метрики Про. И описанное ниже решение вам не подойдет, поскольку в следующей программе Python используется именно такой список полей. В отдельном руководстве я планирую адаптировать репозиторий автора (zhdanchik) под стандартную Яндекс Метрику.
К сожалению, некоторые поля недоступны в Logs API при самостоятельной выгрузке. Например, поля Sign и visitVersion создаются автоматически и только с использованием готовой интеграции Яндекс Метрики - Yandex Cloud - ClickHouse. Поэтому выгрузить с помощью собственного кода на Python по Logs API все данные вы не сможете.
В качестве примера вы можете скачать таблицу по ссылке, чтобы посмотреть как выглядит набор данных, на основе которого будут рассчитываться ассоциированные конверсии, загрузить файл в свой проект DataSphere и запустить код программы 1. prepare visits table.ipynb. После его выполнения в вашем кластере ClickHouse должна появиться новая таблица с визитами visits_from_ch:
Примечание: открыть пример файла по ссылке на компьютере после его скачивания можно следующим образом - переименуйте visits_fake_data_for_meetup_v2.tar.gz в файл с расширением json.gz, чтобы получилось как visits_fake_data_for_meetup_v2.json.gz. После этого вы сможете открыть его с помощью обычного архиватора и извлечь файл в формате .json.
Команда Яндекса любезно предоставила мне доступ к Яндекс Метрике Про для osipenkov.ru (за это им БОЛЬШОЕ СПАСИБО), поэтому я смогу построить ассоциированные конверсии для своих данных.
После создания кластера ClickHouse в Яндекс Метрике Про необходимо настроить трансфер. Он позволит вам передавать неагрегированные данные из Яндекс Метрики в вашу базу данных. Именно этот пункт и разбирается в этой статье. Я не хочу дублировать его в этом руководстве, так как он подробно описан там. После создания трансфера вы получите таблицу визитов в своем кластере ClickHouse с настроенным списком полей.
Примечание: пример схемы данных для таблицы визитов при автоматической выгрузке в ClickHouse с помощью Yandex Data Transfer вы можете посмотреть здесь.
После формирования таблицы с визитами возвращаемся в Yandex DataSphere. Откройте программу 2. analysis of channels chains.ipynb. Это основной notebook для работы. В нем будет инициализирован экземпляр класса, будут собраны визиты в нужном формате из ClickHouse таблиц, создание цепочек и их анализ.
Первая ячейка программы - точно такая же, как и в программе с проверкой доступа к ClickHouse. Просто скопируйте значения имени хоста, имени пользователя и имени базы данных. Перепроверьте, что в корневой директории присутствует текстовый файл с названием _chpass.txt. Как вы помните, в нем записан пароль пользователя от кластера ClickHouse (см. выше).
Запустите первые четыре ячейки программы. Если вы все сделали правильно, то в завершение получите вашу версию кластера ClickHouse:
Запуск основной программы
Теперь начинается основная программа. Для работы со всеми методами и построения ассоциированных конверсий используется класс-интерфейс DataPreparer из модуля analyse_channels_chain (отдельный файл с программой .py):
Сначала его надо импортировать, а потом создать экземпляр класса, проинициалиировав его нужными значениями.
В следующей ячейке задайте собственные значения:
- table_preffix - префикс таблиц, которые создадутся в процессе анализа (можно оставить без изменений);
- raw_visits_table - название таблицы, в которой располагаются ваши визиты;
Поскольку я использую Yandex Data Transfer, то таблица с визитами была названа автоматически.
У вас оно будет другим. Период анализа выставляете свой собственный, ориентируясь на даты выгрузки данных в ClickHouse.
- start_date - начало периода анализа;
- end_date - конец периода анализа;
Цель, которую я буду анализировать - это скачивание электронной книги Google Analytics 4. Идентификатор любой цели в Яндекс Метрике можно посмотреть в разделе Цели:
Идентификатор нужной мне цели - 229813721.
Все эти данные нужно ввести в ячейку программы:
- goals - идентификаторы целей через запятую, по которым будет производиться анализ. Оставьте [-1] для трактования e-commerce покупки как конверсии, либо пустой [], тогда каждый визит будет считаться как конверсия.
В результате ваши настройки могут выглядеть примерно так:
Запустите две ячейки:
Может быть такое, что после выполнения этих фрагментов кода вы получите ошибку.
ValueError: Code: 62. DB::Exception: Syntax error: failed at position 1738 ('(') (line 26, col 11): (round(arraySum((arrayFilter(x, y -> has([229813721], y), Goals.Price, Goals.ID)) / 1000., 2), VisitVersion) as Revenue
FROM название_таблицы
Чтобы ее исправить, вам необходимо перейти в файл analyse_channels_chain.py и найти следующие строки (~540 строка):
1 2 3 4 5 6 7 8 |
def revenue_formula(self): # Тут не приводятся курсы валют, предполагаем, что в Revenue - рубли if self.goals == []: return "0" elif self.goals == [-1]: return "round(arraySum(arrayMap(x -> (if(isFinite(x), x, 0)), arrayMap(Revenue -> (multiIf(Revenue < 0, 0, Revenue > 112170000000, 0, Revenue / 1.) / 1000000), `EPurchase.Revenue`))), 2)" else: return 'round(arraySum((arrayFilter(x, y -> has([{}], y), Goals.Price, Goals.ID)) / 1000., 2)'.format(','.join(map(str, self.goals))) |
Замените этот код на этот:
1 2 3 4 5 6 7 8 |
def revenue_formula(self): # Тут не приводятся курсы валют, предполагаем, что в Revenue - рубли if self.goals == []: return "0" elif self.goals == [-1]: return "round(arraySum(arrayMap(x -> (if(isFinite(x), x, 0)), arrayMap(Revenue -> (multiIf(Revenue < 0, 0, Revenue > 112170000000, 0, Revenue / 1.) / 1000000), `EPurchase.Revenue`))), 2)" else: return 'round(arraySum(arrayFilter(x, y -> has([{0}], y), Goals.Price, Goals.ID)) / 1000, 2)'.format(','.join(map(str, self.goals))) |
Чтобы получилось так:
Примечание: обязательно проверяйте отступы в функции, иначе будет высвечиваться другая ошибка.
Сохраните изменения. Вернитесь к основной программе 2. analysis of channels chains и повторно запустите две ячейки. А еще лучше - перезапустите полностью свой проект в Yandex DataSphere и саму программу в JupyterLab, чтобы изменения точно вступили в силу.
Запустив программу повторно, вы, вероятнее всего, увидите другую ошибку:
ValueError: Code: 47. DB::Exception: Missing columns: 'UserIDHash' while processing query: 'WITH TrafficSource.ClickBannerID[indexOf(TrafficSource.Model, 1)] AS ClickBannerID_pre, TrafficSource.ClickTargetType[indexOf(TrafficSource.Model, 1)] AS ClickTargetType_pre, TrafficSource.StartTime[indexOf(TrafficSource.Model, 1)] AS StartTime_pre, TrafficSource.ID[indexOf(TrafficSource.Model, 1)] AS TraficSourceID_pre, TrafficSource.SearchEngineID[indexOf(TrafficSource.Model, 1)....
Как ни странно, но это вполне нормальная практика, поскольку мы используем репозиторий и наработки другого человека, который лишь предоставил пример (шаблон) программы. Это вовсе не означает, что у нас запуститься все и с первого раза. Если бы мы писали код самостоятельно и с нуля, то этих ошибок бы смогли легко избежать.
Данная ошибка указывает на то, что в процессе выполнения запроса в базе данных отсутствует колонка с названием UserIDHash. И вот вам простое объяснение - поскольку построение ассоциированных конверсий на данных Яндекс Метрики возможно как с помощью загрузки собственных данных с помощью Logs API, так и благодаря готовому коннектору для Метрики Про, автор репозитория (zhdanchik) предоставил нам выбор. Разумеется, он не мог учесть индивидуальные особенности каждого проекта - формируете ли вы таблицу визитов самостоятельно через Logs API или через Yandex Data Transfer (готовый коннектор Метрики Про). Или вообще используете его готовый набор данных (датасет) visits_fake_data_for_meetup_v2.tar.gz.
Вот как раз в его тестовом наборе данных visits_fake_data_for_meetup_v2.tar.gz и фигурирует поле с названием UserIDHash:
И поэтому программа написана с учетом этой особенности. У вас же, как и у меня в примере, может использоваться готовое подключение от Метрики Про, а там поле называется иначе - CounterUserIDHash:
И тогда в программу analyse_channels_chain.py нужно внести еще одно изменение - заменить (~36 строка) значение UserIDHash на свое собственное:
У меня - это CounterUserIDHash, поэтому в программе это будет выглядеть так:
Сохраните изменения. Вернитесь к основной программе 2. analysis of channels chains и повторно запустите две ячейки. А еще лучше - перезапустите полностью свой проект в Yandex DataSphere и саму программу в JupyterLab, чтобы изменения точно вступили в силу.
Если вы все сделали правильно, то в процессе выполнения программы вы должны увидеть шкалу загрузки, а в завершение - 100%:
Это означает, что часть программы выполнена успешно, и в вашем кластере ClickHouse создалась новая таблица с заданным названием и соответствующим набором данных, необходимых для построения ассоциированных конверсий. Убедитесь в этом сами, перейдя в кластер ClickHouse, и открыв WebSQL:
Запустите следующую ячейку с кодом.
С помощью нее выполняется метод сombine_visits. Он создает таблицу с цепочками переходов по каждому пользователю. 1 элемент цепочки - 1 касание. В данной версии в качестве касания может выступать визит, у которого есть источник перехода. Каждая цепочка может кончится либо визитом либо пустотой - если после последнего перехода прошло достаточно времени, чтобы констатировать отток пользователя. Отток может произойти либо посередине истории пользователя, когда время между соседними касаниями-визитами больше чем 95% персентиль расстояния между визитами в среднем на счетчике. Также отток может произойти, если между последним визитом и концом исследуемого периода тоже прошло столько же времени Тип элемента цепочки, который отвечает за касание визита - 2_VISIT, тип элемента цепочки, отвечающий за отток - 0_NULL. Отток может быть только в конце цепочки.
Цепочки представлены в массивах history.*
- history.VisitID - VisitID каждого элемента цепочки (если элемент - визит);
- history.SourceCode - код источника трафика;
- history.StartTime - время элемента цепочки в таймзоне счетчика;
- history.UTCStartTime - время элемента цепочки в UTC;
- history.EventType - тип элемента цепочки (0_NULL - отток, 2_VISIT - визит);
- history.Duration - длительность визита, если элемент цепочки - визит;
- history.Conversions - конверсии в визите, если элемент цепочки - визит.
В процессе выполнения программы вы должны увидеть шкалу загрузки, а в завершение - 100%:
Теперь и эта часть программы выполнена успешно. В вашем кластере ClickHouse должна создаться еще одна новая таблица с заданным названием и соответствующим набором данных, необходимых для построения ассоциированных конверсий. Убедитесь в этом сами, перейдя в кластер ClickHouse, и открыв WebSQL:
Запустите следующую ячейку программы. Все последующие комментарии я возьму из программы автора. Там даются исчерпывающие сведения о каждом фрагменте кода и методе.
Запустите ячейки с методом simple_attributions. Он считает простые позиционные атрибуции и возвращает DataFrame с результатами:
Содержание полей таблицы:
- SourceCode - код источника трафика;
- SourceName - название источника трафика;
- LastClickVisits, LastClickConvs, LastClickRevenue - визиты, конверсии и доход в атрибуции "Последний клик";
- FirstClickVisits, FirstClickConvs, FirstClickRevenue - визиты, конверсии и доход в атрибуции "Первый клик";
- LastSignClickVisits, LastSignClickConvs, LastSignClickRevenue - визиты, конверсии и доход в атрибуции "Последний значимый клик";
- LastSignDirectVisits, LastSignDirectConvs, LastSignDirectRevenue - визиты, конверсии и доход в атрибуции "Последний переход их Яндекс Директа";
- LinearAttrVisits, LinearAttrConvs, LinearAttrRevenue - визиты, конверсии и доход в атрибуции "Линейная" / "Равномерная".
Запустите ячейки с методом associated_conversions. Он считает ассоциированные конверсии и возвращает DataFrame с результатами:
Содержание полей таблицы:
- SourceCode - код источника трафика;
- SourceName - название источника трафика;
- AssociatedVisits, AssociatedConvs, AssociatedRevenue - визиты, конверсии и доход ассоциированные с источником.
Запустите следующие ячейки программы с методом source_in_chains_metrics. Он считает позиционные метрики источников в цепочках:
Содержание полей таблицы:
- in_chain_perc_total - средний вес в цепочке (число касаний во всех цепочках деленное на общее число касаний);
- unique_chains_perc - доля уникальных цепочек (число уникальных цепочек, в которых источник имел хоть одно касание, поделенное на общее число цепочек);
- first_touch_total - доля первых касаний (число уникальных цепочек, в которых источник был первым касание, поделенное на общее число цепочек);
- first_touch_2plus - доля первых касаний (2+ цепочки) (то же, что и выше, но только для цепочек с более чем 1 касанием);
- mid_touch_3plus - доля промежуточных касаний (число уникальных цепочек, в которых источник был промежуточным касанием, поделенное на общее число цепочек);
- last_touch_total - доля последних касаний (число уникальных цепочек, в которых источник был последним касание, поделенное на общее число цепочек);
- last_touch_2plus - доля последних касаний (2+ цепочки) (то же, что и выше, но только для цепочек с более чем 1 касанием).
Соответственно, то же, что и сверху, но берутся только цепочки с конверсией в конце:
- in_conv_chains_perc_total
- unique_conv_chains_perc
- first_touch_conv_total
- first_touch_conv_2plus
- mid_touch_conv_3plus
- last_touch_conv_total
- last_touch_conv_2plus
Визуализация данных
После этого переходим к визуализации. Нарисуем таблицы с помощью Plotly. Прокликайте следующие три ячейки с кодом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
import plotly.figure_factory as ff import plotly.graph_objects as go def plotly_pretty_table(df, width=1200, height=340, columnwidth = [30, 10, 10, 10, 10, 10, 10, 10]): fig = go.Figure(data=[go.Table( header=dict( values=list(df.columns), fill_color='navy', # Цвет фона заголовков align=['left', 'center', 'center'], # Выравнивание текста в заголовках font=dict(color='white', size=12), # Шрифт заголовков height=30 # Высота заголовков ), cells=dict( values=[df[col] for col in df.columns], fill=dict(color=['paleturquoise', 'lavender']), # Чередование цветов ячеек align=['left', 'center', 'center'], # Выравнивание текста в ячейках font=dict(color='black', size=11), # Шрифт ячеек height=25 # Высота ячеек ) )]) # Настраиваем ширину столбцов fig.update_layout( width=width, # Общая ширина таблицы, может быть настроена height=height # Высота таблицы ) fig.update_layout( font=dict(family="Calibri", size=12, color="black"), # Установка шрифта, размера и цвета текста paper_bgcolor='rgba(155,155,155,1)', # Цвет фона таблицы margin=dict(l=10, r=10, t=10, b=10) # Отступы вокруг таблицы ) fig.data[0].columnwidth = columnwidth # Пропорции ширин столбцов fig.show() associated_conversions_formatted_df = associated_conversions_df[['SourceName', 'AssociatedVisits', 'AssociatedConvs', 'AssociatedRevenue']] \ .sort_values('AssociatedConvs', ascending=False) \ .rename(columns={'SourceName': 'Источник', 'AssociatedVisits': 'Ассоциированные визиты', 'AssociatedConvs': 'Ассоциированные конверсии', 'AssociatedRevenue': 'Ассоциированные доходы'}) \ .head(10) associated_conversions_formatted_df['Ассоциированные доходы'] = associated_conversions_formatted_df['Ассоциированные доходы'].apply(lambda x: f"{x:,}") associated_conversions_formatted_df['Ассоциированные конверсии'] = associated_conversions_formatted_df['Ассоциированные конверсии'].apply(lambda x: f"{x:,}") associated_conversions_formatted_df['Ассоциированные визиты'] = associated_conversions_formatted_df['Ассоциированные визиты'].apply(lambda x: f"{x:,}") plotly_pretty_table(associated_conversions_formatted_df, width=1000, height=340, columnwidth = [15, 10, 10, 10]) |
Если вы использовали цель Яндекс Метрики, имеющую доход, то вы увидите подробную таблицу с данными - источник, ассоциированные визиты, ассоциированные конверсии и ассоциированные доходы.
Поскольку я использовал цель без дохода, то в последнем столбце у меня 0. Но при этом отображаются ассоциированные конверсии в разрезе по каждому источнику. Что и требовалось получить.
Запустите следующий фрагмент кода, чтобы получить количество различных касаний в цепочках в разрезе по источникам трафика и их средний вес:
И последнее в программе - цепочки с конверсиями:
Примечание: сами источники трафика берутся из отдельного файла source_names.csv (скопировали из репозитория) и сопоставляются с их кодом. Если вы хотите изменить отображение источников трафика, то вам нужно изменить исходные данные.
На этом построение ассоциированных конверсий в Яндекс Метрике завершено!
Итоги
Если вы дошли до конца и у вас все получилось - я поздравляю вас! Хоть мы и не написали ни одной строчки кода, а лишь воспользовались готовым репозиторием, мы все равно молодцы! Это было непросто. Не каждый интернет-маркетолог и веб-аналитик, ежедневно работающий с Яндекс Метрикой, вообще знает о возможностях построения ассоциированных конверсий. А вы теперь не только знаете, но и умеете это делать. Знание ЧТО ТАК МОЖНО ДЕЛАТЬ гораздо важнее КАК ЭТО ДЕЛАТЬ.
Да, этот материал в большей степени основан на данных, выгруженных с помощью готового подключения в Метрике Про. Но сами шаги, выполняемые в процессе построения ассоциированных конверсий, актуальны и для данных, выгруженных с помощью Logs API. И создание проекта в Yandex Cloud, и привязка платежного аккаунта, и создание/подключение к ClickHouse, и подготовка таблицы визитов Яндекс Метрики для построения ассоциированных конверсий, и запуск основной программы, и визуализация данных. Нужно только учитывать особенности названия полей и удалить из основной программы лишние формулы и функции расчета.
Я постараюсь адаптировать этот материал под стандартную Яндекс Метрику и опубликовать его в блоге, но не обещаю это сделать быстро. А пока для своего проекта вы можете воспользоваться репозиторием zhdanchik (спасибо!) и чат-ботами ИИ, которые уже очень хорошо справляются с задачами изменения кода, правок ошибок и написания скриптов с нуля. Я во время написания данного руководства неоднократно обращался к ним за помощью. И скажу вам честно - это было очень продуктивно!