Сегментация пользователей Google Analytics 4 в BigQuery с использованием алгоритмов кластеризации Python
Из этого руководства вы узнаете, как сегментировать пользователей в 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 приостановил работу для пользователей из России. На момент публикации данной статьи вы не сможете привязать свою банковскую карту, выпущенную на территории РФ, чтобы использовать все возможности Google Cloud Platform, а также выбрать страну Россия из списка. Поэтому выберете из списка наиболее подходящую и нажмите Agree and continue.
На открывшейся странице Google Cloud в левом верхнем углу нажмите на Select a project:
И создайте проект - NEW PROJECT:
В поле Project name вы можете оставить автоматически добавленное название проекта, а можете указать свое собственное название, например BigQuery Public Dataset:
В завершение нажмите кнопку Create (Создать). В вашем Google Cloud будет создан новый проект. Об этом будет свидетельствовать уведомление в правом верхнем углу (Notifications):
Когда вы создали новый проект, API BigQuery включается автоматически. Но я рекомендую перепроверить это. Для этого в Google Cloud выберите свой проект из выпадающего списка:
Затем перейдите по ссылке. Проверьте, что вы вносите изменения в выбранный проект и нажмите Next:
Включите BigQuery API:
Google Cloud и BigQuery являются платными инструментами инфраструктуры Google Cloud Platform. Но вы можете бесплатно использовать режим тестовой среды BigQuery (она же Песочница или Sandbox) с ограниченным набором функций BigQuery.
Бесплатного тарифа должно быть достаточно для того, чтобы ознакомиться с набором данных и запустить примеры запросов. Для использования платного функционала вам необходимо активировать Billing, привязав активную банковскую карту к своей учетной записи. С нее в дальнейшем буду списываться деньги.
Общедоступные наборы данных BigQuery по умолчанию доступны в консоли Google Cloud. Добавить публичный датасет с данными интернет-магазина Google к себе можно просто перейдя по ссылке.
Вам откроется страница BigQuery, а в ней публичный проект со множеством наборов данных:
Один из них - это датасет с данными Google Merchandise Store ga4_obfuscated_sample_ecommerce для Google Analytics 4:
Внутри датасета отображается 92 таблицы с названием events_ Это и есть статистика за три месяца (с 1 ноября 2020 года по 31 января 2021 года), где каждая таблица с events_ - конкретный день:
Подключение к BigQuery
Сегментация пользователей на публичном наборе данных Google Analytics 4 с использованием алгоритмов кластеризации Python будет проводиться с помощью Jupyter Notebook в самом BigQuery. Поэтому откройте BigQuery, перейдите на главную страницу и создайте Python Notebook:
В открывшемся окне выберите регион, в котором будут храниться ваши данные (например, europe-west2 (London)), а затем нажмите SELECT:
После этого, если вы никогда ранее не работали с Python Notebook в BigQuery Studio, вам откроется окно с таким содержимым:
Блокноты BigQuery Studio - это совместная управляемая среда блокнотов, которая позволяет вам выполнять код Python непосредственно в BigQuery Studio. Они построены на Colab Enterprise. Чтобы использовать блокноты BigQuery Studio в ваших проектах Google Cloud, необходимо включить API. Сделайте это, нажав на кнопку ENABLE APIS.
Если вас попросят включить дополнительно и другие службы (Vertex AI API и Compute Engine API), выполните и это.
После их активации нажмите кнопку NEXT. На следующем шаге вам необходимо назначить роли пользователю, от которого вы будете писать программу и выполнять код на Python. Если вы будете делать все от своего имени, укажите свою электронную почту Gmail.
На последнем шаге активируйте все остальные службы API:
В завершение закройте окно. Теперь в интерфейсе вы должны видеть блокнот Jupyter с названием Untitled notebook:
Не закрывая вкладки, перейдите на соседней в раздел IAM & Admin - Service Accounts:
Создайте сервисный аккаунт:
В открывшемся окне на первом шаге введите название сервисного аккаунта. Например, ServiceAccount:
Нажмите Create And Continue. На втором шаге задайте роли. Я рекомендую указать две - BigQuery Admin и BigQuery Studio Admin (на всякий случай):
Заключительный третий шаг можно пропустить и нажать DONE.
После создания сервисного аккаунта напротив него нажмите иконку с тремя точками и выберите пункт Manage keys:
На открывшейся странице нажмите Add key - Create new key:
Создайте ключ в формате JSON:
Приватный ключ для сервисного аккаунта будет автоматически загружен к вам на компьютер. Его вы будете использовать для аутентификации своей учетной записи службы.
После этого вернитесь на вкладку с открытым Jupyter Notebook. Теперь вам необходимо загрузить приватный ключ с локального компьютера в файлы блокнота в BigQuery, чтобы иметь возможность выполнять код на Python в облачном хранилище. Для этого разверните окно блокнота на весь экран, чтобы удобнее было работать, а затем нажмите на иконку папки. Дождитесь, когда будет осуществлено подключение к среде выполнения, а затем нажмите на иконку загрузки в сессионное хранилище:
Укажите путь к вашему файлу JSON на компьютере. Google предупредит вас о том, что все загруженные файлы будут удалены из среды выполнения вместе с ней. Поэтому я рекомендую не удалять приватный ключ JSON с компьютера после его загрузки в проект. В случае, если он перестанет быть доступен в BigQuery Studio, вы сможете загрузить его повторно.
Убедитесь, что ваш приватный ключ отображается в проекте. Теперь вы можете приступать к написанию самой программы на Python.
Далее я буду следовать статье автора. В первой ячейке программы добавьте следующий код, подключив основные библиотеки для работы:
1 2 3 4 5 |
import pandas as pd import numpy as np import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') |
В BigQuery это будет выглядеть так:
Запустите код. Во второй ячейке добавьте нижеприведенный код:
1 2 3 4 5 6 7 8 |
from google.oauth2 import service_account from google.cloud import bigquery from google.cloud.bigquery import ScalarQueryParameter credentials=service_account.Credentials.from_service_account_file( 'C:/[RUTA]/[CUENTA DE SERVICIO].json' ) client = bigquery.Client(credentials=credentials) |
, где вместо C:/[RUTA]/[CUENTA DE SERVICIO].json укажите путь к вашему приватному ключу JSON. Скопировать его можно очень просто - напротив загруженного файла нажмите на иконку с тремя точками и выберите Скопировать путь:
Это будет выглядеть примерно так:
Запустите и эту ячейку. Если вы все сделали правильно, то никак ошибок у вас не будет.
Создание запроса
Как только соединение установлено, наступает очередь сформировать запрос для извлечения необходимых данных. Скопируйте код ниже в новую ячейку:
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 |
start_date='20210130' end_date='20210131' query=""" SELECT user_pseudo_id, geo.continent, geo.country, ecommerce.purchase_revenue AS revenue, count(distinct ecommerce.transaction_id) AS transactions, ecommerce.total_item_quantity AS items FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_*` WHERE _TABLE_SUFFIX BETWEEN @START_DATE AND @END_DATE GROUP BY 1,2,3,4,6 """ query_params = [ ScalarQueryParameter('START_DATE', 'STRING', start_date), ScalarQueryParameter('END_DATE', 'STRING', end_date) ] job_config = bigquery.QueryJobConfig() job_config.query_parameters = query_params query = client.query(query, job_config=job_config) results=query.result() df=results.to_dataframe() |
Запустите ее. Обычно набор данных со значениями, извлеченными с помощью запроса, копируется или сохраняется. Это позволяет избежать ненужных вызовов (время и затраты) на случай, если позже вам придется изменять этот набор данных.
Вставьте следующий код в другую ячейку и запустите программу:
1 2 |
dfc = df.copy() dfc.head(3) |
Вы должны получить результат в таком виде:
Обработка данных
Поскольку в этой выборке отсутствие данных по транзакциям возможно только в случае, когда не были совершены покупки, то есть когда это относится к столбцам 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.
Скопируйте код ниже и вставьте его в следующую ячейку:
1 2 3 4 5 6 7 8 |
dfc['revenue']=dfc['revenue'].fillna(0) dfc['items']=dfc['items'].fillna(0) dfc['buyer'] = np.where( (dfc['transactions'] > 0) & (dfc['revenue'] == 0.0),'no buyer coupon',np.where((dfc['transactions'] == 0) & (dfc['revenue'] == 0.0),'no buyer','buyer') ) dfc.head(3) |
Запустите ее:
С этого момента начинается основная часть программы по сегментации наших пользователей. В большинстве случаев, когда мы сталкиваемся с моделированием данных, уместно следовать определенным (основным) правилам, таким как преобразование значений к одному и тому же типу и стандартизация и нормализация, чтобы привести наши данные к единому масштабу.
Поэтому сначала мы запускаем этот код в новой ячейке:
1 2 |
from sklearn.preprocessing import LabelEncoder from sklearn.preprocessing import StandardScaler |
Этот код на Python использует библиотеки Scikit-learn, которые являются популярными инструментами для выполнения задач машинного обучения.
Примечание:
- LabelEncoder - класс, который используется для преобразования меток (категориальных переменных) в числовые значения. Это полезно, когда вы работаете с данными, содержащими категории, и вам нужно преобразовать их в числовой формат для дальнейшего анализа или для обучения модели;
- StandardScaler - класс, который используется для стандартизации данных, то есть масштабирования признаков так, чтобы они имели нулевoe среднее значение и единичное стандартное отклонение. Это важно, особенно для моделей, чувствительных к масштабу данных, таких как SVM или KNN.
А затем этот:
1 2 3 4 5 |
encoder=LabelEncoder() dfc['country']=dfc[['country']].apply(encoder.fit_transform) dfc['continent']=dfc[['continent']].apply(encoder.fit_transform) dfc['buyer']=dfc[['buyer']].apply(encoder.fit_transform) dfc.head(3) |
В результате вы должны получить такой результат:
В результате выполнения этого кода будут закодированы (превращены в числовые значения) три категориальных столбца с использованием LabelEncoder из библиотеки sklearn: country, continent и buyer. Каждый уникальный элемент в этих столбцах будет представлен уникальным целым числом.
Еще один код, который нужно запустить в следующей ячейке:
1 2 3 4 |
scaler = StandardScaler() scaler.fit(dfc) dfc_scaled = pd.DataFrame(scaler.transform(dfc), columns=dfc.columns ) dfc_scaled.head(3) |
И результат в BigQuery:
Вышеприведенный фрагмент кода выполняет нормализацию (масштабирование) данных с использованием StandardScaler, который как раз и предназначен для стандартизации данных. Он масштабирует данные таким образом, чтобы они имели нулевое (0) среднее значение и единичное (1) стандартное отклонение.
Примечание: StandardScaler - важный метод, который часто используется в предварительной обработке данных перед применением методов машинного обучения, так как многие алгоритмы чувствительны к масштабам входных данных.
Уменьшение размерности
Следующим шагом необходимо провести уменьшение размерности (снижение размерности) полученного набора данных. Этот подход используется, когда в наборе данных имеется большое количество параметров и показателей, многие из которых можно объяснить другими, уже существующими метриками.
Примечание: уменьшение размерности данных (dimensionality reduction или dimension reduction) - это подход упрощения сложных наборов данных для облегчения их обработки. Методы уменьшения размерности данных решают эту проблему, предоставляя меньшее количество измерений (столбцов) при сохранении наиболее важной информации. Мы можем потерять некоторые детали, но получить более простое представление данных, которое легче обрабатывать и сравнивать.
Хосефа Руис в своей статье применяет метод главных компонент (PCA – principal component analysis), который способен описывать новые некоррелированные переменные, объясняя через них поведение исходного набора данных. Другими словами, благодаря PCA можно уменьшить количество переменных в наборе данных, сохранив при этом как можно больше информации. Меньшие наборы данных легче исследовать и визуализировать, а анализ данных становится намного проще и быстрее для алгоритмов машинного обучения без обработки посторонних переменных. Подробнее о применении метода PCA для уменьшения размерности данных читайте в этом материале.
Возьмите нижеприведенный код и добавьте в новую ячейку своей программы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
from sklearn.decomposition import PCA pca = PCA(n_components = dfc_scaled.shape[1], random_state = 1) dfc_pca = pd.DataFrame(pca.fit_transform(dfc_scaled)) exp_v = pca.explained_variance_ratio_ sum = 0 for ix, i in enumerate(exp_v): sum = sum + i if(sum>0.77): variance=ix + 1 break plt.figure(figsize = (5, 5)) plt.plot(range(1, pca.n_components + 1), pca.explained_variance_ratio_.cumsum(), marker = 'o', linestyle = '--') plt.title("77% объяснённой дисперсии с "+str(variance)+" компонентами") plt.xlabel("Число компонент") plt.ylabel("Накопленная доля объясненной дисперсии") plt.show() |
Запустите программу. Вы должны получить результат в таком виде:
Раньше для понимания результатов требовалось гораздо больше времени, чем сейчас. Благодаря развитию искусственного интеллекта, нейросетей и чат-ботов ИИ, таких, как ChatGPT, Gemini и др., мы можем достоверно детализировать и экстраполировать полученные значения.
Следующая ячейка программы на Python:
1 2 3 4 |
cols = ['PC1', 'PC2', 'PC3', 'PC4'] pc = pd.DataFrame(np.round(pca.components_.T[:, 0:4], 2), index = dfc_scaled.columns, columns = cols) pc |
И результат:
Матрица основных компонентов (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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
from sklearn.cluster import KMeans from scipy.spatial.distance import cdist dfc_kmeans = dfc_pca.copy() meanDistortions = [] clusters_range = range(1, 15) for k in clusters_range: kmeans = KMeans(n_clusters=k, random_state=1, n_init='auto') kmeans.fit(dfc_pca) distortion = ( np.sum(np.min(cdist(dfc_pca, kmeans.cluster_centers_, 'euclidean'), axis=1)) / dfc_pca.shape[0] ) meanDistortions.append(distortion) plt.plot(clusters_range, meanDistortions, marker='o') plt.xlabel('Число кластеров (k)') plt.ylabel('Сумма квадратов внутрикластерных расстояний (WCSS)') plt.title('Метод локтя') plt.show() |
Получаем такой график:
В точке 4 сумма квадратов внутрикластерных расстояний (WCSS) перестает существенно уменьшаться.
Выбор алгоритма кластеризации
Теперь, когда мы знаем, сколько групп пользователей будет создано, все, что остается - это добавить, сколько алгоритмов кластеризации мы сочтем подходящими, и сопоставить их друг с другом, например, с помощью значения (коэффициента) силуэта.
Примечание: значение силуэта находится в диапазоне от -1 до +1, где высокое значение указывает на то, что объект хорошо соответствует своему собственному кластеру и плохо соответствует соседним кластерам. Если большинство объектов имеют высокое значение, то конфигурация кластеризации подходит. Если многие точки имеют низкое или отрицательное значение, то в конфигурации кластеризации может быть слишком много или слишком мало кластеров.
Более высокое значение должен получить тот алгоритм, который генерирует наиболее надежные кластеры. Хотя, как и почти во всех сферах жизни, для окончательного выбора одного или другого алгоритма кластеризации могут потребоваться опыт ведения бизнеса и визуализация данных. На этом этапе важно установить библиотеку SKLEARN_EXTRA (команда pip install scikit-learn-extra).
Новая ячейка с подключением библиотек:
1 2 3 4 5 |
from sklearn.metrics import silhouette_score from sklearn_extra.cluster import KMedoids from sklearn.mixture import GaussianMixture from sklearn.cluster import AgglomerativeClustering |
Если выдаст ошибку ModuleNotFoundError: No module named 'sklearn_extra' , тогда нужно установить библиотеку:
1 |
pip install scikit-learn-extra |
В BigQuery:
Далее фрагмент кода такой:
1 2 3 4 |
kmeans = KMeans(n_clusters = 4, random_state = 1, n_init = 'auto') preds = kmeans.fit_predict((dfc_pca)) score = silhouette_score(dfc_pca, preds) print(score) |
Этот код выполняет кластеризацию данных с использованием алгоритма k-средних (KMeans) и оценивает качество кластеризации с помощью коэффициента силуэта. В результате выполнения программы у нас получилось значение 0.4999637811914808:
Пробуем другой алгоритм кластеризации:
1 2 3 4 |
kmedoids = KMedoids(n_clusters = 4, random_state = 1) preds = kmedoids.fit_predict((dfc_pca)) score = silhouette_score(dfc_pca, preds) print(score) |
Этот код выполняет кластеризацию данных с использованием алгоритма k-средних (KMedois) и оценивает качество кластеризации с помощью коэффициента силуэта. В результате выполнения программы у нас получилось значение 0.3258157656718431:
Оно ниже предыдущего. Пробуем дальше:
1 2 3 4 |
HCmodel = AgglomerativeClustering(n_clusters = 4, metric = "euclidean", linkage = "ward",) preds = HCmodel.fit_predict(dfc_pca) score = silhouette_score(dfc_pca, preds) print(score) |
Этот код на Python выполняет кластеризацию данных с использованием метода агломеративной кластеризации (агломеративного иерархического кластеризатора) и вычисляет коэффициент силуэта для оценки качества кластеризации. В результате выполнения программы у нас получилось значение 0.4884457662016585:
Оно больше, чем у KMedois, но меньше, чем при использовании KMeans.
И еще один вариант алгоритма:
1 2 3 4 |
gmm = GaussianMixture(n_components=4, random_state=1) preds = gmm.fit_predict((dfc_pca)) score = silhouette_score(dfc_pca, preds) print(score) |
Этот код выполняет кластеризацию данных с помощью модели гауссовых смесей (GMM, Gaussian mixture models), определяет кластеры и оценивает качество кластеризации с помощью коэффициента силуэта. В результате выполнения программы у нас получилось значение 0.4438150250714645:
Заметьте, во всех алгоритмах мы использовали число кластеров 4, так как нашли именно это значение на предыдущем шаге. И коэффициент силуэта по алгоритмам получился таким:
- KMeans = 0.4999637811914808
- KMedois = 0.3258157656718431
- AgglomerativeClustering = 0.4884457662016585
- GaussianMixture = 0.4438150250714645
Сегментация пользователей
Вот мы и добрались до последнего шага нашего глубинного анализа публичных данных Google Analytics 4. Остается лишь применить выбранный алгоритм (тот, который имеет наивысший балл - KMeans) и визуализировать полученные сегменты.
Точно так же, как мы применяли ChatGPT для метода главных компонент и расшифровки столбцов PC1, PC2, PC3 и PC4, остается только создать профилирование различных сегментов с помощью все того же чат-бота ИИ или любого другого подобного инструмента.
1 2 3 4 5 |
dfk = dfc.copy() dfk['KM_segments'] = kmeans.labels_ km_cluster_profile = dfk.groupby('KM_segments').mean(numeric_only = True) km_cluster_profile |
Этот код создает копию исходного датафрейма, добавляет информацию о кластерах, и затем вычисляет средние значения для каждой группы, которые были образованы в результате кластеризации.
За расшифровкой столбца KM_segments можно обратиться к ИИ:
- Сегмент 0 - пользователи в основном с американского континента, с частыми транзакциями на небольшие суммы и высокой долей покупателей. Они осуществляют значительное количество транзакций и приобретают значительное количество товаров. Может представлять самый типичный (=основной) сегмент данных пользователей публичного набора Google Analytics 4;
- Сегмент 1 - пользователи с американского континента, с менее частыми, но более дорогостоящими транзакциями. Здесь высока доля покупателей. Они совершают меньше транзакций, но имеют более высокую денежную стоимость и покупают значительное количество товаров. Вероятно, этот кластер объединяет пользователей, которые совершают много транзакций, но при этом не приносят дохода. Это могут быть, например, возвраты товаров или пробные покупки;
- Сегмент 2 - пользователи с азиатского континента, с разными доходами и высокой долей покупателей. Они осуществляют значительное количество сделок и покупок предметов;
- Сегмент 3 - пользователи с азиатского континента, с менее частыми, но более высокими транзакциями. Здесь высока доля покупателей. Они совершают меньше транзакций, но имеют более высокий доход от товаров и покупают значительное количество товаров. Похож на сегмент 1 по признакам revenue и transactions.
С этого момента возможности применения данного алгоритма кластеризации разнообразны. Фактически, все это не только поможет вам проанализировать наших пользователей, но даже может быть использовано для создания аудиторий с идентификаторами пользователей по user_pseudo_id (он же Client ID). А это уже точечный таргетинг в рекламе и индивидуальная работа с каждым посетителем вашего сайта!
Весь код программы доступен по ссылке. Вы можете загрузить его в свой проект BigQuery и воспроизвести все шаги, изменив путь к приватному ключу JSON (обязательно) и входные параметры алгоритмов кластеризации (по желанию).