Основы разделения выборки и сегментации клиентов
Основы разделения выборки и сегментации клиентов
Сегментация клиентов — это процесс разделения всей аудитории потребителей на отдельные группы (сегменты), участники которых обладают схожими характеристиками, потребностями или паттернами поведения. В современном бизнесе, будь то IT-разработка, электронная коммерция или маркетинг, персонализация предложений является ключом к повышению лояльности и увеличению прибыли. Невозможно создать идеальный продукт или рекламное сообщение, которое одинаково хорошо подойдет студенту с минимальным доходом и топ-менеджеру крупной корпорации.
Для решения этой задачи аналитики данных используют различные математические и алгоритмические подходы. Выбор конкретного метода зависит от структуры данных и бизнес-цели.
Метод равных интервалов
Метод равных интервалов — это самый базовый способ разделения количественных данных. Его суть заключается в том, что весь диапазон значений признака (от минимального до максимального) делится на заданное количество отрезков одинаковой длины.
Математически ширина каждого интервала вычисляется по следующей формуле:
Где:
- — ширина одного интервала;
- — максимальное значение в выборке;
- — минимальное значение в выборке;
- — желаемое количество групп (сегментов).
Представим, что вы анализируете возраст пользователей вашего мобильного приложения. Минимальный возраст составляет 18 лет, а максимальный — 58 лет. Вы хотите разделить аудиторию на 4 возрастные группы. Ширина интервала составит: (58 - 18) / 4 = 10 лет. Таким образом, получатся группы: 18-28 лет, 28-38 лет, 38-48 лет и 48-58 лет.
Этот метод отлично работает для равномерно распределенных данных, таких как возраст, время суток или количество дней с момента последней покупки. В библиотеке Pandas для реализации этого подхода используется функция cut.
import pandas as pd
import numpy as np
# Создаем синтетические данные о возрасте 10 клиентов
np.random.seed(42)
data = {'client_id': range(1, 11),
'age': np.random.randint(18, 60, 10)}
df = pd.DataFrame(data)
# Разделяем на 4 равных интервала
df['age_group'] = pd.cut(df['age'], bins=4)
print(df[['age', 'age_group']])
Главный недостаток метода равных интервалов — его крайняя чувствительность к выбросам (аномально большим или маленьким значениям).
Если в выборке из 1000 человек со средним доходом 50 000 руб. окажется один миллиардер с доходом 1 000 000 000 руб., метод равных интервалов создаст огромные пустые диапазоны, и 999 человек попадут в одну единственную группу, что сделает сегментацию абсолютно бесполезной.
Метод квантилей
Чтобы решить проблему выбросов, применяется метод квантилей. Квантили — это значения, которые делят отсортированную выборку на группы с равным количеством наблюдений (клиентов), независимо от самих значений признака.
Если мы делим выборку на 4 части, такие квантили называются квартилями (каждая группа содержит ровно 25% клиентов). Если на 10 частей — децилями (по 10% клиентов).
Рассмотрим пример с доходами. У нас есть 5 клиентов с ежемесячным доходом: 20 000 руб., 25 000 руб., 30 000 руб., 40 000 руб. и 5 000 000 руб. Если мы хотим разделить их на две равные группы (используя медиану, которая является 50-м перцентилем), мы просто отсортируем список и проведем черту посередине. В первую группу попадут клиенты с доходом до 30 000 руб., во вторую — с доходом от 30 000 руб. и выше. Аномальный доход в 5 миллионов никак не исказит границы для большинства пользователей.
В Python для квантильного разделения применяется функция qcut.
# Создаем данные о доходах с одним явным выбросом
income_data = {'client_id': range(1, 6),
'income': [20000, 25000, 30000, 40000, 5000000]}
df_income = pd.DataFrame(income_data)
# Разделяем на 2 группы с равным числом клиентов (по 50%)
df_income['income_segment'] = pd.qcut(df_income['income'], q=2, labels=['Низкий', 'Высокий'])
print(df_income[['income', 'income_segment']])
Сравнение методов разделения
Для наглядности сопоставим оба подхода в таблице:
| Характеристика | Метод равных интервалов (pd.cut) |
Метод квантилей (pd.qcut) |
|---|---|---|
| Принцип деления | Одинаковая ширина числового диапазона | Одинаковое количество объектов в группе |
| Размер групп | Может сильно отличаться (от 0 до 100% выборки) | Всегда строго одинаковый (например, по 25%) |
| Отношение к выбросам | Сильно искажает результаты | Устойчив к выбросам (робастен) |
| Идеальное применение | Возраст, время, равномерные метрики | Доход, LTV, количество покупок, RFM-анализ |
Кластеризация методом K-Means
Методы cut и qcut отлично работают, когда нам нужно сегментировать клиентов по одному конкретному признаку (только по возрасту или только по доходу). Но поведение людей в реальном мире многомерно. Маркетологам часто нужно найти группы клиентов, учитывая одновременно частоту покупок, средний чек, время на сайте и количество возвратов.
Здесь на помощь приходит машинное обучение без учителя, а именно алгоритм K-Means (К-средних). Это алгоритм кластеризации, который группирует объекты так, чтобы внутри одной группы они были максимально похожи друг на друга, а сами группы максимально отличались между собой.
Алгоритм работает по следующим шагам:
- Исследователь заранее задает количество кластеров .
- Алгоритм случайным образом выбирает точек в пространстве данных. Эти точки называются центроидами (центрами будущих кластеров).
- Каждый клиент привязывается к тому центроиду, к которому он геометрически ближе всего.
- После того как все клиенты распределены, алгоритм вычисляет новый центр тяжести для каждой группы и перемещает центроид туда.
- Шаги 3 и 4 повторяются до тех пор, пока центроиды не перестанут сдвигаться.
Важнейшее правило при использовании K-Means: данные необходимо масштабировать (стандартизировать). Алгоритм измеряет расстояния между точками. Если средний чек измеряется в десятках тысяч рублей, а количество покупок — в единицах, то без масштабирования алгоритм будет обращать внимание только на деньги, полностью игнорируя частоту покупок.
Пример реализации на Python с использованием библиотеки Scikit-learn:
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
import pandas as pd
# Данные: средний чек (руб.) и количество покупок (шт.)
data = {'avg_check': [1500, 1600, 1400, 8000, 8500, 8200],
'purchases': [2, 3, 2, 15, 14, 16]}
df_behavior = pd.DataFrame(data)
# 1. Масштабирование данных
scaler = StandardScaler()
scaled_data = scaler.fit_transform(df_behavior)
# 2. Применение K-Means (ищем 2 сегмента)
kmeans = KMeans(n_clusters=2, random_state=42, n_init=10)
df_behavior['cluster'] = kmeans.fit_predict(scaled_data)
print(df_behavior)
В результате выполнения этого кода алгоритм четко разделит клиентов на две группы: «редкие покупатели с низким чеком» и «лояльные VIP-клиенты».
Понимание этих трех подходов — от простых интервалов до машинного обучения — дает мощный фундамент для глубокой аналитики. Разделяя аудиторию на осмысленные сегменты, вы можете настраивать таргетированную рекламу, разрабатывать индивидуальные email-рассылки и адаптировать интерфейс IT-продуктов под конкретные нужды пользователей.