IIS_2023_1/basharin_sevastyan_lab_4/main.py

93 lines
5.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
import matplotlib.pyplot as plt
''' Названия столбцов набора данных и их описание:
Id: Уникальный идентификатор для каждого автомобиля в списке.
Price: Ценовой диапазон автомобилей с конкретными ценниками и подсчетами. (111000 - 77500000)
Company Name: Название компании-производителя автомобилей с указанием процентной доли представительства каждой компании.
Model Name: Название модели автомобилей с указанием процентного соотношения каждой модели.
Model Year: Диапазон лет выпуска автомобилей с указанием количества и процентных соотношений. (1990 - 2019)
Location: Местоположение автомобилей с указанием регионов, где они доступны для покупки, а также их процентное соотношение.
Mileage: Информация о пробеге автомобилей с указанием диапазонов пробега, количества и процентов. (1 - 999999)
Engine Type: Описания типов двигателей с процентными соотношениями для каждого типа.
Engine Capacity: Мощность двигателя варьируется в зависимости от количества и процентов. (16 - 6600)
Color: Цветовое распределение автомобилей с указанием процентных соотношений для каждого цвета.
'''
# Загрузите данные из вашей курсовой работы, предположим, что у вас есть файл CSV.
data = pd.read_csv('Data_pakwheels.csv')
data.pop("Id")
data.dropna(inplace=True) # Удаление строки с пропущенными значениями.
# Преобразуйте категориальные признаки в числовые. Используйте, например, one-hot encoding.
# data = pd.get_dummies(data, columns=['Company Name', 'Model Name', 'Location', 'Engine Type', 'Color'])
# Создайте объект LabelEncoder
label_encoder = LabelEncoder()
data['Location'] = label_encoder.fit_transform(data['Location'])
data['Company Name'] = label_encoder.fit_transform(data['Company Name'])
data['Model Name'] = label_encoder.fit_transform(data['Model Name'])
data['Engine Type'] = label_encoder.fit_transform(data['Engine Type'])
data['Color'] = label_encoder.fit_transform(data['Color'])
data['Assembly'] = label_encoder.fit_transform(data['Assembly'])
data['Body Type'] = label_encoder.fit_transform(data['Body Type'])
data['Transmission Type'] = label_encoder.fit_transform(data['Transmission Type'])
data['Registration Status'] = label_encoder.fit_transform(data['Registration Status'])
# Выбор признаков для кластеризации
features = ['Price', 'Model Year', 'Mileage', 'Engine Capacity']
# Выбор числа кластеров с использованием метода локтя
inertia = []
for n_clusters in range(1, 11):
kmeans = KMeans(n_clusters=n_clusters, random_state=42)
kmeans.fit(data[features])
inertia.append(kmeans.inertia_)
# Визуализация метода локтя
plt.plot(range(1, 11), inertia, marker='o')
plt.xlabel('Number of clusters')
plt.ylabel('Inertia')
plt.title('Elbow Method for Optimal k')
plt.show()
# Выбор оптимального числа кластеров (пример, если "локоть" находится при k=3)
optimal_clusters = 5
# Применение K-means
kmeans = KMeans(n_clusters=optimal_clusters, random_state=42)
data['Cluster'] = kmeans.fit_predict(data[features])
# получение меток кластеров
labels = kmeans.labels_
data['Cluster'] = labels
# оценка качества с помощью коэффициента силуэта
silhouette = silhouette_score(data[features].values, labels)
print(f"Коэффициент силуэта: {silhouette:.2f}")
# Интерпретация результатов
for cluster_num in range(optimal_clusters):
cluster_data = data[data['Cluster'] == cluster_num]
print(f"\nCluster {cluster_num + 1} characteristics:")
print(cluster_data[features].describe())
# Дополнительная визуализация, например, по двум признакам
plt.scatter(data['Price'], data['Mileage'], c=data['Cluster'], cmap='viridis')
plt.xlabel('Price')
plt.ylabel('Mileage')
plt.title('Clustering Results')
plt.show()
# получение меток кластеров
labels = kmeans.labels_
data['Cluster'] = labels
# оценка качества с помощью коэффициента силуэта
silhouette = silhouette_score(data[features].values, labels)
print(f"Коэффициент силуэта: {silhouette:.2f}")