
Когда у нас есть много разрозненной информации, часто хочется навести в ней порядок: понять, что к чему относится, где границы между схожими объектами, и какие в этих данных есть закономерности. Чаще всего вы не встретите уже готовые решения – всё, что есть, – это чистые наблюдения и закономерности. Но даже из них можно извлечь смысл, если подойти правильно.
В этой статье мы разберёмся, как находить скрытые группы внутри данных. Речь, конечно, пойдёт про алгоритмы кластеризации данных. Мы познакомимся с несколькими основными алгоритмами кластеризации, узнаем, как выбрать подходящий, и научимся оценивать качество проделанной работы с помощью численных показателей.
Материал подойдёт тем, кто делает первые шаги в анализе данных и хочет разобраться, как на практике можно «разложить всё по полочкам», даже если сначала кажется, что это просто хаос. В данной статье не будет сложных математических формул, все алгоритмы мы опишем максимально простыми словами.
Навигация по странице
Кластеризация в нашей жизни
При анализе больших объемов информации перед нами стоит задача понять, какие в этих данных есть закономерности. Но что делать, когда нет заранее известных категорий, по которым можно разделить все эти данные?
Нет никаких ярлыков, инструкций – перед нами только сухие цифры, наблюдения и характеристики. Разобраться в таких данных почти невозможно.
В таком случае нужно подойти к задаче по-другому: не искать известные ответы, а попытаться выделить группы, которые складываются сами собой, на основе сходства между элементами. Такой подход помогает навести порядок там, где сначала кажется, что есть только хаос.
Кластеризация — это инструмент, который и помогает навести порядок в хаосе данных: она сама находит логичные группы объектов, даже если мы заранее не знаем, сколько их и какие они.
Представьте себе, что вы управляете супермаркетом. У вас ежедневно накапливается история покупки каждого посетителя: кто что купил, когда и на какую сумму. Но вы не знаете, кто эти люди.
Кто-то приходит за готовым обедом каждый день, кто-то — раз в неделю закупает продукты для всей семьи, а кто-то заходит только по пятницам за снеками. Как вам понять, какие типы покупателей у вас есть? Здесь на помощь приходит подход, который позволяет автоматически выделить группы с похожим поведением.
Вы запускаете специальный алгоритм, который сам анализирует данные и делит покупателей на несколько групп. В результате вы получаете понятные сегменты: например, «молодые сотрудники офисов, покупающие готовую еду», «родители с маленькими детьми», «покупатели, готовящиеся к выходным».
Зачем все это нужно? Зная информацию о сегментах покупателей, то есть кто, что и в какое время покупает, вам будет проще принимать важные для бизнеса решения: запускать акции, планировать поставки и даже менять выкладку товаров.
А теперь представьте другую ситуацию. Вы пользуетесь стриминговым сервисом — для музыки, фильмов или видео. Вы заходите в приложение, а оно предлагает вам список популярных треков или фильмов, одинаковый для всех пользователей. Без учёта вашего возраста, вкусов, интересов.
Вам нравится джаз и научная фантастика, но вы видите фонк, k-поп и романтические комедии, потому что они «в тренде». Вам неинтересно, вы закрываете приложение и больше в него никогда не заходите.
Почему так происходит? Потому что система не пытается понять, к какой группе вы относитесь. Она не анализирует, с кем из других пользователей у вас схожие вкусы. Без такого анализа невозможно выстроить персональные рекомендации, которые действительно попадают в цель. Вот почему важно уметь находить группы и закономерности даже тогда, когда заранее никто не объяснил, что искать.
Что такое кластеризация
С примерами использования кластеризации в реальной жизни мы уже познакомились. Теперь настало время все же разобраться с тем, что из себя представляет кластеризация и какие алгоритмы она в себя включает.
Кластеризация — это метод анализа данных, с помощью которого объекты группируются по степени сходства между ними. Причём происходит это без участия человека, без заранее известных правил или категорий.
Алгоритм сам находит закономерности и определяет, какие объекты можно отнести к одной группе, а какие — к другой. Иными словами, это автоматическое объединение элементов, схожих между собой, в группы. Такие группы называются кластерами.
Чтобы лучше понять, где находится кластеризация в общем контексте анализа данных, полезно рассмотреть два основных подхода в машинном обучении: обучение с учителем и обучение без учителя.
Обучение с учителем (supervised learning / контролируемое обучение) — это когда у вас есть набор данных и известные правильные ответы. Например, у вас есть письма, и каждое из них уже помечено как «спам» или «не спам». Алгоритм учится на этих примерах и затем может предсказывать, спам ли новое письмо. Здесь обучение идёт по известной цели.
Обучение без учителя (unsupervised learning / неконтролируемое обучение) — это когда в данных нет никаких подсказок, нет меток, нет заранее известных ответов. Только сами объекты и их признаки. В этом случае алгоритм должен сам разобраться в структуре данных, выявить скрытые связи и разделить объекты на логические группы. Именно к этой категории и относится кластеризация.
Подробно останавливаться на этих подходах машинного обучения мы не будем. Им будут посвящены отдельные статьи в будущем. Если вам не терпится уже сейчас погрузиться в увлекательный мир машинного обучения, то настоятельно рекомендуем ознакомиться с книгами: Грокаем машинное обучение (Луис Серрано) и Машинное обучение с помощью Python (Мюллер Андреас, Гвидо Сара).
Кластеризация применяется во многих сферах нашей жизни. Вот лишь несколько типичных примеров:
- Маркетинг. Кластеризация позволяет делить клиентов на сегменты: кто покупает часто, кто — редко; кто предпочитает определённые товары; кто чувствителен к акциям. Это помогает точнее настраивать рекламу и предложения.
- Здравоохранение. С помощью кластеризации можно выявлять группы пациентов со схожими симптомами или поведенческими признаками, что важно для диагностики и прогнозирования заболеваний.
- Выявление аномалий. Иногда кластеры помогают не только находить группы, но и обнаруживать то, что в группы не попадает — выбросы или подозрительные объекты. Это может быть полезно, например, в банковской сфере для поиска мошеннических операций.
- Обработка изображений и текста. В задачах компьютерного зрения кластеризация может использоваться для выделения похожих областей на изображениях, а в анализе текстов — для группировки похожих документов или новостей.
Работа кластеризации
Чтобы понять, как на практике применяется кластеризация, давайте разберём её работу на простом и понятном примере. Допустим, у нас есть небольшая таблица с данными о клиентах фитнес-клуба. У каждого клиента указаны два параметра:
- Возраст
- Количество посещений в месяц
Вот как выглядит набор данных:

На этом шаге важно:
- Убедиться, что данные числовые
- При необходимости — очистить от пропусков или ошибок
- Иногда (если параметры очень разные по масштабу) — нормализовать значения, чтобы один не «перетягивал» на себя внимание алгоритма
В нашем случае — возраст и посещения примерно соизмеримы, можно оставить как есть. Но бывают случаи, когда один параметр исчисляется десятками, а другой – тысячами. В таком случае данные необходимо нормализовать и привести примерно к одному порядку (масштабу).
Для того чтобы визуально убедиться в наличии хоть какой-то структуры в данных, полезно будет изобразить их на графике. Каждого клиента мы отметим знаком «х», по оси Y отложим количество посещений в месяц, а по X – возраст клиента.

Визуально уже можем заметить:
- Слева вверху — группа молодых и активных посетителей (A, C, B)
- Справа внизу — старшие и «малопосещающие» (F, D, E)
- По центру — средний возраст со средней активностью (H, G, I)
Это ещё не кластеры — просто наблюдение, но оно подсказывает, что структура в наших данных все же присутствует.
Далее нам предстоит выбрать признаки, по которым будет работать алгоритм кластеризации. В этом простом примере всего два признака: возраст и количество посещений.
Но в реальных задачах признаков может быть десятки. Тогда важно:
- Удалять лишнее (например, дублирующие или неинформативные данные)
- Выбирать только самые важные (например, которые действительно влияют на поведение)
- Иногда применять методы снижения размерности, чтобы визуализировать многомерные данные
В нашем случае мы сознательно выбрали наглядные и простые признаки, с которыми удобно работать.
Работа алгоритма k-средних
Наши данные готовы, и мы можем передавать их алгоритму кластеризации. Возьмём простой и популярный — k-средних (подробно его работу рассмотрим в следующей статье).
Как он работает:
- Вы заранее указываете, сколько кластеров хотите найти (например, 3)
- Алгоритм случайно выбирает «центры» кластеров
- Он проверяет, к какому центру ближе каждая точка. Из таких точек формируются группы
- Пересчитывает (сдвигает) центры — теперь они находятся в центре своих групп
- Снова пересчитывает принадлежность всех точек
- Повторяет шаги, пока группы не «устаканятся»
В итоге каждая точка (наш клиент) оказывается отнесённой к определённому кластеру — на основе близости к остальным.
После работы алгоритма мы можем снова нарисовать график — только теперь каждая точка будет окрашена в цвет своего кластера.
Вот что получится:
- Зелёные точки: кластер молодых и активных клиентов
- Оранжевые: средний возраст клиентов и средняя активность.
- Синие: кластер взрослых и малопосещающих

Кластеры — это не жёсткие «папки», а скорее области на графике, где точки плотнее всего сгруппированы. Иногда границы бывают размыты, и клиент может быть «на границе» между группами или вообще на удалении от всех кластеров — и это тоже нормальная ситуация.
Здорово, алгоритм нам разделил данные на кластеры. А как мы поймем: хорошо ли он справился со своей работой?
Конечно, «правильных» ответов нам никто не скажет, но можно оценить, насколько точны получившиеся группы. Для этого применяются метрики качества кластеризации.
Метрики качества кластеризации
Разберём три самые популярные метрики: коэффициент силуэта, внутрикластерное и межкластерное расстояния. Начнём с первого.
Коэффициент силуэта показывает, насколько каждый объект кластера похож на остальные из своей группы и насколько он далёк от других групп. Коэффициент этот вычисляется по простой формуле и может принимать значения от -1 до 1, причём:
- Чем ближе к единице, тем лучше. Значение коэффициента, равное 1 будет означать, что объект идеально попал в свой кластер
- Значения, близкие к нулю, будут означать, что объект находится на «границе» своего кластера
- Отрицательные значения говорят нам о том, что алгоритм ошибся и объект явно попал не в тот кластер
То есть, чем ближе средний коэффициент силуэта по всем объектам к единице, тем лучше кластеризация. При хорошей кластеризации большинство объектов имеют коэффициент силуэта больше 0,5.
Следующие две метрики описывают «плотность» кластеров и их удалённость друг от друга. Внутрикластерное расстояние – это среднее расстояние между объектами внутри одного кластера. Чем меньше это расстояние, тем кластер плотнее.
На изображении ниже первый кластер плотный и имеет маленькое внутрикластерное расстояние, а второй кластер, наоборот – с большим внутрикластерным расстоянием.

Межкластерное расстояние – это расстояние между разными кластерами. Хорошая кластеризация означает большие межкластерные расстояния и хорошо разделённые кластеры.
На изображении ниже между кластером 1 и кластером 2 большое межкластерное расстояние, следовательно, кластеризация выполнена хорошо. А между кластером 2 и 3 – межкластерное расстояние слишком маленькое, что заставляет усомниться в качестве проведённой кластеризации.

Но вернёмся к примеру с фитнес-клубом. В наших данных кластеры четко разделены между собой и достаточно плотные, что может говорить об успешной кластеризации.
Но стоит отметить, что алгоритм лишь разделяет данные на группы, но не говорит, что означает каждая из этих групп. Интерпретация — это наша задача.
Мы смотрим:
- Какие признаки объединяют клиентов в кластере?
- Чем они отличаются от других?
- Как это знание можно применить в жизни?
Например, анализ результатов кластеризации может натолкнуть нас на такие выводы:
- Кластер 1 — молодёжь, занимающаяся спортом 3 и более раз в неделю. Можно предлагать им сезонные абонементы.
- Кластер 2 — клиенты средней активности, возможно, нуждаются в гибком графике.
- Кластер 3 — взрослые, приходящие редко. Им подойдут мотивационные программы.
Каждый этап кластеризации важен. Нельзя просто «скормить» данные алгоритму и получить готовый ответ. Качество результата зависит от понимания данных, правильного выбора признаков, алгоритма, и, конечно, интерпретации результата.
На разобранном ранее примере мы убедились, что даже из двух чисел можно выделить понятные, осмысленные группы, которые дают реальную пользу.
Основные алгоритмы кластеризации
Далее мы кратко опишем два самых популярных алгоритма кластеризации, сравним их между собой и выведем определённые признаки, по которым будем определять, какой лучше алгоритм кластеризации использовать в той или иной ситуации.
Каждому из описанных далее алгоритмов будет посвящена отдельная статья, в которой мы подробно разберём их работу, напишем собственную реализацию на языке Python, сравним её с готовой и проверенной из библиотеки sklearn и продемонстрируем работу алгоритма на примере.
Алгоритм k-средних
Одним из самых простых и популярных алгоритмов кластеризации является алгоритм k-средних (k-means). Его мы уже применяли ранее, но давайте обобщим информацию о нём.
Идея этого алгоритма интуитивно понятна: мы просто хотим «разложить всё по полочкам», чтобы похожие объекты оказались рядом, а разные — подальше друг от друга.
Представьте, что у вас есть кучка разноцветных шариков, но цвета вам не видны. Всё, что вы знаете — это размер и вес каждого шарика. Вам нужно разложить их по коробкам так, чтобы в каждой оказались максимально похожие шарики.
Вы выбираете, сколько коробок будет, и начинаете: раскладываете шарики примерно, потом пересматриваете, что получилось, меняете содержимое коробок, и так — пока всё не станет логичным. Это и есть суть k-средних.
Алгоритм работает очень похоже. Сначала вы выбираете число кластеров (например, 3), и он случайным образом размещает «центры» этих групп. Затем он смотрит на каждый объект (например, данные клиента, письма или товара) и определяет, к какому центру он ближе.
Все объекты распределяются по группам, после чего алгоритм пересчитывает, где теперь должны быть новые центры — исходя из того, что оказалось внутри каждой группы. Этот процесс повторяется, пока центры не перестанут сильно меняться.
Метод k-средних лучше всего работает с данными, где группы чётко отделимы друг от друга и имеют примерно одинаковый «размер» (в смысле плотности и расстояний между объектами).
Например, если вы анализируете клиентов по возрасту и частоте покупок, и видите, что есть молодые активные, пожилые неактивные и кто-то посередине — этот алгоритм справится отлично.
У метода есть ряд преимуществ. Он простой, быстро работает даже на больших объёмах данных, легко реализуется и хорошо визуализируется. Особенно он хорош в задачах, где нужно быстро получить первичное понимание структуры данных.
Но есть и минусы, о которых важно помнить. Во-первых, вы должны заранее указать, сколько групп вы хотите получить. Если указать слишком много или слишком мало, результат может быть странным.
Во-вторых, алгоритм чувствителен к выбросам — то есть объектам, которые сильно отличаются от остальных и не должны быть отнесены ни к какому кластеру. Такие точки могут «перетянуть» центр группы в свою сторону и испортить общую картину. И наконец, он плохо работает, если группы имеют сложную форму (например, серповидную, концентрическую или вытянутую)
Алгоритм DBSCAN
Иногда данные могут быть устроены неаккуратно. Группы имеют разную форму, плотность и размер. Где-то много похожих объектов слабо разбросаны, где-то — тесная кучка, а между ними — пустота.
В таких случаях алгоритм k-средних может «растеряться»: он ждёт, что группы будут похожими, а вы заранее укажете их количество. Но что, если группы непредсказуемые? Тогда на помощь приходит другой подход — алгоритм DBSCAN.
Представьте, что вы стоите на площади, и люди вокруг вас образуют группы. Где-то стоят плотно, разговаривают между собой — это очевидная компания. Где-то одиночки — просто прохожие. Вы обходите площадь и пытаетесь определить, где настоящие группы, а кто просто оказался рядом случайно. Вам неважно, сколько групп — вы просто замечаете, где люди находятся ближе друг к другу, чем в других местах. Так действует DBSCAN.
Этот алгоритм смотрит не на количество кластеров, а на плотность точек. Он определяет, какие точки находятся достаточно близко друг к другу, чтобы образовать плотную группу. Если в каком-то районе много таких точек — это кластер. Если точка стоит одна или рядом с ней мало других — это «шум» или выброс.
Главное преимущество DBSCAN в том, что вам не нужно заранее указывать, сколько кластеров искать. Алгоритм сам поймёт, сколько их должно быть, и где они находятся.
Более того, он умеет выделять аномалии — те точки, которые не похожи ни на одну группу. Это особенно полезно, когда вам важно не только выделить основную структуру данных, но и заметить, что в неё не вписывается.
Этот метод отлично работает, если у вас:
- Кластеры разной формы (например, вытянутые, кольцеобразные),
- Разная плотность данных,
- Есть шум или выбросы, которые не нужно включать в группы.
Но у него есть и слабые стороны. Он плохо работает, если кластеры сильно отличаются по плотности — алгоритму сложно понять, где заканчивается один и начинается другой. Кроме того, его настройка требует выбора двух параметров:
- На каком расстоянии точки считаются «соседями»
- Сколько соседей нужно, чтобы образовалась группа
И если эти параметры задать неправильно, результат может оказаться неудачным.
Сравнение алгоритмов
Итак, мы получили некоторые базовые представления об основных двух алгоритмах кластеризации. Давайте теперь сравним их:
- Определим с кластерами какой формы и размерности работают данные алгоритмы
- Выделим ключевые параметры, которые необходимо определить для корректной работы каждого алгоритма
- Сравним работу каждого алгоритма с выбросами
Алгоритм k-средних хорошо работает, когда группы имеют простую, округлую форму. Он буквально «выстраивает» границу вокруг центров кластеров, поэтому идеален для чётких и симметричных групп.
В отличие от него, DBSCAN не требует, чтобы кластеры были круглыми или равномерными. Он определяет группы по плотности точек, а значит, может выделять кластеры любой формы — вытянутые, изогнутые, кольцевые. Это особенно полезно, если ваши данные «размазаны» или нестандартно сгруппированы.
Ниже приведены примеры работы каждого алгоритма с различным распределением точек на плоскости.
При работе с концентрическими кластерами предпочтение стоит отдать алгоритму DBSCAN.

Аналогично и с серповидными кластерами.

Когда мы имеем два плотных кластера с маленьким межкластерным расстоянием и третий кластер, расположенный в отдалении от них, стоит отталкиваться он вашей цели.
На изображении ниже алгоритм k-средних разбил данные на три кластера, как и ожидалось. Но он разделил вытянутый кластер на две части, потому что воспринимает плотные скопления как отдельные кластеры, даже если они логически связаны.
DBSCAN же объединил весь вытянутый кластер в одну группу, и при этом отметил некоторые точки как шум (чёрные), что даёт более реалистичную картину.

Можно прийти к такому выводу: если кластеры сильно различаются по форме, и при этом в данных есть выбросы, DBSCAN даст более осмысленную сегментацию.
K-средних подойдёт, если вам нужно жёсткое разбиение всех точек, пусть и не идеально.
На следующем изображении представлены вытянутые группы точек.

В таком случае алгоритм DBSCAN оказывается точнее: он сохранил вытянутую структуру кластеров. Но обратите внимание, что при таком разбиении правая «лента» точек оказалась разбита на два кластера. Возможно, здесь просто отсутствует часть данных и справа должен быть всего один кластер.
Алгоритм k-средних в такой ситуации пытается разбить данные на части одинакового размера и формы. Он «перекусывает» вытянутые скопления, создавая неправильные границы между кластерами.
На пятом изображении мы наблюдаем следующую картину.

Здесь алгоритм k-средних показывает почти идеальное разбиение. Каждая группа отделена, примерно одинакова по размеру — именно такой тип данных для него оптимален.
Правда, DBSCAN тоже сработал хорошо, но при этом обозначил некоторые точки как шум. Это может быть полезно, если выбросы важны, но может быть лишним, если требуется категоризация именно всех точек.
Данные примеры очень наглядно показывают, что один и тот же набор данных может по-разному интерпретироваться различными алгоритмами. Помните, что выбор алгоритма зависит прежде всего от типа решаемой задачи и структуры данных, с которыми вы работаете.
Но не от одной лишь структуры данных зависит выбор алгоритма кластеризации. Вам также стоит уделить внимание и ключевым параметрам, с которыми предстоит работать.
При выборе алгоритма k-средних от вас потребуется заранее знать количество кластеров, которое вы хотите получить. Если выберете слишком много или мало, результат может быть неудачным.
В выборе оптимального количества кластеров вам могут помочь различные математические методы, например, метод локтя, о котором мы поговорим в следующей статье.
Для работы с алгоритмом DBSCAN придётся определить сразу два параметра:
- Радиус, в пределах которого считаются «соседи» (обозначается как эпсилон)
- Минимальное количество точек, необходимых для формирования плотной группы
От этих значений сильно зависит, как алгоритм разделит данные. Настроить их не всегда просто, особенно без визуализации.
Также в ряде задач вам предстоит работать с выбросами. Мы уже встречались с ними ранее (серые точки на изображениях выше). Можно сказать, что выбросы – это некоторые «лишние» данные, которые не входят ни в одну группу.
Это могут быть просто ошибочные данные (например, система неправильно записала возраст клиента фитнес-клуба) или просто какие-то аномальные данные (аналогично в примере с фитнес-клубом это будет сорокалетний человек, который занимается по 16 раз в месяц).
Алгоритм k-средних пытается «запихнуть» все данные в кластеры. Даже если точка сильно отличается от остальных, она будет отнесена к ближайшей группе. Это может исказить результат, особенно если выбросов много.
Алгоритм DBSCAN умеет работать с такими выбросами. Если точка стоит слишком далеко и не имеет достаточного количества соседей — она будет помечена как шум и не попадёт ни в один кластер.
Подведя итог всему вышесказанному, можем сформировать такую таблицу со сравнением обоих алгоритмов.
