- •Добавление нового атрибута
- •Пропущенные значения
- •Удаление выбросов
- •Построение графиков для поиска кластеров
- •Анализ кластеров
- •Методы локтя и силуэта для определения оптимального числа кластеров
- •Применение k-Means
- •Графики для визуализации результатов кластеризации
- •Анализ характристик кластеров
- •Визуализация средних значений по кластерам
Применение k-Means
Программа:
kmeans = KMeans(n_clusters=optimal_k, random_state=42, n_init=10)
clusters = kmeans.fit_predict(X_scaled)
df_clean['Cluster'] = clusters
print(f"Кластеризация завершена. Создано {optimal_k} кластера.")
print("Распределение по кластерам:")
cluster_counts = df_clean['Cluster'].value_counts().sort_index()
for cluster, count in cluster_counts.items():
print(f"Кластер {cluster}: {count} записей ({count/len(df_clean)*100:.1f}%)")
Результат: Распределение по кластерам:
Кластер 0: 585 записей (59.6%)
Кластер 1: 331 записей (33.7%)
Кластер 2: 65 записей (6.6%)
Наблюдения:
K-means кластеризация выявила три чётких группы бетонных смесей: стандартные (59.6%), экономичные (33.7%) и высокопрочные (6.6%). Это распределение соответствует реальной структуре строительного рынка. Кластеризация позволяет автоматически классифицировать рецептуры, что полезно для оптимизации производства и контроля качества бетона.
Графики для визуализации результатов кластеризации
Программа:
# Визуализация результатов кластеризации
fig, axes = plt.subplots(2, 2, figsize=(15, 12))
# Цемент vs Прочность с кластерами
scatter1 = axes[0,0].scatter(df_clean['Cement'], df_clean['Comp_Strength'],
c=df_clean['Cluster'], cmap='viridis', alpha=0.7)
axes[0,0].set_xlabel('Цемент (кг/м³)')
axes[0,0].set_ylabel('Прочность (МПа)')
axes[0,0].set_title('Кластеризация: Цемент vs Прочность')
plt.colorbar(scatter1, ax=axes[0,0])
# Цемент/Вода vs Прочность с кластерами
scatter2 = axes[0,1].scatter(df_clean['Cement/Water'], df_clean['Comp_Strength'],
c=df_clean['Cluster'], cmap='plasma', alpha=0.7)
axes[0,1].set_xlabel('Отношение Цемент/Вода')
axes[0,1].set_ylabel('Прочность (МПа)')
axes[0,1].set_title('Кластеризация: Цемент/Вода vs Прочность')
plt.colorbar(scatter2, ax=axes[0,1])
# Возраст vs Прочность с кластерами
scatter3 = axes[1,0].scatter(df_clean['Age'], df_clean['Comp_Strength'],
c=df_clean['Cluster'], cmap='cool', alpha=0.7)
axes[1,0].set_xlabel('Возраст (дни)')
axes[1,0].set_ylabel('Прочность (МПа)')
axes[1,0].set_title('Кластеризация: Возраст vs Прочность')
plt.colorbar(scatter3, ax=axes[1,0])
# Вода vs Прочность с кластерами
scatter4 = axes[1,1].scatter(df_clean['Water'], df_clean['Comp_Strength'],
c=df_clean['Cluster'], cmap='spring', alpha=0.7)
axes[1,1].set_xlabel('Вода (кг/м³)')
axes[1,1].set_ylabel('Прочность (МПа)')
axes[1,1].set_title('Кластеризация: Вода vs Прочность')
plt.colorbar(scatter4, ax=axes[1,1])
plt.tight_layout()
plt.show()
Результаты:
Анализ характристик кластеров
Программа:
print("ХАРАКТЕРИСТИКИ КЛАСТЕРОВ:")
cluster_stats = df_clean.groupby('Cluster')[features].mean()
display(cluster_stats.round(2))
Результаты:
|
Cement |
Water |
Age |
Cement/Water |
Comp_Strength |
Cluster |
|
|
|
|
|
0 |
216.49 |
185.49 |
30.17 |
1.17 |
26.70 |
1 |
366.84 |
171.46 |
34.30 |
2.15 |
47.04 |
2 |
327.20 |
214.47 |
240.77 |
1.53 |
43.12 |
Наблюдения:
- Экономичный подход (59.6%): Минимальный цемент, стандартные сроки, прочность 27 МПа
- Высокотехнологичный подход (33.7%): Максимальный цемент, оптимальное водоцементное отношение, прочность 47 МПа за месяц
- Временной подход (6.6%): Умеренный цемент, но длительное твердение (240 дней), прочность 43 МПа
Практическая ценность: Кластеризация позволяет производителям выбирать стратегию в зависимости от требований проекта (срочность/бюджет/прочность) и прогнозировать результат.
