IIS_2023_1/basharin_sevastyan_lab_4/README.md

111 lines
8.2 KiB
Markdown
Raw 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.

## Лабораторная работа 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 подходит для решения поставленной задачи.