Полное руководство по кластеризации данных на Python: методы и примеры

Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

Для кого эта статья:

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

    Кластеризация данных – это не просто модный термин из мира анализа данных, а мощный инструмент, позволяющий автоматически группировать схожие объекты без предварительной разметки. Когда вы сталкиваетесь с терабайтами необработанных данных, именно кластеризация помогает выявить скрытые закономерности и структуры. Python с его богатой экосистемой библиотек превращает этот сложный процесс в доступный даже для начинающих специалистов. В этом руководстве мы разберем алгоритмы кластеризации от классического K-means до продвинутого DBSCAN, изучим ключевые библиотеки и пройдем весь путь от подготовки данных до оценки качества полученных кластеров. 🐍📊

Хотите глубже погрузиться в мир данных и освоить не только кластеризацию, но и весь спектр инструментов современного аналитика? Профессия аналитик данных от Skypro — это программа, где вы научитесь применять Python для решения реальных бизнес-задач. От базовых концепций до продвинутых алгоритмов машинного обучения, включая кластеризацию, с менторской поддержкой и практикой на реальных проектах. Инвестируйте в навыки, которые никогда не устареют в эпоху данных.

Кластеризация данных на Python: основные концепции и подготовка

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

Прежде чем погружаться в алгоритмы, необходимо понять основные концепции и правильно подготовить данные. 🧹

Пошаговый план для смены профессии

Ключевые понятия кластеризации:

  • Расстояние между объектами – мера сходства объектов, определяющая, насколько они похожи или различны
  • Центроид – центр кластера, обычно средняя точка всех объектов в кластере
  • Инерция – сумма квадратов расстояний от каждой точки до центра её кластера
  • Силуэт – метрика, оценивающая качество кластеризации через соотношение внутрикластерных и межкластерных расстояний

Подготовка данных для кластеризации включает несколько критически важных шагов:

Этап подготовки Описание Инструменты в Python
Обработка пропущенных значений Заполнение или удаление пропусков для обеспечения целостности данных pandas.fillna(), pandas.dropna()
Масштабирование признаков Приведение признаков к единой шкале для корректной работы алгоритмов sklearn.preprocessing.StandardScaler, MinMaxScaler
Снижение размерности Уменьшение количества признаков при сохранении информативности sklearn.decomposition.PCA, t-SNE
Обработка категориальных данных Преобразование категориальных признаков в числовые pandas.get_dummies(), sklearn.preprocessing.OneHotEncoder

Приведем пример подготовки данных для кластеризации:

Python
Скопировать код
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

# Загрузка данных
data = pd.read_csv('customer_data.csv')

# Обработка пропущенных значений
data.fillna(data.mean(), inplace=True)

# Выбор числовых признаков для кластеризации
features = data[['age', 'income', 'spending_score', 'loyalty_points']]

# Масштабирование данных
scaler = StandardScaler()
scaled_features = scaler.fit_transform(features)

# Снижение размерности (опционально)
pca = PCA(n_components=2)
reduced_features = pca.fit_transform(scaled_features)

# Теперь данные готовы для применения алгоритмов кластеризации
print(f"Данные подготовлены: {reduced_features.shape}")

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

Александр Петров, ведущий дата-аналитик

Столкнулся однажды с интересным случаем при работе с данными клиентов интернет-магазина. Мы пытались сегментировать пользователей по поведенческим паттернам, но результаты кластеризации выглядели странно – почти 80% клиентов попадало в один кластер. Проблема оказалась в том, что мы не масштабировали признаки. У нас был признак "сумма покупок за год" с значениями от нескольких тысяч до миллионов, и признак "количество входов в месяц" с значениями от 0 до 30. Алгоритм K-means фактически группировал клиентов только по сумме покупок, игнорируя остальные признаки из-за их малого вклада в евклидово расстояние. После стандартизации данных через StandardScaler мы получили пять чётких кластеров с уникальными характеристиками, что привело к полному пересмотру нашей маркетинговой стратегии. Это был наглядный урок, почему подготовка данных так критична для кластеризации.

Алгоритмы кластеризации в Python: от K-means до DBSCAN

Python предлагает широкий спектр алгоритмов кластеризации, каждый со своими преимуществами и ограничениями. Рассмотрим наиболее популярные алгоритмы и их реализацию на Python. 🔍

1. K-means: классический алгоритм кластеризации

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

Python
Скопировать код
from sklearn.cluster import KMeans

# Применение K-means к подготовленным данным
kmeans = KMeans(n_clusters=5, random_state=42)
clusters = kmeans.fit_predict(scaled_features)

# Добавление результатов кластеризации в исходный датафрейм
data['cluster'] = clusters

# Анализ центроидов кластеров
centroids = scaler.inverse_transform(kmeans.cluster_centers_)
centroids_df = pd.DataFrame(centroids, columns=features.columns)
print(centroids_df)

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

2. Иерархическая кластеризация

Иерархическая кластеризация создает дерево кластеров, позволяя визуализировать процесс объединения или разделения групп на дендрограмме.

Python
Скопировать код
from sklearn.cluster import AgglomerativeClustering
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage

# Применение агломеративной кластеризации
agg_clustering = AgglomerativeClustering(n_clusters=5)
agg_clusters = agg_clustering.fit_predict(scaled_features)

# Построение дендрограммы
linked = linkage(scaled_features, 'ward')
plt.figure(figsize=(12, 8))
dendrogram(linked, truncate_mode='level', p=5)
plt.title('Дендрограмма иерархической кластеризации')
plt.xlabel('Образцы')
plt.ylabel('Расстояние')
plt.show()

3. DBSCAN: плотностная кластеризация

DBSCAN (Density-Based Spatial Clustering of Applications with Noise) обнаруживает кластеры произвольной формы, основываясь на плотности точек. Он не требует предварительного указания числа кластеров и устойчив к выбросам.

Python
Скопировать код
from sklearn.cluster import DBSCAN

# Применение DBSCAN
dbscan = DBSCAN(eps=0.5, min_samples=5)
dbscan_clusters = dbscan.fit_predict(scaled_features)

# Подсчет числа кластеров (исключая шум, которому присваивается метка -1)
n_clusters = len(set(dbscan_clusters)) – (1 if -1 in dbscan_clusters else 0)
print(f"Количество кластеров: {n_clusters}")

# Анализ выбросов
n_noise = list(dbscan_clusters).count(-1)
print(f"Количество выбросов: {n_noise}")

Параметры eps (радиус соседства) и min_samples (минимальное количество точек в соседстве) критически важны для DBSCAN и требуют тщательного подбора.

4. Gaussian Mixture Models (GMM)

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

Python
Скопировать код
from sklearn.mixture import GaussianMixture

# Применение GMM
gmm = GaussianMixture(n_components=5, random_state=42)
gmm_clusters = gmm.fit_predict(scaled_features)

# Вероятности принадлежности к кластерам
probabilities = gmm.predict_proba(scaled_features)
print(f"Форма матрицы вероятностей: {probabilities.shape}")

Алгоритм Преимущества Недостатки Оптимальные случаи применения
K-means Простой, быстрый, масштабируемый Требует задания числа кластеров, чувствителен к выбросам Большие наборы данных с шаровидными кластерами
Иерархическая кластеризация Не требует предварительного задания числа кластеров, наглядная визуализация Вычислительно затратна для больших данных Небольшие и средние наборы данных, когда важна иерархическая структура
DBSCAN Находит кластеры произвольной формы, устойчив к выбросам Сложность выбора параметров, чувствителен к различным плотностям Данные с шумом, кластеры неправильной формы
GMM Мягкая кластеризация с вероятностями, гибкие формы кластеров Чувствителен к инициализации, вычислительно затратен Данные с перекрывающимися кластерами, когда важны вероятности

Библиотеки Python для кластеризации: scikit-learn, SciPy и другие

Python обладает богатой экосистемой библиотек для кластеризации данных, каждая из которых имеет свои особенности и преимущества. Рассмотрим основные библиотеки и их возможности. 📚

1. Scikit-learn: всеобъемлющая библиотека машинного обучения

Scikit-learn – основная библиотека для кластеризации в Python, предлагающая унифицированный API для различных алгоритмов кластеризации и сопутствующих инструментов.

  • Алгоритмы кластеризации: K-means, DBSCAN, Агломеративная кластеризация, Spectral Clustering, OPTICS, Birch и другие
  • Предобработка данных: StandardScaler, MinMaxScaler, RobustScaler для подготовки данных
  • Оценка кластеризации: силуэт, взаимная информация, индекс Дэвиса-Болдина
Python
Скопировать код
from sklearn.cluster import KMeans, DBSCAN, AgglomerativeClustering
from sklearn.metrics import silhouette_score
from sklearn.preprocessing import StandardScaler

# Пример использования нескольких алгоритмов
algorithms = {
'K-means': KMeans(n_clusters=5, random_state=42),
'DBSCAN': DBSCAN(eps=0.5, min_samples=5),
'Agglomerative': AgglomerativeClustering(n_clusters=5)
}

# Оценка алгоритмов
for name, algorithm in algorithms.items():
labels = algorithm.fit_predict(scaled_features)
# Для DBSCAN силуэт рассчитывается только для помеченных точек (не шума)
if name == 'DBSCAN' and -1 in labels:
mask = labels != -1
score = silhouette_score(scaled_features[mask], labels[mask]) if np.sum(mask) > 1 else 0
else:
score = silhouette_score(scaled_features, labels)
print(f"{name}: Silhouette Score = {score:.4f}")

2. SciPy: научные вычисления и иерархическая кластеризация

SciPy предоставляет продвинутые функции для иерархической кластеризации и связанных вычислений.

Python
Скопировать код
from scipy.cluster.hierarchy import linkage, fcluster, dendrogram
import matplotlib.pyplot as plt

# Построение иерархической кластеризации
Z = linkage(scaled_features, 'ward')

# Получение меток кластеров
labels = fcluster(Z, 5, criterion='maxclust')

# Визуализация дендрограммы
plt.figure(figsize=(10, 7))
dendrogram(Z, truncate_mode='lastp', p=30, show_leaf_counts=False)
plt.title('Дендрограмма иерархической кластеризации')
plt.xlabel('Индексы образцов')
plt.ylabel('Расстояние')
plt.show()

3. HDBSCAN: расширенная версия DBSCAN

HDBSCAN – это усовершенствованная версия DBSCAN, которая автоматически адаптируется к различной плотности кластеров.

Python
Скопировать код
import hdbscan

# Применение HDBSCAN
hdb = hdbscan.HDBSCAN(min_cluster_size=5, gen_min_span_tree=True)
hdb_labels = hdb.fit_predict(scaled_features)

# Визуализация результатов (для двумерных данных)
if scaled_features.shape[1] == 2:
plt.figure(figsize=(10, 8))
plt.scatter(scaled_features[:, 0], scaled_features[:, 1], 
c=hdb_labels, cmap='viridis', marker='o', s=50)
plt.title('Кластеры, обнаруженные HDBSCAN')
plt.colorbar(label='Метки кластеров')
plt.grid(True)
plt.show()

4. PyTorch и TensorFlow: глубокое обучение для кластеризации

Для более сложных задач кластеризации и автокодировщиков можно использовать библиотеки глубокого обучения.

Python
Скопировать код
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset

# Простой автокодировщик для кластеризации
class Autoencoder(nn.Module):
def __init__(self, input_dim, encoding_dim):
super(Autoencoder, self).__init__()
self.encoder = nn.Sequential(
nn.Linear(input_dim, 128),
nn.ReLU(True),
nn.Linear(128, 64),
nn.ReLU(True),
nn.Linear(64, encoding_dim)
)
self.decoder = nn.Sequential(
nn.Linear(encoding_dim, 64),
nn.ReLU(True),
nn.Linear(64, 128),
nn.ReLU(True),
nn.Linear(128, input_dim)
)

def forward(self, x):
encoded = self.encoder(x)
decoded = self.decoder(encoded)
return encoded, decoded

# Настройка для учебного примера
input_dim = scaled_features.shape[1]
encoding_dim = 2 # Уменьшенная размерность для кластеризации
model = Autoencoder(input_dim, encoding_dim)

# Преобразование данных в тензоры PyTorch
X_tensor = torch.tensor(scaled_features, dtype=torch.float32)
dataset = TensorDataset(X_tensor, X_tensor)
dataloader = DataLoader(dataset, batch_size=64, shuffle=True)

# Обучение автокодировщика (сокращенный пример)
optimizer = optim.Adam(model.parameters(), lr=0.001)
criterion = nn.MSELoss()

# Получение сжатого представления для кластеризации
model.eval()
with torch.no_grad():
encoded_features, _ = model(X_tensor)
encoded_features = encoded_features.numpy()

# Теперь можно применить K-means к encoded_features
kmeans = KMeans(n_clusters=5, random_state=42)
cluster_labels = kmeans.fit_predict(encoded_features)

Мария Соколова, руководитель отдела аналитики

В прошлом году мы работали над сегментацией клиентов для одной крупной розничной сети. У нас был массивный набор данных с более чем 50 признаками по каждому клиенту – от демографических данных до сложных паттернов покупок. Стандартный K-means давал плохо интерпретируемые результаты, и мы решили попробовать подход с автокодировщиками из PyTorch.

Мы создали глубокий автокодировщик, который уменьшил размерность признаков с 50 до 10, сохранив при этом большую часть вариативности данных. Затем применили HDBSCAN к этим 10 признакам. Результат превзошел ожидания – мы обнаружили 7 четких кластеров клиентов с очень различным поведением. Особенно ценным оказался кластер "скрытых ценителей" – небольшая группа клиентов со средним чеком, но удивительно высокой лояльностью и специфическими предпочтениями.

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

Практическое руководство: кластеризация реальных данных с Python

Теория полезна, но реальная сила кластеризации раскрывается при работе с настоящими данными. Рассмотрим полный процесс кластеризации на примере набора данных о клиентах торгового центра. 🛒

Для этого примера будем использовать открытый набор данных "Mall Customer Segmentation Data" с информацией о клиентах торгового центра, включающий такие признаки как возраст, доход, оценка потребительской активности.

Python
Скопировать код
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

# Шаг 1: Загрузка данных
data = pd.read_csv('https://raw.githubusercontent.com/StefanieSenger/Mall_Customers/master/Mall_Customers.csv')
data.rename(columns={'Annual Income (k$)': 'Income', 'Spending Score (1-100)': 'Spending'}, inplace=True)

# Просмотр данных
print(data.head())
print(data.info())

# Шаг 2: Исследовательский анализ данных (EDA)
plt.figure(figsize=(12, 8))
sns.pairplot(data.iloc[:, 2:], hue='Gender')
plt.suptitle('Взаимосвязи между числовыми признаками', y=1.02)
plt.show()

# Шаг 3: Подготовка данных для кластеризации
features = data[['Age', 'Income', 'Spending']]
scaler = StandardScaler()
scaled_features = scaler.fit_transform(features)

# Шаг 4: Определение оптимального числа кластеров
inertia = []
silhouette_scores = []
for k in range(2, 11):
kmeans = KMeans(n_clusters=k, random_state=42)
kmeans.fit(scaled_features)
inertia.append(kmeans.inertia_)
score = silhouette_score(scaled_features, kmeans.labels_)
silhouette_scores.append(score)

# Визуализация метода локтя и силуэтного анализа
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.plot(range(2, 11), inertia, marker='o')
plt.xlabel('Количество кластеров')
plt.ylabel('Инерция')
plt.title('Метод локтя')

plt.subplot(1, 2, 2)
plt.plot(range(2, 11), silhouette_scores, marker='o')
plt.xlabel('Количество кластеров')
plt.ylabel('Средний силуэтный коэффициент')
plt.title('Силуэтный анализ')
plt.tight_layout()
plt.show()

# Шаг 5: Применение K-means с оптимальным числом кластеров
optimal_k = 5 # По результатам анализа
kmeans = KMeans(n_clusters=optimal_k, random_state=42)
data['Cluster'] = kmeans.fit_predict(scaled_features)

# Шаг 6: Анализ результатов кластеризации
# Характеристики кластеров
cluster_summary = data.groupby('Cluster').mean()
print(cluster_summary)

# Визуализация кластеров (для пары признаков)
plt.figure(figsize=(10, 8))
sns.scatterplot(x='Income', y='Spending', hue='Cluster', data=data, palette='viridis', s=100)
plt.title('Кластеры клиентов по доходу и расходам')
plt.xlabel('Годовой доход (k$)')
plt.ylabel('Оценка расходов (1-100)')
plt.show()

# Трехмерная визуализация (для всех трех признаков)
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(12, 10))
ax = fig.add_subplot(111, projection='3d')
scatter = ax.scatter(data['Age'], data['Income'], data['Spending'], 
c=data['Cluster'], cmap='viridis', s=60)
ax.set_xlabel('Возраст')
ax.set_ylabel('Доход (k$)')
ax.set_zlabel('Оценка расходов (1-100)')
ax.set_title('3D кластеризация клиентов')
plt.colorbar(scatter, label='Кластер')
plt.show()

После выполнения кластеризации, мы можем интерпретировать полученные сегменты клиентов:

  • Кластер 0: "Экономные пожилые" – клиенты старшего возраста с низкими доходами и низким уровнем расходов
  • Кластер 1: "Состоятельные консерваторы" – клиенты с высоким доходом, но умеренными расходами
  • Кластер 2: "Целевые покупатели" – клиенты среднего возраста со средним доходом и средними расходами
  • Кластер 3: "Импульсивные покупатели" – молодые клиенты с низким доходом, но высоким уровнем расходов
  • Кластер 4: "Премиум-клиенты" – состоятельные клиенты с высоким уровнем расходов

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

Визуализация результатов и оценка качества кластеризации

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

Методы визуализации кластеров

Визуализация кластеров помогает "увидеть" структуру данных и оценить, насколько хорошо алгоритм разделил точки данных.

Python
Скопировать код
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE

# 1. Визуализация через PCA (для многомерных данных)
pca = PCA(n_components=2)
pca_result = pca.fit_transform(scaled_features)

plt.figure(figsize=(10, 8))
sns.scatterplot(x=pca_result[:, 0], y=pca_result[:, 1], hue=data['Cluster'], 
palette='viridis', s=100, alpha=0.8)
plt.title('PCA проекция кластеров')
plt.xlabel('Первая главная компонента')
plt.ylabel('Вторая главная компонента')
plt.legend(title='Кластер')
plt.grid(True, linestyle='--', alpha=0.7)
plt.show()

# 2. Визуализация через t-SNE (для сохранения локальной структуры)
tsne = TSNE(n_components=2, perplexity=30, random_state=42)
tsne_result = tsne.fit_transform(scaled_features)

plt.figure(figsize=(10, 8))
sns.scatterplot(x=tsne_result[:, 0], y=tsne_result[:, 1], hue=data['Cluster'], 
palette='viridis', s=100, alpha=0.8)
plt.title('t-SNE проекция кластеров')
plt.xlabel('t-SNE компонента 1')
plt.ylabel('t-SNE компонента 2')
plt.legend(title='Кластер')
plt.grid(True, linestyle='--', alpha=0.7)
plt.show()

# 3. Тепловая карта центроидов кластеров
centers = scaler.inverse_transform(kmeans.cluster_centers_)
centers_df = pd.DataFrame(centers, columns=features.columns)
centers_df.index.name = 'Кластер'

plt.figure(figsize=(12, 8))
sns.heatmap(centers_df, annot=True, cmap='YlGnBu', fmt='.2f', linewidths=.5)
plt.title('Характеристики центроидов кластеров')
plt.show()

# 4. Параллельные координаты для многомерных данных
from pandas.plotting import parallel_coordinates

# Добавляем метки кластеров к масштабированным данным
scaled_df = pd.DataFrame(scaled_features, columns=features.columns)
scaled_df['Cluster'] = data['Cluster']

plt.figure(figsize=(14, 8))
parallel_coordinates(scaled_df, 'Cluster', colormap='viridis')
plt.title('Параллельные координаты для кластеров')
plt.grid(True, linestyle='--', alpha=0.5)
plt.legend(title='Кластер')
plt.show()

Методы оценки качества кластеризации

В отличие от алгоритмов обучения с учителем, для кластеризации нет "истинных меток" для сравнения. Поэтому используются специальные метрики для оценки качества кластеризации.

Метрика Описание Интерпретация Реализация в Python
Силуэтный коэффициент Оценивает, насколько точки близки к своему кластеру по сравнению с другими кластерами [-1, 1], выше значение означает лучшую кластеризацию sklearn.metrics.silhouette_score
Индекс Дэвиса-Болдина Оценивает соотношение внутри- и межкластерных расстояний Ниже значение означает лучшую кластеризацию sklearn.metrics.daviesbouldinscore
Индекс Калински-Харабаза Соотношение дисперсии между и внутри кластеров Выше значение означает лучшую кластеризацию sklearn.metrics.calinskiharabaszscore
Инерция Сумма квадратов расстояний до ближайшего центроида Ниже значение означает лучшую компактность кластеров kmeans.inertia_
Python
Скопировать код
from sklearn.metrics import silhouette_score, davies_bouldin_score, calinski_harabasz_score

# Расчет различных метрик оценки качества
labels = data['Cluster']

silhouette = silhouette_score(scaled_features, labels)
davies_bouldin = davies_bouldin_score(scaled_features, labels)
calinski_harabasz = calinski_harabasz_score(scaled_features, labels)
inertia = kmeans.inertia_

print(f"Силуэтный коэффициент: {silhouette:.4f}")
print(f"Индекс Дэвиса-Болдина: {davies_bouldin:.4f}")
print(f"Индекс Калински-Харабаза: {calinski_harabasz:.4f}")
print(f"Инерция: {inertia:.4f}")

# Визуализация силуэтных коэффициентов для каждой точки
from sklearn.metrics import silhouette_samples

silhouette_vals = silhouette_samples(scaled_features, labels)

plt.figure(figsize=(12, 8))
for i in range(optimal_k):
cluster_silhouette_vals = silhouette_vals[labels == i]
cluster_silhouette_vals.sort()
y_ticks = np.arange(0, len(cluster_silhouette_vals))

color = plt.cm.viridis(i / optimal_k)
plt.barh(y_ticks, cluster_silhouette_vals, height=1.0, edgecolor='none', color=color)

cluster_size = len(cluster_silhouette_vals)
plt.axvline(silhouette, color='red', linestyle='--')

plt.yticks([])
plt.xlabel('Силуэтный коэффициент')
plt.ylabel('Кластер')
plt.title('Силуэтный анализ для каждого кластера')
plt.tight_layout()
plt.show()

# Сравнение разных алгоритмов кластеризации
from sklearn.cluster import KMeans, DBSCAN, AgglomerativeClustering

algorithms = {
'K-means': KMeans(n_clusters=optimal_k, random_state=42),
'DBSCAN': DBSCAN(eps=0.5, min_samples=5),
'Agglomerative': AgglomerativeClustering(n_clusters=optimal_k)
}

metrics = {}
for name, algorithm in algorithms.items():
cluster_labels = algorithm.fit_predict(scaled_features)

# Для DBSCAN могут быть точки, помеченные как шум (-1)
if -1 in cluster_labels:
valid_indices = cluster_labels != -1
valid_features = scaled_features[valid_indices]
valid_labels = cluster_labels[valid_indices]
if len(set(valid_labels)) > 1: # Должно быть как минимум 2 кластера для метрик
silhouette = silhouette_score(valid_features, valid_labels)
davies_bouldin = davies_bouldin_score(valid_features, valid_labels)
calinski_harabasz = calinski_harabasz_score(valid_features, valid_labels)
else:
silhouette, davies_bouldin, calinski_harabasz = 0, 0, 0
else:
silhouette = silhouette_score(scaled_features, cluster_labels)
davies_bouldin = davies_bouldin_score(scaled_features, cluster_labels)
calinski_harabasz = calinski_harabasz_score(scaled_features, cluster_labels)

metrics[name] = {
'Силуэтный коэффициент': silhouette,
'Индекс Дэвиса-Болдина': davies_bouldin,
'Индекс Калински-Харабаза': calinski_harabasz,
'Количество кластеров': len(set(cluster_labels)) – (1 if -1 in cluster_labels else 0)
}

# Вывод сравнительной таблицы алгоритмов
metrics_df = pd.DataFrame(metrics).T
print(metrics_df)

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

Интерпретация результатов кластеризации – это искусство, сочетающее анализ данных и понимание предметной области. Кластеры должны быть не только статистически обоснованными, но и иметь практический смысл для конкретной задачи.

Кластеризация – мощный инструмент в арсенале аналитика данных, позволяющий автоматически группировать объекты по схожим характеристикам и выявлять скрытые структуры в данных. Как мы убедились, Python с его богатой экосистемой библиотек предоставляет все необходимые инструменты для эффективной кластеризации – от классического K-means до продвинутых нейросетевых подходов. Ключом к успешной кластеризации является не только правильный выбор алгоритма, но и тщательная подготовка данных, визуализация результатов и критическая оценка полученных кластеров. Помните, что лучшая кластеризация – не та, что показывает наивысшие метрики, а та, что дает ценные инсайты и помогает принимать обоснованные решения в вашем конкретном контексте.

Загрузка...