## Лабораторная работа 4. Вариант 5. ### Задание Использовать метод кластеризации по варианту для набора данных, самостоятельно сформулировав задачу. Интерпретировать результаты и оценить, насколько хорошо он подходит для решения сформулированной вами задачи. Алгоритм кластеризации: K-means ### Как запустить Для запуска программы необходимо с помощью командной строки в корневой директории файлов прокета прописать: ``` python python main.py ``` ### Используемые технологии - Библиотека `pandas`, используемая для работы с данными для анализа scv формата. - `sklearn` (scikit-learn): Scikit-learn - это библиотека для машинного обучения и анализа данных в Python. Из данной библиотеки были использованы следующие модули: - `KMeans` - реализация алгоритма K-means для кластеризации данных. - `LabelEncoder` - это класс из scikit-learn, используемый для преобразования категориальных признаков (например, строки) в числовые значения. - `matplotlib.pyplot` - библиотека для визуализации данных, используется для построения графика метода локтя и визуализации результатов кластеризации. ### Описание работы #### Описание набора данных Набор данных: набор данных о цене автомобиля в автопарке. Названия столбцов набора данных и их описание: - Id: Уникальный идентификатор для каждого автомобиля в списке. - Price: Ценовой диапазон автомобилей с конкретными ценниками и подсчетами. (111000 - 77500000) - Company Name: Название компании-производителя автомобилей с указанием процентной доли представительства каждой компании. - Model Name: Название модели автомобилей с указанием процентного соотношения каждой модели. - Model Year: Диапазон лет выпуска автомобилей с указанием количества и процентных соотношений. (1990 - 2019) - Location: Местоположение автомобилей с указанием регионов, где они доступны для покупки, а также их процентное соотношение. - Mileage: Информация о пробеге автомобилей с указанием диапазонов пробега, количества и процентов. (1 - 999999) - Engine Type: Описания типов двигателей с процентными соотношениями для каждого типа. - Engine Capacity: Мощность двигателя варьируется в зависимости от количества и процентов. (16 - 6600) - Color: Цветовое распределение автомобилей с указанием процентных соотношений для каждого цвета. - Assembly: Импорт или местный рынок. - Body Type: Тип кузова. - Transmission Type: Тип трансмиссии. - Registration Status: Статус регистрации. Ссылка на страницу набора на kuggle: [Ultimate Car Price Prediction Dataset](https://www.kaggle.com/datasets/mohidabdulrehman/ultimate-car-price-prediction-dataset/data) #### Оцифровка и нормализация данных Для нормальной работы с данными, необходимо исключить из них все нечисловые значения. После этого, представить все строковые значения параметров как числовые и очистить датасет от "мусора". Для удаления нечисловых значений воспользуемся функцией `.dropna()`. Так же мы удаляем первый столбец `Id`, так как при открытии файла в `pd` он сам нумерует строки. Все нечисловые значения мы преобразуем в числовые с помощью `LabelEncoder`: ```python 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']) ``` #### Выбор признаков для кластеризации: ```python features = ['Price', 'Model Year', 'Mileage', 'Engine Capacity'] ``` Данный набор признаков был выбран, так как многие из них показали высокую важность в предыдущей лабораторной работе. #### Метод локтя Алгоритм K-средних требует четкого задание количества кластеров. Выберем количество кластеров, используя метод локтя. ```python from sklearn.cluster import KMeans 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_) ``` В результате мы получим следующий график: ![](elbow.png "Точность") Анализирую этот график, видим, что примерно на 5-6 шаге инерция меняется уже не значительно. Задаем значение кластеров равным 5. ```python optimal_clusters = 5 ``` #### Применение K-means K-means применяется с оптимальным числом кластеров, вычисленным на предыдущем этапе. ```python from sklearn.cluster import KMeans kmeans = KMeans(n_clusters=optimal_clusters, random_state=42) data['Cluster'] = kmeans.fit_predict(data[features]) ``` #### Интерпретация результатов Для каждого кластера выводятся статистические характеристики выбранных признаков. ![](clust1.png "Точность") ![](clust2.png "Точность") #### Визуализация результатов Результаты кластеризации визуализируются на графике рассеяния, например, по двум признакам. ![](engine_clust.png "Точность") ![](mileage_clust.png "Точность") ### Вывод На основе графиков и интерпретированных результатов можно сделать вывод, что кластеризация проведена верно. Коэффициент силуэта: `0.62`. Коэффициент может варьироваться от -1 до 1, можно сказать, что оценка высокая и метод K-means подходит для решения поставленной задачи.