# Кластерный анализ
## Метод к-средних



Дана матрица данных $X$ и дано число $k$ предполагаемых кластеров. Цель кластеризации представить данные в виде групп кластеров $C=\{C_1, C_2, \ldots, C_k\}$. Каждый кластер имеет свой центр:

\begin{equation}
\mu_i = \frac{1}{n_i} \sum \limits_{x_j \in C_i} x_j
\end{equation}

где $n_i = |C_i|$ - это количество точек в кластере $C_i$.

Таким образом, мы имеем некоторые кластеры $C=\{C_1, C_2, \ldots, C_k\}$ и необходимо оценить качество разбиения. Для этого будем вычислять сумму квадратических ошибок (SSE):

\begin{equation}
SSE(C) = \sum \limits_{i=1}^{k} \sum \limits_{x_j \in C_i} ||x_j - \mu_i||^2
\end{equation}

Цель найти
\begin{equation}
C^* = arg\min\limits_C \{SSE(C)\}
\end{equation}

### Алгоритм к-средних
На вход алгоритм получает матрицу данных $D$, количество кластеров $k$, и критерий остановки $\epsilon$:
1. t = 0
2. случайным образом инициализируем $k$ центров кластеров: $\mu_1^t, \mu_2^t, \ldots, \mu_k^t \in R^d$;
3. повторять
    4. $t = t + 1$;
    5. $C_j = 0$ для всех $j = 1, \ldots, k$
    6. для каждого $x_j \in D$
        7. $j^* = arg\min\limits_C \{||X_j - \mu_i^{t-1}||^2\}$ \\\ присваиваем $x_j$ к ближайшему центру
        8. $C_{j^*} = C_{j^*} \cup {x_j}$
    9. для каждого i=1 до k
        10. $\mu_i = \frac{1}{|C_i|} \sum_{x_j \in C_i} x_j$
11. пока $\sum_{i=1}^k ||\mu_i^{t} - \mu_i^{t-1}||^2 \leq \epsilon$

## Задание
1. Написать программу, реализующую алгоритм к-средних.
2. Визуализировать сходимость центров кластеров.
3. Оценить $SSE$ для значений $k = 1, \ldots, 10$ и построить график зависимости $SSE$ от количества кластеров.


```python
import matplotlib.pyplot as plt
import numpy as np
from scipy.spatial import distance
from sklearn.datasets import make_blobs
X, Y = make_blobs(n_samples = 1000, n_features=2, centers=5, cluster_std = 1.2, random_state=17)
plt.scatter(X[:,0], X[:,1])
plt.show()
```


```python
def get_center(cluster):
    return np.array([cluster[:,0].mean(), cluster[:,1].mean()])

def get_dist(point_1, point_2):
    return np.linalg.norm(point_1 - point_2)
                          
def get_clusters(X, centers):
    clusters = dict()
    for point in X:           
        best_cluster = min([(index, get_dist(point, center)) for index, center in enumerate(centers)],
                          key=lambda t:t[1])[0]
        try:
            clusters[best_cluster].append(point)
        except KeyError:
            clusters[best_cluster] = [point]
    return {key: np.array(clusters[key]) for key in clusters} 
                          
def get_new_value_centers(clusters):
    new_centers = list()
    for key in clusters:
        new_centers.append(np.mean(clusters[key], axis = 0))
    return np.array(new_centers)
                          
def get_cluster_plt(clusters):
    for key in clusters:
        plt.scatter(clusters[key][0:,0], clusters[key][0:,1])
    plt.show() 
                          
def k_means(X, k, early_stop, show_clusters=False):
    centers = np.array([get_center(cluster) for cluster in np.array_split(X, k)])
    eps = float("inf")
    while eps >= early_stop:
        clusters = get_clusters(X, centers)
        if show_clusters: get_cluster_plt(clusters)
        new_centers = get_new_value_centers(clusters)
        eps = sum([get_dist(centers[index], new_centers[index]) for index, _ in enumerate(new_centers)])
        centers = new_centers
    return clusters              
```

Сходимость центров кластеров


```python
clusters = k_means(X, 4, 0.1, show_clusters=True)
```

Оценка SSE


```python
def k_means_centers(X, k, early_stop, show_clusters=False):
    centers = np.array([get_center(cluster) for cluster in np.array_split(X, k)])
    eps = float("inf")
    while eps >= early_stop:
        clusters = get_clusters(X, centers)
        if show_clusters: get_cluster_plt(clusters)
        new_centers = get_new_value_centers(clusters)
        eps = sum([get_dist(centers[index], new_centers[index]) for index, _ in enumerate(new_centers)])
        centers = new_centers
    return centers
```


```python
def get_sse(data,clusters):
    error = 0
    for j in range(len(data)):
        min_cluster_distance = min([distance.euclidean(clusters[i],data[j]) for i in range(len(clusters))])
        error = error + min_cluster_distance ** 2
    return error

k = list(range(1,11))
k_sse = [get_sse(X,k_means_centers(X,k[i],0.1)) for i in range(len(k))]

plt.plot(k, k_sse)
plt.gcf().set_size_inches(18.5, 10.5)
```

## Реальные данные

используйте метод KMeans из sklearn.clustering

1. Выбрать оптимальное количество кластеров.
2. Построить 
2. Произвести анализ получившихся кластеров:
    1. определите средний год автомобилей;
    2. определите средний пробег автомобилей;
    3. определите среднюю мощность;
    4. определите среднюю цену автомобилей;
    5. основные марки автомобилей в кластере;
    6. определите тип топлива;
    7. определите основной тип кузова;
    8. определите основной тип привода;
    9. определите основной тип КПП;
    10. определите количество хозяев автомобиля.
Охарактеризуйте каждый класстер.


```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.read_csv('data.csv', encoding='cp1251')
df = df.drop(columns=['Модель', 'Цвет'])
df.head()
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>Марка</th>
      <th>Год</th>
      <th>Состояние</th>
      <th>Пробег</th>
      <th>Объем</th>
      <th>Топливо</th>
      <th>Мощность</th>
      <th>Кузов</th>
      <th>Привод</th>
      <th>КПП</th>
      <th>Руль</th>
      <th>Хозяев в ПТС</th>
      <th>Цена</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>Volkswagen</td>
      <td>2013.0</td>
      <td>БУ</td>
      <td>42000.0</td>
      <td>1200.0</td>
      <td>бензин</td>
      <td>105.0</td>
      <td>хэтчбек</td>
      <td>передний</td>
      <td>автомат</td>
      <td>левый</td>
      <td>1 владелец</td>
      <td>689196.0</td>
    </tr>
    <tr>
      <th>1</th>
      <td>Skoda</td>
      <td>2012.0</td>
      <td>БУ</td>
      <td>62000.0</td>
      <td>1800.0</td>
      <td>бензин</td>
      <td>152.0</td>
      <td>кроссовер</td>
      <td>полный</td>
      <td>механика</td>
      <td>левый</td>
      <td>1 владелец</td>
      <td>639196.0</td>
    </tr>
    <tr>
      <th>2</th>
      <td>Renault</td>
      <td>2015.0</td>
      <td>БУ</td>
      <td>4700.0</td>
      <td>1600.0</td>
      <td>бензин</td>
      <td>106.0</td>
      <td>хэтчбек</td>
      <td>передний</td>
      <td>механика</td>
      <td>левый</td>
      <td>1 владелец</td>
      <td>629196.0</td>
    </tr>
    <tr>
      <th>3</th>
      <td>Nissan</td>
      <td>2012.0</td>
      <td>БУ</td>
      <td>70000.0</td>
      <td>1600.0</td>
      <td>бензин</td>
      <td>110.0</td>
      <td>хэтчбек</td>
      <td>передний</td>
      <td>автомат</td>
      <td>левый</td>
      <td>1 владелец</td>
      <td>479196.0</td>
    </tr>
    <tr>
      <th>4</th>
      <td>УАЗ</td>
      <td>2014.0</td>
      <td>БУ</td>
      <td>50000.0</td>
      <td>2700.0</td>
      <td>бензин</td>
      <td>128.0</td>
      <td>внедорожник</td>
      <td>полный</td>
      <td>механика</td>
      <td>левый</td>
      <td>1 владелец</td>
      <td>599196.0</td>
    </tr>
  </tbody>
</table>
</div>




```python
new_df = pd.get_dummies(df)
new_df.head()
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>Год</th>
      <th>Пробег</th>
      <th>Объем</th>
      <th>Мощность</th>
      <th>Цена</th>
      <th>Марка_Acura</th>
      <th>Марка_Alfa Romeo</th>
      <th>Марка_Audi</th>
      <th>Марка_BMW</th>
      <th>Марка_BYD</th>
      <th>...</th>
      <th>Привод_полный</th>
      <th>КПП_автомат</th>
      <th>КПП_вариатор</th>
      <th>КПП_механика</th>
      <th>КПП_роботизированная</th>
      <th>Руль_левый</th>
      <th>Руль_правый</th>
      <th>Хозяев в ПТС_1 владелец</th>
      <th>Хозяев в ПТС_2 владельца</th>
      <th>Хозяев в ПТС_3 и более</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>2013.0</td>
      <td>42000.0</td>
      <td>1200.0</td>
      <td>105.0</td>
      <td>689196.0</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>...</td>
      <td>0</td>
      <td>1</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>1</td>
      <td>0</td>
      <td>1</td>
      <td>0</td>
      <td>0</td>
    </tr>
    <tr>
      <th>1</th>
      <td>2012.0</td>
      <td>62000.0</td>
      <td>1800.0</td>
      <td>152.0</td>
      <td>639196.0</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>...</td>
      <td>1</td>
      <td>0</td>
      <td>0</td>
      <td>1</td>
      <td>0</td>
      <td>1</td>
      <td>0</td>
      <td>1</td>
      <td>0</td>
      <td>0</td>
    </tr>
    <tr>
      <th>2</th>
      <td>2015.0</td>
      <td>4700.0</td>
      <td>1600.0</td>
      <td>106.0</td>
      <td>629196.0</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>...</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>1</td>
      <td>0</td>
      <td>1</td>
      <td>0</td>
      <td>1</td>
      <td>0</td>
      <td>0</td>
    </tr>
    <tr>
      <th>3</th>
      <td>2012.0</td>
      <td>70000.0</td>
      <td>1600.0</td>
      <td>110.0</td>
      <td>479196.0</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>...</td>
      <td>0</td>
      <td>1</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>1</td>
      <td>0</td>
      <td>1</td>
      <td>0</td>
      <td>0</td>
    </tr>
    <tr>
      <th>4</th>
      <td>2014.0</td>
      <td>50000.0</td>
      <td>2700.0</td>
      <td>128.0</td>
      <td>599196.0</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>...</td>
      <td>1</td>
      <td>0</td>
      <td>0</td>
      <td>1</td>
      <td>0</td>
      <td>1</td>
      <td>0</td>
      <td>1</td>
      <td>0</td>
      <td>0</td>
    </tr>
  </tbody>
</table>
<p>5 rows × 126 columns</p>
</div>




```python
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
new_df[['Год', 'Пробег', 'Объем', 'Мощность', 'Цена']] = ss.fit_transform(new_df[['Год', 'Пробег', 'Объем', 'Мощность', 'Цена']])
new_df.head()
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>Год</th>
      <th>Пробег</th>
      <th>Объем</th>
      <th>Мощность</th>
      <th>Цена</th>
      <th>Марка_Acura</th>
      <th>Марка_Alfa Romeo</th>
      <th>Марка_Audi</th>
      <th>Марка_BMW</th>
      <th>Марка_BYD</th>
      <th>...</th>
      <th>Привод_полный</th>
      <th>КПП_автомат</th>
      <th>КПП_вариатор</th>
      <th>КПП_механика</th>
      <th>КПП_роботизированная</th>
      <th>Руль_левый</th>
      <th>Руль_правый</th>
      <th>Хозяев в ПТС_1 владелец</th>
      <th>Хозяев в ПТС_2 владельца</th>
      <th>Хозяев в ПТС_3 и более</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1.055883</td>
      <td>-1.129295</td>
      <td>-1.096928</td>
      <td>-0.458895</td>
      <td>0.420103</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>...</td>
      <td>0</td>
      <td>1</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>1</td>
      <td>0</td>
      <td>1</td>
      <td>0</td>
      <td>0</td>
    </tr>
    <tr>
      <th>1</th>
      <td>0.868335</td>
      <td>-0.842782</td>
      <td>-0.125615</td>
      <td>0.440164</td>
      <td>0.315187</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>...</td>
      <td>1</td>
      <td>0</td>
      <td>0</td>
      <td>1</td>
      <td>0</td>
      <td>1</td>
      <td>0</td>
      <td>1</td>
      <td>0</td>
      <td>0</td>
    </tr>
    <tr>
      <th>2</th>
      <td>1.430978</td>
      <td>-1.663641</td>
      <td>-0.449386</td>
      <td>-0.439766</td>
      <td>0.294203</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>...</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>1</td>
      <td>0</td>
      <td>1</td>
      <td>0</td>
      <td>1</td>
      <td>0</td>
      <td>0</td>
    </tr>
    <tr>
      <th>3</th>
      <td>0.868335</td>
      <td>-0.728177</td>
      <td>-0.449386</td>
      <td>-0.363250</td>
      <td>-0.020546</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>...</td>
      <td>0</td>
      <td>1</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>1</td>
      <td>0</td>
      <td>1</td>
      <td>0</td>
      <td>0</td>
    </tr>
    <tr>
      <th>4</th>
      <td>1.243431</td>
      <td>-1.014690</td>
      <td>1.331355</td>
      <td>-0.018930</td>
      <td>0.231254</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>...</td>
      <td>1</td>
      <td>0</td>
      <td>0</td>
      <td>1</td>
      <td>0</td>
      <td>1</td>
      <td>0</td>
      <td>1</td>
      <td>0</td>
      <td>0</td>
    </tr>
  </tbody>
</table>
<p>5 rows × 126 columns</p>
</div>




```python
from sklearn.cluster import KMeans, AgglomerativeClustering, DBSCAN, AffinityPropagation
inertia = []
for it in np.arange(1,20,1):
    method = KMeans(n_clusters=it)
    method.fit(new_df)
    inertia.append(method.inertia_)
    print(it)
```

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19



```python
for i in range(len(inertia)):
    print(i+1,inertia[i]) 
```

    1 303666.09226419945
    2 238066.35809271294
    3 203215.59994571476
    4 188096.71848079565
    5 176308.26383170072
    6 166868.51967859885
    7 160779.23246553304
    8 155563.4221062198
    9 150434.37152236237
    10 146538.95858094987
    11 143247.76194929198
    12 140234.2185084517
    13 137206.36955768696
    14 134389.44205518265
    15 132121.6934500015
    16 129743.02831074157
    17 127996.209894227
    18 126181.09337907878
    19 124530.70736049648


Оптимальное количество кластеров 15


```python
def cls_info(df, k):
    print('------ Кластер ', k, ' -------')
    claster =  df[method.labels_ == k]
    print(claster['Год'].mean())
    print(claster['Пробег'].mean())
    print(claster['Объем'].mean())
    print(claster['Мощность'].mean())
    print(claster['Цена'].mean())
    print(claster['Привод'].value_counts().head(1))
    print(claster['Марка'].value_counts().head(2))
    print(claster['Кузов'].value_counts().head(2))
    print(claster['КПП'].value_counts().head(2))
    print(claster['Хозяев в ПТС'].value_counts().head(2))
    print('---------------------------')
```


```python
print('------ Реальность -------')
print(df['Год'].mean())
print(df['Пробег'].mean())
print(df['Объем'].mean())
print(df['Мощность'].mean())
print(df['Цена'].mean())
print(df['Привод'].value_counts().head(1))
print(df['Марка'].value_counts().head(2))
print(df['Кузов'].value_counts().head(2))
print(df['КПП'].value_counts().head(2))
print(df['Хозяев в ПТС'].value_counts().head(2))
print('---------------------------')
```

    ------ Реальность -------
    2007.3700562551758
    120830.33855906794
    1877.595019846369
    128.98960564265113
    488987.6818298638
    передний    23933
    Name: Привод, dtype: int64
    ВАЗ       5497
    Toyota    2700
    Name: Марка, dtype: int64
    седан      14241
    хэтчбек     8462
    Name: Кузов, dtype: int64
    механика    19308
    автомат     13935
    Name: КПП, dtype: int64
    3 и более      12613
    2 владельца    12070
    Name: Хозяев в ПТС, dtype: int64
    ---------------------------



```python
for it in range(16):
    cls_info(df, it)
```

    ------ Кластер  0  -------
    2012.1751925192518
    63387.76347634764
    1542.7117711771177
    104.2871287128713
    432276.9573707371
    передний    3525
    Name: Привод, dtype: int64
    ВАЗ        684
    Renault    345
    Name: Марка, dtype: int64
    седан      1675
    хэтчбек    1113
    Name: Кузов, dtype: int64
    механика            3556
    роботизированная      60
    Name: КПП, dtype: int64
    1 владелец    3519
    3 и более       75
    Name: Хозяев в ПТС, dtype: int64
    ---------------------------
    ------ Кластер  1  -------
    1998.067221067221
    72930.8024948025
    1722.3146223146223
    84.61607761607762
    86363.76507276508
    задний    554
    Name: Привод, dtype: int64
    ВАЗ    889
    УАЗ    143
    Name: Марка, dtype: int64
    седан          730
    внедорожник    323
    Name: Кузов, dtype: int64
    механика    1383
    автомат       60
    Name: КПП, dtype: int64
    3 и более      757
    2 владельца    468
    Name: Хозяев в ПТС, dtype: int64
    ---------------------------
    ------ Кластер  2  -------
    2012.8614298323037
    60326.43865842895
    2132.8773168578996
    171.48455428067078
    1227472.0706090026
    полный    1404
    Name: Привод, dtype: int64
    Toyota    344
    Audi      203
    Name: Марка, dtype: int64
    кроссовер    1228
    седан         552
    Name: Кузов, dtype: int64
    автомат     1815
    вариатор     229
    Name: КПП, dtype: int64
    1 владелец     1587
    2 владельца     590
    Name: Хозяев в ПТС, dtype: int64
    ---------------------------
    ------ Кластер  3  -------
    1999.6247086247085
    237500.89393939395
    2937.5291375291376
    191.7937062937063
    407217.94755244756
    полный    506
    Name: Привод, dtype: int64
    Mercedes-Benz    142
    BMW              111
    Name: Марка, dtype: int64
    седан          326
    внедорожник    279
    Name: Кузов, dtype: int64
    автомат     717
    механика    133
    Name: КПП, dtype: int64
    3 и более      563
    2 владельца    235
    Name: Хозяев в ПТС, dtype: int64
    ---------------------------
    ------ Кластер  4  -------
    2008.9737206085754
    98074.15952051636
    1448.6399262332873
    95.61180267404333
    298626.3042876902
    передний    2132
    Name: Привод, dtype: int64
    ВАЗ     520
    Ford    235
    Name: Марка, dtype: int64
    хэтчбек        2138
    внедорожник       7
    Name: Кузов, dtype: int64
    механика    1736
    автомат      294
    Name: КПП, dtype: int64
    2 владельца    2168
    1 владелец        1
    Name: Хозяев в ПТС, dtype: int64
    ---------------------------
    ------ Кластер  5  -------
    2008.9607907742998
    108518.84349258649
    1605.7001647446457
    106.36507413509061
    326849.65667215816
    передний    2910
    Name: Привод, dtype: int64
    ВАЗ          495
    Chevrolet    268
    Name: Марка, dtype: int64
    седан        2368
    универсал     238
    Name: Кузов, dtype: int64
    механика    2757
    автомат      194
    Name: КПП, dtype: int64
    2 владельца    3035
    Name: Хозяев в ПТС, dtype: int64
    ---------------------------
    ------ Кластер  6  -------
    2002.2536157024792
    193473.40857438016
    1476.9111570247933
    82.2448347107438
    98850.0444214876
    передний    1843
    Name: Привод, dtype: int64
    ВАЗ       1406
    Daewoo      62
    Name: Марка, dtype: int64
    седан      918
    хэтчбек    783
    Name: Кузов, dtype: int64
    механика    1914
    автомат       15
    Name: КПП, dtype: int64
    3 и более      1259
    2 владельца     491
    Name: Хозяев в ПТС, dtype: int64
    ---------------------------
    ------ Кластер  7  -------
    2011.2364380757422
    91274.27328556807
    3325.793244626407
    256.89252814738995
    1657216.7727737974
    полный    909
    Name: Привод, dtype: int64
    Toyota    183
    BMW       150
    Name: Марка, dtype: int64
    кроссовер      440
    внедорожник    345
    Name: Кузов, dtype: int64
    автомат     931
    вариатор     24
    Name: КПП, dtype: int64
    2 владельца    431
    1 владелец     430
    Name: Хозяев в ПТС, dtype: int64
    ---------------------------
    ------ Кластер  8  -------
    2009.939024390244
    72631.38455284553
    2067.967479674797
    105.95365853658537
    418875.9130081301
    полный    1204
    Name: Привод, dtype: int64
    УАЗ          344
    Chevrolet    289
    Name: Марка, dtype: int64
    внедорожник    1038
    кроссовер        95
    Name: Кузов, dtype: int64
    механика    1215
    автомат       12
    Name: КПП, dtype: int64
    1 владелец     596
    2 владельца    433
    Name: Хозяев в ПТС, dtype: int64
    ---------------------------
    ------ Кластер  9  -------
    2007.0385576579793
    136103.9032488397
    1629.9892895394503
    106.0124955373081
    262912.8768297037
    передний    2686
    Name: Привод, dtype: int64
    ВАЗ     370
    Ford    294
    Name: Марка, dtype: int64
    седан        2489
    универсал     116
    Name: Кузов, dtype: int64
    механика    2465
    автомат      249
    Name: КПП, dtype: int64
    3 и более     2475
    1 владелец     326
    Name: Хозяев в ПТС, dtype: int64
    ---------------------------
    ------ Кластер  10  -------
    2006.8225130890053
    145801.34764397907
    2130.418848167539
    165.565445026178
    513192.24659685866
    передний    1478
    Name: Привод, dtype: int64
    Toyota    243
    BMW       167
    Name: Марка, dtype: int64
    седан      1502
    хэтчбек     129
    Name: Кузов, dtype: int64
    автомат     1589
    механика     179
    Name: КПП, dtype: int64
    3 и более      1009
    2 владельца     704
    Name: Хозяев в ПТС, dtype: int64
    ---------------------------
    ------ Кластер  11  -------
    2007.657043305127
    138630.5719263315
    2279.5420607267297
    162.04828272772522
    671646.3285216526
    полный    1892
    Name: Привод, dtype: int64
    Nissan     256
    Hyundai    249
    Name: Марка, dtype: int64
    кроссовер      1178
    внедорожник     450
    Name: Кузов, dtype: int64
    автомат     1238
    механика     627
    Name: КПП, dtype: int64
    2 владельца    967
    3 и более      709
    Name: Хозяев в ПТС, dtype: int64
    ---------------------------
    ------ Кластер  12  -------
    1998.7640871525168
    258800.57325319308
    1972.1262208865514
    123.88354620586026
    209069.97595792636
    передний    854
    Name: Привод, dtype: int64
    Volkswagen       117
    Mercedes-Benz    107
    Name: Марка, dtype: int64
    седан      813
    хэтчбек    132
    Name: Кузов, dtype: int64
    механика    1069
    автомат      245
    Name: КПП, dtype: int64
    3 и более      949
    2 владельца    282
    Name: Хозяев в ПТС, dtype: int64
    ---------------------------
    ------ Кластер  13  -------
    2006.2400306748466
    153372.99386503067
    3458.128834355828
    258.6296012269939
    755522.2369631901
    полный    1070
    Name: Привод, dtype: int64
    BMW              201
    Mercedes-Benz    143
    Name: Марка, dtype: int64
    кроссовер    613
    седан        320
    Name: Кузов, dtype: int64
    автомат     1210
    вариатор      68
    Name: КПП, dtype: int64
    3 и более      628
    2 владельца    495
    Name: Хозяев в ПТС, dtype: int64
    ---------------------------
    ------ Кластер  14  -------
    1997.5278246205733
    249334.54890387857
    1879.4266441821248
    127.0725126475548
    195677.2639123103
    передний    771
    Name: Привод, dtype: int64
    Toyota    464
    Nissan    236
    Name: Марка, dtype: int64
    седан      585
    минивэн    231
    Name: Кузов, dtype: int64
    автомат     988
    механика    120
    Name: КПП, dtype: int64
    3 и более      829
    2 владельца    235
    Name: Хозяев в ПТС, dtype: int64
    ---------------------------
    ------ Кластер  15  -------
    2007.2490660024907
    118465.71731008717
    1459.194686591947
    92.75425487754255
    233711.92818596927
    передний    2355
    Name: Привод, dtype: int64
    ВАЗ     808
    Ford    284
    Name: Марка, dtype: int64
    хэтчбек      2276
    универсал      66
    Name: Кузов, dtype: int64
    механика    1886
    автомат      363
    Name: КПП, dtype: int64
    3 и более     2108
    1 владелец     301
    Name: Хозяев в ПТС, dtype: int64
    ---------------------------


Для задачи классификации  исходных данных я посчитал оптимальным 15 кластеров. Каждый кластер описывает новые данные об автомобилях, однако начиная с 15 отличия в кластерах менее очевидны (если 4 и 9 отличаются довольно сильно, то сходства между 9 и 15 гораздо больше)

## Работу выполнил
---
Студент группы **РИМ-181226**

Кабанов Евгений Алексеевич

b03c91f3ad2e1a72afd558af796601be1e215645
ipynb
Jupyter Notebook
DA-LR6-Kabanov.ipynb
ghspbravo/Data-Analysis
25a0102378bf73bfd775ab15a2ad64fcd658ad73
MIT
DA-LR6-Kabanov.ipynb
ghspbravo/Data-Analysis
25a0102378bf73bfd775ab15a2ad64fcd658ad73
MIT
DA-LR6-Kabanov.ipynb
ghspbravo/Data-Analysis
25a0102378bf73bfd775ab15a2ad64fcd658ad73
MIT
Qwen/Qwen-72B
1. YES
2. YES