Сегментация пользователей Google Analytics 4 в BigQuery с использованием алгоритмов кластеризации Python

29 октября, 2024

Из этого руководства вы узнаете, как сегментировать пользователей в Google BigQuery на данных Google Analytics 4 с использованием алгоритмов кластеризации Python.

За основу этого материала взята публикация datola.es (автор - Joseba Ruiz) и все приведенные в ней коды на Python. Я не претендую на их авторство. Но моя статья расширена подробными комментариями по каждому шагу сегментации и в ней используются скриншоты, сделанные лично мной в процессе выполнения всех этапов работ, описанных в оригинальной статье.

К сожалению, полностью разобраться в алгоритмах кластеризации после прочтения руководства не получится, так как автор материала не ставил перед собой такой задачи (у него есть отдельная книга по аналитике данных на Python, в которой подробно описывается теоретическая часть). Но получить первое представление о том, какие методы и алгоритмы используются в такого рода задачах, вы, безусловно, сможете. Давайте приступим!

Публичный набор данных

Данные, с которыми вы будете работать, принадлежат демонстрационному интернет-магазину Google Merchandise Store с настроенной электронной торговлей и активированной улучшенной статистикой. Однако этот публичный датасет следует отличать от тестового аккаунта GA4 для Google Merchandise Store, поскольку это другие данные. Публичный набор данных в BigQuery содержит обфусцированные данные за три месяца (с 1 ноября 2020 года по 31 января 2021 года), то есть немного искаженные и запутанные для анализа. Некоторые поля содержат плейсхолдеры, в том числе <Other>NULL и '' ". Из-за обфускации внутренняя согласованность набора данных может быть несколько ограничена.

Сам набор данных в BigQuery называется ga4_obfuscated_sample_ecommerce. Для его использования вам понадобится доступ к проекту Google Cloud c включенным BigQuery API.

В моем блоге есть отдельная статья на эту тему. Обязательно прочитайте ее прежде, чем переходить к следующему шагу.

Итак, чтобы начать работу, вам необходимо создать проект в Google Cloud. Для этого используйте любую учетную запись Gmail, перейдя в Google Gloud по ссылке. Если вы работаете с облаком Google впервые, то вас попросят указать страну и согласиться с условиями использованиями Google Cloud Platform:

Начало работы с Google Cloud

В связи с текущими событиями в мире Google приостановил работу для пользователей из России. На момент публикации данной статьи вы не сможете привязать свою банковскую карту, выпущенную на территории РФ, чтобы использовать все возможности Google Cloud Platform, а также выбрать страну Россия из списка. Поэтому выберете из списка наиболее подходящую и нажмите Agree and continue.

На открывшейся странице Google Cloud в левом верхнем углу нажмите на Select a project:

Select a project

И создайте проект - NEW PROJECT:

Создание проекта

В поле Project name вы можете оставить автоматически добавленное название проекта, а можете указать свое собственное название, например BigQuery Public Dataset:

Название проекта

В завершение нажмите кнопку Create (Создать). В вашем Google Cloud будет создан новый проект. Об этом будет свидетельствовать уведомление в правом верхнем углу (Notifications):

Уведомление о создании проекта

Когда вы создали новый проект, API BigQuery включается автоматически. Но я рекомендую перепроверить это. Для этого в Google Cloud выберите свой проект из выпадающего списка:

Выбор проекта в Google Cloud

Затем перейдите по ссылке. Проверьте, что вы вносите изменения в выбранный проект и нажмите Next:

Подтверждение изменений в проекте

Включите BigQuery API:

Включение BigQuery API

Google Cloud и BigQuery являются платными инструментами инфраструктуры Google Cloud Platform. Но вы можете бесплатно использовать режим тестовой среды BigQuery (она же Песочница или Sandbox) с ограниченным набором функций BigQuery.

Тестовая среда BigQuery

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

Общедоступные наборы данных BigQuery по умолчанию доступны в консоли Google Cloud. Добавить публичный датасет с данными интернет-магазина Google к себе можно просто перейдя по ссылке.

Вам откроется страница BigQuery, а в ней публичный проект со множеством наборов данных:

Публичные датасеты BigQuery

Один из них - это датасет с данными Google Merchandise Store ga4_obfuscated_sample_ecommerce для Google Analytics 4:

Публичный набор данных BigQuery для Google Analytics 4

Внутри датасета отображается 92 таблицы с названием events_ Это и есть статистика за три месяца (с 1 ноября 2020 года по 31 января 2021 года), где каждая таблица с events_ - конкретный день:

Статистика в публичном датасете BigQuery для GA4 за три месяца

Подключение к BigQuery

Сегментация пользователей на публичном наборе данных Google Analytics 4 с использованием алгоритмов кластеризации Python будет проводиться с помощью Jupyter Notebook в самом BigQuery. Поэтому откройте BigQuery, перейдите на главную страницу и создайте Python Notebook:

Создание Python Notebook

В открывшемся окне выберите регион, в котором будут храниться ваши данные (например, europe-west2 (London)), а затем нажмите SELECT:

Регион хранения данных

После этого, если вы никогда ранее не работали с Python Notebook в BigQuery Studio, вам откроется окно с таким содержимым:

Introducing BigQuery Studio notebooks

Блокноты BigQuery Studio - это совместная управляемая среда блокнотов, которая позволяет вам выполнять код Python непосредственно в BigQuery Studio. Они построены на Colab Enterprise. Чтобы использовать блокноты BigQuery Studio в ваших проектах Google Cloud, необходимо включить API. Сделайте это, нажав на кнопку ENABLE APIS.

Если вас попросят включить дополнительно и другие службы (Vertex AI API и Compute Engine API), выполните и это.

Включение API различных служб

После их активации нажмите кнопку NEXT. На следующем шаге вам необходимо назначить роли пользователю, от которого вы будете писать программу и выполнять код на Python. Если вы будете делать все от своего имени, укажите свою электронную почту Gmail.

Назначение ролей пользователю

На последнем шаге активируйте все остальные службы API:

Активация оставшихся служб API

В завершение закройте окно. Теперь в интерфейсе вы должны видеть блокнот Jupyter с названием Untitled notebook:

Jupyter Notebook

Не закрывая вкладки, перейдите на соседней в раздел IAM & Admin - Service Accounts:

IAM & Admin - Service Accounts

Создайте сервисный аккаунт:

Create Service Account

В открывшемся окне на первом шаге введите название сервисного аккаунта. Например, ServiceAccount:

Название сервисного аккаунта

Нажмите Create And Continue. На втором шаге задайте роли. Я рекомендую указать две - BigQuery Admin и BigQuery Studio Admin (на всякий случай):

Назначение ролей

Заключительный третий шаг можно пропустить и нажать DONE.

Создание сервисного аккаунта

После создания сервисного аккаунта напротив него нажмите иконку с тремя точками и выберите пункт Manage keys:

Manage keys

На открывшейся странице нажмите Add key - Create new key:

Add key - Create new key

Создайте ключ в формате JSON:

Создание ключа JSON

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

После этого вернитесь на вкладку с открытым Jupyter Notebook. Теперь вам необходимо загрузить приватный ключ с локального компьютера в файлы блокнота в BigQuery, чтобы иметь возможность выполнять код на Python в облачном хранилище. Для этого разверните окно блокнота на весь экран, чтобы удобнее было работать, а затем нажмите на иконку папки. Дождитесь, когда будет осуществлено подключение к среде выполнения, а затем нажмите на иконку загрузки в сессионное хранилище:

Загрузка файла в сессионное хранилище

Укажите путь к вашему файлу JSON на компьютере. Google предупредит вас о том, что все загруженные файлы будут удалены из среды выполнения вместе с ней. Поэтому я рекомендую не удалять приватный ключ JSON с компьютера после его загрузки в проект. В случае, если он перестанет быть доступен в BigQuery Studio, вы сможете загрузить его повторно.

Загрузка приватного ключа JSON в проект

Убедитесь, что ваш приватный ключ отображается в проекте. Теперь вы можете приступать к написанию самой программы на Python.

Далее я буду следовать статье автора. В первой ячейке программы добавьте следующий код, подключив основные библиотеки для работы:

В BigQuery это будет выглядеть так:

Подключение основных библиотек

Запустите код. Во второй ячейке добавьте нижеприведенный код:

, где вместо C:/[RUTA]/[CUENTA DE SERVICIO].json укажите путь к вашему приватному ключу JSON. Скопировать его можно очень просто - напротив загруженного файла нажмите на иконку с тремя точками и выберите Скопировать путь:

Копирование пути к ключу JSON

Это будет выглядеть примерно так:

Вставка скопированного пути в код

Запустите и эту ячейку. Если вы все сделали правильно, то никак ошибок у вас не будет.

Создание запроса

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

Запустите ее. Обычно набор данных со значениями, извлеченными с помощью запроса, копируется или сохраняется. Это позволяет избежать ненужных вызовов (время и затраты) на случай, если позже вам придется изменять этот набор данных.

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

Вы должны получить результат в таком виде:

Результат выполнения запроса

Обработка данных

Поскольку в этой выборке отсутствие данных по транзакциям возможно только в случае, когда не были совершены покупки, то есть когда это относится к столбцам revenue (доход) и items (товары), необходимо заменить значения NaN нулями. Кроме того, чтобы дифференцировать транзакции "без дохода" (где применялись 100% купоны) и повысить ценность окончательной сегментации, Хосефа Руис (Josefa Ruiz) решил добавить новый признак buyer (покупатель) со значениями buyer, no buyer и no buyer coupon.

Условия:

  • если количество transactions (транзакций) больше 0 и revenue (выручка) равно 0.0 -> присваивается значение no buyer coupon;
  • если количество transactions равно 0 и revenue также равно 0.0 -> присваивается значение no buyer;
  • во всех остальных случаях (если ни одно из предыдущих условий не выполнено) -> присваивается значение buyer.

Скопируйте код ниже и вставьте его в следующую ячейку:

Запустите ее:

Результат обработки

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

Поэтому сначала мы запускаем этот код в новой ячейке:

Этот код на Python использует библиотеки Scikit-learn, которые являются популярными инструментами для выполнения задач машинного обучения.

Примечание:

  • LabelEncoder - класс, который используется для преобразования меток (категориальных переменных) в числовые значения. Это полезно, когда вы работаете с данными, содержащими категории, и вам нужно преобразовать их в числовой формат для дальнейшего анализа или для обучения модели;
  • StandardScaler - класс, который используется для стандартизации данных, то есть масштабирования признаков так, чтобы они имели нулевoe среднее значение и единичное стандартное отклонение. Это важно, особенно для моделей, чувствительных к масштабу данных, таких как SVM или KNN.

А затем этот:

В результате вы должны получить такой результат:

Результат выполнения скриптов

В результате выполнения этого кода будут закодированы (превращены в числовые значения) три категориальных столбца с использованием LabelEncoder из библиотеки sklearn: country, continent и buyer. Каждый уникальный элемент в этих столбцах будет представлен уникальным целым числом.

Еще один код, который нужно запустить в следующей ячейке:

И результат в BigQuery:

Полученные результаты

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

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

Уменьшение размерности

Следующим шагом необходимо провести уменьшение размерности (снижение размерности) полученного набора данных. Этот подход используется, когда в наборе данных имеется большое количество параметров и показателей, многие из которых можно объяснить другими, уже существующими метриками.

Примечание: уменьшение размерности данных (dimensionality reduction или dimension reduction) - это подход упрощения сложных наборов данных для облегчения их обработки. Методы уменьшения размерности данных решают эту проблему, предоставляя меньшее количество измерений (столбцов) при сохранении наиболее важной информации. Мы можем потерять некоторые детали, но получить более простое представление данных, которое легче обрабатывать и сравнивать.

Хосефа Руис в своей статье применяет метод главных компонент (PCA – principal component analysis), который способен описывать новые некоррелированные переменные, объясняя через них поведение исходного набора данных. Другими словами, благодаря PCA можно уменьшить количество переменных в наборе данных, сохранив при этом как можно больше информации. Меньшие наборы данных легче исследовать и визуализировать, а анализ данных становится намного проще и быстрее для алгоритмов машинного обучения без обработки посторонних переменных. Подробнее о применении метода PCA для уменьшения размерности данных читайте в этом материале.

Возьмите нижеприведенный код и добавьте в новую ячейку своей программы:

Запустите программу. Вы должны получить результат в таком виде:

Анализ объясненной дисперсии

Раньше для понимания результатов требовалось гораздо больше времени, чем сейчас. Благодаря развитию искусственного интеллекта, нейросетей и чат-ботов ИИ, таких, как ChatGPT, Gemini и др., мы можем достоверно детализировать и экстраполировать полученные значения.

Следующая ячейка программы на Python:

И результат:

Результат выполнения кода

Матрица основных компонентов (Principal Components, PC) - это результат применения метода главных компонент (PCA) к данным.

Расшифровка столбцов:

  • PC1 - фокусируется на покупательском поведении пользователей, поскольку имеет наибольший вклад от признаков транзакции (transactions) и покупатель (buyer). Это может указывать на то, что PC1 отражает общий объем продаж или активность покупателей, так как еще есть взаимосвязь с количеством приобретенных товаров (items);
  • PC2 - отражает географические различия в данных (географическую изменчивость) в связи с наибольшим вкладом от признаков continent (континент) и country (страна);
  • PC3 - связан с доходом от транзакций (revenue) и количеством купленных товаров (items). Может подчеркивать различия в среднем чеке или ассортименте товаров;
  • PC4 - определяется уникальными идентификаторами пользователей user_pseudo_id (он же Client ID в Google Analytics 4). Присутствует незначительная связь с доходом (revenue) и страной (country).

Определение количества кластеров

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

Быстрый способ определить количество сегментов пользователей на публичных данных Google Analytics 4, которые мы получим, хотя и не единственный и гораздо менее эффективный для всех вариантов, с которыми мы можем столкнуться в будущем - это метод локтя (Elbow method).

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

Копируем код ниже и выполняем его в BigQuery:

Получаем такой график:

Метод локтя

В точке 4 сумма квадратов внутрикластерных расстояний (WCSS) перестает существенно уменьшаться.

Выбор алгоритма кластеризации

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

Примечание: значение силуэта находится в диапазоне от -1 до +1, где высокое значение указывает на то, что объект хорошо соответствует своему собственному кластеру и плохо соответствует соседним кластерам. Если большинство объектов имеют высокое значение, то конфигурация кластеризации подходит. Если многие точки имеют низкое или отрицательное значение, то в конфигурации кластеризации может быть слишком много или слишком мало кластеров.

Более высокое значение должен получить тот алгоритм, который генерирует наиболее надежные кластеры. Хотя, как и почти во всех сферах жизни, для окончательного выбора одного или другого алгоритма кластеризации могут потребоваться опыт ведения бизнеса и визуализация данных. На этом этапе важно установить библиотеку SKLEARN_EXTRA (команда pip install scikit-learn-extra).

Новая ячейка с подключением библиотек:

Если выдаст ошибку ModuleNotFoundError: No module named 'sklearn_extra' , тогда нужно установить библиотеку:

В BigQuery:

Установка и подключение библиотек Python

Далее фрагмент кода такой:

Этот код выполняет кластеризацию данных с использованием алгоритма k-средних (KMeans) и оценивает качество кластеризации с помощью коэффициента силуэта. В результате выполнения программы у нас получилось значение 0.4999637811914808:

Значение коэффициента силуэта 0.4999 (KMeans)

Пробуем другой алгоритм кластеризации:

Этот код выполняет кластеризацию данных с использованием алгоритма k-средних (KMedois) и оценивает качество кластеризации с помощью коэффициента силуэта. В результате выполнения программы у нас получилось значение 0.3258157656718431:

Значение коэффициента силуэта 0.3258 (KMedois)

Оно ниже предыдущего. Пробуем дальше:

Этот код на Python выполняет кластеризацию данных с использованием метода агломеративной кластеризации (агломеративного иерархического кластеризатора) и вычисляет коэффициент силуэта для оценки качества кластеризации. В результате выполнения программы у нас получилось значение 0.4884457662016585:

Значение коэффициента силуэта 0.4884 (агломеративная кластеризация)

Оно больше, чем у KMedois, но меньше, чем при использовании KMeans.

И еще один вариант алгоритма:

Этот код выполняет кластеризацию данных с помощью модели гауссовых смесей (GMM, Gaussian mixture models), определяет кластеры и оценивает качество кластеризации с помощью коэффициента силуэта. В результате выполнения программы у нас получилось значение 0.4438150250714645:

Значение коэффициента силуэта 0.4438 (модели гауссовских смесей)

Заметьте, во всех алгоритмах мы использовали число кластеров 4, так как нашли именно это значение на предыдущем шаге. И коэффициент силуэта по алгоритмам получился таким:

  1. KMeans = 0.4999637811914808
  2. KMedois = 0.3258157656718431
  3. AgglomerativeClustering = 0.4884457662016585
  4. GaussianMixture = 0.4438150250714645

Сегментация пользователей

Вот мы и добрались до последнего шага нашего глубинного анализа публичных данных Google Analytics 4. Остается лишь применить выбранный алгоритм (тот, который имеет наивысший балл - KMeans) и визуализировать полученные сегменты.

Точно так же, как мы применяли ChatGPT для метода главных компонент и расшифровки столбцов PC1, PC2, PC3 и PC4, остается только создать профилирование различных сегментов с помощью все того же чат-бота ИИ или любого другого подобного инструмента.

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

Результаты сегментации пользователей

За расшифровкой столбца KM_segments можно обратиться к ИИ:

  • Сегмент 0 - пользователи в основном с американского континента, с частыми транзакциями на небольшие суммы и высокой долей покупателей. Они осуществляют значительное количество транзакций и приобретают значительное количество товаров. Может представлять самый типичный (=основной) сегмент данных пользователей публичного набора Google Analytics 4;
  • Сегмент 1 - пользователи с американского континента, с менее частыми, но более дорогостоящими транзакциями. Здесь высока доля покупателей. Они совершают меньше транзакций, но имеют более высокую денежную стоимость и покупают значительное количество товаров. Вероятно, этот кластер объединяет пользователей, которые совершают много транзакций, но при этом не приносят дохода. Это могут быть, например, возвраты товаров или пробные покупки;
  • Сегмент 2 - пользователи с азиатского континента, с разными доходами и высокой долей покупателей. Они осуществляют значительное количество сделок и покупок предметов;
  • Сегмент 3 - пользователи с азиатского континента, с менее частыми, но более высокими транзакциями. Здесь высока доля покупателей. Они совершают меньше транзакций, но имеют более высокий доход от товаров и покупают значительное количество товаров. Похож на сегмент 1 по признакам revenue и transactions.

С этого момента возможности применения данного алгоритма кластеризации разнообразны. Фактически, все это не только поможет вам проанализировать наших пользователей, но даже может быть использовано для создания аудиторий с идентификаторами пользователей по user_pseudo_id (он же Client ID). А это уже точечный таргетинг в рекламе и индивидуальная работа с каждым посетителем вашего сайта!

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

Загрузка файла программы в свой проект Google BigQuery

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

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