936 KiB
936 KiB
загрузим датасет¶
In [2]:
import pandas as pd
df = pd.read_csv("..//static//csv//car_price_prediction.csv", sep=",")
df
Out[2]:
In [3]:
# Шаг 1: Импорт необходимых библиотек
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans, AgglomerativeClustering
from sklearn.metrics import silhouette_score
from scipy.cluster.hierarchy import dendrogram, linkage
# Шаг 2: Предобработка данных
# Удалим колонку ID, которая не имеет смысла для анализа
df = df.drop(columns=["ID"])
# Преобразуем категориальные переменные в числовые
df = pd.get_dummies(df, drop_first=True)
# Нормализуем данные (все числовые данные приводим к одному масштабу)
scaler = StandardScaler()
df_scaled = scaler.fit_transform(df)
# Шаг 3: Понижение размерности с помощью PCA для визуализации
pca = PCA(n_components=2)
df_pca = pca.fit_transform(df_scaled)
# Визуализация данных после понижения размерности
plt.figure(figsize=(8, 6))
plt.scatter(df_pca[:, 0], df_pca[:, 1], c='blue', edgecolor='k', alpha=0.6)
plt.title("PCA: Визуализация данных после понижения размерности")
plt.xlabel("Компонента 1")
plt.ylabel("Компонента 2")
plt.show()
# Шаг 4: Выбор количества кластеров с помощью метода локтя и коэффициента силуэта
# Метод локтя
inertia = []
for k in range(1, 11):
kmeans = KMeans(n_clusters=k, random_state=42)
kmeans.fit(df_scaled)
inertia.append(kmeans.inertia_)
plt.figure(figsize=(8, 6))
plt.plot(range(1, 11), inertia, marker='o')
plt.title('Метод локтя для выбора количества кластеров')
plt.xlabel('Количество кластеров')
plt.ylabel('Инерция')
plt.show()
# Метод силуэта
silhouette_scores = []
for k in range(2, 11): # начинаем с 2, так как для одного кластера не имеет смысла вычислять силуэт
kmeans = KMeans(n_clusters=k, random_state=42)
kmeans.fit(df_scaled)
score = silhouette_score(df_scaled, kmeans.labels_)
silhouette_scores.append(score)
plt.figure(figsize=(8, 6))
plt.plot(range(2, 11), silhouette_scores, marker='o')
plt.title('Коэффициент силуэта для различных количеств кластеров')
plt.xlabel('Количество кластеров')
plt.ylabel('Коэффициент силуэта')
plt.show()
# Шаг 5: Кластеризация с выбранным количеством кластеров (например, 3)
kmeans = KMeans(n_clusters=3, random_state=42)
df['Cluster'] = kmeans.fit_predict(df_scaled)
# Визуализация кластеров на основе PCA
plt.figure(figsize=(8, 6))
plt.scatter(df_pca[:, 0], df_pca[:, 1], c=df['Cluster'], cmap='viridis', edgecolor='k', alpha=0.6)
plt.title("Визуализация кластеров с использованием PCA")
plt.xlabel("Компонента 1")
plt.ylabel("Компонента 2")
plt.colorbar(label='Cluster')
plt.show()
# Шаг 6: Иерархическая кластеризация
Z = linkage(df_scaled, method='ward')
plt.figure(figsize=(10, 7))
dendrogram(Z)
plt.title("Дендограмма для иерархической кластеризации")
plt.show()
# Применение иерархической кластеризации с выбранным количеством кластеров
hierarchical = AgglomerativeClustering(n_clusters=3)
df['Hierarchical Cluster'] = hierarchical.fit_predict(df_scaled)
# Визуализация кластеров для иерархической кластеризации
plt.figure(figsize=(8, 6))
plt.scatter(df_pca[:, 0], df_pca[:, 1], c=df['Hierarchical Cluster'], cmap='viridis', edgecolor='k', alpha=0.6)
plt.title("Визуализация кластеров иерархической кластеризации")
plt.xlabel("Компонента 1")
plt.ylabel("Компонента 2")
plt.colorbar(label='Cluster')
plt.show()
# Шаг 7: Оценка качества кластеризации
silhouette_kmeans = silhouette_score(df_scaled, df['Cluster'])
silhouette_hierarchical = silhouette_score(df_scaled, df['Hierarchical Cluster'])
print(f"Коэффициент силуэта для K-means: {silhouette_kmeans:.4f}")
print(f"Коэффициент силуэта для иерархической кластеризации: {silhouette_hierarchical:.4f}")