646 lines
1.7 MiB
Plaintext
Raw Permalink Normal View History

2025-02-13 23:39:55 +04:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Бизнес-цель:** класстеризация цен на золото с целью выделения основных ценовых групп."
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Index(['Open', 'High', 'Low', 'Close', 'Adj Close', 'Volume', 'SP_open',\n",
" 'SP_high', 'SP_low', 'SP_close', 'SP_Ajclose', 'SP_volume', 'DJ_open',\n",
" 'DJ_high', 'DJ_low', 'DJ_close', 'DJ_Ajclose', 'DJ_volume', 'EG_open',\n",
" 'EG_high', 'EG_low', 'EG_close', 'EG_Ajclose', 'EG_volume', 'EU_Price',\n",
" 'EU_open', 'EU_high', 'EU_low', 'EU_Trend', 'OF_Price', 'OF_Open',\n",
" 'OF_High', 'OF_Low', 'OF_Volume', 'OF_Trend', 'OS_Price', 'OS_Open',\n",
" 'OS_High', 'OS_Low', 'OS_Trend', 'SF_Price', 'SF_Open', 'SF_High',\n",
" 'SF_Low', 'SF_Volume', 'SF_Trend', 'USB_Price', 'USB_Open', 'USB_High',\n",
" 'USB_Low', 'USB_Trend', 'PLT_Price', 'PLT_Open', 'PLT_High', 'PLT_Low',\n",
" 'PLT_Trend', 'PLD_Price', 'PLD_Open', 'PLD_High', 'PLD_Low',\n",
" 'PLD_Trend', 'RHO_PRICE', 'USDI_Price', 'USDI_Open', 'USDI_High',\n",
" 'USDI_Low', 'USDI_Volume', 'USDI_Trend', 'GDX_Open', 'GDX_High',\n",
" 'GDX_Low', 'GDX_Close', 'GDX_Adj Close', 'GDX_Volume', 'USO_Open',\n",
" 'USO_High', 'USO_Low', 'USO_Close', 'USO_Adj Close', 'USO_Volume'],\n",
" dtype='object')\n"
]
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"import seaborn as sns\n",
"df = pd.read_csv(\"../static/csv/FINAL_USO.csv\")\n",
"df=df.drop(columns=[\"Date\"])\n",
"columns = df.columns\n",
"index = df.index\n",
"print(df.columns)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Визуализация по парам признаков\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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9dm1axdGjhyJG264wXssNjYWs2fPDnh9v379kJqa6v3cqVMn9O7dG6dOnar3e8aPHw+lUokPPvjAe6yiogK7d+/GH/7wB+8xuVyOs2fP4sCBAw2u/Wp9/vnn6NKlC9LS0rzHJBIJFi9ejKqqKuzduxcAvL8vKysLQM0bkDfeeCNuueUWZGdnA6gp1zly5IjPfxZERERErR3jxhpffPEF9Hq9T1yYlpaGn376CUePHvUe+/zzzxEcHIw///nP3mNisRiLFi266u8EakrNAVzzW5GlpaX48ccfkZ6ejtjYWO/xQYMG4ZZbbsHnn3/uPSaXy7F//36UlJQEfNaPP/6IgoIC3H333dDr9dDpdNDpdKiursbNN9+MrKwsuFyua1onEV09lmkTUZsyfPhwDBs2zO94TExMwDKc2s6cOYORI0f6HVepVAGvT0xMDPg9FRUV9X5PcHCwdzKgzWZDSEgItm3bBrvd7hNULlmyBF9//TWGDx8OlUqFW2+9FXfffTc0Gk29z78SZ86cQXJyMoKCfPecPGXWZ86cAQB07twZycnJyM7Oxv3334/s7GyMGzcOo0ePxqJFi3Dq1CkcP34cLpeLyUgiIiJqUxg31njvvfeQlJSEkJAQaLVaAECvXr0gk8mwadMmPP/8897f3LVrV0RERPjc37t37wa/I5CoqCgANf0cr4UnXg30/X379sWXX36J6upqhIeH4x//+AfmzJmDhIQEDB06FFOmTME999yDnj17AqgpGQdQb8m50WhETEzMNa2ViK4O34wkIqqDWCwOeNztdjd476xZs1BZWYkvvvgCAPD//t//Q58+fTB48GDvNX379sXPP/+M999/HykpKdi6dStSUlKwYsWKxvkBVyglJQXZ2dmwWCz44YcfkJqaigEDBkAulyM7OxvZ2dmIiIiAWq1u1nURERERtRWtNW40mUzYsWMHCgsLkZyc7P3Tr18/mM1mbN68+YrWeC369OkDADh8+HCTPL+23//+9zh16hQyMzMRHx+Pl156Cf379/f+Z+p56/Gll14K+Lbs7t27/ZKwRNR0mIwkog6je/fu3t3g2gId+61Gjx6Nrl274oMPPoBOp8OePXt8drc9wsPD8Yc//AHr169HUVERbrvtNjz33HOwWq2/6fu7d++OgoICv3KTEydOeM97pKamoqioCO+//z6cTidGjRqFoKAgb5IyOzsbo0aNqjPIJiIiImpv2kvcuG3bNlitVvz73//Ghx9+6PPn2WefxZkzZ7zTpLt3747S0lJUVVX5POPnn3++pt91/fXXo3fv3vjkk0/8nnklPPFqoO8/ceIElEolwsPDvce6du2KBQsWYPv27SgsLIRCocBzzz0HoOZNUKDmbc0JEyYE/BNo2jcRNQ0mI4mow5g4cSL27duHH3/80XusvLwcmzZtavTvCgoKwl133YUdO3bgP//5DxwOh19QqdfrfT5LpVL069cPbrf7iqY81mfKlCk4f/68T/8hh8OBzMxMREREYMyYMd7jnvLrF198EYMGDUJ0dLT3+DfffIODBw+yRJuIiIg6lPYSN7733nvo2bMnHnjgAdx1110+f/7+978jIiLC+5umTJkCh8OBf//73977nU4nMjMzr/m3rVy5Enq9Hvfeey8cDoff+a+++go7d+4MeG/Xrl1xww03YOP
"text/plain": [
"<Figure size 1600x1200 with 4 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def draw_data_2d(data, x_index, y_index, subplot):\n",
" # Преобразуем numpy.ndarray в pandas.DataFrame\n",
" data = pd.DataFrame(data, columns=columns, index=index)\n",
" sns.scatterplot(x=data.columns[x_index], y=data.columns[y_index], data=data, ax=subplot)\n",
" subplot.set_title(f'{data.columns[x_index]} vs {data.columns[y_index]}')\n",
" subplot.set_xlabel(data.columns[x_index])\n",
" subplot.set_ylabel(data.columns[y_index])\n",
"\n",
"plt.figure(figsize=(16, 12))\n",
"\n",
"#high и low\n",
"draw_data_2d(df, 2, 3, subplot=plt.subplot(2, 2, 1))\n",
"\n",
"# high и adj close\n",
"draw_data_2d(df, 2, 5, subplot=plt.subplot(2, 2, 2))\n",
"\n",
"# low и adj close\n",
"draw_data_2d(df, 3, 5, subplot=plt.subplot(2, 2, 3))\n",
"\n",
"#Volume и adj close\n",
"draw_data_2d(df, 6, 5, subplot=plt.subplot(2, 2, 4))"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.preprocessing import StandardScaler\n",
"columns = df.columns\n",
"index = df.index"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Понижение размерности и визуализации"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAArEAAAIjCAYAAAAUdENlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAD+CklEQVR4nOzdd3hb5dk/8O85OlqWLHlnOnEWhEwgjACFQAkzQIEALaUvq5RCoVCg9CVtGWGlgV/ZZRWasEpZobyFAmGWUXYCJASIM5zEjhNvbenonPP8/pClWLZsS7ZsS/H3c125wEey9GhY59b93M/9SEIIASIiIiKiPCIP9QCIiIiIiDLFIJaIiIiI8g6DWCIiIiLKOwxiiYiIiCjvMIglIiIiorzDIJaIiIiI8g6DWCIiIiLKOwxiiYiIiCjvMIglIiIiorzDIJaIiIiI8g6D2By3fPlySJKU9K+iogJHHHEEXn311aEeHhEREfXTZ599hksvvRTTp0+Hw+HAuHHjcMYZZ2D9+vVDPbScpgz1ACg9N954IyZMmAAhBHbu3Inly5fj+OOPx7/+9S+ccMIJQz08IiIi6qOlS5fiww8/xOmnn45Zs2Zhx44duO+++7Dvvvvi448/xowZM4Z6iDlJEkKIoR4EdW/58uU477zz8Nlnn2G//fZLHG9tbcWIESNw+umn46mnnhrCERIREVF//Pe//8V+++0Hi8WSOFZdXY2ZM2fitNNOw5NPPjmEo8tdLCfIU0VFRbDb7VCUXcn0mpoaSJKE5cuXJ133kksugSRJOPfccxPHVqxYgQMOOAAlJSWw2+2YOnUqli5divh3mnfeeQeSJOHFF1/sct9///vfIUkSPvroIwDA119/jXPPPRcTJ06EzWbDyJEjcf7556O5uTnl2KuqqrqUSEiShHfffTfpOh3HCwDPPfccJElCVVVV4tj333+PH/7whxg5ciSsVisqKytx0UUXoaWlJXEdVVVx3XXXYc6cOXC73XA4HDj00EPxzjvvJN1+/Pn7f//v/3UZ84wZM3D44YcnHTv88MO7HPvss88Sj6cjv9+Pq666ChMnToTZbE563E1NTSmfp85SPWedn7eBeKzvvvsuJEnC888/3+W6Tqcz6XWKl798/vnn3T6Ozs/bOeecA5vNhm+//TbpescccwyKi4uxffv2bm8r/ji6+9f59WloaMDPf/5zjBgxAjabDbNnz8Zjjz3W5XYNw8Ddd9+NmTNnwmazoby8HMcee2yXx5Wq3CfV/ba1teE3v/kNKisrYbVaMXnyZCxduhSGYXT72OK6+3tJ9T7TNA033XQTJk2aBKvViqqqKvz+979HJBLpcpupZnAuvfTSLrcpSRJuuOGGpGO33357l8f573//G4qidHlPdf79xsZGTJw4EfPmzYOqqonjkUgE119/PSZPnpz4W/7d737XZeySJOHSSy/tMvYTTjgh6bMhk89DAFi9ejWOPfZYlJeXJz2/vc10dfxbuvPOOzF+/HjY7XbMmzcPa9euTbpuup+VDzzwAGbPnp34G549ezYeffTRpOuce+65kCQJe++9d5cxLVmyBJIkwel0drnsySefxJw5c2C321FSUoKf/OQn2LZtW9J1Dj/8cMyYMQNffPEFDj74YNjtdkyYMAEPPvhg0vUy+WwAgE2bNuH0009HSUkJCgoKMHfuXLzyyitdfjccDuOGG27AHnvsAZvNhlGjRuHUU0/Fxo0be/2b7/jaxv8+a2pqErdtGAZmzZqV8r3Rnfhz3d39dHT//fdj+vTpsFqtGD16NC655BK0tbX1eh8HH3xwUgALAFOmTMH06dO7fDamsmzZMkiShL/97W9Jx2+99VZIkoR///vfvd5GPmI5QZ7weDxoamqCEAINDQ2499574ff78bOf/azH39uwYQP++te/djnu9Xpx4IEH4pxzzoHZbMZrr72Ga665Boqi4KqrrsLhhx+OyspKPPXUUzjllFOSfvepp57CpEmTcNBBBwEA3njjDWzatAnnnXceRo4ciW+++QYPP/wwvvnmG3z88cddTooAcOihh+LCCy8EAHz77be49dZbe3wcmqbhD3/4Q5fjgUAAY8eOxYknngiXy4W1a9fiL3/5C+rq6vCvf/0r8VgfeeQRnHnmmfjFL34Bn8+HRx99FMcccww+/fTTlCeBvvrf//3flMevvvpqPPjgg/j5z3+OQw45BGazGStWrEj5JaEnRx11FM4++2wAsYD5nnvuSbp8MB9rttx99914++23cc455+Cjjz6CyWTCQw89hJUrV+KJJ57A6NGje72NM888E8cff3zSsUWLFiX9HAqFcPjhh2PDhg249NJLMWHCBDz33HM499xz0dbWhssvvzxx3Z///OdYvnw5jjvuOFxwwQXQNA3vv/8+Pv7446QZkbg777wTZWVlAIBbbrkl6bJgMIh58+ahrq4Ov/zlLzFu3Dj897//xaJFi1BfX4+77rqr18e3995746qrrko69vjjj+ONN95IOnbBBRfgsccew2mnnYarrroKn3zyCZYsWYJvv/024/dad9ra2rBkyZIux48//njccccduOKKK7DHHnvgpJNO6nKdSCSCk08+GSaTCS+++GLipG0YBk466SR88MEHuPDCC7HXXnthzZo1uPPOO7F+/Xr885//zMrYu/s89Hg8OO644yCEwJVXXonKykoAwBVXXJH2bT/++OPw+Xy45JJLEA6Hcffdd+OHP/wh1qxZgxEjRgBI/7PS5/Ph6KOPxqRJkyCEwLPPPosLLrgARUVFWLhwYeI+FUXBN998g9WrV2OfffZJHF++fDlsNluXMd5yyy249tprccYZZ+CCCy5AY2Mj7r33Xhx22GFYvXo1ioqKEtdtbW3F8ccfjzPOOANnnnkmnn32WVx88cWwWCw4//zz035e4nbu3ImDDz4YwWAQl112GUpLS/HYY4/hpJNOwvPPP584z+i6jhNOOAFvvfUWfvKTn+Dyyy+Hz+fDG2+8gbVr12L+/Pl44oknErcb/xzteGzSpEndjuOJJ57AmjVrMh6/1WrFI488kvj5ggsu6HKdG264AYsXL8b8+fNx8cUX4/vvv8cDDzyAzz77DB9++CHMZnNG9xkvH5w+fXqv1z3vvPOwYsUKXHnllTjqqKNQWVmJNWvWYPHixfj5z3/e5fNxtyEopy1btkwA6PLParWK5cuXJ1138+bNAoBYtmxZ4tgZZ5whZsyYISorK8U555zT431NmzZNnHDCCYmfFy1aJKxWq2hra0sca2hoEIqiiOuvvz5xLBgMdrmtp59+WgAQ7733XpfLxowZI84777zEz++8844AIN55553EsfHjxyeN9/777xdWq1UcccQRYvz48T0+jl/96lfC6XQmftY0TUQikaTrtLa2ihEjRojzzz8/cSz+/N1+++1dbnP69Oli3rx5ScfmzZuXdOzf//63ACCOPfZY0flPa9SoUeKYY45JOnb99dcLAKKxsbHHxyOEEKqqCgDi0ksvTRx77rnnujxvA/FY46/Pc8891+W6Docj6XWKv18/++yzbh9L5+dNCCFef/11AUDcfPPNYtOmTcLpdIqTTz6529voy+O46667BADx5JNPJo6pqioOOugg4XQ6hdfrFUII8fbbbwsA4rLLLutym4ZhJP3817/+VQAQW7Zs6fbx3XTTTcLhcIj169cn/e4111wjTCaT2Lp1a4+Pcfz48WLBggVdjl9yySVJ77Mvv/xSABAXXHBB0vV++9vfCgDi7bffzvg2hRACQNLf++9+9ztRUVEh5syZ0+V1FGLX39+XX37Z5ffPOussUVJSIr7//vuk33niiSeELMvi/fffTzr+4IMPCgDiww8/TBrPJZdc0uV+FyxYkPTZkMnnYfz99/TTTyfdZnfPU0fx+7Hb7aK2tjZx/JNPPhEAxBVXXJE4lulnZZymacLlciX9/Z9zzjnC4XCIE088Men4+++/L+x2uzj55JOFw+FIHK+pqREmk0nccsstSbe9Zs0aoShK0vF58+YJAOLPf/5z4lgkEhF77723qKioEKqqCiEy+2z4zW9+IwAkvcY+n09
"text/plain": [
"<Figure size 800x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from sklearn.decomposition import PCA\n",
"\n",
"reduced_df = PCA(n_components=2).fit_transform(df)\n",
"\n",
"# Визуализация\n",
"plt.figure(figsize=(8, 6))\n",
"plt.scatter(reduced_df[:, 0], reduced_df[:, 1], alpha=0.6)\n",
"plt.title(\"Визуализация данных после понижения размерности до 2-х\")\n",
"plt.xlabel(\"Principal Component 1\")\n",
"plt.ylabel(\"Principal Component 2\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Выбор кол-ва кластеров на основе инерции (метод локтя) (неиерархического\n",
"алгоритма кластеризации) "
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA04AAAIjCAYAAAA0vUuxAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABxqklEQVR4nO3dd3xV9f3H8fe9yc0eJISQAAECQWRvNIDiYAiWQm0dOABtrbXgQq1SfwrUWqqtghNXC3XgbMGt4ABkyAZZAoFAGAkhCdnrJvf8/gi5cskOSc69yev5eORB7rnfc+/n3vsF8s53HIthGIYAAAAAAFWyml0AAAAAALg7ghMAAAAA1IDgBAAAAAA1IDgBAAAAQA0ITgAAAABQA4ITAAAAANSA4AQAAAAANSA4AQAAAEANCE4AAAAAUAOCEwAAAADUgOAEAABQjcWLF8tisWjz5s1mlwLARAQnAB6p/AcZi8WiNWvWVLjfMAzFxMTIYrHoF7/4hQkVAgCA5oTgBMCj+fn5acmSJRWOr1q1SseOHZOvr68JVQEAgOaG4ATAo40fP14ffPCBSkpKXI4vWbJEgwYNUlRUlEmVAQCA5oTgBMCjTZ48Wenp6VqxYoXzWHFxsT788EPdeOONlZ7jcDi0YMEC9erVS35+fmrbtq3uuOMOnT592tmmc+fOzqmAlX117tzZ2TYvL0/333+/YmJi5Ovrq+7du+uf//ynDMOo8NwrV66s8jFra9q0aZWeP2fOHJd23377rS655BIFBgaqVatWmjhxovbu3evSZs6cORWe+7vvvpOvr6/+8Ic/uLSp7mvlypXO8xcuXKjevXsrICDApc2HH35Yq9d32WWX1er1Sa5TNs/+uuyyy1zabdu2TVdddZXatGnj0q420zhr+/nWpr8cPny4xvdy2rRpLq/t8OHDzudwOBzq27evLBaLFi9e7Dxe3if69+9fof558+bJYrEoKCjI5fiiRYt0xRVXKDIyUr6+vurZs6cWLlxY6XtQVb89++9BeZuaPufy/pSWluZyfPPmzRVel1S3fnzul7e3t0u7Dz74QIMGDZK/v78iIiJ088036/jx49XWW5XTp09r6NCh6tChg/bt21evxwDgWbxrbgIA7qtz586Kj4/XO++8o3HjxkmSvvjiC2VlZemGG27Qc889V+GcO+64Q4sXL9att96qu+++W4mJiXrhhRe0bds2rV27VjabTQsWLFBubq4kae/evfrb3/6mP//5z+rRo4ckOX8INQxDv/zlL/Xdd9/pt7/9rfr376+vvvpKDz74oI4fP6758+dXWvfdd9+tIUOGSJLeeOMNl+BXGxERES6Pfcstt7jc//XXX2vcuHHq0qWL5syZo4KCAj3//PMaPny4tm7d6vID79l27NihSZMmafz48XrxxRclSddcc43i4uKcbe677z716NFDv//9753Hyt+X9957T3/84x912WWX6a677lJgYKDz/auLDh06aN68eZKk3Nxc3XnnndW2nz9/viIiIiRJTzzxhMt9WVlZGjdunAzD0MyZMxUTE+N8HTWp6+c7evRoTZkyxeXY008/7Qzlbdq00Ztvvum873//+5+WLl3qcqxr165V1vPmm29q586dld7n7e2t3bt3a9u2bRowYIDz+OLFi+Xn51eh/cKFC9WrVy/98pe/lLe3tz755BP98Y9/lMPh0PTp0yt9jrP/Drz66qtKSkqqstaGUNd+vHDhQpeAaLX+/Pvh8r/zQ4YM0bx583Ty5Ek9++yzWrt2rbZt26ZWrVrVuq60tDSNHj1aGRkZWrVqVbWfGYBmxAAAD7Ro0SJDkrFp0ybjhRdeMIKDg438/HzDMAzj2muvNS6//HLDMAyjU6dOxtVXX+087/vvvzckGW+//bbL43355ZeVHjcMw/juu+8MScZ3331X4b5ly5YZkoy//vWvLsd/85vfGBaLxUhISHA5vnz5ckOS8eGHHzqPTZ8+3ajLP8c33XSTERsb63JMkjF79mzn7f79+xuRkZFGenq689iOHTsMq9VqTJkyxXls9uzZzuc+fPiwER0dbYwYMcIoKCio8vk7depkTJ06tdL7Jk+ebLRq1crl/PL374MPPqjV6xs2bJjRu3dv5+1Tp05VeH3lXnvtNUOSceTIEeexkSNHGiNHjnTe/uqrrwxJxjvvvFPhdZzdNypTl89XkjF9+vQKj3H11VcbnTp1qvTxz37/z1XexxMTEw3DMIzCwkKjY8eOxrhx4wxJxqJFi5xtp06dagQGBhoTJkwwZsyY4Tz+/fffG/7+/sakSZOMwMBAl8cv//tytrFjxxpdunSpcHzFihWGJGPVqlUuz3n266rt51z+mk+dOuVyfNOmTRVeV1378bmPWa64uNiIjIw0evfu7dI3P/30U0OS8dhjj1Vb89n/3iQnJxu9evUyunTpYhw+fLja8wA0Ly16qt7q1as1YcIEtWvXThaLRcuWLavT+YWFhZo2bZr69Okjb29vTZo0qdJ2L774onr06CF/f391795db7zxxvkXD8DpuuuuU0FBgT799FPl5OTo008/rXKa3gcffKDQ0FCNHj1aaWlpzq9BgwYpKChI3333XZ2e+/PPP5eXl5fuvvtul+P333+/DMPQF1984XK8sLBQkiodAait4uLiaje9SE5O1vbt2zVt2jSFh4c7j/ft21ejR4/W559/XuGc9PR0jR07VsHBwfr444/rXV9OTo4CAgLO6/UVFhbW+vzi4mJJqvb9yMnJkSS1bt26zrXU9fNtTC+++KLS09M1e/bsKtvcdtttWrJkiYqKiiSVTce75pprFBoaWqGtv7+/8/usrCylpaVp5MiROnTokLKyslza1uZ9LpeTk6O0tDRlZmZW2y4jI8Pl7+C5z1mfflyVzZs3KzU1VX/84x9d+tbVV1+tCy+8UJ999lmtHufYsWMaOXKk7Ha7Vq9erU6dOtW6BgCer0UHp7y8PPXr1885HaWuSktL5e/vr7vvvlujRo2qtM3ChQs1a9YszZkzR7t379bcuXM1ffp0ffLJJ+dTOoCztGnTRqNGjdKSJUv0v//9T6WlpfrNb35TadsDBw4oKytLkZGRatOmjctXbm6uUlNT6/TcR44cUbt27RQcHOxyvHw605EjR1yOl6/rqOwH2drKzMyssF7l3JokqXv37hXu69Gjh9LS0pSXl+dy/Be/+IX27dunzMzMStdm1VZ8fLxOnDihOXPmKCkpqdIfiGuSlpZW6/en/Ifz6t6PwYMHy2azac6cOdq2bZvzB3WHw1Hj49f1820sWVlZ+tvf/qaZM2eqbdu2Vba7+uqr5e3trY8++kh5eXl6//33deutt1badu3atRo1apRz7VCbNm305z//2fl8Z6vN+1zutttuU5s2bRQWFqbg4GDdeOONOnnyZIV23bt3d/n7d+7/o/Xpx1Wp7rEuvPDCWn+Ot9xyi1JTU7Vq1Sq1b9++VucAaD5a9BqncePGOddEVKaoqEiPPPKI3nnnHWVmZqp379568sknnYuOAwMDnQtp165dW+lv1958803dcccduv766yVJXbp00aZNm/Tkk09qwoQJDf6agJbqxhtv1O23366UlBSNGzeuyvUKDodDkZGRevvttyu9v02bNo1YpZwL/ataY1QbKSkpDf6b7p9++klffPGFrrvuOt1///1atGhRvR7nvvvu0759+/T4449r7ty5dT6/uLhYycnJGj16dK3ap6SkKCgoSIGBgVW26dSpkxYtWqR77rlHAwcOdLmvb9++da7RDE8++aSsVqsefPBBpaenV9nOZrPp5ptv1qJFi5Sfn6/WrVvriiuucFlDJUkHDx7UlVdeqQsvvFDPPPOMYmJi5OPjo88//1zz58+vECpTUlIkqVa7VD722GO65JJLZLfbtWXLFv3lL39RZmZmhRGi//73vwoJCXHe3r9/f5Vrq9zFNddcozfeeEPPPvuscw0egJajRQenmsyYMUN79uzRu+++q3bt2mnp0qW66qqrtHPnTnXr1q1Wj1FUVFRhyom/v782btwou90um83WGKUDLc6vfvUr3XHHHfrhhx/03nv
"text/plain": [
"<Figure size 1000x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from sklearn.cluster import KMeans\n",
"inertias = []\n",
"clusters_range = range(1, 11)\n",
"for i in clusters_range:\n",
" kmeans = KMeans(n_clusters=i, random_state=42)\n",
" kmeans.fit(df)\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()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Вывод: \n",
"На основе инерции можно предположить, что оптимально взять 2-4 кластера"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Выбор кол-ва кластеров на основе коэф-а силуэта (для неиерархического алгоритма кластеризации)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Коэффициент силуэта вычисляется с помощью среднего внутрикластерного расстояния (a) и среднего расстояния до ближайшего кластера (b) по каждому образцу. Силуэт вычисляется как (b - a) / max(a, b). b — это расстояние между a и ближайшим кластером, в который a не входит. \n",
"\n",
"Коэффициент силуэта принимает значения от -1 до 1. Чем ближе значение к 1, тем лучше качество кластеризации. Значение, близкое к 0, может указывать на то, что объекты находятся на границе между кластерами, а отрицательное значение — на неправильное назначение объектов кластерам."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA04AAAIjCAYAAAA0vUuxAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACDBElEQVR4nOzdd3hU1cLF4TWZdNIIKYQQIBCqNAFBQIp0bGAXRIqfDeECYkGvVxAbVxFR7BVU7A3Fq0DovQtSE0roJYSQTuqc74/ISEwgGcjkpPze58ljcubMzJpNkKzsffZYDMMwBAAAAAC4IBezAwAAAABAeUdxAgAAAIBiUJwAAAAAoBgUJwAAAAAoBsUJAAAAAIpBcQIAAACAYlCcAAAAAKAYFCcAAAAAKAbFCQAAAACKQXECAAAoI88++6wsFosSEhLMjgLAQRQnAGVm1qxZslgs2rhxY6HbPvzwQ1ksFg0cOFB5eXllkueGG25QvXr1HL7f6NGjZbFYSj8QAAAotyhOAEz3008/aeTIkerSpYu+/vprWa1WsyMBAAAUQHECYKqlS5dq0KBBatasmebOnStPT0+zIwEAABRCcQJgmi1btmjAgAEKCwvT/Pnz5e/vX+ic7777Tm3btpWXl5eCgoI0ZMgQHT161H770aNHNWjQIIWHh8vDw0P169fXE088odTU1EKP9fnnnysiIkIBAQGaMmWK/fg333yjWrVqKSgoSC+//HKh+82fP1+NGjWSj4+PxowZI8MwJOWXvgYNGsjPz0/jx48vsMRw6dKlslgsWrp0aYHHuv7662WxWPTss8/aj13omoeNGzfKYrFo1qxZ9mMHDhwodEySRo0aJYvFouHDhxc4npSUpHHjxikiIkIeHh6KiorSyy+/LJvNVugxX3311UKvvXnz5urevXuB13Sxj3OvqyTXcdSrV69Q3qLYbDa98cYbatGihTw9PRUcHKx+/foVWPL5zzGVpKlTp8pisdjzn2/48OEXzT9z5kxZLBb98ccfhe770ksvyWq16ujRo9qxY4duuukmhYaGysPDQ02bNtWLL76onJycYp/r/I8DBw5Ikn7++Wddf/31qlWrljw8PNSgQQM9//zzDi1f7d69+0Vf2/nOLZ/958c/x+yPP/5Qv379FBwcXOC8G2644aJZzv/emj59uurWrSsvLy9169ZN27dvL3Dun3/+qeHDh6t+/fry9PRUzZo1de+99+r06dMFznv33XfVqlUr+fv7q1q1amrVqpU+/vjjAucMHz5cPj4+hfJ8//33hf5edu/eXc2bNy/2NZz7OxcfH6/g4GB1797d/v8CSdq7d6+qVaumO++886JjUpSDBw8qKipKzZs318mTJx2+P4Cy4Wp2AABV0759+9SvXz95eHho/vz5CgsLK3TOrFmzNGLECF111VWaMmWKTp48qTfeeEOrVq3SH3/8oYCAAO3bt08nT57Uv/71L1WvXl07duzQjBkztGjRIq1cuVJeXl6SpFWrVmnYsGHq1KmTBg0apM8//1z79+/X2bNn9dxzz+nf//63FixYoCeffFJ16tTRoEGDJEn79+/XwIEDFRUVpZdeeknz5s2z/8A+atQo/etf/9Iff/yh6dOnKzg4WE899dQFX/Py5cv122+/lfpY7t27Vx9++GGh4xkZGerWrZuOHj2qBx98UHXq1NHq1av11FNP6fjx43r99dcdep6mTZvq888/t3/9wQcfaNeuXZo+fbr9WMuWLS/5dVzI//3f/2nWrFnq37+/7rvvPuXm5mrFihVau3at2rVrV+R9kpKSCpTjogQFBRXIfs8999g/v+222zRq1Ch98cUXuvLKKwvc74svvlD37t0VHh5uL5OPP/64qlWrpg0bNmjixIlavXq15s6dKxcXFz344IPq1atXgee5+eabdcstt9iPBQcHS8r/nvfx8dH48ePl4+OjxYsXa+LEiUpJSdHUqVNLPGa1a9e2v/60tDSNHDnyoudPnz5dQUFBkqQXX3yxwG3Jycnq37+/DMPQ+PHjFRERIUl65JFHSpzns88+U2pqqkaNGqXMzEy98cYb6tGjh7Zt26bQ0FBJUnR0tPbv368RI0aoZs2a2rFjhz744APt2LFDa9eutV9XmJqaqj59+qhBgwYyDEPffvut7rvvPgUEBOjWW28tcaZLFRISonfffVe333673nzzTY0ZM0Y2m03Dhw+Xr6+v3nnnHYceb9++ferRo4cCAwMVHR1t/3MAUA4ZAFBGZs6caUgyfv31V6NBgwaGJKNPnz5FnpudnW2EhIQYzZs3N86ePWs//uuvvxqSjIkTJ17weaKjow1JxnPPPWc/dtNNNxmRkZFGZmamYRiGkZqaakRGRhre3t7G/v37DcMwDJvNZnTu3Nlo1aqV/X5jxowxfH19jYSEBMMwDCMnJ8e4+uqrDUnGunXr7OcNGjTICAkJsT/+kiVLDEnGkiVL7Od06NDB6N+/vyHJmDRpkv34pEmTDEnGqVOnCryODRs2GJKMmTNn2o/FxcUVOnbHHXcYzZs3NyIiIoxhw4bZjz///PNGtWrVjNjY2AKP++STTxpWq9U4dOhQgcecOnVqobG84oorjG7duhU6bhiGMWzYMKNu3bpF3nah13S+unXrFshblMWLFxuSjDFjxhS6zWaz2T//55g+8cQTRkhIiNG2bdsi8999991GZGRkgWP/fIxBgwYZtWrVMvLy8uzHNm/eXGj8/+nDDz80JBmfffZZkbf/83nOl5GRUejYgw8+aHh7e9u/t4rTqVMno3nz5vavT506dcHnPJf14MGD9mPdunUrMGbz5883JBlfffVVgfvWrVvXuP766y+a5dz3lpeXl3HkyBH78XXr1hmSjEceecR+rKjX/tVXXxmSjOXLl1/wOXJzcw0/Pz9j9OjR9mPDhg0zqlWrVujc7777rtDfy27duhlXXHFFsa/hn3/mgwYNMry9vY3Y2Fhj6tSphiRjzpw5F3ycc87/u7Fr1y6jVq1axlVXXWUkJiYWe18A5mKpHoAyN3z4cB0+fFiDBw/WggUL9N133xU6Z+PGjYqPj9fDDz9c4Lqn66+/Xk2aNNH//vc/+7GcnBwlJCTYP1q3bq127doVeNxFixbpuuuuk4eHhyTJx8dHzZo1U3BwsCIjIyXJvqvf1q1b7cuDFi1apK5du6pGjRqSJFdXV7Vt21aS1L59e/vj33LLLYqPjy+0/OicH3/8URs2bNB///vfSxqzC9m0aZO+++47TZkyRS4uBf+X/t1336lLly6qXr16gfHp1auX8vLytHz58gLnZ2RkFDgvISHhsnc4TExMVEJCgtLT0y/p/j/88IMsFosmTZpU6LYL7Wx49OhRvfnmm3rmmWeKXK4lSdnZ2fbvhQsZOnSojh07piVLltiPffHFF/Ly8iows5GVlVVgzAYOHKjQ0NAiv6+Lc26GVMqfWUlISFCXLl2UkZGh3bt3l+gxMjMzS3ytYHZ2tiRddCzOLXs993fgUgwcOFDh4eH2r9u3b68OHToUmIE9/7VnZmYqISFBV199tSRp8+bNBR4vLy9PCQkJOnjwoKZPn66UlBR16dKl0PP+8/u5qCW85z9eQkKCfUyK89Zbb8nf31+33XabnnnmGd1zzz0aMGBAie4rSdu3b1e3bt1Ur149LVy4UNWrVy/xfQGYg+IEoMwlJiZq9uzZ+vTTT9W6dWuNHTtWycnJBc45ePCgJKlx48aF7t+kSRP77VL+Mrzg4OACHxs3btTevXslSWfOnFF6enqBH9wu5Nw5hw8ftv/3Uu53vry8PP373//W3XffXepL2Z588kl16dKlyGtN9uzZo3nz5hUam3PLxuLj4wucP2nSpELnlvSH9Qtp3LixgoOD5ePjo9DQUP3nP/9xqIzt27dPtWrVUmBgYInvM2nSJNWqVUsPPvjgBc9JSkq6YKk6p3fv3goLC9MXX3whKf9aq6+++koDBgyQr6+v/byvvvqq0LidPHnS/v3niB07dujmm2+Wv7+//Pz8FBwcrCFDhkhSob8jF5KQkFDk9YJFSUpKkqSLjkW7du3k5uamZ599Vn/88Ye
"text/plain": [
"<Figure size 1000x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from sklearn.metrics import silhouette_score\n",
"silhouette_scores = []\n",
"for i in clusters_range[1:]: \n",
" kmeans = KMeans(n_clusters=i, random_state=42)\n",
" labels = kmeans.fit_predict(df) #reduced_df\n",
" score = silhouette_score(reduced_df, labels) #reduced_df\n",
" silhouette_scores.append(score)\n",
"\n",
"# Построение диаграммы значений силуэта\n",
"plt.figure(figsize=(10, 6))\n",
"plt.plot(clusters_range[1:], silhouette_scores, marker='o')\n",
"plt.title('Коэффициенты силуэта для разных k')\n",
"plt.xlabel('Количество кластеров')\n",
"plt.ylabel('Коэффициент силуэта')\n",
"plt.grid(True)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Вывод:\n",
"Значение коэф-а силуэта наибольшее при 2 кластерах, т.е. выгодно взять 2 кластера. Дальше значение коэф-а силуэта будет постепенно снижаться."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Иерархическая кластеризация"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Иерархический агломеративный алгоритм: последовательное объединение исходных элементов и уменьшение числа кластеров (построение кластеров снизу вверх)."
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA0EAAAKPCAYAAACraMGpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACEXklEQVR4nO3dd3gU5f7+8XvTE0JC7xC69I6ISFFQQBQpiggemmJDAbGBHooFEUXBrwWxBRQ8glgQD1WlKE1AUKSDhN5CSSf1+f3BL3uy7AJJDJls5v26rr2uzOyT3c/uzO7OPfPMMw5jjBEAAAAA2ISP1QUAAAAAQH4iBAEAAACwFUIQAAAAAFshBAEAAACwFUIQAAAAAFshBAEAAACwFUIQAAAAAFshBAEAAACwFUIQAAAAAFshBAEALPXDDz9o69atzunvvvtO27dvt64gFApHjhzRzJkzndNRUVGaM2eOdQUBKFAIQbDU/Pnz5XA4PN4aNGhgdXkA8sG2bds0YsQI7d27V+vXr9cjjzyiuLg4q8uCl3M4HBo2bJiWLl2qqKgoPfvss/rll1+sLgtAAeFndQGAJD3//POqW7euc3rixIkWVgMgPz344IP69NNPVbt2bUlSr169dMMNN1hcFbxdxYoVNXToUHXp0kWSVL58ea1cudLaogAUGA5jjLG6CNjX/Pnzdc8992jFihXq0KGDc36HDh0UHR2tv/76y7riAOSb5ORk/fXXXwoJCXHZIQL8U/v371d0dLQaNGigIkWKWF0OgAKC7nCwVEpKiiTJxyd7q+L58+c1cuRIVa5cWYGBgapZs6YmT56sjIwMZ5uoqCg5HA5NmTLF7f8bNGjgErYyTZgwwWOXvEvbdujQQQ0aNNDmzZt14403Kjg4WNWqVdMHH3zg9pinTp3SAw88oLJlyyooKEiNGzfWrFmzXNpk1urpNnv2bEnSzJkz5XA4tHr1aj388MMqWbKkwsLCNGDAAJ07d87l8RYsWKBu3bqpQoUKCgwMVI0aNfTyyy8rPT3d7XU4HA716NHDre6HH37YrTti1jq/++47l/YXLlxQ8eLF3d7zgwcP6rHHHtN1112n4OBglSxZUvfcc4+ioqLcnvNSmc+XtT+/JA0bNkwOh0ODBg1ymZ/T9WLq1KmKiIhQcHCw2rdv7xa2//zzTw0aNEjVq1dXUFCQypUrpyFDhujMmTMu7TLXm127dqlPnz4KCwtTyZIlNWLECF24cMHZLjIyUg6HQ59++qnL/7/66qtyOBxatGhRjl/3oEGDVLVqVbf3zuFwaMKECS7zjh49qiFDhqhs2bIKDAxU/fr13WqRLi7LCRMmqHbt2goKClL58uXVq1cv7d+//7L1xcXFqXnz5qpWrZqOHz/unJ+QkKCnnnrKuUyuu+46TZkyRZfud8usNzAwUM2bN1fdunX1xhtvePz8eRIZGalbbrlFZcqUUWBgoOrVq6fp06e7tatatarHz9mDDz7o0u5y3wWXrnNbtmxR165dFRYWptDQUHXs2FHr1693aZP52Q0ICNDp06dd7lu3bp3zsTdt2uRy34YNG9SlSxeFh4crJCRE7du315o1azzWebV1L7vv0eXen8xb5rqWk3U08/Vn3kJCQtSwYUN9/PHHLv87aNAghYaG6lKZ3aUvPXrz1VdfqXnz5goODlapUqV0//336+jRo26PmVlzjRo11KpVK509e1bBwcFyOBxX/R7y9PmaPXu2fHx89Nprr7m1v9z7lvV5sruuStLixYvVvn17FS1aVGFhYWrZsqW++OILSf/7/r7S7dK6M9+vEiVKqG/fvjp8+LBLm+z+tq1cudLjMunWrZvbd8/06dPVuHFjhYeHq0iRImrcuLE++eQTl//L6XdtdHS0y/xNmza5rY+5WUezLqeMjAw1atTI42OgcKE7HCyVGYICAwOv2jYxMVHt27fX0aNH9fDDD6tKlSpau3atxowZo+PHj2vatGn/uJ7p06c7f4zHjBnjsc25c+d0++23q0+fPrrvvvs0b948PfroowoICNCQIUMkSUlJSerQoYP27dunxx9/XNWqVdNXX32lQYMG6fz58xoxYoTLY9533326/fbbXea1adPGZfrxxx9XsWLFNGHCBO3evVvTp0/XwYMHnT9K0sUv9NDQUI0aNUqhoaH6+eefNW7cOMXGxuqNN95webygoCD997//1alTp1SmTBln3XPnzlVQUJDH1x4UFKTIyEiX8PTNN9+4bXRJ0saNG7V27Vr17dtXlSpVUlRUlKZPn64OHTpox44dCgkJ8fgcl7Nv3z599NFHbvNzul589tlniouL07Bhw3ThwgW9/fbbuuWWW7Rt2zaVLVtWkrR8+XL9/fffGjx4sMqVK6ft27frww8/1Pbt27V+/Xq3jYw+ffqoatWqmjRpktavX6//+7//07lz5/TZZ59JkgYPHqxvvvlGo0aN0q233qrKlStr27ZtevHFF/XAAw+4LfvsvO7sOnnypG644QY5HA49/vjjKl26tBYvXqwHHnhAsbGxGjlypCQpPT1dd9xxh3766Sf17dtXI0aMUFxcnJYvX66//vpLNWrUcHvs1NRU9e7dW4cOHdKaNWtUvnx5SZIxRt27d9eKFSv0wAMPqEmTJlq6dKmeeeYZHT16VFOnTr1svefPn9ekSZOy/fqmT5+u+vXrq3v37vLz89PChQv12GOPKSMjQ8OGDXNp26RJEz311FMu82rWrOnxcT///HPn308++aTLfdu3b1fbtm0VFhamZ599Vv7+/poxY4Y6dOigVatWqVWrVi7tfX19NXv2bJfHiYyMVFBQkNtn5+eff1bXrl3VvHlzjR8/Xj4+Ps6N519++UXXX3+9S/urrXvZfY+mTZum+Ph4SdLOnTv16quvunRT9hRSMl1tHZ06dapKlSql2NhYffrppxo6dKiqVq2qTp06XfZ/LmfmzJkaPHiwWrZsqUmTJunkyZN6++23tWbNGm3ZskXFihW77P+OGzfO43dVdixbtkxDhgzR448/rtGjR3ts07NnT/Xq1UuS9Msvv+jDDz90uT+76+rMmTM1ZMgQ1a9fX2PGjFGxYsW0ZcsWLVmyRP369dMLL7zgDO/R0dF68skn9dBDD6lt27ZuNU2cOFFjx45Vnz599OCDD+r06dN655131K5dO7f3Kzu/bZ6sXr3auSMnq7i4ON12222qUaOGjDGaN2+eHnzwQRUrVky9e/eWlPPv2tzKyffo559/rm3btuXJ86KAM4CFpk2bZiSZP/74w2V++/btTf369V3mvfzyy6ZIkSJmz549LvNHjx5tfH19zaFDh4wxxhw4cMBIMm+88Ybb89WvX9+0b9/ebf7zzz9vJJno6Ogrtm3fvr2RZN58803nvOTkZNOkSRNTpkwZk5KS4vK6Zs+e7WyXkpJiWrdubUJDQ01sbOxVa80UGRlpJJnmzZs7H98YY15//XUjySxYsMA5LzEx0e3/H374YRMSEmIuXLjg8jrq169vGjVqZKZMmeKc//nnn5tKlSqZtm3burz/mXXed999xs/Pz5w4ccJ5X8eOHU2/fv3cXoenWtatW2ckmc8+++yyrzfr80VGRjrn9enTxzRo0MBUrlzZDBw40Dk/p+tFcHCwOXLkiLPdhg0bjCTz5JNPXrH2//znP0aSWb16tXPe+PHjjSTTvXt3l7aPPfaY23p9/PhxU6JECXPrrbea5ORk07RpU1OlShUTExOTq9c9ePBgU6VKFbc6JZnx48c7px944AFTvnx5l3XbGGP69u1rwsPDna/1008/NZLMW2+95faYGRkZbvVlZGSY/v37m5CQELNhwwaX9t99952RZF555RWX+XfffbdxOBxm3759l6332WefNWXKlDHNmzf3+Fm9lKdl1blzZ1O9enWXeREREaZbt25XfbwXXnjBOBwOt//N+t736NHDBAQEmP379zvnHTt2zBQtWtS0a9fOOS/zs3vfffeZhg0bOucnJCSYsLAw5+dm48aNxpiL73OtWrVM586dne955musVq2aufXWW53zcrLuZfc9yrRixQojyaxYscLtvpyso5mv/8CBA85
"text/plain": [
"<Figure size 1000x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from scipy.cluster import hierarchy\n",
"#linkage - иерархич. кластеризация\n",
"linkage_matrix = hierarchy.linkage(df, method='ward')\n",
"\n",
"plt.figure(figsize=(10, 7))\n",
"hierarchy.dendrogram(linkage_matrix, truncate_mode='lastp', p=16, leaf_rotation=90., leaf_font_size=12., show_contracted=True)\n",
"plt.title('Дендрограмма иерархической агломеративной кластеризации')\n",
"plt.xlabel('Индексы образцов')\n",
"plt.ylabel('Расстояние')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Визуализация кластеризации"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1006 1194 1029 ... 1182 1713 1708]\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABSMAAAPxCAYAAAABkLiiAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3ST1f/A8XeSJm3TvQe0pUBp2XuUvaegDAVBBUFx4d5+3XsPXDgRBRwgyFD2BtlQZimrg+7dNGnSzN8fSLS/tohKF3xe5/Qcc8fz3Bs48unnee69CofD4UAIIYQQQgghhBBCCCFqmLKuByCEEEIIIYQQQgghhLg6SDJSCCGEEEIIIYQQQghRKyQZKYQQQgghhBBCCCGEqBWSjBRCCCGEEEIIIYQQQtQKSUYKIYQQQgghhBBCCCFqhSQjhRBCCCGEEEIIIYQQtUKSkUIIIYQQQgghhBBCiFohyUghhBBCCCGEEEIIIUStkGSkEEIIIYQQQgghhBCiVkgyUghxxWrSpAnTpk37132vueaayzsgIYQQQghRL0ncWL2UlBQUCgXffPONs+z5559HoVDU+H2EEFcmSUYKIRqEb775BoVCwb59+6qs79+/P23atKnlUdWNC4Ha22+/XddDEUIIIYSodyRurFpiYiIKhQI3NzeKi4tr9d6bN29m3LhxhIaGotFoCA4OZvTo0SxZsqRWxyGEqB8kGSmEuGIlJSXxxRdf1PUwhBBCCCFEPXc1xI3z588nNDQUgMWLF/+naz399NMYjcZLavvcc88xYMAAjh49yh133MGcOXN49NFH0ev1jB8/noULF/6nsQghGh6Xuh6AEELUFFdX17oeghBCCCGEaACu9LjR4XCwcOFCJk+eTHJyMgsWLOC2227719dzcXHBxeXv0wmLFy/mxRdfZMKECSxcuBC1Wu2se/TRR1mzZg0Wi+Vfj0MI0TDJm5FCiCtWVXv/HD58mH79+uHu7k7jxo15+eWXmTt3LgqFgpSUlErX2L59O926dcPNzY2mTZvy7bffXvSeFosFf39/br311kp1Op0ONzc3HnnkEWfZhx9+SOvWrdFqtfj5+dGlS5fL9nQ4NzeXGTNmEBISgpubG+3bt2fevHkV2nTq1Ilx48ZVKGvbti0KhYLDhw87y3788UcUCgWJiYmXZWxCCCGEEPXJlR437tixg5SUFCZNmsSkSZPYunUr6enpldoVFxczbdo0fHx88PX1ZerUqVUu6b7UPSOfeeYZ/P39+frrryskIi8YNmzY3+63uXHjRvr06YOHhwe+vr5ce+21lWLS0tJSHnjgAZo0aYKrqyvBwcEMGTKEAwcOVGi3e/duhg8fjo+PD1qtln79+rFjx46/nYcQ4vKSNyOFEA1KSUkJ+fn5lcov5YlqRkYGAwYMQKFQ8OSTT+Lh4cGXX35Z7ZPw06dPM2HCBGbMmMHUqVP5+uuvmTZtGp07d6Z169ZV9lGr1YwdO5YlS5bw2WefodFonHW//PIL5eXlTJo0CYAvvviC++67jwkTJnD//fdjMpk4fPgwu3fvZvLkyZfydVTLaDTSv39/Tp8+zaxZs4iOjmbRokVMmzaN4uJi7r//fgD69OnD999/7+xXWFjIsWPHUCqVbNu2jXbt2gGwbds2goKCaNmy5X8alxBCCCFEbZG48U8LFiygWbNmdO3alTZt2qDVavn+++959NFHnW0cDgfXXnst27dv584776Rly5YsXbqUqVOn/u31q3Lq1ClOnDjB9OnT8fLy+lfXWL9+PSNGjKBp06Y8//zzGI1GPvzwQ3r16sWBAwdo0qQJAHfeeSeLFy9m1qxZtGrVioKCArZv305iYiKdOnUCzic1R4wYQefOnXnuuedQKpXMnTuXgQMHsm3bNrp16/avxiiE+BccQgjRAMydO9cBXPSndevWFfpERUU5pk6d6vx87733OhQKhePgwYPOsoKCAoe/v78DcCQnJ1foCzi2bt3qLMvNzXW4uro6Hn744YuOdc2aNQ7AsWLFigrlI0eOdDRt2tT5+dprr6005kuRnJzsABxvvfVWtW3ef/99B+CYP3++s8xsNjvi4+Mdnp6eDp1O53A4HI5FixY5AMfx48cdDofDsXz5coerq6tjzJgxjokTJzr7tmvXzjF27Nh/PFYhhBBCiNomcWNFZrPZERAQ4Pjf//7nLJs8ebKjffv2Fdr98ssvDsDx5ptvOsusVqujT58+DsAxd+5cZ/lzzz3n+Lt0wrJlyxyA47333rukcV6Icf96nw4dOjiCg4MdBQUFzrJDhw45lEql45ZbbnGW+fj4OO65555qr2232x0xMTGOYcOGOex2u7O8rKzMER0d7RgyZMgljVEIcXnIMm0hRIPy8ccfs27duko/F97gu5jVq1cTHx9Phw4dnGX+/v5MmTKlyvatWrWiT58+zs9BQUHExsZy9uzZi95n4MCBBAYG8uOPPzrLioqKWLduHRMnTnSW+fr6kp6ezt69e/927P/Ub7/9RmhoKDfeeKOzTK1Wc99996HX69myZQuAc35bt24Fzr8B2bVrV4YMGcK2bduA88t1jh49WuG7EEIIIYSo7yRuPG/VqlUUFBRUiAtvvPFGDh06xLFjx5xlv/32Gy4uLtx1113OMpVKxb333vuP7wnnl5oD//qtyKysLBISEpg2bRr+/v7O8nbt2jFkyBB+++03Z5mvry+7d+8mMzOzymslJCRw6tQpJk+eTEFBAfn5+eTn52MwGBg0aBBbt27Fbrf/q3EKIf45WaYthGhQunXrRpcuXSqV+/n5VbkM569SU1OJj4+vVN68efMq20dGRlZ5n6Kioovex8XFxXkyYHl5Oa6urixZsgSLxVIhqHz88cdZv3493bp1o3nz5gwdOpTJkyfTq1evi17/UqSmphITE4NSWfGZ04Vl1qmpqQCEhIQQExPDtm3buOOOO9i2bRsDBgygb9++3HvvvZw9e5bExETsdrskI4UQQgjRoEjceN78+fOJjo7G1dWV06dPA9CsWTO0Wi0LFizg1Vdfdc45LCwMT0/PCv1jY2P/9h5V8fb2Bs7v5/hvXIhXq7p/y5YtWbNmDQaDAQ8PD958802mTp1KREQEnTt3ZuTIkdxyyy00bdoUOL9kHLjokvOSkhL8/Pz+1ViFEP+MvBkphBDVUKlUVZY7HI6/7Ttp0iRKS0tZtWoVAD/99BNxcXG0b9/e2aZly5YkJSXxww8/0Lt3b37++Wd69+7Nc889d3kmcIl69+7Ntm3bMBqN7N+/nz59+tCmTRt8fX3Ztm0b27Ztw9PTk44dO9bquIQQQgghGor6GjfqdDpWrFhBcnIyMTExzp9WrVpRVlbGwoULL2mM/0ZcXBwAR44cqZHr/9UNN9zA2bNn+fDDDwkPD+ett96idevWzu/0wluPb731VpVvy65bt65SElYIUXMkGSmEuGpERUU5nwb/VVVl/1Xfvn0JCwvjxx9/JD8/n40bN1Z4un2Bh4cHEydOZO7cuaSlpTFq1CheeeUVTCbTf7p/VFQUp06dqrTc5MSJE876C/r06UNaWho//PADNpuNnj17olQqnUnKbdu20bNnz2qDbCGEEEKIK82VEjcuWbIEk8nEp59+yqJFiyr8vPzyy6SmpjpPk46KiiIrKwu9Xl/hGklJSf9qXi1atCA2NpZly5ZVuualuBCvVnX/EydOEBgYiIeHh7MsLCyMu+++m19++YXk5GQCAgJ45ZVXgPNvgsL5tzUHDx5c5U9Vp30LIWqGJCOFEFeNYcOGsXPnThISEpxlhYWFLFiw4LLfS6lUMmHCBFasWMF3332H1WqtFFQWFBRU+KzRaGjVqhUOh+OSTnm8mJEjR5KdnV1h/yGr1cqHH36Ip6cn/fr1c5ZfWH79xhtv0K5dO3x8fJzlGzZsYN++fbJEWwghhBBXlSslbpw/fz5NmzblzjvvZMKECRV+HnnkETw9PZ1zGjlyJFarlU8//dTZ32az8eGHH/7rub3wwgsUFBRw2223YbVaK9WvXbuWlStXVtk3LCyMDh06MG/ePIqLi53lR48eZe3atYwcOdI5xpKSkgp
"text/plain": [
"<Figure size 1600x1200 with 4 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"linkage_matrix = hierarchy.linkage(df, method='ward')\n",
"\n",
"result = hierarchy.fcluster(linkage_matrix, 60, criterion=\"distance\")\n",
"print(result)\n",
"\n",
"def draw_data_2d(data, x_index, y_index, clusters, subplot):\n",
" data = pd.DataFrame(data, columns=columns, index=index)\n",
" sns.scatterplot(x=data.columns[x_index], y=data.columns[y_index], hue=clusters, palette='viridis', data=data, ax=subplot)\n",
" subplot.set_title(f'{data.columns[x_index]} vs {data.columns[y_index]}')\n",
" subplot.set_xlabel(data.columns[x_index])\n",
" subplot.set_ylabel(data.columns[y_index])\n",
"\n",
"\n",
"plt.figure(figsize=(16, 12))\n",
"\n",
"#high и low\n",
"draw_data_2d(df, 2, 3,result, subplot=plt.subplot(2, 2, 1))\n",
"\n",
"# high и adj close\n",
"draw_data_2d(df, 2, 5, result,subplot=plt.subplot(2, 2, 2))\n",
"\n",
"# low и adj close\n",
"draw_data_2d(df, 3, 5, result,subplot=plt.subplot(2, 2, 3))\n",
"\n",
"#Volume и adj close\n",
"draw_data_2d(df, 6, 5, result,subplot=plt.subplot(2, 2, 4))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Неиерархический алгоритм кластеризации"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA1IAAAK9CAYAAAAuQ13kAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3hUVeLG8e9MJjOpk17ovfdeBOkdREBAxYKyuuja17r+XGXVRV17xd57QUUUKYIU6dJ7CyW9zmRSJpny+wMZHZMgLSSB9/M88yxzzrn3njtBdt6cc88xeL1eLyIiIiIiInLCjFXdARERERERkZpGQUpEREREROQkKUiJiIiIiIicJAUpERERERGRk6QgJSIiIiIicpIUpERERERERE6SgpSIiIiIiMhJUpASERERERE5SQpSIiIiIiIiJ0lBSkRE5E8eeughDAbDaR2blZV1hnslIiLViYKUiMg5IikpCYPBwJNPPulX7vV6+fvf/47BYOChhx4CYMmSJRgMBgwGAx988EG557vgggswGAy0bdu2srte6QwGAzfddFO5de+88w4Gg4F169ad5V5Vjf79+58TP1MRkaqmICUicg7zer3ceOONvPbaazzwwAO+IHVMUFAQH330UZnjkpKS+OWXXwgKCjpLPa1e/u///o+ioqKq7oaIiFRjClIiIuewm2++mVmzZnH//ffzn//8p0z9yJEjWbBgQZlpaB999BEJCQl07dr1bHW1WjGZTOdtiBQRkROjICUico669dZbeemll7jvvvt45JFHym0zduxYLBYLn3/+uV/5Rx99xKRJkwgICCj3uA8++IAuXboQHBxMdHQ0l156KYcPH/Zrs2zZMiZOnEj9+vWxWCzUq1eP22+/vcxIz9SpUwkLCyM5OZmLL76YsLAw4uLiuPPOO3G73X5tP/nkE7p06UJ4eDhWq5V27drx3HPPnexH85fKe0aqqKiIW265hdjYWMLDw7noootITk72mzL5R3l5eUydOpXIyEgiIiK45pprKCwsPO51b7rpJsLCwsptd9lll5GYmOj7TNatW8ewYcOIjY0lODiYRo0ace211576Tf/Jyy+/TJs2bbBYLNSuXZt//OMf5OXl+eqff/55AgIC/MqeeuopDAYDd9xxh6/M7XYTHh7OPffcc8b6JiJSHShIiYicg26//Xaef/557rnnHv773/9W2C4kJISxY8fy8ccf+8o2bdrEtm3buPzyy8s95tFHH+Wqq66iWbNmPP3009x2220sWrSICy+80O9L9eeff05hYSE33HADL7zwAsOGDeOFF17gqquuKnNOt9vNsGHDiImJ4cknn6Rfv3489dRTvPbaa742CxYs4LLLLiMqKorHH3+cxx57jP79+7NixYoT+kyKi4vJysoq83I4HCd0/NSpU3nhhRcYOXIkjz/+OMHBwYwaNarC9pMmTSI/P5+ZM2cyadIk3nnnHWbMmHHca0yePJmCggLmzp3rV15YWMicOXO45JJLCAgIICMjg6FDh5KUlMS9997LCy+8wJQpU1i1atUJ3ctfeeihh/jHP/5B7dq1eeqpp5gwYQKvvvoqQ4cOpbS0FIC+ffvi8XhYvny577hly5ZhNBpZtmyZr2zDhg04HA4uvPDCM9I3EZFqwysiIueEAwcOeAFvgwYNvID3rrvuqrDt4sWLvYD3888/93733Xdeg8HgPXTokNfr9Xrvuusub+PGjb1er9fbr18/b5s2bXzHJSUleQMCAryPPvqo3/m2bNniNZlMfuWFhYVlrjtz5kyvwWDwHjx40Fd29dVXewHvf/7zH7+2nTp18nbp0sX3/tZbb/VarVavy+U6kY/DD/CXr7Vr1/raP/jgg94//l/k+vXrvYD3tttu8zvv1KlTvYD3wQcfLHPstdde69d23Lhx3piYmOP20+PxeOvUqeOdMGGCX/lnn33mBbxLly71er1e7+zZs8v0+UT9+Wf6ZxkZGV6z2ewdOnSo1+12+8pffPFFL+B96623vF6v1+t2u71Wq9V79913+/oeExPjnThxojcgIMCbn5/v9Xq93qefftprNBq9ubm5J91XEZHqTCNSIiLnmPT0dACaN29+Qu2HDh1KdHQ0n3zyCV6vl08++YTLLrus3LZfffUVHo+HSZMm+Y3qJCYm0qxZMxYvXuxrGxwc7PtzQUEBWVlZ9O7dG6/Xy4YNG8qce/r06X7v+/bty/79+33vIyMjKSgoYMGCBSd0X382duxYFixYUOZ11113/eWx8+bNA+DGG2/0K7/55psrPKa8+8nOzsZut1d4jMFgYOLEiXz//fd+I2WffvopderUoU+fPsDRzwLgu+++840QnSkLFy6kpKSE2267DaPx968J1113HVar1TdaZjQa6d27N0uXLgVgx44dZGdnc++99+L1elm5ciVwdJSqbdu2vj6LiJwrFKRERM4x99xzD926dePvf/87X3zxxV+2DwwMZOLEiXz00UcsXbqUw4cPVzitb8+ePXi9Xpo1a0ZcXJzfa8eOHWRkZPjaHjp0iKlTpxIdHe177qlfv34A2Gw2v/MGBQURFxfnVxYVFUVubq7v/Y033kjz5s0ZMWIEdevW5dprr/UFnBNRt25dBg8eXObVunXrvzz24MGDGI1GGjVq5FfetGnTCo+pX79+mfsB/O6pPJMnT6aoqIhvv/0WAIfDwffff8/EiRN9z23169ePCRMmMGPGDGJjYxk7dixvv/02TqfzL+/lrxw8eBCAFi1a+JWbzWYaN27sq4ej4XD9+vUUFRWxbNkyatWqRefOnenQoYNvet/y5cvp27fvafdLRKS6MVV1B0RE5MwKCwvjhx9+4MILL2TKlClYrVaGDh163GMuv/xyZs2axUMPPUSHDh0qDBcejweDwcAPP/xQ7kIUYWFhwNFnnoYMGUJOTg733HMPLVu2JDQ0lOTkZKZOnYrH4/E7rqJFLf4oPj6ejRs38uOPP/LDDz/www8/8Pbbb3PVVVfx7rvv/uXxZ1tF9+T1eo97XM+ePWnYsCGfffYZl19+OXPmzKGoqIjJkyf72hgMBr744gtWrVrFnDlz+PHHH7n22mt56qmnWLVqle/nUNn69OlDaWkpK1euZNmyZb7A1LdvX5YtW8bOnTvJzMxUkBKRc5JGpEREzkExMTHMnz+fWrVqMX78eN80q4r06dOH+vXrs2TJkgpHowCaNGmC1+ulUaNG5Y7u9OzZE4AtW7awe/dunnrqKe655x7Gjh3L4MGDqV279mndl9lsZsyYMbz88svs27ePv//977z33nvs3bv3tM77Vxo0aIDH4+HAgQN+5ZV13UmTJjFv3jzsdjuffvopDRs29H22f9SzZ08effRR1q1bx4cffsi2bdv45JNPTuvaDRo0AGDXrl1+5SUlJRw4cMBXD9C9e3fMZjPLli3zC1IXXnghq1evZtGiRb73IiLnGgUpEZFzVJ06dViwYAGhoaGMGjWKLVu2VNjWYDDw/PPP8+CDD3LllVdW2G78+PEEBAQwY8aMMiMrXq+X7Oxs4PfRmD+28Xq9p7VU+bFzH2M0Gmnfvj3AGZnSdjzDhg0Dji4J/kcvvPBCpVxv8uTJOJ1O3n33XebNm8ekSZP86nNzc8t8/h07dgRO/7MYPHgwZrOZ559/3u8ab775JjabzW+lwqCgILp168bHH3/MoUOH/EakioqKeP7552nSpAm1atU6rT6JiFRHmtonInIOa9asGT/++CP9+/dn2LBhLF++nMaNG5fbduzYsYwdO/a452vSpAmPPPII9913H0lJSVx88cWEh4dz4MABZs+ezfXXX8+dd95Jy5YtadKkCXfeeSfJyclYrVa+/PLLv3w+6Hj+9re/kZOTw8CBA6lbty4HDx7khRdeoGPHjrRq1eqUz3siunTpwoQJE3j22WfJzs6mZ8+e/Pzzz+zevRugzJ5Tp6tz5840bdqU+++/H6fT6TetD+Ddd9/l5ZdfZty4cTRp0oT8/Hxef/11rFYrI0eO/MvzZ2Zmlru3WKNGjZgyZQr33XcfM2bMYPjw4Vx00UXs2rWLl19+mW7dunHFFVf4HdO
"text/plain": [
"<Figure size 1000x800 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA1IAAAK9CAYAAAAuQ13kAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAD2p0lEQVR4nOzdd3hUVeLG8e9MJj2ZSU8Ivfeu9F6kSJOqgoq6KirWFZV1V8Wy2LD+dBHXgoodQQHp0nvvCKFDEtIz6VN/f7DMmk2CCRJC4P08T57HOefce88NUXlzmsHtdrsRERERERGRUjNWdAdEREREREQqGwUpERERERGRMlKQEhERERERKSMFKRERERERkTJSkBIRERERESkjBSkREREREZEyUpASEREREREpIwUpERERERGRMlKQEhERERERKSMFKRERqbSef/55DAbDn7o2JSXlEvfqytGjRw969Ojh+Xz8+HEMBgOfffZZuT5HRORaoCAlInKZnf/L7BtvvFGo3O12c99992EwGHj++ecBWLlyJQaDAYPBwJdfflns/Tp37ozBYKBZs2bl3fVyZzAYmDhxYrF1n332GQaDga1bt17mXlW8du3aYTAY+Ne//nVZn3v27FmeeOIJGjVqREBAAIGBgbRt25aXXnqJjIyMy9oXEZErjYKUiMgVwO1288ADDzBjxgz+8Y9/eILUeX5+fnz11VdFrjt+/Djr16/Hz8/vMvX0yvL3v/+dvLy8iu5GuTp8+DBbtmyhVq1azJo160/dq2bNmuTl5XHbbbf9YdstW7bQrFkz3n//fbp27cqbb77JtGnTaN26Na+88gqjR4/+U30REansTBXdARERgYceeojp06fzzDPP8MILLxSpHzhwID///DMpKSlERER4yr/66iuio6OpX78+6enpl7PLVwSTyYTJdHX/r+zLL78kKiqKadOmMXLkSI4fP06tWrUu6l4Gg6FUoTsjI4ObbroJLy8vduzYQaNGjQrVv/zyy3z00UcX1QcRkauFRqRERCrYI488wvvvv8/kyZN56aWXim0zdOhQfH19+f777wuVf/XVV4wePRovL69ir/vyyy9p27Yt/v7+hIWFcfPNN3Pq1KlCbdasWcOoUaOoUaMGvr6+VK9enccee6zISM/48eMJCgrizJkzDBs2jKCgICIjI3niiSdwOp2F2n7zzTe0bduW4OBgzGYzzZs355133inrt+YPFbdGKi8vj4cffpiIiAiCg4MZMmQIZ86cKTRl8vcyMjIYP348ISEhWCwW7rzzTnJzcy/43IkTJxIUFFRsu1tuuYWYmBjP92Tr1q3069ePiIgI/P39qV27NnfddVep3/Grr75i5MiRDBo0CIvFUuzIJMCMGTOoW7cu/v7+tGvXjjVr1hRpU9o1Uh9++CFnzpzhzTffLBKiAKKjo/n73/9+wXskJSVx9913Ex0djZ+fHy1btmTmzJlF2pXmZyUjI4NHH32U6tWr4+vrS7169Xj11VdxuVwX7IOISHlSkBIRqUCPPfYY7777Lk899RT//Oc/S2wXEBDA0KFD+frrrz1lu3btYt++fdx6663FXvPyyy9z++23U79+fd58800effRRli9fTrdu3Qqtb/n+++/Jzc3l/vvv57333qNfv36899573H777UXu6XQ66devH+Hh4bzxxht0796dadOmMWPGDE+bpUuXcssttxAaGsqrr77KK6+8Qo8ePVi3bl2pvif5+fmkpKQU+crOzi7V9ePHj+e9995j4MCBvPrqq/j7+3PjjTeW2H706NFkZWUxdepURo8ezWeffcaUKVMu+IwxY8aQk5PDggULCpXn5uYyb948Ro4ciZeXF0lJSdxwww0cP36cp59+mvfee4+xY8eycePGUr3Lpk2biIuL45ZbbsHHx4fhw4cXO73v448/5r777iMmJobXXnuNzp07M2TIkCKhubR+/vln/P39GTly5EVdn5eXR48ePfjiiy8YO3Ysr7/+OhaLhfHjxxcKSaX5WcnNzaV79+58+eWX3H777bz77rt07tyZyZMn8/jjj19U/0RELgm3iIhcVseOHXMD7po1a7oB96RJk0psu2LFCjfg/v77793z5893GwwG98mTJ91ut9s9adIkd506ddxut9vdvXt3d9OmTT3XHT9+3O3l5eV++eWXC91vz549bpPJVKg8Nze3yHOnTp3qNhgM7hMnTnjK7rjjDjfgfuGFFwq1bd26tbtt27aez4888ojbbDa7HQ5Hab4dhQB/+LVlyxZP++eee879+/+Vbdu2zQ24H3300UL3HT9+vBtwP/fcc0Wuveuuuwq1vemmm9zh4eEX7KfL5XJXrVrVPWLEiELl3333nRtwr1692u12u91z5swp0ueymDhxort69epul8vldrvd7iVLlrgB944dOzxtbDabOyoqyt2qVSt3QUGBp3zGjBluwN29e3dP2fmfvU8//fSCzw0NDXW3bNmy1P3s3r17oee8/fbbbsD95ZdfFupnx44d3UFBQW6r1ep2u0v3s/Liiy+6AwMD3YcOHSpU/vTTT7u9vLw8/z6IiFxuGpESEakgZ8+eBaBBgwalan/DDTcQFhbGN998g9vt5ptvvuGWW24ptu2PP/6Iy+Vi9OjRhUZ1YmJiqF+/PitWrPC09ff39/xzTk4OKSkpdOrUCbfbzY4dO4rce8KECYU+d+3alaNHj3o+h4SEkJOTw9KlS0v1Xv9r6NChLF26tMjXpEmT/vDaRYsWAfDAAw8UKn/ooYdKvKa490lNTcVqtZZ4jcFgYNSoUfzyyy+FRsq+/fZbqlatSpcuXYBz3wuA+fPnY7fb/7D/v+dwOPj2228ZM2aMZ/pir169iIqKKjQqtXXrVpKSkpgwYQI+Pj6e8vHjx2OxWMr0zPOsVivBwcEXdS3AL7/8QkxMTKGfT29vbx5++GGys7NZtWoVULqfle+//56uXbsSGhpa6Ge5T58+OJ1OVq9efdH9FBH5MxSkREQqyFNPPcX111/Pfffdxw8//PCH7b29vRk1ahRfffUVq1ev5tSpUyVO6zt8+DBut5v69esTGRlZ6OvAgQMkJSV52p48eZLx48cTFhbmWffUvXt3ADIzMwvd18/Pj8jIyEJloaGhhTa6eOCBB2jQoAEDBgygWrVq3HXXXZ6AUxrVqlWjT58+Rb6aNGnyh9eeOHECo9FI7dq1C5XXq1evxGtq1KhR5H2AP9y8Y8yYMeTl5fHzzz8DkJ2dzS+//MKoUaM8wad79+6MGDGCKVOmEBERwdChQ/n0008pKCj4w3dZsmQJycnJtGvXjri4OOLi4jh27Bg9e/bk66+/9qwPOnHiBAD169cvdL23tzd16tT5w+cUx2w2k5WVdVHXnu9T/fr1MRoL/zWjcePGnnoo3c/K4cOHWbRoUZGf4z59+gAU+lkWEbmcru6tjkRErmBBQUEsXLiQbt26MXbsWMxmMzfccMMFr7n11luZPn06zz//PC1btiwxXLhcLgwGAwsXLix2I4qgoCDg3Jqnvn37kpaWxlNPPUWjRo0IDAzkzJkzjB8/vshi/pI2tfi9qKgodu7cyeLFi1m4cCELFy7k008/5fbbby92s4GKVtI7ud3uC17XoUMHatWqxXfffcett97KvHnzyMvLY8yYMZ42BoOBH374gY0bNzJv3jwWL17MXXfdxbRp09i4caPnz6E450edStpmfNWqVfTs2fOPXu+iNGrUiJ07d2Kz2QqNcl1qpflZcblc9O3blyeffLLYe5R2RFdE5FJTkBIRqUDh4eEsWbKEzp07M3z4cJYuXUrHjh1LbN+lSxdq1KjBypUrefXVV0tsV7duXdxuN7Vr177gXzT37NnDoUOHmDlzZqHNJS52Wt55Pj4+DB48mMGDB+NyuXjggQf48MMP+cc//nHB0aE/q2bNmrhcLo4dO1ZohCYuLq5cnjd69GjeeecdrFYr3377LbVq1aJDhw5F2nXo0IEOHTrw8ssv89VXXzF27Fi++eYb/vKXvxR735ycHH766SfGjBlT7IYPDz/8MLNmzaJnz57UrFkTODdy06tXL08bu93OsWP
"text/plain": [
"<Figure size 1000x800 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1000x800 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1000x800 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Применение K-Means для кластеризации\n",
"# можно изменить количество кластеров\n",
"kmeans = KMeans(n_clusters=2, random_state=42) \n",
"\n",
"# кластеры\n",
"clusters = kmeans.fit_predict(df) #reduced_df\n",
"# задание названий кластерам\n",
"clusters_names = [\"Кластер 1\" if cluster == 0 else \"Кластер 2\" for cluster in clusters]\n",
"\n",
"\n",
"def draw_data_2d(data, x_index, y_index, clusters):\n",
" plt.figure(figsize=(10, 8))\n",
" sns.scatterplot(x=data.columns[x_index], y=data.columns[y_index], hue=clusters, palette='viridis', data=data)\n",
" plt.title(f' KMeans {data.columns[x_index]} vs {data.columns[y_index]}')\n",
" plt.xlabel(data.columns[x_index])\n",
" plt.ylabel(data.columns[y_index])\n",
" plt.legend()\n",
" plt.show()\n",
"\n",
"#high и low\n",
"draw_data_2d(df, 1, 2, clusters_names)\n",
"\n",
"# high и adj close\n",
"draw_data_2d(df, 1, 4,clusters_names)\n",
"\n",
"# low и adj close\n",
"draw_data_2d(df, 2,4, clusters_names)\n",
"\n",
"#Volume и adj close\n",
"draw_data_2d(df, 5, 4, clusters_names)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Неиерархическая кластеризация на PCA"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA0wAAAK9CAYAAAAXJOy/AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3iTVf8G8DujGc3qbikUSmkZpS0UZIkyi4CAIAqIgoAL3Lhw8HO9iLjnK4KLJQgCgiAiQ4ayZ9mrUKDQlu6kadrM5/dHXyIxSemig96f68olec4zvokt5M45zzkiQRAEEBERERERkRtxbRdARERERERUVzEwERERERERecHARERERERE5AUDExERERERkRcMTERERERERF4wMBEREREREXnBwEREREREROQFAxMREREREZEXDExEREREREReMDARERERERF5wcBERFQHzJ07FyKRCPv27XPZrtfr0blzZygUCvzxxx8AgLfeegsikQhisRhpaWlu5zIYDFAqlRCJRHjqqadqpP4bZcuWLRCJRM6Hj48PoqKi8OCDD+LcuXNu+xsMBrz99tto164d1Go1lEol4uLi8PLLLyM9Pd3jNUaOHAmRSISXX37Zax3Tp0/HXXfdhdDQUIhEIrz11lvV9RKr7OrPw9WHr68vYmNj8X//938wGAxu+589exYTJ05EVFQUFAoFtFotunfvjs8//xzFxcVu+9vtdoSHh0MkEmHt2rUea/jzzz/x0EMPoWXLlvD19UVUVBQeeeQRZGRkVPvrJSKqadLaLoCIiDwzGAy44447cPjwYaxYsQIDBgxwaZfL5fjpp58wZcoUl+2//PJLTZZZI5555hl06tQJVqsVBw4cwDfffIM1a9bgyJEjCA8PBwCcO3cOSUlJuHjxIkaMGIHHHnsMMpkMhw8fxvfff48VK1bg9OnTLuc1GAxYvXo1IiMj8dNPP+G9996DSCRyu/7//d//ISwsDImJiVi3bl2NvOaK+vrrr6FWq2E0GrF+/XpMnz4dmzZtwvbt252vac2aNRgxYgTkcjkefPBBxMXFwWKxYNu2bXjppZdw7NgxfPPNNy7n3bRpEzIyMhAZGYmFCxdi4MCBbtd++eWXkZeXhxEjRiAmJgbnzp3Df//7X/z2229ITk5GWFhYjbwHREQ3hEBERLVuzpw5AgBh7969giAIgsFgELp2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
"text/plain": [
"<Figure size 1000x800 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def draw_data_with_centers_2d(data, x_index, y_index, clusters, centers):\n",
" plt.figure(figsize=(10, 8))\n",
" sns.scatterplot(x=data.columns[x_index], y=data.columns[y_index], hue=clusters, palette='viridis', data=data)\n",
" for i, center in enumerate(centers):\n",
" plt.scatter(center[x_index], center[y_index], marker='x', color='red', s=200, label=f'Центр кластера {i+1}')\n",
"\n",
" plt.title(f'KMeans {data.columns[x_index]} vs {data.columns[y_index]}')\n",
" plt.xlabel(data.columns[x_index])\n",
" plt.ylabel(data.columns[y_index])\n",
" plt.legend()\n",
" plt.show()\n",
"\n",
"# Применение K-Means для кластеризации\n",
"# можно изменить количество кластеров\n",
"kmeans = KMeans(n_clusters=2, random_state=42) \n",
"\n",
"# кластеры\n",
"clusters = kmeans.fit_predict(reduced_df) #reduced_df\n",
"# задание названий кластерам\n",
"clusters_names = [\"Кластер 1\" if cluster == 0 else \"Кластер 2\" for cluster in clusters]\n",
"# координаты центров кластеров\n",
"centers = kmeans.cluster_centers_\n",
"\n",
"reduced_df = pd.DataFrame(reduced_df, columns=['PCA1', 'PCA2'])\n",
"\n",
"draw_data_with_centers_2d(reduced_df, 0, 1, clusters_names, centers)"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1000x800 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Применение K-Means для кластеризации\n",
"# можно изменить количество кластеров\n",
"kmeans = KMeans(n_clusters=3, random_state=42) \n",
"\n",
"# кластеры\n",
"clusters = kmeans.fit_predict(reduced_df) #reduced_df\n",
"# задание названий кластерам\n",
"clusters_names = [\"Кластер 1\" if cluster == 0 else \"Кластер 2\" if cluster == 1 else \"Кластер 3\" for cluster in clusters]\n",
"# координаты центров кластеров\n",
"centers = kmeans.cluster_centers_\n",
"\n",
"reduced_df = pd.DataFrame(reduced_df, columns=['PCA1', 'PCA2'])\n",
"\n",
"draw_data_with_centers_2d(reduced_df, 0, 1, clusters_names, centers)"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABaUAAAKgCAYAAACLLhECAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAC+PElEQVR4nOzdd3wUdf7H8ff2TSeNQCihCVINHRGkSUcEURAFKQpiQ0VRz7sT8c6upyeehdODUzh/dj096yn2Q0XFgqecUqWXkBBSNrv7/f0RM2ZTNxCyJLyesI/MTv3M7OzM7Ge/+xmbMcYIAAAAAAAAAIA6YI90AAAAAAAAAACA4wdJaQAAAAAAAABAnSEpDQAAAAAAAACoMySlAQAAAAAAAAB1hqQ0AAAAAAAAAKDOkJQGAAAAAAAAANQZktIAAAAAAAAAgDpDUhoAAAAAAAAAUGdISgMAAAAAAAAA6gxJaQAAAAAAAABAnSEpDaDe6dKli2w2m/Vo2rSp/H5/pMMCEKZNmzaFvIdvuummkOGFhYUaN25cyDi/+c1vKpzWZrOpW7duFS7n+++/l91uDxl38ODBR3ntAADHov3792vZsmWaMWOGMjMz1aRJE7lcLiUlJWnAgAFasmSJfD5fpMMEAOC4QVIaQL3y2Wefad26dSH9du7cqddffz1CEQGoTXl5eTr99NP1r3/9y+p300036bbbbqt0mm+++Ubvvvtuuf7333+/jDFHI0wAQD3z5ptvavbs2Xr88cf11VdfadeuXfL7/crKytJHH32k+fPna+DAgcrNzY10qAAAHBdISgOoV5YvX16j/gDqj9zcXI0ePVpvvfWW1e/222/XokWLqp32/vvvD3l+4MABPf7447UeIwCgfktMTNS5556rP/zhD7rsssuUkJBgDfv00091++23RzA6AACOHySlAdQbhYWFevLJJ63n7du3t7pffvll7du3r9w07777bshP9zdt2mQNu+mmm6z+rVq1CpnuhRde0PTp09WtWzelpaXJ7XYrNjZWnTp10mWXXRYyn7JatWpVrrxA2UfpJPry5ctDhpUIBoPq2bNnhcMk6YYbblDfvn2VlpYmj8cjj8ej5s2b68wzz9RHH31UzdYMZYzRs88+q/Hjx6tZs2byeDxKSkpS9+7dtWDBgpCfs1a2Hvfdd1+lw0qU3uaVPUrKK/z0009yOBxW/zfffLPc/Hr37m0Nv/jiiyVJ//znPzVmzBhrPRo1aqQ+ffpo8eLFIftI2X2jqkfZ/ePtt9/WWWedpebNm8vj8Sg+Pl49evTQokWLtH///nJxVrRPuFwupaena/z48frggw9q8GoVmzlzZrVxly2LUVo461229fGLL76ooUOHKikpKeS1qY3SGNnZ2RoxYoTef/99q999992n6667rsrp7PbiS5l//vOf2rx5s9X/scce06FDhyRJDoejynnk5OTotttuU9++fZWQkCC3262WLVtq5syZ5X6ZIUkbN27UlVdeqYEDB6pFixaKiYmRx+NRs2bNdPrpp+vll18uN03Z93lhYaFuueUWtW/f3nrvXnPNNSosLAyZzu/367777tPJJ5+sRo0ayel0Kjk5WZ07d9b555+v//u//6ty3UpUdiw0xujSSy+1+icmJurTTz8NmbaikikVPUofF9euXatLLrlEffv2VbNmzRQVFSWv16uMjAxNmTJFH374YaWx/vvf/9aUKVOUkZEhr9erhIQEdenSRZdccon27t1bbluGczwp8fLLL+uMM85Q06ZN5Xa7lZiYqKFDh2rlypXlWtWXXe93331XTzzxhHr27KmoqCg1btxYs2fP1q5du8La1pI0YcKESofde++9OvXUU9W0aVNFRUXJ5XKpSZMmGjVqlF555ZWQZfj9fv3+97/XmDFj1LZtWzVq1Egul0vJyckaOHCglixZoqKiomrXp0Rl56ESpY83pbfpzz//rNjY2Eq395GcLypSWRxS6HG29LHvcLZVOMI5h5Q9d0i1c/wId5tUto2r2kerml9ZFY0bCAR0yimnWP379u2rQCBgTXPrrbdaw2JjY/XDDz9UuYwSNblOqUxKSoqWLFmibdu2aeXKlfrd736nJUuWaPXq1fJ4PNZ4r732WlgxSZXvd6tWrQp5b/z2t78tN+3gwYNrdB4/kn35559/1nXXXafu3bsrPj5eXq9XLVu21IQJE6wvgsM9rpbdZzZs2KD58+erY8eOiomJUVRUlDp16qTrr79ee/furXK9Z86cqe+//16TJk1SUlKSoqOjNWDAAP373/8uN93hXJuX3cYrVqwIGV72vVD2PVvZ6/viiy9W+joBAGrAAEA98dRTTxlJ1uM///mPcblc1vP777+/3DSrVq0KmWbjxo3WsEWLFln9MzIyQqabNGlSyHRlH/Hx8ebrr7+uMM6MjIwqp5Vkli1bZo2/bNmykGElHnzwwXLTldasWbNK5+90Os1XX30V1nbNz883Y8eOrTLerKwsa/yK1mPnzp0mPj6+0nWsaJtX9hg0aJA1fum4zj777JB5bdiwIWS6Tz/91BhjzIwZMyqdd5MmTcxnn31mjCm/b1T1KL1/LFiwoMpxmzVrZr799tuQWKvbJ5xOZ7lpqlPVepY8Fi1aVOn04az3qlWrrPFfeeWVGr12Vdm4cWPIdJdffrnp2bOn9dxms5mHH344rGknTJhgdS9cuNAYY0wgEDCtW7c2kkxaWpo5+eSTK41x/fr1plWrVpWuk8fjMU8//XTINC+//HK122Lx4sUh05R9nw8YMKDC6aZPnx4yXXWvc9++fcPa5hUdC4PBoJkzZ47VLzEx0axZs6babV7Zo/TxdcmSJVWOa7PZyh0jgsGgufDCC6uc7ssvvyy3LcPZJwOBgJk+fXqV45599tnG7/dXut5Dhw6tcLo2bdqY3bt3V7mtjTHmtddeq3KbnXLKKVXG969//csa9+DBg9Wu+2mnnVbl+pR+f1d2HipRej8s/R6aPHlylceA0sNqer6oSGVxGBN6nC197DucbRWOcM4hZa8tjKmd40e426SybVzVtVFV8yursnE3btxoEhISrGG33XabMcaYr7/+2rjdbqv/X//61yrnX6Km1ymHo/Q5qEuXLmFPV9F+9+abb5qoqCir/4033ljhtIMGDap2X6iNfflf//qXiYuLq3SaK664whgT3nVB2X3mxRdfNNHR0ZWO16xZM/Pdd99Vut49e/YsdzyQZOx2e7lz7+Fcm5fdxr169QoZPn78+CrfsxW9vnl5eeWuG6q63gIAVM4pAKgnSrfy6dGjh/r166fTTjvNatGyfPlyXX755bWyrEaNGmnEiBHq2LGjEhMT5Xa7tWvXLr3wwgvasmWLcnJydN111+nVV18tN20wGLS6R4wYoeHDh0uSFi5cGPby9+3bp9/97ndVjnPiiSdq3LhxatKkibxer7Zu3arHH39cubm58vv9ev311yu9AVxpV199dUj93hYtWmjixIlKSEjQunXryrXQq8i1116rnJycascrvW0SExN1ww03SJKeeuoprVmzptz4l19+uRXbSy+9pL179yolJUWS9Mwzz1jjde7cWb1795YkOZ1OjRgxQpmZmVYrrOeee04FBQXauXOnTj/9dK1fv15t27bVXXfdZc1jzZo1euqpp6znpYeV/LT3iSee0J/+9KeQ5U6cOFHbt2/X3//+dwUCAW3btk1nnnmm1q1bJ6ez/Gl2+PDhGjFihA4ePKi//OUv2rdvn/x+v1599VV17ty52m1Y0bZs27at5s2bJ6m4FVpWVlbY00rSlClT1KtXL2VlZenWW2+tcJrSpTDi4+N10UUXqXHjxpW+djXxwAMPWK1U7Xa7HnvsMc2cOTOsaYcNG6Yff/xR3377rR577DHddNNNeuutt7Rx40ZJ0rx58yqsNy0Vt+ibOHGi1boqNTVV5557rpKSkvTGG2/o448/VmFhoc4//3z17NlTbdq0kVS8j2VmZqpXr15KTU1VfHy8Dh06pI8++kirVq2SJP3hD3/QBRdcoGbNmlW47A8//FATJ05Up06dtHLlSiuGlStX6vbbb1d6erpyc3N
"text/plain": [
"<Figure size 1800x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABaUAAAKgCAYAAACLLhECAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAADPRklEQVR4nOzdd3hUZdrH8d9zpqU3UiCU0JEqRRQQBUQRxQIWEJUiKhYUFUVX1xVxV+xlF0VFFFRcV2RV1N21rGIXV1QU9RUUKQrSO6TNzPP+ETJm0oNJJiHfz3XNlZlT73PmzJkzd55zP8ZaawUAAAAAAAAAQC1wIh0AAAAAAAAAAKDhICkNAAAAAAAAAKg1JKUBAAAAAAAAALWGpDQAAAAAAAAAoNaQlAYAAAAAAAAA1BqS0gAAAAAAAACAWkNSGgAAAAAAAABQa0hKAwAAAAAAAABqDUlpAAAAAAAAAECtISkNAAAAAAAAAKg1JKUB1EtdunSRMSb0aNKkifx+f6TDAlBJa9asCfsM33rrrWHjc3Nzdcopp4RNc+ONN5Y6rzFG3bp1K3U933//vRzHCZt24MCBNbx1AIC6asaMGTr11FPVpk0bJSUlye12Kzk5WUcccYRuvPFG/frrr5EOEQCABoGkNIB657PPPtO3334bNmzjxo16/fXXIxQRgOq0f/9+nXrqqfrXv/4VGnbrrbfqjjvuKHOe5cuX69133y0x/G9/+5ustTURJgCgHpoxY4Zee+01/fTTT9q1a5cCgYB27typzz//XHfeeacOP/xwrVq1KtJhAgBwyCMpDaDemTdvXpWGA6g/9u7dq5NOOklvvfVWaNidd96padOmVTjv3/72t7DXO3fu1NNPP13tMQIA6q+0tDSdfvrpmjJlimbMmKEbbrhBnTp1Co3fsmWL7rnnnghGCABAw0BSGkC9kpubq+eeey70un379qHnr776qrZt21ZinnfffTfs1v01a9aExt16662h4S1btgyb76WXXtKYMWPUrVs3ZWRkyOv1Ki4uTp06ddIVV1wRtpziWrZsWaK8QPFH0ST6vHnzwsYVCgaD6tWrV6njJOmmm27SUUcdpYyMDPl8Pvl8PjVr1kxnnHGGPvroowr2ZjhrrRYuXKjTTjtNTZs2lc/nU0pKinr06KEpU6YoLy8vNG1Z2/Hggw+WOa5Q0X1e1qOwvMKqVavkcrlCw998880Sy+vdu3do/GWXXSZJeuWVV3TyySeHtiMpKUlHHnmkpk+fHnaMFD82ynsUPz7efvttnXXWWWrWrJl8Pp8SEhLUs2dPTZs2Tdu3by8RZ2nHhMfjUWZmpk477TR98MEHVXi3CowfP77CuIuXxSiqMttdvPXxyy+/rOOOO04pKSlh7011lMbYtWuXhgwZovfffz807MEHH9QNN9xQ7nyOU3A588orr2jt2rWh4U888YT27dsnSXK5XOUuY/fu3brjjjt01FFHKTExUV6vVy1atND48eNL3JkhSatXr9bVV1+tY445Rs2bN1dsbKx8Pp+aNm2qU089Va+++mqJeYp/znNzc3X77berffv2oc/uddddp9zc3LD5/H6/HnzwQfXt2zd0q3mjRo3UuXNnjR07Vv/4xz/K3bZCZZ0LrbWaNGlSaHhycrL+97//hc1bWsmU0h5Fz4vLli3T5ZdfrqOOOkpNmzZVdHS0oqKilJWVpVGjRunDDz8sM9b//ve/GjVqlLKyshQVFaXExER16dJFl19+ubZu3VpiX1bmfFLo1Vdf1emnn64mTZrI6/UqOTlZxx13nJ599tkSreqLb/e7776rZ555Rr169VJ0dLTS09M1YcIEbdq0qVL7WpKGDx9e5rgHHnhAxx57rJo0aaLo6Gh5PB41btxYQ4cO1WuvvRa2Dr/frz/96U86+eSTQ2UIPB6PGjVqpGOOOUYzZ85Ufn5+hdtTqKzvoUJFzzdF9+kvv/yiuLi4Mvf37/m+KE1ZcUjh59mi576D2VeVUZnvkOLfHVL1nD8qu0/K2sflHaPlLa+40qYNBAI6+uijQ8OPOuooBQKB0DwzZswIjYuLi9OKFSvKXUehqlynlGf16tV6+eWXdd999+nGG2/UnXfeqS+++EJxcXGhaYp+l1SkrH3897//XW63W8YYOY6jxx57rMS8Vb1e3L59u66//noNHjxYLVu2VHx8vLxerzIyMnTCCSfomWeeKfPuoO+//16TJk1Sp06dFBcXp5iYGLVu3VrnnHOOli5dWunzfGnH4FdffaUJEyaoTZs2io6OVlxcnHr06KEZM2aEvofL2u5bb71Vn376qYYMGaLExETFx8frxBNP1Oeff15ivieffFIjR45Ux44dlZqaKo/Ho4SEBHXv3l033HCDtm7dWuE+Lv7dU/yzVdPnMABAERYA6pHnn3/eSgo9PvnkE+vxeEKv//a3v5WYZ/HixWHzrF69OjRu2rRpoeFZWVlh85155plh8xV/JCQk2K+//rrUOLOyssqdV5KdO3duaPq5c+eGjSs0a9asEvMV1bRp0zKX73a77VdffVWp/ZqdnW2HDRtWbrw7duwITV/admzcuNEmJCSUuY2l7fOyHgMGDAhNXzSus88+O2xZP/30U9h8//vf/6y11o4bN67MZTdu3Nh+9tln1tqSx0Z5j6LHx5QpU8qdtmnTpvabb74Ji7WiY8LtdpeYpyLlbWfhY9q0aWXOX5ntXrx4cWj61157rUrvXXlWr14dNt+VV15pe/XqFXptjLGPPvpopeYdPnx46PnUqVOttdYGAgHbqlUrK8lmZGTYvn37lhnjypUrbcuWLcvcJp/PZxcsWBA2z6uvvlrhvpg+fXrYPMU/5/379y91vjFjxoTNV9H7fNRRR1Vqn5d2LgwGg/biiy8ODUtOTrZLly6tcJ+X9Sh6fp05c2a50xpjSpwjgsGgveiii8qd78svvyyxLytzTAYCATtmzJhypz377LOt3+8vc7uPO+64Uudr3bq13bx5c7n72lpr//Of/5S7z44++uhy4/vXv/4VmnbPnj0Vbvvxxx9f7vYU/XyX9T1UqOhxWPQzNHLkyHLPAUXHVfX7ojRlxWFt+Hm26LnvYPZVZVTmO6T4tYW11XP+qOw+KWsfl3dtVN7yiitr2tWrV9vExMTQuDvuuMNaa+3XX39tvV5vaPjjjz9e7vILVfU6pbICgYDdvHmzffTRR8OWde2111Z6GaXt46eeeso6jmMlWcdx7Jw5c0qdt6rXi8uXL69w+gsuuKDEeubMmRO234s/HnjggUqf54sfg7NmzbJut7vM6Tp16mR//fXXMre7f//+YdfyhY/o6Gj7wQcfhM1X9DqhtEfTpk3t+vXry93HZ555Ztj4ww8/vFbPYQCA37gFAPVI0VYIPXv2VJ8+fXT88cfrP//5T2j8lVdeWS3rSkpK0pAhQ9SxY0clJyfL6/Vq06ZNeumll7Ru3Trt3r1bN9xwg/7973+XmDcYDIaeDxkyRCeccIIkaerUqZVe/7Zt23TzzTeXO81hhx2mU045RY0bN1ZUVJR+/vlnPf3009q7d6/8fr9ef/31MjuAK+raa68Nq9/bvHlzjRgxQomJifr2229LtNArzfXXX6/du3dXOF3RfZOcnKybbrpJkvT8889r6dKlJaa/8sorQ7EtWrRIW7duVWpqqiTphRdeCE3XuXNn9e7dW5Lkdrs1ZMgQde/ePdQK65///KdycnK0ceNGnXrqqVq5cqXatGkTdovu0qVL9fzzz4deFx2XmJgoSXrmmWd0//33h613xIgR2rBhg5566ikFAgGtX79eZ5xxhr799lu53SW/ak844QQNGTJEe/bs0cMPP6xt27bJ7/fr3//+tzp37lzhPixtX7Zp00aXXnqppIJWaDt27Kj0vJI0atQoHXHEEdqxY4dmzJhR6jxFS2EkJCTokksuUXp6epnvXVU89NBDodZdjuPoiSee0Pjx4ys17+DBg/Xjjz/qm2++0RNPPKFbb71Vb731llavXi1JuvTSS0utNy0VtOgbMWJEqJVgWlqazj33XKWkpOiNN97Qxx9/rNzcXI0dO1a9evVS69atJRUcY92
"text/plain": [
"<Figure size 1800x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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YYclbOuHH35IWO+DDz4wxhhz1FFH1bvtTp06mQ8//NAYU/vaaGiofn2cddZZDS7bpUsX8+WXXya0tbFrwu/311qnMQ0dZ9VwySWX1Lt+U477tdde85Z/5plnmvXaNWTJkiUJ65122mlm5MiR3nPLssztt9/epHUnT57sjc+ZM8cYY0w8Hjc9e/Y0kkxeXp4ZPXp0vW389ttvTY8ePeo9plAoZB566KGEdZ5++ulGz8Vll12WsE7N9/kuu+xS53rTp09PWK+x13nHHXds0jmv617oOI457rjjvGlZWVnmo48+avSc1zdUv7/edNNNDS5rWVate4TjOObYY49tcL3//Oc/tc5lU67JeDxupk+f3uCyhx12mInFYvUe9x577FHner169TIrV65s8FwbY8zzzz/f4DnbeeedG2zfs88+6y1bUFDQ6LHvtddeDR5P9fd3fZ9DVapfh9XfQ1OmTGnwHlB9XnM/L+pSXzuMSbzPVr/3bcq5aoqmfIbU/G5hTMvcP5p6Tuo7xw19N2poezXVt+ySJUtMRkaGN++qq64yxhjz+eefm2Aw6E2/6667Gtx+leZ+T2nMq6++aizLMpLMPffck3Acdb1mDanrunvppZdMJBLxpl988cV1rjt27NhGr4WWuJafffZZk5aWVu86p59+ujGmad8Lal4zTzzxhElJSal3uS5dupivv/663uMeOXJkrfuBJGPbdq3P3k35bl7zHG+//fYJ8w844IAG37N1vb7FxcW1vjc09H0LAFA/vwCgnaie5TNixAjttNNO2muvvfT8889780877bQW2VdmZqYmTJiggQMHKisrS8FgUL/99psef/xx/fjjj9qwYYPOO+88Pffcc7XWdRzHG58wYYLGjx8vSZozZ06T97969Wr95S9/aXCZAQMGaL/99lOnTp0UDof1008/acGCBSosLFQsFtMLL7xQbwdw1Z199tkJ9Xu32WYbHXTQQcrIyNBXX31VK0OvLueee642bNjQ6HLVz01WVpYuvPBCSdKDDz6ojz76qNbyp512mte2J598UqtWrVKHDh0kSQ8//LC33ODBg7XDDjtIkvx+vyZMmKDhw4d7WViPPvqoSktLtWLFCu2///769ttv1bt3b1177bXeNj766CM9+OCD3vPq8zIyMiRJ9913n/7f//t/Cfs96KCD9Msvv+jee+9VPB7X8uXLdfDBB+urr76S31/7Y3b8+PGaMGGCCgoKdMstt2j16tWKxWJ67rnnNHjw4EbPYV3nsnfv3jrxxBMluVloa9eubfK6kjR16lRtv/32Wrt2ra688so616leCiM9PV0nnHCCOnbsWO9r1xw333yzl6Vq27buuecezZw5s0nr7rnnnvruu+/05Zdf6p577tGll16ql19+WUuWLJEknXjiiXXWm5bcjL6DDjrIy67Kzc3V4YcfruzsbL344ot65513VFZWphkzZmjkyJHq1auXJPcaGz58uLbffnvl5uYqPT1dRUVFevvtt/Xaa69Jkv7617/qmGOOUZcuXerc91tvvaWDDjpIgwYN0qJFi7w2LFq0SFdffbXy8/NVWFiYkNV1yCGHaMSIEVq/fr2WLVumN954o0nnqC6O42jWrFnefTUnJ0f/+te/NHz48DqXre6kk05Sr1699P333+v222+vc/uhUEg77bS
"text/plain": [
"<Figure size 1800x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABaUAAAKgCAYAAACLLhECAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAADjUElEQVR4nOzdd5xcZfmw8Wtmdrb3ZLPJpneSkBASOoTQEjqEGukBKYoIiCA2pChFgRcUpCk/ukiRIohSBFRAkCJdQCGhB0hI2c3WmTnvH7Mz2dmS7IZkJ+X6ns9kzpw2zzlz9szMnXvuJxQEQYAkSZIkSZIkSb0gnO0GSJIkSZIkSZI2HAalJUmSJEmSJEm9xqC0JEmSJEmSJKnXGJSWJEmSJEmSJPUag9KSJEmSJEmSpF5jUFqSJEmSJEmS1GsMSkuSJEmSJEmSeo1BaUmSJEmSJElSrzEoLUmSJEmSJEnqNQalJUmSJEmSJEm9xqC0pHXOxhtvTCgUSt8GDBhALBbLdrMkddO8efMy/obPOeecjPlNTU3stddeGcv84Ac/6HTdUCjEpEmTOn2et956i3A4nLHsDjvssIb3TpK0ttphhx06vIe0v916663ZbqYkSRsEg9KS1inPP/88b7zxRsa0+fPn85e//CVLLZK0OtXX17P33nvzpz/9KT3tnHPO4cILL+xynddee40nn3yyw/Rf/epXBEGwJpopSZIkSfoKcrLdAEnqiRtvvLHL6XvttVfvNkbSalVXV8eee+7J3//+9/S0iy66iDPPPHOl6/7qV7/KyIJevHgxN99885popiRpPfDDH/6QioqKDtOnTp2ahdZIkrThMVNa0jqjqamJ22+/Pf14zJgx6fEHHniAhQsXdljnySefzPhJ5rx589LzzjnnnPT0YcOGZax37733csQRRzBp0iSqq6vJzc2luLiY8ePHc9JJJ2Vsp71hw4at9KehbYPrN954Y8a8lEQiwdSpUzudB8kvU1tuuSXV1dXk5eWRl5fHoEGD2H///Xn66adXcjQzBUHA3XffzT777MPAgQPJy8ujsrKSTTfdlNNOO43m5ub0sl3tx+WXX97lvJS2x7yrWyqw+O677xKJRNLTH3nkkQ7b23zzzdPzv/nNbwLwxz/+kT322CO9H+Xl5WyxxRace+65GedI+3NjRbf258df//pXDjzwQAYNGkReXh6lpaVMmTKFs88+my+//LJDOzs7J6LRKDU1Neyzzz784x//6MGrlTRnzpyVtrt9WYy2urPf7bOP77vvPnbaaScqKyszXpvVURpjyZIlzJw5MyMgffnll680IB0OJz/K/PGPf+T9999PT7/++utZtmwZAJFIZIXbWLp0KRdeeCFbbrklZWVl5ObmMmTIEObMmdPhlxkAc+fO5dRTT2XatGkMHjyYoqIi8vLyGDhwIHvvvTcPPPBAh3Xa/503NTVx/vnnM2bMmPTf7umnn05TU1PGerFYjMsvv5ytt96a8vJycnJy6NOnDxMmTODII4/k97///Qr3LaWra2EQBHzrW99KT6+oqOBf//pXxrqdlUzp7Nb2uvjyyy9z4oknsuWWWzJw4EAKCgrIz89n6NChzJ49m6eeeqrLtj722GPMnj2boUOHkp+fT1lZGRtvvDEnnngiCxYs6HAsu3M9SXnggQfYd999GTBgALm5uVRUVLDTTjtx2223dciqb7/fTz75JLfccgtTp06loKCAfv36ccwxx/DZZ59161gDzJo1q8t5l112Gdtvvz0DBgygoKCAaDRK//792W233XjwwQczniMWi3HWWWexxx57MHLkSMrLy4lGo/Tp04dp06ZxxRVX0NLSstL9SenqfSil7fWm7TH96KOPKC4u7vJ4f5X3i8501Q7IvM62vfatyrHqju68h7R/74DVc/3o7jHp6hiv6Bxd0fba62zZeDzOtttum56+5ZZbEo/H0+tccMEF6XnFxcW8/fbbK3yOlJ58Tumu4447jtNPP73Dbdy4cd3eRlfn3RNPPJHxt/GjH/2ow7o7dKOUyOo6lz/66CPOPPNMNt10U0pLS8nPz2fIkCHMmjWLRx99FOje54LOzpn33nuPk08+mXHjxlFUVERBQQHjx4/n+9//PgsWLFjhfs+ZM4e33nqLAw44gMrKSgoLC9luu+147LHHOqy3Kp/N2x/j9qVZ2v8ttP+b7er1ve+++7p8nSRJPRBI0jrijjvuCID07Z///GcQjUbTj3/1q191WOeJJ57IWGfu3LnpeWeffXZ6+tChQzPWO+CAAzLWa38rLS0NXn311U7bOXTo0BWuCwQ33HBDevkbbrghY17KVVdd1WG9tgYOHNjl9nNycoJXXnmlW8e1oaEh2HPPPVfY3kWLFqWX72w/5s+fH5SWlna5j50d865u06dPTy/ftl0HHXRQxrbee++9jPX+9a9/BUEQBEcddVSX2+7fv3/w/PPPB0HQ8dxY0a3t+XHaaaetcNmBAwcGr7/+ekZbV3ZO5OTkdFhnZVa0n6nb2Wef3eX63dnvJ554Ir38gw8+2KPXbkXmzp2bsd63v/3tYOrUqenHoVAouOaaa7q17qxZs9LjZ5xxRhAEQRCPx4Phw4cHQFBdXR1svfXWXbbxnXfeCYYNG9blPuXl5QV33nlnxjoPPPDASo/Fueeem7FO+7/z7bbbrtP1jjjiiIz1VvY6b7nllt065p1dCxOJRHDcccelp1VUVAQvvPDCSo95V7e219crrrhihcuGQqEO14hEIhEce+yxK1zv3//+d4dj2Z1zMh6PB0ccccQKlz3ooIOCWCzW5X7vtNNOna43YsSI4PPPP1/hsQ6CIPjzn/+8wmO27bbbrrB9f/rTn9LL1tbWrnTfd9lllxXuT9u/767eh1Lanodt/4YOPvjgFV4D2s7r6ftFZ7pqRxBkXmfbXvtW5Vh1R3feQ9p/tgiC1XP96O4x6eoYr+iz0Yq2115Xy86dOzcoKytLz7vwwguDIAiCV199NcjNzU1P/81vfrPC7af09HPKikyfPj29zrBhw4K8vLygqKgomDRpUvDDH/4wWLBgQbe2k9LZeffII48EBQUF6ek/+clPVtqWrm6r41z+05/+FJSUlHS5zimnnBIEQfc+F7Q/Z+67776gsLCwy+UGDhwYvPnmm13u99SpUztcD4AgHA53eO9dlc/m7Y/xZpttljF/n332WeHfbGevb319fYfPDSv6vCVJ6prlOyStM9pm+UyZMoWtttqKXXbZhT//+c/p+d/+9rdXy3OVl5czc+ZMxo0bR0VFBbm5uXz22Wfce++9fPDBByxdupQzzzyThx56qMO6iUQiPT5z5kxmzJgBwBlnnNHt51+4cCE//vGPV7jMRhttxF577UX//v3Jz8/nww8/5Oabb6auro5YLMZf/vKXLjuAa+u73/1uRv3ewYMHs99++1FWVsYbb7zRIUOvM9/73vdYunTpSpdre2wqKir44Q9/CMAdd9zBCy+80GH5b3/72+m23X///SxYsIC+ffsCcNddd6WXmzBhAptvvjkAOTk5zJw5k8mTJ6ezsP7whz/Q2NjI/Pnz2XvvvXnnnXcYOXIkF198cXobL7zwAnfccUf6cdt5ZWVlANxyyy38v//3/zKed7/99uOTTz7hpptuIh6P8/HHH7P//vvzxhtvkJPT8W12xowZzJw5k9raWn7961+zcOFCYrEYDz30EBMmTFjpMezsWI4cOZJvfOMbQDILbdGiRd1eF2D27NlsttlmLFq0iAsuuKDTddqWwigtLeWEE06gX79+Xb52PXHllVems1TD4TDXX389c+bM6da6O++8M//73/94/fXXuf766znnnHN49NFHmTt3LgDf+MY3Oq03DcmMvv322y+dXVVVVcWhhx5KZWUlDz/8MM888wxNTU0ceeSRTJ06lREjRgDJc2zy5MlsttlmVFVVUVpayrJly3j66ad54oknAPjpT3/K17/+dQYOHNjpcz/11FPst99+jB8/nttuuy3dhttuu42LLrqImpoa6urqMrK6DjjgAKZMmcKSJUt4//33+dvf/tatY9SZRCLBMccck76u9unTh8c
"text/plain": [
"<Figure size 1800x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from sklearn.metrics import silhouette_samples, silhouette_score\n",
"import numpy as np\n",
"pca = PCA(n_components=2)\n",
"reduced_data = pca.fit_transform(df)\n",
"random_state = 9\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",
"silhouettes = get_clusters_silhouettes(df, random_state)\n",
"\n",
"draw_silhouettes(df, silhouettes)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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
}