AIM-PIbd-31-Shanygin-A-V/lab_5/Lab5.ipynb

575 lines
2.3 MiB
Plaintext
Raw Normal View History

2024-12-13 23:33:51 +04:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Лабораторная работа 5 (Store)\n",
"Цель: проанализировать размеры складских помещений в магазине и сравнить"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" Store_Area Items_Available Daily_Customer_Count Store_Sales\n",
"0 1659 1961 530 66490\n",
"1 1461 1752 210 39820\n",
"2 1340 1609 720 54010\n",
"3 1451 1748 620 53730\n",
"4 1770 2111 450 46620\n",
"Index(['Store_Area', 'Items_Available', 'Daily_Customer_Count', 'Store_Sales'], dtype='object')\n"
]
}
],
"source": [
"import pandas as pd\n",
"df = pd.read_csv(\".//static//csv//Stores.csv\")\n",
"# удаляем id\n",
"df = df.drop(df.columns[0], axis=1)\n",
"\n",
"print(df.head())\n",
"print(df.columns)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1500x1000 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"import pandas as pd\n",
"\n",
"# Создание фигуры\n",
"plt.figure(figsize=(15, 10))\n",
"\n",
"plt.subplot(2, 2, 1)\n",
"sns.scatterplot(x=df[\"Store_Area\"], y=df[\"Store_Sales\"], alpha=0.6, color=\"blue\")#Площадь vs Продажи\n",
"\n",
"plt.subplot(2, 2, 2)\n",
"sns.scatterplot(x=df[\"Items_Available\"], y=df[\"Store_Sales\"], alpha=0.6, color=\"blue\") #Количество ассортимента vs продажи\n",
"\n",
"plt.subplot(2, 2, 3)\n",
"sns.scatterplot(x=df[\"Daily_Customer_Count\"], y=df[\"Store_Sales\"], alpha=0.6, color=\"blue\") #Количество посетителей vs Цена\n",
"\n",
"# Упорядочиваем графики\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Понижение размерности и визуализация"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA04AAAImCAYAAABkcNoCAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOydeXxTVfr/P0naNEk3Wlp2KBTaspSWIggooICDOgpFFEQFxKEKisigIjqjuG8/RFSKrOqouLAICA4z+kXHUUdFUSyLZVOoIFtKt6RJmvX3R70hy12Tm+Smfd6vly9plptzzz333OdznuWoPB6PBwRBEARBEARBEAQn6lg3gCAIgiAIgiAIQumQcCIIgiAIgiAIghCAhBNBEARBEARBEIQAJJwIgiAIgiAIgiAEIOFEEARBEARBEAQhAAkngiAIgiAIgiAIAUg4EQRBEARBEARBCEDCiSAIgiAIgiAIQgASTgRBEARBEARBEAIkxLoBBEEQkWDatGn47rvv/F5LTExEVlYWRo0ahb/+9a9IT0/3e//YsWN488038dVXX+HcuXPIzMzEwIEDcccdd6B3796sv7N06VKsXLkSU6dOxSOPPBJWm5uamvDee+9h+/btOH78ODQaDXJzczFlyhSUlpZCpVKFdXyCaA243W6sX78e7777Lk6ePInMzEyMGTMG99xzD1JSUgAAy5YtQ3l5ud/3kpKS0LFjR4wePRqzZs1CmzZtYtB6giCUDAkngiBaLH379sWjjz7q/dvhcODAgQN48cUXUVlZiffee88rRj755BM88MADyMvLw5133okuXbrgzJkzePPNNzF58mSsWLECl156qd/x3W43tm7divz8fHz44Ye4//77odfrQ2prdXU1ysrKcPr0aUybNg1FRUVwu934z3/+gwcffBC7d+/Gk08+SeKJIARYu3YtXnrpJcycORPDhg3DsWPH8Morr+DIkSN4/fXX/e6h9evXAwA8Hg8sFgv27duHNWvW4LPPPsN7772HzMzMWJ0GQRAKhIQTQRAtlpSUFAwYMMDvtcGDB6OxsRGvvPIKKioqMGDAAPz2229YuHAhRowYgZdeegkajcb7+bFjx+Kmm27CwoUL8dlnn0Gr1Xrf++qrr3DmzBm8+OKLmDp1Kj766CNMmjQppLYuXLgQZ86cwfr169G9e3fv65dffjk6deqEF198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
"text/plain": [
"<Figure size 1000x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from sklearn.decomposition import PCA\n",
"from sklearn.preprocessing import StandardScaler\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# Оставляем только числовые столбцы для анализа\n",
"df_numerical = df[['Store_Area', 'Items_Available', 'Daily_Customer_Count', 'Store_Sales']]\n",
"\n",
"# Стандартизируем данные\n",
"scaler = StandardScaler()\n",
"df_scaled = scaler.fit_transform(df_numerical)\n",
"\n",
"# Применяем PCA для понижения размерности до 2 компонентов\n",
"pca = PCA(n_components=2)\n",
"df_pca = pca.fit_transform(df_scaled)\n",
"\n",
"# Преобразуем результат в DataFrame для удобства\n",
"df_pca_df = pd.DataFrame(df_pca, columns=['PC1', 'PC2'])\n",
"\n",
"# Визуализируем результат\n",
"plt.figure(figsize=(10, 6))\n",
"sns.scatterplot(x='PC1', y='PC2', data=df_pca_df)\n",
"plt.title('PCA: Снижение размерности до 2D')\n",
"plt.xlabel('Первая главная компонента (PC1)')\n",
"plt.ylabel('Вторая главная компонента (PC2)')\n",
"plt.show()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Выбор кол-ва кластеров на основе инерции (метод локтя) (неиерархического алгоритма кластеризации)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA14AAAImCAYAAABD3lvqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACDTUlEQVR4nOzdd3hUVf7H8c9MekghhSSEGgg9CRBKAGlGFhGwIHbFsiKIuP4EFUVZO4pIExAVUcGCFZZVUVkrSu81oQSS0FJIh/Qyvz9CRiMthGRuyvv1PHlC7j33zneGs2s+nHPPMVksFosAAAAAANXGbHQBAAAAAFDXEbwAAAAAoJoRvAAAAACgmhG8AAAAAKCaEbwAAAAAoJoRvAAAAACgmhG8AAAAAKCaEbwAAAAAoJoRvAAAAACgmhG8AAAAAKCaEbwAoAqMGjVK7dq102233XbeNhMmTFC7du301FNP2bAyAJV17NgxtWvXTsuXLze6FAB1AMELAKqI2WzWjh07lJiYeNa5nJwc/frrrwZUBQAAagKCFwBUkY4dO8rJyUk//PDDWed+/fVXubi4yN/f34DKAACA0QheAFBFXF1dNWDAgHMGr++++05XX3217O3tzzr3008/6cYbb1RoaKiuuOIKvfzyy8rJyZEkRUZGql27duf8OnbsmCRp7dq1uuOOO9StWzdFREToscceU0JCQrnXeOyxx855j4tNoSqbQnmur7/avXu37r//fkVERCg8PFwPPvigDh48aD2/ceNGtWvXThs3bpQkHThwQIMGDdJtt92mefPmnfc15s2bJ0n68ssvdc011ygkJKTc+YtN2/ziiy/Oed+/Xlc2nexi7SpbQ0U/mwu9/vnOl/09PPXUU4qMjCz3up999lm5z/Cvr7N169ZybT/++GO1a9eu3D3y8vI0c+ZMDR48WCEhIQoPD9d9992n6Ojocteer65Ro0aVa1NWx7n8vX+UGTVqVLn75Ofn680339SQIUMUGhqqwYMHa+HChSopKSl3zd9r2bhxY4WuvRiLxaLJkycrLCxMa9asqfB1ACBJZ/8GAACotKFDh+rRRx9VYmKiAgICJEmnT5/W77//rg8++EC///57ufbffPONHn/8cV177bV69NFHdfz4cc2ePVsxMTH64IMPNH/+fBUUFOjkyZN6+OGHNW7cOA0cOFCS5OfnpxUrVujJJ5/U8OHDNXbsWKWnp2vu3Lm69dZb9Z///Ec+Pj6SSn9hvfXWW3XjjTdKkvV+FdGxY0c999xz1p+//PJLffXVV9afN2zYoNGjRysiIkKvvPKK8vPz9c477+i2227TF198odatW591z9dff10hISEaN26cPD091a9fP0nSCy+8IEnW1wsICNDmzZs1ZcoU3XTTTZoyZYoaNGggSRWqPy8vT6GhoZoyZYr12Pmu++tn+/d2la3hUj6bZ599Vp06dTrn63/++eeSpL179+rFF188q+3fZWZmas6cOec816BBA/3yyy/q1q2b9dh3330ns7n8v8VOmjRJW7Zs0cSJE9W8eXPFx8frjTfe0GOPPaaVK1fKZDJZ29500026+eabrT+X/T1WJYvFogcffFA7duzQww8/rPbt22vjxo2aM2eOjh49qpdeesna9u99tnXr1hW+9kJefvllffvtt3rzzTfVt2/fKn+PAOo2ghcAVKGBAwfKxcVFP/zwg+69915J0o8//igfH59yv+hKpb9IzpgxQ/369dOMGTOsx1u2bKl7771Xq1evtgaBstGt5s2bq0uXLpKkkpISzZgxQ3379tXMmTOt14eHh2vo0KF67733NGnSJElSbm6uWrZsab227H4V4ebmZr1Okv74449y52fOnKkWLVpo4cKFsrOzkyT17dtX//jHPzR37ly98cYb5drHx8drzZo1+vrrr9WmTRtJsoZUNzc3SSr3eitXrpQkPf3009bAI0mOjo4XrT03N1e+vr7l7ne+6/762f693a5duypVw6V8NsHBwed9/bLj+fn552z7d3PnzlVgYKDS09PPOte/f3/9/PPPeuKJJyRJiYmJ2r59u7p3767jx49LkgoKCpSdna0pU6Zo6NChkqSePXvq9OnTmjZtmlJSUtSoUSPrPQMCAsrVU/b3WJV+//13rVu3TrNmzdKwYcMkSVdccYWcnZ31xhtv6O6777b2p7/32dWrV1f42vOZOXOmPv/8c82fP1/9+/ev8vcHoO5jqiEAVCFnZ2dFRkaWm264cuVKXXPNNeVGCCTp8OHDSkxMVGRkpIqKiqxfPXr0kJubm9auXXvB14qNjdXJkyc1fPjwcsebN2+url27atOmTdZjCQkJcnd3r4J3WF5OTo52796ta665xhosJMnDw0NXXnlluRrK2s+ePVsREREX/UW3TFhYmCTp/fffV3JysgoKClRUVFSha6vqfVemhkv9bKrKgQMH9Pnnn+vf//73Oc9HRkYqLi5Ohw8fliT98MMP6ty5s5o0aWJt4+joqPfee09Dhw5VUlKSNmzYoM8++8y6QExBQcEl11VSUqKioiJZLJaLtin7+mvbTZs2yd7eXkOGDCl3zXXXXWc9fz6Xc60kffLJJ1q4cKGGDRtWblQUAC4FI14AUMWuueYaPfzww0pMTJSTk5PWr1+vRx999Kx2GRkZkkqnZZ1ralZycvIFX6fsel9f37PO+fr6KioqSlLpyNqJEyfUtGnTS3sjFXDq1ClZLJbz1nDq1Klyxx588EF5eHiUm6p4MT169NCUKVO0cOFCzZ8//5LqO378+AWn5FVnDZf62VSVl19+WcOGDVPXrl3Ped7f318hISH6+eef1apVK3333XcaPny4tb+U+eOPP/TKK6/o8OHDatCggdq3by9XV1dJumB4Op8FCxZowYIFsrOzk6+vr/r27av/+7//K7fgTNko8V/17NlTUun0SS8vr3IhVpJ15O1Cn+flXCtJ+/btU9++ffXtt9/qnnvuUceOHS/YHgDOheAFAFWsf//+atCggX744Qe5urqqadOmCgkJOaudh4eHpNJnacp+ufwrT0/PC75Ow4YNJUkpKSlnnTt58qS8vLwkSdHR0crLyztrQYyq4O7uLpPJdN4aymosM2nSJP3www965JFH9Mknn1R4Stott9yiNWvWqKioSM8++6yaNm2qcePGXfCakpIS7dy5UyNHjqzQa/x9RPJya7jUz6YqfP/999qzZ0+5qafnctVVV+nnn3/WNddcoz179mj+/PnlgteRI0c0fvx4DRo0SO+8846aNWsmk8mkTz755KypptLFPzup9PO75ZZbVFJSohMnTmj27Nl64IEH9PXXX1vbvPDCC+WC8l+f0/L09FR6erqKi4vLBaiyf6Ao6+/ncjnXStL//d//6e6779awYcM0ZcoUffnll2eFOAC4GKYaAkAVc3R01KBBg7Rq1Sp9//331mdK/q5Vq1by8fHRsWPHFBoaav3y9/fXzJkzzxqB+LugoCA1atRI3377bbnjR48e1Y4dOxQeHi5J+u2339ShQwd5e3tf8nspKSm54C+Yrq6uCgkJ0ffff6/i4mLr8VOnTum3334767m2kJAQzZ8/X8ePH9frr79e4TreeOMN/fbbb5o2bZquueYahYaGXvT5qm3btiknJ0cREREXbFc2evP3xSUut4ZL/WwuV0FBgaZPn67x48eXe/7qXAYNGqSdO3fq448/Vrdu3eTn51fu/J49e5Sfn68xY8aoefPm1mBVFrrKPrOyFQEv9tlJpYvBhIaGqnPnzrrmmmt05513av/+/crMzLS2CQoKKve/hb8+T9ezZ08VFRWdtWpoWXC70Od5OddKpSOUzs7OevbZZ7V371598MEHF32/APB3jHgBQDUYOnSoxo4dK7PZXG5Fvb+ys7PThAkT9Oyzz8rOzk5XXnmlsrKytGDBAiUlJV10ipzZbNbEiRM1efJkPfbYY7ruuuuUnp6u+fPny9PTU/fdd5/27t2rTz75RMOGDdOOHTus1548eVJS6chGWlraWaEsLS1NMTExio+Ptwa483nsscd0//33a8yYMbrjjjtUWFiohQsXqqCgQOPHjz+
"text/plain": [
"<Figure size 1000x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from sklearn.cluster import KMeans\n",
"from sklearn.preprocessing import StandardScaler\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# Оставляем только числовые столбцы для анализа\n",
"df_numerical = df[['Store_Area', 'Items_Available', 'Daily_Customer_Count', 'Store_Sales']]\n",
"# Стандартизируем данные\n",
"scaler = StandardScaler()\n",
"df_scaled = scaler.fit_transform(df_numerical)\n",
"\n",
"# Оценка инерции для разных значений K\n",
"inertias = []\n",
"clusters_range = range(1, 11) # Пробуем K от 1 до 10\n",
"for i in clusters_range:\n",
" kmeans = KMeans(n_clusters=i, random_state=42)\n",
" kmeans.fit(df_scaled)\n",
" inertias.append(kmeans.inertia_)\n",
"\n",
"# График инерции\n",
"plt.figure(figsize=(10, 6))\n",
"plt.plot(clusters_range, inertias, marker='o')\n",
"plt.title('Метод локтя для оптимального k')\n",
"plt.xlabel('Количество кластеров')\n",
"plt.ylabel('Инерция')\n",
"plt.grid(True)\n",
"plt.show()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"На основе инерции можно предположить, что оптимально взять 2-4 кластера\n",
"\n",
"Выбор кол-ва кластеров на основе коэф-а силуэта (неиерархического алгоритма кластеризации)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA1oAAAImCAYAAABKNfuQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAChOElEQVR4nOzdeVhUZf8G8HtmYBj2fQdxQfZFZVHct7Tyzd1Wlxa1zPJt0+SXr+1ZLplZuKXlklmumVqRVpZaiKCAsouo7Pu+M/P7A5kkUBmc8Qxwf66LKzlzZvieRwzuOc/zfUQKhUIBIiIiIiIiUhux0AUQERERERF1NQxaREREREREasagRUREREREpGYMWkRERERERGrGoEVERERERKRmDFpERERERERqxqBFRERERESkZgxaREREREREasagRUREREREpGYMWkTULcyaNQuzZs1qcezcuXOYOHEivLy8sHfvXo1+/aVLl2L06NEqP2/06NFYunSpBioiIk251b/b3NxcjBs3DoGBgbhw4cK9L4yI7ikdoQsgIhJCYWEhnnvuOXh7e2Pr1q1wd3cXuiQi6sJyc3Mxe/ZslJaW4quvvoKPj4/QJRGRhjFoEVG39OWXX6KmpgYrV66Era2t0OUQUReWl5enDFnbt2+Hh4eH0CUR0T3AqYNE1O0UFxdj9+7deOihh1qFrPT0dCxatAhDhgxBv379MGvWLERFRbU45/fff8fUqVPh7++PwYMH480330R5eXmLc77++muMGjUK/v7+ePnll1FRUQEA2LBhA0JCQhAYGIg333wTdXV1yufU1dXh7bffRlBQEAYOHIj169cDACorK7F48WL069cPI0aMwNdff618TkZGBtzd3XHgwAHlsdraWowZM6bFXbq2pk5GRETA3d0dERERbX4ONN35CwwMbDXtce/evZgwYQJ8fHwwcuRIrF+/Ho2NjcrH25oqeXOtzV+rrY/mOu80bbKta/q3vLw8vP766wgJCUH//v0xc+ZMnD9/Xvm4u7u7cpwBQKFQ4NFHH4W7uzsyMjJanHe7WhctWoThw4dDLpe3+PpvvPEGxo8fDwDIycnBK6+8gkGDBsHf3x+zZs1STh9bv379Lb9Gc32JiYl44YUXMGjQIHh7e2PYsGF47733UFNTc9sxOH369G1rb+81AsCJEycwZcoU+Pv73/a1bnbgwAG4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
"text/plain": [
"<Figure size 1000x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from sklearn.metrics import silhouette_score\n",
"\n",
"# Оставляем только числовые столбцы для анализа\n",
"df_numerical = df[['Store_Area', 'Items_Available', 'Daily_Customer_Count', 'Store_Sales']]\n",
"\n",
"# Стандартизируем данные\n",
"scaler = StandardScaler()\n",
"df_scaled = scaler.fit_transform(df_numerical)\n",
"\n",
"# Оценка коэффициента силуэта для разных значений K\n",
"silhouette_scores = []\n",
"clusters_range = range(2, 11) # Пробуем K от 2 до 10 (минимум 2 кластера для оценки силуэта)\n",
"for i in clusters_range: \n",
" kmeans = KMeans(n_clusters=i, random_state=42)\n",
" labels = kmeans.fit_predict(df_scaled) # Получаем метки кластеров\n",
" score = silhouette_score(df_scaled, labels) # Вычисляем коэффициент силуэта\n",
" silhouette_scores.append(score)\n",
"\n",
"# График коэффициентов силуэта\n",
"plt.figure(figsize=(10, 6))\n",
"plt.plot(clusters_range, silhouette_scores, marker='o')\n",
"plt.title('Коэффициенты силуэта для разных K')\n",
"plt.xlabel('Количество кластеров')\n",
"plt.ylabel('Коэффициент силуэта')\n",
"plt.grid(True)\n",
"plt.show()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Значение коэф-а силуэта наибольшее при 2 кластерах, т.е. выгодно взять 2 кластера."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Иерархическая кластеризация\n",
"\n",
"Иерархический агломеративный алгоритм: последовательное объединение исходных элементов и уменьшение числа кластеров (построение кластеров снизу вверх)."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA00AAAKLCAYAAAAqxWMxAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACbfklEQVR4nOzdd3gVZdrH8d9Jr5DQIUDooffeDWAFFXTVRbGsBVfAta1lXZVVsaywgmABddeCHRQsWCiCCogUaVJCKKEkEEghgZSTMu8feTPJIXGAGM6EzPdzXVxknlPmnufMmTP3PGVchmEYAgAAAACUy8fuAAAAAACgKiNpAgAAAAALJE0AAAAAYIGkCQAAAAAskDQBAAAAgAWSJgAAAACwQNIEAAAAABZImgAAAADAAkkTAAAAAFggaQIq6OGHH1ZMTEy5/x5++GG7wwMcYceOHRo6dKh2796tY8eO6eqrr9a3335rd1iwwfHjx9WjRw9t3rxZx48f11//+lf997//tTssANWEn90BAOezunXratasWR5lEydOtCkawHnatm2rAQMG6NJLL5Uk9e/fX7GxsTZHBTvUrFlTt9xyi6655hoZhqGYmBg9//zzdocFoJogaQIqqKCgQCEhIeratatHeUBAgD0BAQ41ZcoUTZo0SW63W02bNrU7HNho4sSJuu6665SRkaHo6Gj5+vraHRKAaoLueUAF5efnKygo6Iyeu27dOt1www3q0qWLevfurYceekipqanm459++qliYmJ08OBBj9fFxsZ6dPXLy8v73S6Bp77Xpk2bNHr0aHXu3FmjRo3SN9984/HemZmZevbZZzV8+HB16tRJI0eO1Lx588qs/9T1HDx4UOPGjdPDDz+s1157Tf3791ePHj1011136dChQx6vX7JkicaOHatu3bqpY8eOuvjii/Xee++Zj69Zs8Z83/Xr13u8du7cuYqJifFoNSiO55///KfHc48fP66OHTsqJiZGa9asOeP1l+fhhx8u01Lx4YcfKiYmRjNnzjTL0tPT9fjjj6t///7q1KmTrrnmGq1evdrjdTExMZo7d64eeughdevWTf3799eUKVOUm5trPqegoEBz5szRyJEj1blzZ3Xt2lXXXXedfv75Z/M5M2fOVGxsrL7//ntdfPHF6tKli6655hpzWwsKCnT11VerT58+HvvVww8/rK5du2rPnj1mPKW3wTAMXXfddebnWvx5lK5DSRo3bpzGjRtnLhcWFmrOnDkaMWKEOnbsqIsuukjvvvtumbpcsGCBRo8erS5dumjo0KGaNm2a3G63uU2l99uvvvpKvXr10rRp08xteu+99zRq1Ch17txZQ4cO1dSpUz3qrvRn1aBBAzVt2rTcz6o8n3zyicaMGaOuXbuqc+fOuuKKK/T111+bjxd/j8rrdvt738HSdSRJixYt0pgxY9StWzcNGDBAjz/+uI4fP24+XlwH3bp1M+ul2N13312mq29ubq7+/e9/a8iQIerYsaNGjRqlRYsWebwuNjZWL774op555hn16tVLffr00YMPPqj09PQz3n6rrseffvppuftJSkqKevbsWe73NSYmRm3btlWvXr00adIkpaWlmc8p77M6dd84m7qUpDp16qhFixZatWrVabtLn24/LH2MOvVf6bh37NihiRMnqm/fvurQoYMGDRqkp59+Wjk5OeZz3G63pk+frmHDhqlz584aOXKkPvvsszOqc0lKTEzUfffdp969e6tLly666aabtG3bNvP9Dx48qJiYGH311Ve68847ze/dyy+/rMLCQo/P5dQ6ue+++zw+U8MwNGPGDA0aNEg9evTQnXfeqaSkJPP5Z3rcOvVzlMp+5qc7LhXXz5kcl4FziZYmoIKys7NVs2bN0z5v7dq1uuWWW9S3b19Nnz5dx48f14wZM3TjjTdq3rx5Z5x4STJPGF999VXVqlVLUtHJz6nJjiSNHz9eN9xwg+69917NmzdP99xzj2bPnq0hQ4YoJydHY8eOVUpKiu6++25FRUVpyZIlevTRR3Xs2DHdeeed5vsMGTJEd911l7lcr149SdLSpUsVGRmpf/7znyosLNS0adM0btw4ffXVVwoODtby5cs1YcIE3XjjjZo0aZJycnL0/vvv68knn1THjh3VpUsX8z1DQ0O1bNky9ejRwyxbtGiRfHzKXtcJDQ3V8uXLZRiGXC6XJOm7775TQUGBx/POZv1Wjh8/runTp5f5HG666SYdO3ZM9957r+rVq6f58+frtttu0xtvvKF+/fqZz50xY4a6dOmi6dOna/fu3Zo+fbqOHj1qvufUqVP1wQcf6P7771dMTIyOHDmil19+WX/729+0fPlyBQcHS5JSU1P10EMPaeLEiWratKn++9//6tZbb9Unn3yidu3a6bnnntPo0aP1/PPP6/nnn9eSJUv02Wef6YknnlCLFi3K3baFCxfq119/PaN6KG3y5Mn69NNPNX78eHXr1k1r167VM888o4yMDE2YMEGS9N577+nJJ5/Un/70J9133306cOCA/v3vf+v48eN68sknPd4vJydHTz75pG677TaNGjVKkvT4449r4cKFuv3229WzZ09t27ZNL7/8srZv36433njD/OxP91mV57333tPTTz+tSZMmqUePHjp+/Lhef/11PfDAA+rWrZsaNGhgPnfWrFmqW7euJJnfOUm6+uqr9ac//clc/te//uWxjldeeUUvvfSSxo4dq3vvvVcHDhzQjBkztHHjRn388cce33uXy6XVq1dryJAhkqSTJ09qxYoVHvu/YRiaMGGCNmzYoLvvvlstW7bU4sWLde+998rtduvKK680n/v+++8rOjpazz77rFJTUzVt2jQlJCToww8/lMvlOu3233XXXbruuuskFbXctG/f3jwGNG3aVLt27SpTp9OmTVNmZqZq1KjhUV58/MjLy9Pu3bv173//W1OmTNHUqVNP+zlVpC6L5eXl6ZlnnjnjdUjl74fFHn/8cXXo0MFcvvbaa82/k5OTdf3116tr16567rnnFBAQoB9++EH/+9//VK9ePd1xxx2SpAceeEArVqzQX//6V3Xp0kUrVqzQww8/LH9//9PWeWpqqq677joFBwfrscceU3BwsN5++21df/31mjdvnlq2bGnGM3nyZA0ZMkQzZ87U+vXrNWvWLGVlZenvf/97udu9bt06ffXVVx5lb731lmbPnq0HH3xQzZs313PPPae//e1v+vjjjyWd+XGrIs7kuHSm33WgMpE0ARWUnp5uJhBWpk2bpubNm2v27NlmV5EuXbrosssu0/z583X99def8TqzsrIkSd26dVNkZKQk6ccffyz3uePGjTNPYAcNGqTRo0fr5Zdf1pAhQ/Tpp58qLi5OH374obp162Y+Jz8/X6+88oquu+46RURESCo6UTy1C6JUlDR++umnatKkiSSpRYsWGj16tBYsWKA///nPio+P1+jRo/Xoo4+ar+nWrZv69OmjNWvWeCQtgwcP1tKlS80f9cOHD+vXX39Vz549y7Re9evXTytWrNCmTZvMuL7++mv16tXL48r32azfyksvvaRGjRp5XB1fuHChduzYoY8//th8n8GDB2vcuHGaOnWq5s+fbz63Vq1aeu211+Tn56chQ4bIx8dHzz77rCZNmqSWLVsqOTlZ9957r0crRWBgoCZNmqSdO3ea25idna3JkyebJ8d9+/bV8OHDNWfOHL344otq1aqVJk2apGnTpmn48OGaPHmyhg4dqrFjx5a7XSdPntTUqVPVoUMH/fbbb5Jk7p+nJqCl7d27Vx9//LHuu+8+82Rw4MCBcrlcmj17tsaOHauaNWvq5Zdf1vDhw/X000+br83OztZXX32lvLw8j/f88ssv5e/vr9tuu02+vr6Kj4/XvHnzdP/995vrGDBggOrVq6cHH3xQP/zwg5lgnO6zKs+BAwd06623elwMiIqK0pgxY7R+/XpddtllZnm7du3UuHHjMu/RoEEDj+9FWFiY+ffx48f16quv6pprrtHjjz9ulrdp00bXX399me998f5fvE3Lli1T3bp1PVoHVq1apR9//FEvvviiOX5r0KB
"text/plain": [
"<Figure size 1000x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from scipy.cluster import hierarchy\n",
"\n",
"linkage_matrix = hierarchy.linkage(df_scaled, method='ward')\n",
"\n",
"plt.figure(figsize=(10, 7))\n",
"hierarchy.dendrogram(\n",
" linkage_matrix, \n",
" truncate_mode='lastp', \n",
" p=12, \n",
" leaf_rotation=90., \n",
" leaf_font_size=12., \n",
" show_contracted=True\n",
")\n",
"plt.title('Дендрограмма иерархической агломеративной кластеризации')\n",
"plt.xlabel('Индексы образцов')\n",
"plt.ylabel('Расстояние')\n",
"plt.show()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Визуализация кластеризации"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1400x1200 with 4 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from scipy.cluster.hierarchy import fcluster\n",
"# Визуализация кластеров\n",
"plt.figure(figsize=(14, 12))\n",
"result = fcluster(linkage_matrix, t=60, criterion='distance')\n",
"\n",
"plt.subplot(2, 2, 1)\n",
"sns.scatterplot(x=df[\"Store_Area\"], y=df[\"Store_Sales\"], hue=result, palette=\"Set1\", alpha=0.6)#Store_Area vs Store_Sales\n",
"\n",
"plt.subplot(2, 2, 2)\n",
"sns.scatterplot(x=df[\"Items_Available\"], y=df[\"Store_Area\"], hue=result, palette=\"Set1\", alpha=0.6)#Items_Available vs Store_Area\n",
"\n",
"plt.subplot(2, 2, 3)\n",
"sns.scatterplot( x=df[\"Daily_Customer_Count\"], y=df[\"Store_Sales\"], hue=result, palette=\"Set1\", alpha=0.6)#Daily_Customer_Count vs Store_Sales\n",
"\n",
"plt.subplot(2, 2, 4)\n",
"sns.scatterplot(x=df[\"Items_Available\"], y=df[\"Daily_Customer_Count\"], hue=result, palette=\"Set1\",alpha=0.6)#Items_Available vs Daily_Customer_Count\n",
"\n",
"# Настройка графиков\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Неиерархический алгоритм кластеризации"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Центры кластеров:\n",
" [[ 1745.60833333 2093.9625 640.70833333 65702.91666667]\n",
" [ 1334.08658009 1600.46320346 639.17748918 44322.25108225]\n",
" [ 1590.27536232 1908.01449275 1048.26086957 55292.41545894]\n",
" [ 1259.72477064 1511.40825688 853.94495413 72138.0733945 ]]\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1600x1200 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"features_used = [\n",
" \"Store_Area\",\n",
" \"Items_Available\",\n",
" \"Daily_Customer_Count\",\n",
" \"Store_Sales\"\n",
"]\n",
"data_to_scale = df[features_used]\n",
"scaler = StandardScaler()\n",
"data_scaled = scaler.fit_transform(data_to_scale)\n",
"\n",
"random_state = 42\n",
"kmeans = KMeans(n_clusters=4, random_state=random_state)\n",
"labels = kmeans.fit_predict(data_scaled)\n",
"centers = kmeans.cluster_centers_\n",
"\n",
"# Отображение центроидов\n",
"centers_original = scaler.inverse_transform(centers) # Обратная стандартизация\n",
"print(\"Центры кластеров:\\n\", centers_original)\n",
"\n",
"\n",
"plt.figure(figsize=(16, 12))\n",
"plt.subplot(2, 2, 1)\n",
"sns.scatterplot(x=df[\"Store_Area\"],y=df[\"Store_Sales\"],hue=labels,palette=\"Set1\",alpha=0.6) # Визуализация результатов кластеризации KMeans\n",
"\n",
"\n",
"plt.subplot(2, 2, 2)\n",
"sns.scatterplot(x=df[\"Items_Available\"],y=df[\"Store_Sales\"],hue=labels,palette=\"Set1\",alpha=0.6)\n",
"\n",
"plt.subplot(2, 2, 3)\n",
"sns.scatterplot(x=df[\"Daily_Customer_Count\"],y=df[\"Store_Sales\"],hue=labels,palette=\"Set1\",alpha=0.6)\n",
"\n",
"\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Неиерархическая кластеризация на PCA"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABjAAAAJHCAYAAAA+Dx+UAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd5hU5dkG8Pu06dt7X9ouLL1IUbo11ogaNcYWCyqJXzQmaqwpRpPYazTRmAjGEruiCIqKgChKlbbANrb3NvWU7491B4adWRa2zJb7d11esuedOeeZmTO75znPWwTDMAwQERERERERERERERH1I2K4AyAiIiIiIiIiIiIiIjocCxhERERERERERERERNTvsIBBRERERERERERERET9DgsYRERERERERERERETU77CAQURERERERERERERE/Q4LGERERERERERERERE1O+wgEFERERERERERERERP0OCxhERERERERERERERNTvsIBBRDQIGIYR7hAohKH82Qzl105EREREgXhtODTwcyainsYCBtEgdumllyI3Nzfgv3HjxmH+/Pn4/e9/j8bGxg7PKSgowL333ouTTjoJEyZMwPz583HzzTdj165dIY/zyCOPIDc3F3/84x978+WE9MQTTyA3Nzcsxw7mzTffRG5uLg4cONDrz/N6vfjzn/+M995772jDPCoXXXQRcnNzsWLFil49Tn/7LLujqakJv/3tb7Fx40b/tksvvRSXXnppn8XQ1e/zwoULcdttt/XosfPz83HxxRf3yL4OHDiA3NxcvPnmmz2yPyIiIuo/mLOEx2DKWXJzc/HEE0902L5nzx7MmjUL8+bNQ2Fhof+xubm5ePjhh4PuS9d1zJkzZ8Bee1ZWVuKvf/0rTjvtNEycOBGzZ8/GddddF5CTAL2Tl1RUVODaa69FaWlpj+wv1OdKREMPCxhEg1xeXh5effVV/3//+te/cMUVV+CNN97A4sWLA3pHfPzxxzj33HPx/fff4/rrr8c//vEP3HTTTSgsLMRPfvITrF27tsP+dV3H22+/jZycHLzzzjtwuVx9+fKGvKqqKvz73/+Gqqq9doz9+/dj06ZNyMnJwSuvvNJrxxlsdu7ciXfeeQe6rvu33XPPPbjnnnv65PjH8n3uSR999BE2bdrUI/tKTEzEq6++ivnz5/fI/oiIiKh/Yc4yuPVFznK4/Px8XHHFFbBarVi6dCmys7P9baIo4qOPPgr6vG+++QZVVVV9FGXP+vbbb3HOOedg9erVuOyyy/D3v/8dd9xxB9xuNy699FK8/fbbvXr8devW4fPPP++x/b366qu44IILemx/RDRwyeEOgIh6l8PhwKRJkwK2HXfccWhtbcXjjz+OLVu2YNKkSSguLsatt96KOXPm4NFHH4UkSf7Hn3LKKbj44otx66234tNPP4XJZPK3ffnll6ioqMDDDz+Mn/3sZ3j//fd5kTHIvPnmm0hLS8PixYtxyy23oKioCFlZWeEOa0AaOXJknxznWL/P/ZXJZOrwe4yIiIgGD+Ys1JP27duHyy+/HHa7Hf/+97+Rmpoa0D5lyhRs3LgRO3bsQF5eXkDbBx98gDFjxmDnzp19GXK3NTQ04Fe/+hWys7Pxr3/9C1ar1d926qmn4tprr8Xdd9+N2bNnIz4+PoyRdh2v/4moHUdgEA1R48aNAwCUlZUBAF566SV4vV7ceeedAYkAAFitVtx6660477zzOgzhfuONN5CTk4OpU6dixowZePXVV4947IULF+LPf/4zLr/8ckyYMAF33HEHgLaLrrvvvhvHH388xo8fj5/85CdYv359wHM9Hg/uv/9+nHDCCZg8eTJuv/12eDyegMcEGw67YcMG5ObmYsOGDf5t+/fvxy9+8QtMnz4dxx13HBYvXox9+/YFHOuvf/0r5s2bh3HjxuGss87C8uXLA/ar6zqefvppzJ8/HxMnTsQNN9wQdJj74br6vFWrVuGnP/0pJk+ejHHjxuG0007DsmXLALRNq3PiiScCAG6//XYsXLjQ/7zXX38dixYtwqRJkzBhwgScc845+PDDDwP2nZube8RpgzRNw9tvv40FCxbgpJNOgs1mC/oZ+3w+PPjgg5g7dy4mTJiAq666Cm+//XaH4eVvvfUWTj/9dIwfPx5nn3021q9fj7y8vE6HZy9fvhyLFi3C5MmTccIJJ+Duu+8OeK+eeOIJnHbaaVi5ciXOPPNMjB8/Hueccw42bdqEzZs344ILLsCECRNw5plndjif9uzZg8WLF2PKlCmYMmUKlixZgpKSEn97+3nzyiuvYMGCBZgyZYq/V19n7/GGDRtw2WWXAQAuu+wy//l46Ln585//HIsWLerwem+44QacffbZ/p83btyIn/3sZ5g4cSKmT5+OW2+9FXV1dSHfL+DYv8+HvuZDvyuHxw4A27dvx+WXX46pU6di8uTJuOKKK7B582YAbZ/Jk08+CSBw6Leu63juuedw8sknY9y4cTj11FPx0ksvdTjOLbfcghtvvBGTJk3ClVde2WEKqTfffBN5eXnYsmULLrzwQowfPx4LFizA888/H7Cvqqoq3HTTTf7v+N13341HHnkk4LtCRERE/RdzFuYsXclZDrVv3z5cdtlliIiIwNKlSzsUL4C24lh8fHyHURiqquLjjz/GGWec0eE5Xfnc6+rq8Pvf/x4LFizAuHHjMH36dCxZsiQgH7r00ktxxx134LnnnsP8+fMxfvx4XHTRRdi6dav/MW63G/feey/mzp3rfz8Pv8493Ntvv42qqir87ne/CyheAG0jTm655RZccsklaGlp6fDcUNO13nbbbQGfV3FxMa677jrMmDEDEydOxIUXXugfcfHmm2/i9ttvBwCceOKJAZ/Z66+/jjPOOMM/NdwTTzwBTdMCjnP55ZfjnnvuwZQpU3D66adD07SAPKL9u7F+/Xr8/Oc/x8SJE3HCCSfgb3/7W8C+WlpacPfdd2PWrFmYPHkybrrpJrz44ov9avo2Ijp6LGAQDVEFBQUAgIyMDADAmjVrkJeXh6SkpKCPnzVrFm666SYkJCT4tzU0NODTTz/Fj3/8YwDAueeei23btuH7778/4vGXLVuG8ePH4+mnn8b5558Pj8eDyy+/HJ988gluuukmPPnkk0hOTsbVV18dcGH4m9/8Bq+99hoWL16MRx99FI2NjXjxxReP+vVXVlbiwgsvRGFhIe6991787W9/Q01NDS6//HI0NDTAMAwsWbIEr7zyCq688ko888wz/gugQ4fe/u1vf8NTTz2F888/H08++SSio6Px0EMPHfH4XXneZ599hiVLlmDs2LF4+umn8cQTTyAjIwN/+MMfsGXLFiQmJvpvEl9//fX+fy9btgx33303TjrpJDz77LN48MEHYTKZcMstt6CiosK//1dffRU33HBDp3F+8cUXqK6uxo9//GNYLBb86Ec/wltvvQWv1xvwuLvvvhv//ve/8bOf/QxPPfUU4uPjcddddwU85u2338Ztt92GKVOm4Omnn8app56KG264IeCC83BPP/00br75ZkyaNAmPP/44lixZghUrVuDSSy+F2+32P66iogIPPPAArrvuOjz22GNoamrCjTfeiJtvvhkXXHABnnrqKRiGgZtuusn/vIKCAlx00UWora3FX/7yF9x3330oKSnBxRdfjNra2oA4nnzySdx66624++67MXny5CO+x2PHjsXdd9/tf2+CTRt19tln4/vvv0dRUZF/W1NTE7744gucc845ANqGsF9xxRWwWCx49NFH8bvf/Q5ff/01LrvssoDXf7hj+T4fjZaWFlx99dWIiYnBE088gUceeQQulwtXXXUVmpubccEFF+D8888HEDj0+95778Xjjz+Os88+G3//+99x2mmn4c9//jOeeuqpgP1/+OGHsNvteOaZZ3D11VcHjUHXdfzqV7/C6aefjueeew5TpkzBX//6V6xZswZA21zLl19+Ob777jv87ne/w/33349du3bhhRdeOKbXTERERH2POQtzlq7kLO3279+Pyy+/HA6HA0uXLg15nkiShFNPPbVDAWP9+vXweDwdOrt05XM3DAO
"text/plain": [
"<Figure size 1600x600 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"pca = PCA(n_components=2)\n",
"reduced_data = pca.fit_transform(data_scaled)\n",
"\n",
"# Визуализация сокращенных данных\n",
"plt.figure(figsize=(16, 6))\n",
"plt.subplot(1, 2, 1)\n",
"sns.scatterplot(x=reduced_data[:, 0], y=reduced_data[:, 1], hue=result, palette='Set1', alpha=0.6)\n",
"plt.title('PCA reduced data: Agglomerative Clustering')\n",
"\n",
"plt.subplot(1, 2, 2)\n",
"sns.scatterplot(x=reduced_data[:, 0], y=reduced_data[:, 1], hue=labels, palette='Set1', alpha=0.6)\n",
"plt.title('PCA reduced data: KMeans Clustering')\n",
"\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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zJihPXv2KD8/XzabzTu9+D792P37iZ6X2+3Wvffeqw8++EA2m83b+qz461uWY9+ntWvX6qWXXtKvv/6qzMxMhYaGqnnz5ho5cmSJ57Zt2zbNnTtXX3zxhY4cOaK4uDh16NBBN9xwgxo1alSuv5mkv97frKwsPfPMM/rPf/6j/fv3Kzo6Wuedd54mTpzo87up+Pu4Zs0avfDCC1q5cqWys7PVokUL3XzzzSV+15d3mym+7MjISH3++edyOBze+1esWKFbbrnF+3PR/utk9ncAABRHMA0A1VTxNh6XXHKJ6tevrzVr1kiSFi9eXCKYrqhFixbpoYce8pl26NAhffLJJ1q3bp3ee+891a9f/2+tozjDMHT33XfL6XSWuG/u3LmaPXu2z7SNGzdq0qRJmj17tjfULY3T6dTIkSO1YcMG77SCggJt3LhRGzdu1Pbt23XzzTeX+fi8vDxvkPJ3XHLJJZo5c6YKCgq0YsUKn6Dqgw8+8N4u+tJ2xx13lLiY3pYtW7RlyxZ99dVXmj9/foXWv3nzZo0cOVIZGRneaU6nU5988onWrFmjqVOnesP348nKytKmTZt04403avHixT4BXWncbneF6qyI7OxsjRkzRkeOHKm0Zc6fP18vvfSS9+cHH3zwhF+WHQ6H2rRpo6+++krr1q3TsGHDtHXrVh06dEiS1KVLF7399tslHrd69WrddNNNPqenb968WQ8//LA2bdqkWbNmeac/9thj3rCoyP79+7V8+XKtW7dOq1atUmRkpM/93377rRYuXOiz/GXLlmnv3r169dVXJUm7d+/WlVde6dOb3u12a/Pmzdq8ebPS09Mr/PnfsmWLZsyYIdM0K/S4Y+3atUvDhg3zeX9dLpd++ukn/fTTT8rOztaECRMkFY6mHDp0qDfkkAr3V4cOHdKXX36phx9+WEOGDKnQ+m+77TYtX77c+3PR9vL555/r6aef1nnnnVfiMU899ZRPsP7777/r/vvv1549ezR58uTjru/JJ5/0qb/IF198oeuuu87nffz111/1r3/9S3v27NH9998vqer32Zs3b9a///3vcs+/f/9+PfbYY5W2/mN9//33uuaaa1RQUOCdlpmZqQ0bNnj3/+UJpyuyz6rq1/xUGT9+vNatW6cNGzbov//9r958801dcMEFuuuuu2SapoKCgvT4448fN5T+u9tgamqqUlNTSyxz5cqVkqTAwEA1bNiwQs9r8eLF3n1vWdcGKI+PPvpIkyZN8gnGjxw5onXr1umLL77QwoUL1alTJ0mFf5uMGjVKubm53nn37t2r999/X2vWrNHChQsVERFR7nVnZmZq6NCh2rZtm3fa/v379cYbb+iTTz7R4sWLvWftFHf99df77Iu+/fZbXXvttXr22We9QfrJbjOZmZlas2aNz8CAd955p9zPSSp7fwcAwLFo5QEA1dC+ffv06aefSpJatWqlevXqqXfv3goNDZUk7wiZk1U0WleS2rRpo6VLl2rVqlW67rrrJBUGu//9739LfezIkSO1du1a77/SvjCVZtGiRd5+vsV5PB598803iouL05AhQ7wjp2NiYiTJJzgqzUsvveT9gnXBBRfonXfe0RtvvKEWLVpIKgwid+7cWebjZ8+eXa4L2CUkJPg879GjR/vcHxkZqT59+kiSvv76a+9od+mvYLp
"text/plain": [
"<Figure size 1800x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABaYAAAKkCAYAAAD7iOgXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAADL9klEQVR4nOzdd3wUdf7H8fd3tqYXEgKEDoJIEeQAOwJ6NmyAoiJ3ClaKZwf7yakgih0LJ4oK/kRUVBTkThQsKCrFDqhwSq8hEFK2zPz+CFmzkECCIQvJ6+kjMpmdnflsmdnse7/7GeM4jiMAAAAAAAAAAKqJFesCAAAAAAAAAAC1C8E0AAAAAAAAAKBaEUwDAAAAAAAAAKoVwTQAAAAAAAAAoFoRTAMAAAAAAAAAqhXBNAAAAAAAAACgWhFMAwAAAAAAAACqFcE0AAAAAAAAAKBaEUwDAAAAAAAAAKoVwTQAHOQGDBig1q1bq3Xr1rr11ltjXQ5wyOnZs6dat26tnj177nFZbm6uzjrrrMg+1qdPH+3YsUOSIvNKfmbMmLHH9Xv16hW1zBNPPHHAbw8AHIp27typhx9+WKeccoratWun7t276/7771deXl6sSwMAADFCMA0AB7GVK1fq66+/jvw+a9asSGgG4M8pKCjQVVddpeXLl0uSWrVqpYkTJyopKanM5efPnx/1+6pVq7R69eoDXicAHOqCwaAGDRqkZ599Vr///ruCwaDWr1+vF198UZdeeqlCoVCsSwQAADFAMA0AB7HXX3896veCggK98847MaoGqDlCoZD+8Y9/aPHixZKkZs2a6YUXXlBaWlq51/niiy/2+jsAoGzvvfeelixZIkm67LLLNHPmTPXv31+S9N133+n//u//YlgdAACIFYJpADhIhUIhvf3225Kk7Oxsud1uSdJrr70Wy7KAQ57jOLrttts0b948SVKjRo304osvKiMjo8zls7OzJUlr167VypUrI/M///xzSVLDhg0PcMUAcGj7/vvvZVmWGjRooFtuuUUtWrTQTTfdFLn8yy+/jGF1AAAgVtyxLgAAULa5c+dq06ZNkqS+ffvq22+/1dy5c7V06VJ98803OvLII6OWHzlypKZPny5JmjNnTiQsW716tXr16iVJOu+88zRmzJjIdd5++2393//9n1auXKmdO3cqOTlZHTp00NVXX62OHTtGliu9jvJkZ2frww8/lCQ98cQTevLJJ/eo5ddff9W5556rQCAQtbwkzZgxQ1OmTNHy5cvl8XjUrFkzDRo0SH/961/3eV8VFRXp+eef18yZM/Xbb78pLi5OzZo100UXXaRzzjmnzPto2bJlkfmff/65Lr30UklS165d9fLLL0cuGzhw4D7fML/00kv65ZdfNGrUKEnSPffcowsvvDBy+YoVK3T66adLkvr3769Ro0bJtm29/PLLeuutt/Tbb7/Jtm01btxYvXv31mWXXSaPx6M333xzn33FS9e7ceNGPffcc5o7d67WrVun+Ph4derUSYMGDVLXrl2jrte6desy15ecnKzmzZvr8ssv1ymnnLLXbUvFo/pvv/32CtUnRT83yjNs2DANHz5cUvFIuoceekg//vij8vLyZNt21LK7P48q4oEHHoh86FO/fn1NmjRJWVlZ5S7fsWNHbd68WUVFRZo/f76aNWsmx3EiI6a7du1abkuPb775RuPHj9eiRYsUCATUrFkz9evXTwMGDJBl/TE+wHEcvfzyy5o+fbpWr16tgoICpaWlqUuXLho6dKhatGgRWbbksRs0aJBOO+00Pfzww/r222/l8Xh04okn6pZbblHdunUjy//666964okn9PXXXysnJ0cej0dNmjTRWWedpUGDBkXVUZaePXtqzZo1Uff1pEmT9O9//1ubN2/WW2+9pTZt2kTVtjel971ffvlFTz/9tBYuXKjNmzfL7/ercePGOuecczRw4MCo2rZv365nn31WH3zwgdauXaukpCQddthhGjRokLp37x5V69689NJL6tatm2zb1uTJkzVt2jT973//U1xcnI466igNGTJEHTp0iCy/YMEC/e1vf5MkPfnkk1q/fr0mT56stWvXqlGjRvrb3/4Wtb+XXn706NHq06ePpOLj1Nlnn63//e9/kqKPjUuWLNGzzz6rJUuWqLCwUNnZ2TrnnHN06aWXyuPxRNZd0WN2yeOwt/2v5H4ofb/tvvyjjz6qp59+WlL0fllyXNx9/5s2bZruuOMOSXu+3uyu9PGt9P1Uup7d17948WI9++yz+uGHH5STk6P4+Hi1aNFC/fv317nnnlvutko76aSTtG7dunIvL32/SAfmPi/9HCl9v0rRrzkl+8re7qvdlfWaX7qG4447Ts8//7yk4vZEgwYNkuM4atWqlV5//XX5fL5y112RfbA8d9xxh2688UZt2LAhsl/v3LkzcnnJh++VuV2hUEh33nmn3n//fblcrkjrs9L3b3l2f5zmzZunF154QT///LNyc3OVkJCgI444Qpdeeuket23FihV6+umn9fnnn2vbtm3KyMhQ586ddfXVV+uwww6r0N9M0h+P7/bt2zV+/Hj997//1caNG5WWlqaTTjpJw4YNi3ptKv04zp07VxMnTtSsWbOUl5entm3b6rrrrtvjtb6i+0zpdaekpOjTTz+V1+uNXD5z5kxdf/31kd9Ljl/7c7wDAKA0gmkAOEiVbuPRu3dvNW3aVHPnzpUkTZ06dY9gurImT56sf/3rX1HztmzZoo8++kjz58/XO++8o6ZNm/6pbZRm27Zuv/12BQKBPS57+umn9eijj0bNW7x4sYYPH65HH300EuqWJRAI6NJLL9WiRYsi84qKirR48WItXrxYK1eu1HXXXVfu9QsKCiJByp/Ru3dvPfDAAyoqKtLMmTOjgqr3338/Ml3ypu2WW27Z42R6y5Yt07Jly/Tll19qwoQJldr+0qVLdemllyonJycyLxAI6KOPPtLcuXM1cuTISPi+N9u3b9eSJUt07bXXaurUqVEBXVkOZF/QvLw8XX755dq2bVuVrXPChAl64YUXIr/fc889+3yz7PV6deSRR+rLL7/U/PnzNWDAAC1fvlxbtmyRJHXr1k1vvvnmHtebM2eO/vGPfygYDEbmLV26VPfee6+WLFmicePGReaPHTs2EhaV2Lhxo9577z3Nnz9fs2fPVkpKStTlCxcu1Msvvxy1/hkzZmjdunWaMmWKJGnNmjXq379/VG/6UCikpUuXaunSpVq/fn2ln//Lli3TmDFj5DhOpa63u9WrV2vAgAFRj28wGNQPP/ygH374QXl5eRo6dKgkKScnRxdeeGEk5JCKj1dbtmzRF198oXvvvVfnn39+pbZ/00036b333ov8XrK/fPrpp3ryySd10kkn7XGdJ554IipY//XXX3X33Xdr7dq1uuGGG/a6vccffzyq/hKff/65rrjiiqjH8eeff9ZDDz2ktWvX6u6775ZU/cfspUuX6rnnnqvw8hs3btTYsWOrbPu7+/bbb/X3v/9dRUVFkXm5ublatGhR5PhfkXC6Mses6r7PD5QhQ4Zo/vz5WrRokT777DO9/vrrOvXUU3XbbbfJcRz5/X49/PDDew2lq2IfjIuLi9xfa9asibpvK/rBQmlTp06NHHvLOzdARXzwwQcaPnx41Aef27Zt0/z58/X555/r5ZdfVpcuXSQV/20yaNAg5efnR5Zdt26d3n33Xc2dO1cvv/yykpOTK7zt3NxcXXjhhVqxYkVk3saNG/Xaa6/po48+0tSpUyPf2intqquuijoWLVy4UJdddpmeeuqpSJC+v/tMbm6u5s6dGzUw4K233qrwbZLKP94BALA7WnkAwEFow4YN+vjjjyVJ7du3V5MmTdSrVy8lJCRIUmSEzP4qGa0rSUceeaSmT5+u2bNn64orrpBUHOx+9tlnZV730ksv1bx58yI/Zb1hKsvkyZMj/XxLC4fD+vrrr5WRkaHzzz8/MnI6PT1dkqKCo7K88MILkTdYp556qt566y299tpratu2raTiIHLVqlXlXv/RRx+t0Ans6tWrF3W7Bw8eHHV5SkqKTj75ZEnSV199FRn
"text/plain": [
"<Figure size 1800x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABaYAAAKkCAYAAAD7iOgXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAADZPElEQVR4nOzdd3xUZdrG8etMn0lPCC0QqvQqAiKgUuwdUFCWtSMouC4WsCurggUFu6wd8RUsrCIiu6KgLooVO2BbBaSXQEgy7Zz3j5MMGZJAgpAJ5Pflcz5z5syZmXtqmGueuR/DsixLAAAAAAAAAABUE0eiCwAAAAAAAAAA1C4E0wAAAAAAAACAakUwDQAAAAAAAACoVgTTAAAAAAAAAIBqRTANAAAAAAAAAKhWBNMAAAAAAAAAgGpFMA0AAAAAAAAAqFYE0wAAAAAAAACAakUwDQAAAAAAAACoVgTTAFDDDR8+XK1bt1br1q11/fXXJ7oc4KDTv39/tW7dWv379y9zWl5enk477bTYa2zQoEHasWOHJMW2lSxz584tc/4BAwbE7fPQQw8d8NsDAIeC66+/PvbeCQAAaieCaQCowX799Vd99tlnsePz58+PhWYA/pzCwkJddtllWrlypSSpVatWeuqpp5SSklLu/kuWLIk7vmrVKq1evfqA1wkAh5r33ntPr732WqLLAAAACUYwDQA12CuvvBJ3vLCwUG+88UaCqgEOHZFIRH/729/05ZdfSpKaNWumZ555RhkZGRWe5+OPP97jcQDA3m3btk0333xzossAAAA1AME0ANRQkUhEr7/+uiQpJydHLpdLkjR79uxElgUc9CzL0g033KDFixdLkho3bqznnntOderUKXf/nJwcSdIff/yhX3/9Nbb9o48+kiQ1atToAFcMAIeOf/zjH9q4cWOiywAAADUAwTQA1FCLFi2KfXAbPHiw+vTpI0lavny5vvrqqzL7T5gwIdarsXR7gdWrV8e2T5gwIe48r7/+uoYNG6aePXuqQ4cOOuqoozRq1CgtW7Ysbr/Sl1HRUrp/70MPPVRuLT///LM6duxYbr/fuXPnatiwYTr88MPVs2dPDRs2TP/+978rdV8Fg0E99thjOu2009SpU6fY+UuC/fLuo9I++uij2PYRI0bEnTZixIi93valS5dq5syZseMvvfRS3GX88ssvsdNuueUWSZJpmnruued01lln6fDDD1eXLl10+umna/r06QqHw5Kk1157ba/XXbreDRs26K677tLxxx+vjh07qmfPnho1apQ++eSTMvdZRZfXvXt3DR06VP/5z38qdd+/8sorla5Pin9uVLSU7tP8zTff6Pzzz1f37t3Vtm3bPT7vKuvuu++OPTcaNGigZ599VvXq1atw/y5dusjr9Ura1c7DsqzYiOkePXpUeN6vvvpKI0eO1BFHHKFOnTrpjDPO0IwZM2SaZtx+lmXp+eef11lnnaXu3burQ4cO6tu3r8aNG6eff/45bt+S23733Xfrq6++0vnnn6+uXbuqR48euuaaa7Rhw4a4/X/++WddddVV6tOnj9q3b68uXbrojDPO0JNPPlmmjvKU16P72WefVe/evdW6dWv98MMPZWrb01LaTz/9pKuvvlrHHnusOnTooCOOOEKDBg3Sc889V6a27du3695779UJJ5ygjh076qijjtL5558f+4KhdK17e71K9mvw+eef12mnnaaOHTuqR48eGjVqlL7++uu46126dGnsvP/5z380Y8aMWA0nn3xymdd76f1LtyoIBoM64YQTyn1vXLZsmUaPHq1evXqpa9euOvXUU/XPf/4z9l5QorLv2ZV5/ZXcD6Xvt933nzp1armvy5L3xd1ffy+//HKFf292V/r9bfeWDhX1hf/yyy81atQo9e3bVx06dFCPHj107rnn6l//+tcer6u0Y489tlLPjxIH4j4v/RzZvS996b85lbmvdlfe3/zSNVx00UWxfZcsWaI2bdqodevWOu200xQMBvd42ZV5De7NggUL9Oabb8rtdqtjx46VPl9599mOHTs0atQode7cWWeccUZs38r87dzX/w9J0tdff60xY8aoV69e6tixowYMGKBbbrlFf/zxR5laK1pKP7fXr1+vG2+8UX369FGHDh3Uv39/TZ48Wdu3b4+73pL/wxxxxBHatGmTxo8fr549e6pr16665JJLtHz58jK1Ll68WBdccIF69+6tDh06qGfPnrrwwgvLPGal/390yimnlLmc6dOnl/s+Xvq+Lv3a2bx5s3r27Fnu+z4AAKW5El0AAKB8pdt4nHrqqWratKkWLVokSZo1a5Y6d+78py7/hRde0D/+8Y+4bZs3b9Z7772nJUuW6I033lDTpk3/1HWUZpqmbrzxRoVCoTKnPfbYY5o6dWrcti+//FJjx47V1KlTddJJJ1V4uaFQSBdccIG++OKL2LZgMKgvv/xSX375pX799VddddVVFZ6/sLBQN910U5Vvz+5OPfVU3X333QoGg3rrrbc0bNiw2Glvv/12bH3QoEGSpOuuu67MZHorVqzQihUr9Mknn2j69OlVuv7ly5frggsu0NatW2PbQqGQ3nvvPS1atEgTJkzQBRdcsNfL2b59u5YtW6Yrr7xSs2bNUqdOnfa4fyQSqVKdVZGfn69LLrlE27Zt22+XOX36dD3zzDOx47fffvteRzx7PB517txZn3zyiZYsWaLhw4dr5cqV2rx5sySpZ8+e5YZFCxcu1N/+9re4cHH58uW64447tGzZMk2ZMiW2/Z577tHTTz8dd/4NGzZo3rx5WrJkiRYsWKC0tLS40z///HPNmDEj7vLnzp2rtWvXaubMmZKkNWvWaOjQoXG96SORiJYvX67ly5dr3bp1VX7+r1ixQpMnT5ZlWVU63+5Wr16t4cOHxz2+4XBY3333nb777jvl5+friiuukCRt3bpVw4YN0//+97/Yvps3b9bmzZv18ccf64477tDZZ59dpeu/5pprNG/evNjxktfLhx9+qIcffljHHntsmfM89NBDWrFiRez4zz//rFtvvVV//PGHxo0bt8fre/DBB+PqL/HRRx/p0ksvjXscf/zxR9133336448/dOutt0qq/vfs5cuX68knn6z0/hs2bNA999yz365/d19//bXOP//8uPA0Ly9PX3zxRez9/8wzz9zr5VTlPau67/MD5fLLL9eSJUv0xRdf6L///a9eeeUVnXDCCbrhhhtkWZZ8Pp/uv//+2Bdw5dkfr8EtW7botttukySNHTtWv/76q7755pt9vl2PPvqo3nvvvX0+f4mqPM7/+c9/9Pe//z3u9bp69WrNmjVLixYtKvNF1d6sWrVK5557btwI8jVr1uiZZ57R+++/r1mzZpWZ9yAcDmv48OFxj8UHH3ygzz//XC+88ILat28vSXrnnXc0duzYuC/5tm3bpiVLluijjz7SjBkz1L179zI1/fTTT/ruu+9ilyOpym3k/vGPf+zXv90AgEMXI6YBoAZav3693n//fUlSx44d1aRJEw0YMEBJSUmS7EkQ8/Pz9/nyTdPUjBkzJEmdO3fWnDlztGDBAl166aWS7GD3v//9b7nnveCCC7R48eLYUtLmYG9eeOGFWD/f0qLRqD777DPVqVNHZ599tubOnauZM2cqMzNTkuKCo/I888wzsVDihBNO0L/+9S/Nnj079oFq+vTpWrVqVYXnnzp1aqUmsKtfv37c7b744ovjTk9LS9PAgQMlSZ9++mnch8ySYLpp06bq0qWL/vjjD/3vf/9Tenq6BgwYoJdeeklz587VaaedJsn+gPn666/rpJNOil3frFmzYpd34oknxrZPmzZNpmlq3Lhx2rp1q5xOp/72t79p3rx5euyxx9S4cWNZlqXJkyfHhfclunTposWLF+u9997T66+/rnPOOUeS/Rz5/PPP93q/FBYWSrLbXZS+f+rXr7/X886aNSu2/8MPP1zm9KVLl8Y+2J5wwgmaO3dubP8uXbrs9fJ3t379+rgwWJKeeOKJSgWsPXv2lCR98sknikajsTYePp+v3C+JSr7wCIfDys3N1VNPPaX58+fr8ssvlyS9+ea
"text/plain": [
"<Figure size 1800x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABaYAAAKkCAYAAAD7iOgXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAADi8ElEQVR4nOzdd5hU5d2H8Xvq9mVhWXoHQRQQNEiIvfvGEhW7McbejbGhMdFoNKKJid1oYuyJaCKxa2I3EjW2WNFYoqIoSF+2TDvvH7Mz7LK7sCAwlPtzrrnOmTNnzjxn2u5855nfEwqCIECSJEmSJEmSpNUkXOgGSJIkSZIkSZLWLwbTkiRJkiRJkqTVymBakiRJkiRJkrRaGUxLkiRJkiRJklYrg2lJkiRJkiRJ0mplMC1JkiRJkiRJWq0MpiVJkiRJkiRJq5XBtCRJkiRJkiRptTKYliRJkiRJkiStVgbTkrSGO+SQQxg2bBjDhg3jnHPOKXRzpLXO9ttvz7Bhw9h+++1bXTZ//nz22GOP/Gtsn332YeHChQD5dbnTAw880Or6O+ywQ4ttrr766lV+PJK0Nnruuedava/mTm29P0uSpHWfwbQkrcE+/vhjXn755fz5Rx55JB+aSfpm6uvrOfbYY3n//fcBGDp0KDfddBMVFRVtbj916tQW5z/77DOmT5++ytspSeuC9957r9BNkCRJa5hooRsgSWrfX/7ylxbn6+vruf/++znkkEMK1CJp3ZBKpfjRj37Ea6+9BsDAgQO5+eab6dy5c7vXeeGFF5Z6XpLUvlwwPXz4cH73u9+1uCwSiRSiSZIkqcDsMS1Ja6hUKsV9990HQO/evYlGs98l3n333YVslrTWC4KAn/zkJzzzzDMA9O3bl1tvvZWuXbu2uX3v3r0B+OKLL/j444/z6//1r38B0KdPn1XcYkla++WC6QEDBtCjR48Wp5qamgK3TpIkFYLBtCStoZ5++mlmzZoFwIQJE9hyyy0BmDZtGv/5z39abX/22WfnazU2Ly8wffr0/Pqzzz67xXXuu+8+DjzwQMaNG8eIESP4zne+w3HHHcfrr7/eYrvm++hIfcirr766zbZ8+OGHjBw5ss16kg888AAHHnggm266KePGjePAAw/k73//e4fuq8bGRq6//nr22GMPRo0alb9+Lthv6z5q7l//+ld+/aGHHtriskMPPXSZx/7iiy9y55135s/fddddLfbx0Ucf5S8777zzAMhkMtx6663svffebLrppowePZo999yTG2+8kWQyCcC99967zNtu3t6ZM2fyy1/+kp133pmRI0cybtw4jjvuOF566aVW91l7+xs7diwHHHAA//jHPzp03//lL3/pcPug5XOjvVPzOs1vvvkmhx12GGPHjmX48OErpS7ppZdemn9u9OzZk1tuuYXu3bu3u/3o0aMpKioCFpfzCIIg32N68803b/e6//nPfzjmmGP41re+xahRo/je977H7bffTiaTabFdEATcdttt7L333owdO5YRI0aw1VZbcdppp/Hhhx+22DZ37Jdeein/+c9/OOywwxgzZgybb745Z5xxBjNnzmyx/Ycffsipp57KlltuycYbb8zo0aP53ve+xx/+8IdW7WhLWzW6b7nlFrbYYguGDRvGu+++26ptSzs198EHH3D66aez7bbbMmLECL71rW+xzz77cOutt7Zq24IFC/jVr37FLrvswsiRI/nOd77DYYcdlv+CoXlbl/V6hexr8LbbbmOPPfZg5MiRbL755hx33HG88cYbLW73xRdfzF/3H//4B7fffnu+Dd/97ndbvd6bb3/vvffm1zc2NrLLLru0+d74+uuvc/zxxzN+/HjGjBnD7rvvzu9///v8e0FOR9+zO/L6y90Pze+3Jbe/4oor2nxd5t4Xl3z93XPPPe3+vVlS8/e35vdT8/Ysuf/XXnuN4447jq222ooRI0aw+eabc9BBB/G3v/1tqbfV3Lbbbtuh50fOqrjPmz9HlqxL3/xvTkfuqyW19Te/eRuOOOKI/LZTp05lww03ZNiwYeyxxx40NjYudd8deQ22J5lM8tFHHwHZLwMTiQRz5swhCIJlXhfavs8WLlzIcccdxyabbML3vve9/LYd+du5ov8PAbzxxhucdNJJjB8/npEjR7LDDjtw3nnn8cUXX7Rqa3un5s/tr776inPPPZctt9ySESNGsP322zNp0iQWLFjQ4nZz/8N861vf4uuvv2bixImMGzeOMWPGcNRRRzFt2rRWbX3mmWf44Q9/yBZbbMGIESMYN24chx9+eKvHrPn/R7vttlur/dx4441tvo83v6+bv3Zmz57NuHHj2nzflySpOUt5SNIaqnkZj913350BAwbw9NNPAzB58mQ22WSTb7T/O+64g1/84hct1s2ePZunnnqKqVOncv/99zNgwIBvdBvNZTIZzj33XBKJRKvLrr/+eq644ooW61577TVOPvlkrrjiCv7v//6v3f0mEgl++MMf8uqrr+bXNTY28tprr/Haa6/x8ccfc+qpp7Z7/fr6en76058u9/Esaffdd+fSSy+lsbGRhx9+mAMPPDB/2aOPPppf3meffQA466yzWg2m99577/Hee+/x0ksvceONNy7X7U+bNo0f/vCHzJ07N78ukUjw1FNP8fTTT3P22Wfzwx/+cJn7WbBgAa+//jqnnHIKkydPZtSoUUvdPpVKLVc7l0dtbS1HHXUU8+bNW2n7vPHGG7n55pvz5y+44IJl9niOx+NssskmvPTSS0ydOpVDDjmE999/n9mzZwMwbty4NsOiJ554gh/96EctwsVp06Zx0UUX8frrr3P55Zfn11922WX88Y9/bHH9mTNn8tBDDzF16lQee+wxOnXq1OLyV155hdtvv73F/h944AFmzJjBnXfeCcDnn3/OAQcc0KI2fSqVYtq0aUybNo0vv/xyuZ//7733HpMmTepwoNSe6dOnc8ghh7R4fJPJJG+//TZvv/02tbW1nHjiiQDMnTuXAw88kP/973/5bWfPns3s2bN54YUXuOiii9hvv/2W6/bPOOMMHnroofz53Ovln//8J9dccw3bbrttq+tcffXVLerkfvjhh5x//vl88cUXnHbaaUu9vauuuqpF+3P+9a9/cfTRR7d4HP/73//y61//mi+++ILzzz8fWP3v2dOmTeMPf/hDh7efOXMml1122Uq7/SW98cYbHHbYYS3C0/nz5/Pqq6/m3//32muvZe5ned6zVvd9vqqccMIJTJ06lVdffZXnn3+ev/zlL+yyyy785Cc/IQgCiouL+c1vfpP/Aq4t3/Q1+NFHH+Wf4w899BA333wzyWSSmpoajjrqqA79fVrSddddx1NPPbXc11vS8jzO//jHP/jxj3/c4vU6ffp0Jk+ezNNPP93qi6pl+eyzzzjooIPyHREg+75988038+yzzzJ58uRW4x4kk0kOOeSQFo/Fc889xyuvvMIdd9zBxhtvDMDjjz/OySef3OJLvnnz5jF16lT+9a9/cfvttzN27NhWbfrggw94++238/sBuP/++5fruH7xi1+s1L/dkqR1lz2mJWkN9NVXX/Hss88CMHLkSPr3788OO+xAWVkZkB0Esba2doX3n8lkuP322wHYZJNNmDJlCo899hhHH300kA12n3/++Tav+8Mf/pBnnnkmf8qVOViWO+64I1/Pt7l0Os3LL79M165d2W+//XjggQe488476dKlC0CL4KgtN998cz6U2GWXXfjb3/7G3Xffnf9AdeONN/LZZ5+1e/0rrriiQwPY9ejRo8VxH3nkkS0u79SpEzvuuCMA//73v1t8yMwF0wMGDGD06NF88cUX/O9//6OqqooddtiBu+66iwceeIA99tgDyH7AvO+++/i///u//O1Nnjw5v79dd901v/7KK68kk8lw2mmnMXfuXCKRCD/60Y946KGHuP766+nbty9BEDBp0qQW4X3O6NGjeeaZZ3jqqae477772H///YHsc+SVV15Z5v1SX18PZMtdNL9/evTosczrTp48Ob/9Nddc0+ryF198Mf/BdpddduGBBx7Ibz969Ohl7n9JX331VYswGOC
"text/plain": [
"<Figure size 1800x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from sklearn.metrics import silhouette_samples, silhouette_score\n",
"from sklearn.decomposition import PCA\n",
"from sklearn.cluster import KMeans\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"# Применение PCA для уменьшения размерности (если нужно)\n",
"pca = PCA(n_components=2)\n",
"reduced_data = pca.fit_transform(df_scaled) \n",
"\n",
"random_state = 9\n",
"\n",
"# Функция для вычисления силуэтов\n",
"def get_clusters_silhouettes(data, random_state, max_clusters=5):\n",
" silhouettes = []\n",
" for n_clusters in range(2, max_clusters + 1):\n",
" kmeans = KMeans(n_clusters=n_clusters, random_state=random_state)\n",
" cluster_labels = kmeans.fit_predict(data)\n",
" silhouette_avg = silhouette_score(data, cluster_labels)\n",
" sample_silhouette_values = silhouette_samples(data, cluster_labels)\n",
" silhouettes.append((n_clusters, silhouette_avg, sample_silhouette_values, cluster_labels))\n",
" return silhouettes\n",
"\n",
"# Функция для визуализации силуэтов\n",
"def draw_silhouettes(data, silhouettes):\n",
" for n_clusters, silhouette_avg, sample_silhouette_values, cluster_labels in silhouettes:\n",
" fig, ax1 = plt.subplots(1, 1)\n",
" fig.set_size_inches(18, 7)\n",
"\n",
" # Первый график: Диаграмма силуэтов\n",
" ax1.set_xlim([-0.1, 1])\n",
" ax1.set_ylim([0, len(data) + (n_clusters + 1) * 10])\n",
" y_lower = 10\n",
" for i in range(n_clusters):\n",
" ith_cluster_silhouette_values = sample_silhouette_values[cluster_labels == i]\n",
" ith_cluster_silhouette_values.sort()\n",
" size_cluster_i = ith_cluster_silhouette_values.shape[0]\n",
" y_upper = y_lower + size_cluster_i\n",
" color = plt.cm.nipy_spectral(float(i) / n_clusters)\n",
" ax1.fill_betweenx(np.arange(y_lower, y_upper), 0, ith_cluster_silhouette_values, facecolor=color, edgecolor=color, alpha=0.7)\n",
" ax1.text(-0.05, y_lower + 0.5 * size_cluster_i, str(i))\n",
" y_lower = y_upper + 10\n",
"\n",
" ax1.set_title(\"Диаграмма силуэтов для %d кластеров\" % n_clusters)\n",
" ax1.set_xlabel(\"Коэффициент силуэта\")\n",
" ax1.set_ylabel(\"Метка кластера\")\n",
" ax1.axvline(x=silhouette_avg, color=\"red\", linestyle=\"--\")\n",
" ax1.set_yticks([])\n",
" ax1.set_xticks([-0.1, 0, 0.2, 0.4, 0.6, 0.8, 1])\n",
" plt.suptitle((\"Анализ силуэтов для KMeans кластеризации на данных с %d кластерами\" % n_clusters), fontsize=14, fontweight='bold')\n",
"\n",
" plt.show()\n",
"\n",
"# Вычисление силуэтов\n",
"silhouettes = get_clusters_silhouettes(df_scaled, random_state)\n",
"\n",
"# Визуализация силуэтов\n",
"draw_silhouettes(df_scaled, silhouettes)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "aimenv",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.6"
}
},
"nbformat": 4,
"nbformat_minor": 2
}