- •Добавление нового атрибута
- •Пропущенные значения
- •Удаление выбросов
- •Построение графиков для поиска кластеров
- •Анализ кластеров
- •Методы локтя и силуэта для определения оптимального числа кластеров
- •Применение k-Means
- •Графики для визуализации результатов кластеризации
- •Анализ характристик кластеров
- •Визуализация средних значений по кластерам
Построение графиков для поиска кластеров
Программа:
# Построим scatter plot для поиска кластеров
fig, axes = plt.subplots(2, 2, figsize=(15, 12))
# График 1: Цемент vs Прочность
axes[0,0].scatter(df_clean['Cement'], df_clean['Comp_Strength'], alpha=0.6, c='blue')
axes[0,0].set_xlabel('Цемент (кг/м³)')
axes[0,0].set_ylabel('Прочность (МПа)')
axes[0,0].set_title('Цемент vs Прочность')
axes[0,0].grid(True)
# График 2: Отношение цемент/вода vs Прочность
axes[0,1].scatter(df_clean['Cement/Water'], df_clean['Comp_Strength'], alpha=0.6, c='green')
axes[0,1].set_xlabel('Отношение Цемент/Вода')
axes[0,1].set_ylabel('Прочность (МПа)')
axes[0,1].set_title('Цемент/Вода vs Прочность')
axes[0,1].grid(True)
# График 3: Возраст vs Прочность
axes[1,0].scatter(df_clean['Age'], df_clean['Comp_Strength'], alpha=0.6, c='red')
axes[1,0].set_xlabel('Возраст (дни)')
axes[1,0].set_ylabel('Прочность (МПа)')
axes[1,0].set_title('Возраст vs Прочность')
axes[1,0].grid(True)
# График 4: Вода vs Прочность
axes[1,1].scatter(df_clean['Water'], df_clean['Comp_Strength'], alpha=0.6, c='purple')
axes[1,1].set_xlabel('Вода (кг/м³)')
axes[1,1].set_ylabel('Прочность (МПа)')
axes[1,1].set_title('Вода vs Прочность')
axes[1,1].grid(True)
plt.tight_layout()
plt.show()
Результаты:
Анализ кластеров
На графиках видны естественные группы бетонов:
- Низкопрочные смеси (мало цемента, много воды)
- Среднепрочные смеси (средние показатели)
- Высокопрочные смеси (много цемента, оптимальное водоцементное отношение)
Отношение цемент/вода хорошо разделяет смеси по эффективности
Признаки для кластеризации:
['Cement', 'Water', 'Age', 'Cement/Water', 'Comp_Strength']
Размерность данных: (981, 5)
Методы локтя и силуэта для определения оптимального числа кластеров
Программа:
inertia = []
silhouette_scores = []
k_range = range(2, 8)
for k in k_range:
kmeans = KMeans(n_clusters=k, random_state=42, n_init=10)
kmeans.fit(X_scaled)
inertia.append(kmeans.inertia_)
silhouette_scores.append(silhouette_score(X_scaled, kmeans.labels_))
# Визуализация метода локтя
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 5))
ax1.plot(k_range, inertia, 'bo-')
ax1.set_xlabel('Количество кластеров')
ax1.set_ylabel('Inertia')
ax1.set_title('Метод локтя')
ax1.grid(True)
ax2.plot(k_range, silhouette_scores, 'ro-')
ax2.set_xlabel('Количество кластеров')
ax2.set_ylabel('Silhouette Score')
ax2.set_title('Silhouette Score')
ax2.grid(True)
plt.tight_layout()
plt.show()
Метод локтя анализирует внутрикластерную дисперсию (inertia). Оптимальное k соответствует точке на графике, где уменьшение inertia резко замедляется, образуя "локоть".
Метод силуэта оценивает качество кластеризации по шкале от -1 до 1, где значения ближе к 1 указывают на хорошо разделенные кластеры.
Анализ оптимального числа кластеров
k = 2: Silhouette Score = 0.324
k = 3: Silhouette Score = 0.362
k = 4: Silhouette Score = 0.286
k = 5: Silhouette Score = 0.293
k = 6: Silhouette Score = 0.255
k = 7: Silhouette Score = 0.274
Выбрано количество кластеров: 3
