2024-11-23 11:55:22 +04:00
{
"cells": [
{
"cell_type": "code",
2024-12-12 19:02:58 +04:00
"execution_count": 62,
2024-11-23 11:55:22 +04:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Index(['HeartDisease', 'BMI', 'Smoking', 'AlcoholDrinking', 'Stroke',\n",
" 'PhysicalHealth', 'MentalHealth', 'DiffWalking', 'Sex', 'AgeCategory',\n",
" 'Race', 'Diabetic', 'PhysicalActivity', 'GenHealth', 'SleepTime',\n",
" 'Asthma', 'KidneyDisease', 'SkinCancer'],\n",
" dtype='object')\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>HeartDisease</th>\n",
" <th>BMI</th>\n",
" <th>Smoking</th>\n",
" <th>AlcoholDrinking</th>\n",
" <th>Stroke</th>\n",
" <th>PhysicalHealth</th>\n",
" <th>MentalHealth</th>\n",
" <th>DiffWalking</th>\n",
" <th>Sex</th>\n",
" <th>AgeCategory</th>\n",
" <th>Race</th>\n",
" <th>Diabetic</th>\n",
" <th>PhysicalActivity</th>\n",
" <th>GenHealth</th>\n",
" <th>SleepTime</th>\n",
" <th>Asthma</th>\n",
" <th>KidneyDisease</th>\n",
" <th>SkinCancer</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>No</td>\n",
" <td>16.60</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>3.0</td>\n",
" <td>30.0</td>\n",
" <td>No</td>\n",
" <td>Female</td>\n",
" <td>55-59</td>\n",
" <td>White</td>\n",
" <td>Yes</td>\n",
" <td>Yes</td>\n",
" <td>Very good</td>\n",
" <td>5.0</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>Yes</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>No</td>\n",
" <td>20.34</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>Yes</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>No</td>\n",
" <td>Female</td>\n",
" <td>80 or older</td>\n",
" <td>White</td>\n",
" <td>No</td>\n",
" <td>Yes</td>\n",
" <td>Very good</td>\n",
" <td>7.0</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>No</td>\n",
" <td>26.58</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>20.0</td>\n",
" <td>30.0</td>\n",
" <td>No</td>\n",
" <td>Male</td>\n",
" <td>65-69</td>\n",
" <td>White</td>\n",
" <td>Yes</td>\n",
" <td>Yes</td>\n",
" <td>Fair</td>\n",
" <td>8.0</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>No</td>\n",
" <td>24.21</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>No</td>\n",
" <td>Female</td>\n",
" <td>75-79</td>\n",
" <td>White</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>Good</td>\n",
" <td>6.0</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>Yes</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>No</td>\n",
" <td>23.71</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>28.0</td>\n",
" <td>0.0</td>\n",
" <td>Yes</td>\n",
" <td>Female</td>\n",
" <td>40-44</td>\n",
" <td>White</td>\n",
" <td>No</td>\n",
" <td>Yes</td>\n",
" <td>Very good</td>\n",
" <td>8.0</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>Yes</td>\n",
" <td>28.87</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>6.0</td>\n",
" <td>0.0</td>\n",
" <td>Yes</td>\n",
" <td>Female</td>\n",
" <td>75-79</td>\n",
" <td>Black</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>Fair</td>\n",
" <td>12.0</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>No</td>\n",
" <td>21.63</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>15.0</td>\n",
" <td>0.0</td>\n",
" <td>No</td>\n",
" <td>Female</td>\n",
" <td>70-74</td>\n",
" <td>White</td>\n",
" <td>No</td>\n",
" <td>Yes</td>\n",
" <td>Fair</td>\n",
" <td>4.0</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>Yes</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>No</td>\n",
" <td>31.64</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>5.0</td>\n",
" <td>0.0</td>\n",
" <td>Yes</td>\n",
" <td>Female</td>\n",
" <td>80 or older</td>\n",
" <td>White</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>Good</td>\n",
" <td>9.0</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>No</td>\n",
" <td>26.45</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>No</td>\n",
" <td>Female</td>\n",
" <td>80 or older</td>\n",
" <td>White</td>\n",
" <td>No, borderline diabetes</td>\n",
" <td>No</td>\n",
" <td>Fair</td>\n",
" <td>5.0</td>\n",
" <td>No</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>No</td>\n",
" <td>40.69</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>Yes</td>\n",
" <td>Male</td>\n",
" <td>65-69</td>\n",
" <td>White</td>\n",
" <td>No</td>\n",
" <td>Yes</td>\n",
" <td>Good</td>\n",
" <td>10.0</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" HeartDisease BMI Smoking AlcoholDrinking Stroke PhysicalHealth \\\n",
"0 No 16.60 Yes No No 3.0 \n",
"1 No 20.34 No No Yes 0.0 \n",
"2 No 26.58 Yes No No 20.0 \n",
"3 No 24.21 No No No 0.0 \n",
"4 No 23.71 No No No 28.0 \n",
"5 Yes 28.87 Yes No No 6.0 \n",
"6 No 21.63 No No No 15.0 \n",
"7 No 31.64 Yes No No 5.0 \n",
"8 No 26.45 No No No 0.0 \n",
"9 No 40.69 No No No 0.0 \n",
"\n",
" MentalHealth DiffWalking Sex AgeCategory Race \\\n",
"0 30.0 No Female 55-59 White \n",
"1 0.0 No Female 80 or older White \n",
"2 30.0 No Male 65-69 White \n",
"3 0.0 No Female 75-79 White \n",
"4 0.0 Yes Female 40-44 White \n",
"5 0.0 Yes Female 75-79 Black \n",
"6 0.0 No Female 70-74 White \n",
"7 0.0 Yes Female 80 or older White \n",
"8 0.0 No Female 80 or older White \n",
"9 0.0 Yes Male 65-69 White \n",
"\n",
" Diabetic PhysicalActivity GenHealth SleepTime Asthma \\\n",
"0 Yes Yes Very good 5.0 Yes \n",
"1 No Yes Very good 7.0 No \n",
"2 Yes Yes Fair 8.0 Yes \n",
"3 No No Good 6.0 No \n",
"4 No Yes Very good 8.0 No \n",
"5 No No Fair 12.0 No \n",
"6 No Yes Fair 4.0 Yes \n",
"7 Yes No Good 9.0 Yes \n",
"8 No, borderline diabetes No Fair 5.0 No \n",
"9 No Yes Good 10.0 No \n",
"\n",
" KidneyDisease SkinCancer \n",
"0 No Yes \n",
"1 No No \n",
"2 No No \n",
"3 No Yes \n",
"4 No No \n",
"5 No No \n",
"6 No Yes \n",
"7 No No \n",
"8 Yes No \n",
"9 No No "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd \n",
"df = pd.read_csv(\"..//static//csv//heart_2020_cleaned.csv\")\n",
"print(df.columns)\n",
"\n",
"display(df.head(10))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Сегментация пациентов по рискам сердечно-сосудистых заболеваний\n",
"Цель: Определить группы пациентов с различными уровнями риска развития сердечно-сосудистых заболеваний на основе их демографических данных, образа жизни и состояния здоровья.\n",
"\n",
"Пример:\n",
"\n",
"Кластер 1: Пациенты с высоким риском (курение, высокий ИМТ, низкая физическая активность).\n",
"\n",
"Кластер 2: Пациенты с о средним риском (умеренное курение, средний ИМТ, средняя физическая активность).\n",
"\n",
"Кластер 3: Пациенты с низким риском (отсутствие вредных привычек, нормальный ИМТ, высокая физическая активность).\n",
"\n",
"Бизнес-применение:\n",
"\n",
"Разработка персонализированных программ профилактики и лечения для каждой группы пациентов.\n",
"\n",
"Таргетированная реклама медицинских услуг и продуктов для улучшения образа жизни."
]
},
{
"cell_type": "code",
2024-12-12 19:02:58 +04:00
"execution_count": 63,
2024-11-23 11:55:22 +04:00
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"\n",
"df = pd.read_csv(\"..//static//csv//heart_2020_cleaned.csv\").head(1000)\n",
2024-12-11 20:59:23 +04:00
"df = df.dropna()\n",
"from scipy import stats\n",
"\n",
"z_scores = stats.zscore(df[['BMI', 'PhysicalHealth', 'MentalHealth', 'SleepTime']])\n",
"abs_z_scores = abs(z_scores)\n",
"filtered_entries = (abs_z_scores < 3).all(axis=1)\n",
"df = df[filtered_entries]\n",
"from sklearn.preprocessing import LabelEncoder\n",
2024-11-23 11:55:22 +04:00
"\n",
2024-12-11 20:59:23 +04:00
"label_encoders = {}\n",
2024-11-23 11:55:22 +04:00
"\n",
2024-12-11 20:59:23 +04:00
"for column in df.select_dtypes(include=['object']).columns:\n",
" le = LabelEncoder()\n",
" df[column] = le.fit_transform(df[column])\n",
" label_encoders[column] = le\n",
2024-11-23 11:55:22 +04:00
"\n",
2024-12-11 20:59:23 +04:00
"from imblearn.over_sampling import RandomOverSampler\n",
2024-11-23 11:55:22 +04:00
"\n",
2024-12-11 20:59:23 +04:00
"ros = RandomOverSampler(random_state=42)\n",
2024-11-23 11:55:22 +04:00
"\n",
2024-12-11 20:59:23 +04:00
"X = df.drop('HeartDisease', axis=1)\n",
"y = df['HeartDisease']\n",
2024-11-23 11:55:22 +04:00
"\n",
2024-12-11 20:59:23 +04:00
"X_resampled, y_resampled = ros.fit_resample(X, y)\n",
2024-11-23 11:55:22 +04:00
"\n",
2024-12-11 20:59:23 +04:00
"df_balanced = X_resampled.copy()\n",
"df_balanced['HeartDisease'] = y_resampled\n",
2024-11-23 11:55:22 +04:00
"\n",
2024-12-11 20:59:23 +04:00
"df = df_balanced\n"
2024-11-23 11:55:22 +04:00
]
},
{
"cell_type": "code",
2024-12-12 19:02:58 +04:00
"execution_count": 64,
2024-11-23 11:55:22 +04:00
"metadata": {},
"outputs": [
{
"data": {
2024-12-11 20:59:23 +04:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAABjQAAASlCAYAAAAPuDBdAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd5gT1f7H8XeS3WRrtlfaUqWDAiIiCAoidkXBDraLBbvX9vPaFdu194oFFRFsXMWKolIUVGx0lr691ySbzO+PlUDYZGm7myx8Xs+TB3bOZOabySQ5c75zzjEZhmEgIiIiIiIiIiIiIiISwszBDkBERERERERERERERGRXlNAQEREREREREREREZGQp4SGiIiIiIiIiIiIiIiEPCU0REREREREREREREQk5CmhISIiIiIiIiIiIiIiIU8JDRERERERERERERERCXlKaIiIiIiIiIiIiIiISMhTQkNEREREREREREREREKeEhoiIiIiIiIiIiIiIhLylNAQEZG9MmnSJGJiYlp0n9OmTcNkMrF+/fpm2f6dd96JyWRqlm3vC5PJxJ133rnb606ZMqV5AxIRERGRVmfSpElkZWUFOwwf69evx2QyMW3atN1e95FHHmn+wJpZVlYWkyZNCnYYeyRUr5VE5MCjhIaIyC5sa0Tf8ZGamsrIkSP57LPPGqy/bZ2LL77Y7/b+7//+z7tOYWGhd3kwEgT+TJo0yee12u12+vXrx3//+18cDkeww2txWVlZnHDCCX7Lvv32W0wmE++//36LxrRgwQLuvPNOSktLW3S/IiIiIgeSHa8DfvjhhwblhmHQrl07TCZTwPpiU/n777+58847m/zGnsZuhtn2+pcsWdKk+9yVTz/9dLdv5gk1f/zxB6effjodOnQgIiKCNm3aMHr0aJ566qlgh+ZXVlZWg2tdf4/dSTiJiLSUsGAHICLSWtx999107NgRwzDIy8tj2rRpHHfccXzyyScNLmAiIiKYNWsWzz77LFar1afsnXfeISIigtra2pYMf4/YbDZefvllAEpLS5k1axY33HADP//8M++++27Q4jrvvPM488wzsdlsQYshFCxYsIC77rqLSZMmER8fH+xwRERERPZrERERvP322xxxxBE+y7/77js2b97cInXTv//+m7vuuosRI0aEXC+Lpvbpp5/yzDPPtLqkxoIFCxg5ciTt27fnkksuIT09nU2bNrFo0SKeeOIJrrzyymCH2MDjjz9OZWWl9+9PP/2Ud955h8cee4zk5GTv8sMPP5xzzz2Xm2++ORhhioj4UEJDRGQ3jR07loEDB3r/vuiii0hLS+Odd95pkNA49thj+fjjj/nss884+eSTvcsXLFhAdnY248aNY9asWS0W+54KCwvj3HPP9f59+eWXM3jwYGbMmMGjjz5KZmZmUOKyWCxYLJag7FtEREREDkzHHXccM2fO5MknnyQsbHszyttvv82AAQN8el3Lgeu+++4jLi6On3/+ucFNR/n5+cEJahdOOeUUn79zc3N55513OOWUU/wmznY8/0VEgkVDTomI7KX4+HgiIyP9VuratGnD8OHDefvtt32WT58+nT59+tC7d++92ucjjzyCyWRiw4YNDcpuueUWrFYrJSUlAKxevZpx48aRnp5OREQEbdu25cwzz6SsrGyP92s2mxkxYgRAg27uW7Zs4ZRTTiEmJoaUlBRuuOEG3G43UN8NPysryyeps01tbS1xcXFMnjzZu+ypp56iV69eREVFkZCQwMCBA32OYaA5ND777DOOPPJIYmNjsdvtDBo0yOd533//PWeccQbt27fHZrPRrl07rr32Wmpqavb4WOyOLVu2cOGFF5KWlobNZqNXr168+uqrPus4nU5uv/12BgwYQFxcHNHR0QwbNox58+Y1uu0777yTf//73wB07NjR2w1852Py4Ycf0rt3b+/+586d26SvUURERORAcdZZZ1FUVMSXX37pXeZ0Onn//fc5++yz/T7H4/Hw+OOP06tXLyIiIkhLS2Py5Mneuvo224Y3/eGHHzj00EOJiIigU6dOvPHGG951pk2bxhlnnAHAyJEjvfW/b7/9FoCPPvqI448/nszMTGw2G507d+aee+7x1smb2ooVKzj99NNJTEwkIiKCgQMH8vHHH/usU1xczA033ECfPn2IiYnBbrczduxYli1b1ui2J02axDPPPAPgM+TRzl588UU6d+6MzWZj0KBB/Pzzz41ud8mSJZhMJl5//fUGZZ9//jkmk4k5c+YAUFFRwTXXXENWVhY2m43U1FRGjx7NL7/80ug+1q5dS69evfz2oE5NTW30uVDfM/6aa66hXbt22Gw2unTpwoMPPojH4/FZb0/PrS+++IL+/fsTERFBz549mT179i5j8cffHBrbhiybOXMmPXv2JDIykiFDhvDHH38A8MILL9ClSxciIiIYMWKE3yHTFi9ezLHHHktcXBxRUVEceeSR/Pjjj3sVo4gcGJRaFRHZTWVlZRQWFmIYBvn5+Tz11FNUVlb69GTY0dlnn83VV19NZWUlMTEx1NXVMXPmTK677rq9Hm5q/Pjx3Hjjjbz33nveRu1t3nvvPY455hgSEhJwOp2MGTMGh8PBlVdeSXp6Olu2bGHOnDmUlpYSFxe3x/teu3YtAElJSd5lbrebMWPGMHjwYB555BG++uor/vvf/9K5c2cuu+wyTCYT5557Lg899BDFxcUkJiZ6n/vJJ59QXl7uPX4vvfQSV111FaeffjpXX301tbW1/P777yxevDjghSLUX+BdeOGF9OrVi1tuuYX4+Hh+/fVX5s6d633ezJkzqa6u5rLLLiMpKYmffvqJp556is2bNzNz5sxdvnaXy+X3zjt/yaG8vDwOO+wwb+U+JSWFzz77jIsuuojy8nKuueYaAMrLy3n55Zc566yzuOSSS6ioqOCVV15hzJgx/PTTT/Tv399vLKeddhqrVq1q0BU8JSXFu84PP/zA7Nmzufzyy4mNjeXJJ59k3LhxbNy40ef9ExEREZFdy8rKYsiQIbzzzjuMHTsWqL+hpqysjDPPPJMnn3yywXMmT57MtGnTuOCCC7jqqqvIzs7m6aef5tdff+XHH38kPDzcu+6aNWs4/fTTueiii5g4cSKvvvoqkyZNYsCAAfTq1Yvhw4dz1VVX8eSTT3LrrbfSo0cPAO+/06ZNIyYmhuuuu46YmBi++eYbbr/9dsrLy3n44Yd3+fpqa2v91nV3HIpom7/++ouhQ4fSpk0bbr75ZqKjo3nvvfc45ZRTmDVrFqeeeioA69at48MPP+SMM86gY8eO5OXl8cILL3DkkUfy999/B+zxPXnyZLZu3cqXX37Jm2++6Xedt99+m4qKCiZPnozJZOKhhx7itNNOY926dT7HdUcDBw6kU6dOvPfee0ycONGnbMaMGSQkJDBmzBgALr30Ut5//32mTJlCz549KSoq4ocffmD58uUccsghAY9jhw4dWLhwIX/++ece38BWXV3NkUceyZYtW5g8eTLt27dnwYIF3HLLLeTk5PD444/7HKPdPbdWr17NhAkTuPTSS5k4cSKvvfYaZ5xxBnPnzmX06NF7FGMg33//PR9//DFXXHEFAFOnTuWEE07gxhtv5Nlnn+Xyyy+npKSEhx56iAsvvJBvvvnG+9xvvvmGsWPHMmDAAO644w7MZjOvvfYaRx11FN9//z2HHnpok8QoIvsZQ0REGvXaa68ZQIOHzWYzpk2b1mB9wLjiiiuM4uJiw2q1Gm+++aZhGIbxv//9zzCZTMb69euNO+64wwCMgoIC7/MmTpxoREdH7zKeIUOGGAMGDPBZ9tNPPxmA8cYbbxiGYRi//vqrARgzZ87c49e7LY6CggKjoKDAWLNmjXH//fcbJpPJ6Nu3r896gHH33Xf7PP/ggw/2iW/lypUGYDz33HM+65100klGVlaW4fF4DMMwjJNPPtno1atXo7Ftey+ys7MNwzCM0tJSIzY21hg8eLBRU1Pjs+627RqGYVRXVzfY1tSpUw2TyWRs2LDBu2zb+7KjDh06+H3/d3zseJwvuugiIyMjwygsLPTZzplnnmnExcV
2024-11-23 11:55:22 +04:00
"text/plain": [
"<Figure size 1600x1200 with 4 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"\n",
"plt.figure(figsize=(16, 12))\n",
"\n",
"plt.subplot(2, 2, 1)\n",
"sns.scatterplot(x='BMI', y='PhysicalHealth', hue='HeartDisease', data=df)\n",
"plt.title('BMI vs PhysicalHealth')\n",
"\n",
"plt.subplot(2, 2, 2)\n",
"sns.scatterplot(x='MentalHealth', y='SleepTime', hue='HeartDisease', data=df)\n",
"plt.title('MentalHealth vs SleepTime')\n",
"\n",
"plt.subplot(2, 2, 3)\n",
"sns.scatterplot(x='PhysicalHealth', y='SleepTime', hue='HeartDisease', data=df)\n",
"plt.title('PhysicalHealth vs SleepTime')\n",
"\n",
"plt.subplot(2, 2, 4)\n",
"sns.scatterplot(x='BMI', y='MentalHealth', hue='HeartDisease', data=df)\n",
"plt.title('BMI vs MentalHealth')\n",
"\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "code",
2024-12-12 19:02:58 +04:00
"execution_count": 65,
2024-11-23 11:55:22 +04:00
"metadata": {},
"outputs": [
{
"data": {
2024-12-11 20:59:23 +04:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAABjQAAASlCAYAAAAPuDBdAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdeXwTdf7H8Xdpm6ZXQmkE5EZbD7BVFl1XwSrrweK6LlgPPEFZf6634sHhfXB5rYoHHuu1CioCrrreJ4d4o+C6anFZEBCwpU3apml65PeH22xD0yRN08kkfT0fjz6U+c7M9/P9zjeTmflkZlJ8Pp9PAAAAAAAAAAAAJtYj3gEAAAAAAAAAAACEQ0IDAAAAAAAAAACYHgkNAAAAAAAAAABgeiQ0AAAAAAAAAACA6ZHQAAAAAAAAAAAApkdCAwAAAAAAAAAAmB4JDQAAAAAAAAAAYHokNAAAAAAAAAAAgOmR0AAAAAAAAAAAAKZHQgMAEJXJkycrJyfH0DqfeOIJpaSk6D//+U+XrP/GG29USkpKl6y7M1JSUnTjjTdGPO9FF13UtQEBAAAg4UyePFlDhgyJdxgB/vOf/yglJUVPPPFExPPecccdXR9YFxsyZIgmT54c7zA6xKznSgC6HxIaABBGy0X01n+9e/fWmDFj9Nprr7WZv2WeP/3pT0HXd8011/jnKS8v90+PR4IgmMmTJwe01Wazaf/999edd96p+vr6eIdnuCFDhui4444LWvb+++8rJSVFL7zwgqExffjhh7rxxhtVVVVlaL0AAADdSevzgJUrV7Yp9/l8GjhwoFJSUto9XoyVb775RjfeeGPMf9gT6scwLe3/7LPPYlpnOK+++mrEP+Yxm3Xr1unEE0/U4MGDZbVa1b9/fx199NGaP39+vEMLasiQIW3OdYP9RZJwAgCjpMU7AABIFDfffLOGDh0qn8+n7du364knntCxxx6rl19+uc0JjNVq1ZIlS/TAAw/IYrEElC1atEhWq1Uej8fI8DskIyNDjz76qCSpqqpKS5Ys0ZVXXqlPP/1Uzz77bNziOvPMMzVx4kRlZGTELQYz+PDDD3XTTTdp8uTJ6tmzZ7zDAQAASGpWq1ULFy7U6NGjA6Z/8MEH2rx5syHHpt98841uuukmHXHEEaa7yyLWXn31Vd1///0Jl9T48MMPNWbMGA0aNEjnnnuu+vbtqx9//FEfffSR7rnnHl188cXxDrGNu+++WzU1Nf5/v/rqq1q0aJH+8pe/yOFw+KcfeuihOuOMMzR9+vR4hAkAAUhoAECExo0bpwMPPND/7ylTpqhPnz5atGhRm4TG7373O7300kt67bXX9Mc//tE//cMPP9SGDRtUWlqqJUuWGBZ7R6WlpemMM87w//uCCy7QwQcfrOeee0533XWX+vXrF5e4UlNTlZqaGpe6AQAA0D0de+yxWrx4se69916lpf3vMsrChQs1cuTIgLuu0X3NmjVLdrtdn376aZsfHe3YsSM+QYUxfvz4gH9v27ZNixYt0vjx44MmzlqPfwCIFx45BQBR6tmzpzIzM4Me1PXv318lJSVauHBhwPRnnnlGRUVF2m+//aKq84477lBKSoo2btzYpmzGjBmyWCyqrKyUJJWVlam0tFR9+/aV1WrVgAEDNHHiRDmdzg7X26NHDx1xxBGS1OY29y1btmj8+PHKycnRbrvtpiuvvFJNTU2SfrkNf8iQIQFJnRYej0d2u13nnXeef9r8+fM1fPhwZWVlKS8vTwceeGBAH7b3Do3XXntNhx9+uHJzc2Wz2XTQQQcFLLdixQqddNJJGjRokDIyMjRw4EBdfvnlqqur63BfRGLLli0655xz1KdPH2VkZGj48OF67LHHAubxer26/vrrNXLkSNntdmVnZ+uwww7Te++9F3LdN954o6666ipJ0tChQ/23ge/aJy+++KL2228/f/2vv/56TNsIAADQXZx66qmqqKjQW2+95Z/m9Xr1wgsv6LTTTgu6THNzs+6++24NHz5cVqtVffr00Xnnnec/Vm/R8njTlStX6te//rWsVqv22GMPPfXUU/55nnjiCZ100kmSpDFjxviP/95//31J0t///nf9/ve/V79+/ZSRkaE999xTt9xyi/+YPNa+/fZbnXjiierVq5esVqsOPPBAvfTSSwHz7Ny5U1deeaWKioqUk5Mjm82mcePG6auvvgq57smTJ+v++++XpIBHHu3q4Ycf1p577qmMjAwddNBB+vTTT0Ou97PPPlNKSoqefPLJNmVvvPGGUlJS9Morr0iSqqurddlll2nIkCHKyMhQ7969dfTRR+uLL74IWccPP/yg4cOHB72Dunfv3iGXlX65M/6yyy7TwIEDlZGRoYKCAs2bN0/Nzc0B83V0bL355ps64IADZLVaNWzYMC1dujRsLMEEe4dGyyPLFi9erGHDhikzM1OHHHKI1q1bJ0l66KGHVFBQIKvVqiOOOCLoI9M+/vhj/e53v5PdbldWVpYOP/xwrVq1KqoYAXQPpFYBIEJOp1Pl5eXy+XzasWOH5s+fr5qamoA7GVo77bTTdOmll6qmpkY5OTlqbGzU4sWLNXXq1KgfN3XyySfr6quv1vPPP++/qN3i+eef1zHHHKO8vDx5vV6NHTtW9fX1uvjii9W3b19t2bJFr7zyiqqqqmS32ztc9w8//CBJys/P909ramrS2LFjdfDBB+uOO+7Q22+/rTvvvFN77rmnzj//fKWkpOiMM87Qbbfdpp07d6pXr17+ZV9++WW5XC5//z3yyCO65JJLdOKJJ+rSSy+Vx+PR2rVr9fHHH7d7oij9coJ3zjnnaPjw4ZoxY4Z69uypNWvW6PXXX/cvt3jxYrndbp1//vnKz8/XJ598ovnz52vz5s1avHhx2LY3NDQE/eVdsOTQ9u3b9Zvf/MZ/cL/bbrvptdde05QpU+RyuXTZZZdJklwulx599FGdeuqpOvfcc1VdXa2//vWvGjt2rD755BMdcMABQWM54YQT9P3337e5FXy33Xbzz7Ny5UotXbpUF1xwgXJzc3XvvfeqtLRUmzZtCth+AAAACG/IkCE65JBDtGjRIo0bN07SLz+ocTqdmjhxou699942y5x33nl64okndPbZZ+uSSy7Rhg0bdN9992nNmjVatWqV0tPT/fOuX79eJ554oqZMmaJJkybpscce0+TJkzVy5EgNHz5cJSUluuSSS3Tvvfdq5syZ2nfffSXJ/98nnnhCOTk5mjp1qnJycvTuu+/q+uuvl8vl0u233x62fR6PJ+ixbutHEbX45z//qVGjRql///6aPn26srOz9fzzz2v8+PFasmSJJkyYIEn697//rRdffFEnnXSShg4dqu3bt+uhhx7S4Ycfrm+++abdO77PO+88bd26VW+99Zb+9re/BZ1n4cKFqq6u1nnnnaeUlBTddtttOuGEE/Tvf/87oF9bO/DAA7XHHnvo+eef16RJkwLKnnvuOeXl5Wns2LGSpD//+c964YUXdNFFF2nYsGGqqKjQypUr9a9//Uu/+tWv2u3HwYMHa/Xq1fr66687/AM2t9utww8/XFu2bNF5552nQYMG6cMPP9SMGTP0008/6e677w7oo0jHVllZmU455RT9+c9/1qRJk/T444/rpJNO0uuvv66jjz66QzG2Z8WKFXrppZd04YUXSpLmzJmj4447TldffbUeeOABXXDBBaqsrNRtt92mc845R++++65/2XfffVfjxo3TyJEjdcMNN6hHjx56/PHH9dvf/lYrVqzQr3/965jECCDJ+AAAIT3++OM+SW3+MjIyfE888USb+SX5LrzwQt/OnTt9FovF97e//c3n8/l8//jHP3wpKSm+//znP74bbrjBJ8n3888/+5ebNGmSLzs7O2w8hxxyiG/kyJEB0z755BOfJN9TTz3l8/l8vjVr1vgk+RYvXtzh9rbE8fPPP/t+/vln3/r1632zZ8/2paSk+IqLiwPmk+S7+eabA5YfMWJEQHzfffedT5LvwQcfDJjv+OOP9w0ZMsTX3Nzs8/l8vj/+8Y++4cOHh4ytZVts2LDB5/P5fFVVVb7c3FzfwQcf7Ku
2024-11-23 11:55:22 +04:00
"text/plain": [
"<Figure size 1600x1200 with 4 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(16, 12))\n",
"\n",
"plt.subplot(2, 2, 1)\n",
"sns.scatterplot(x='BMI', y='PhysicalHealth', data=df)\n",
"plt.title('BMI vs PhysicalHealth')\n",
"\n",
"plt.subplot(2, 2, 2)\n",
"sns.scatterplot(x='MentalHealth', y='SleepTime', data=df)\n",
"plt.title('MentalHealth vs SleepTime')\n",
"\n",
"plt.subplot(2, 2, 3)\n",
"sns.scatterplot(x='PhysicalHealth', y='SleepTime', data=df)\n",
"plt.title('PhysicalHealth vs SleepTime')\n",
"\n",
"plt.subplot(2, 2, 4)\n",
"sns.scatterplot(x='BMI', y='MentalHealth', data=df)\n",
"plt.title('BMI vs MentalHealth')\n",
"\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "code",
2024-12-12 19:02:58 +04:00
"execution_count": 66,
2024-11-23 11:55:22 +04:00
"metadata": {},
"outputs": [
{
"data": {
2024-12-11 20:59:23 +04:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA0EAAAJhCAYAAACHJrtbAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACSh0lEQVR4nOzdeXxU5d3///dMZiaZ7PsGYd9XERRQQBAUUVxa1GpdcKn683apWq3ar7VWe1e7arUu1WpRq7dbW60LKopIq2AVpeACbmwSEtaEJXtyfn/E63BmMpPMJIEEzuv5eOQBmZw55zrXOec61+dcy/FYlmUJAAAAAFzC29UJAAAAAID9iSAIAAAAgKsQBAEAAABwFYIgAAAAAK5CEAQAAADAVQiCAAAAALgKQRAAAAAAVyEIAgAAAOAqBEEAAAAAXIUgCADQrfTp00fnnXdeVycDAHAQIwgCABeaN2+ePB6P/ZOUlKTi4mLNnDlTd999t3bt2tXVSQQAYJ/xdXUCAABd59Zbb1Xfvn1VX1+vsrIyLVq0SFdddZV+//vf65///KdGjRrV1UkEAKDTEQQBgIvNmjVL48aNs3+/8cYbtXDhQs2ePVsnnXSSPvvsMwWDwS5MYWR79uxRSkrKftlWTU2NAoGAvF46TwDAwYISHQAQ4uijj9ZPf/pTrVu3Tn/961/tz1etWqVTTz1V2dnZSkpK0rhx4/TPf/4z5Lumm90777yja665Rnl5eUpJSdF3vvMdbdmyJWRZy7L0i1/8Qj179lRycrKmTZumTz75pEV6zDrffvtt/c///I/y8/PVs2dP++/33Xefhg8frsTERBUXF+uyyy5TRUVFi/Xce++96tevn4LBoA4//HD961//0tSpUzV16lR7mUWLFsnj8eipp57STTfdpB49eig5OVk7d+7U9u3bde2112rkyJFKTU1Venq6Zs2apf/+978h2zHreOaZZ/Tzn/9cPXr0UFpamk499VRVVlaqtrZWV111lfLz85Wamqrzzz9ftbW18RwiAEAH0RIEAGjhnHPO0U9+8hO9/vrruuiii/TJJ5/oyCOPVI8ePXTDDTcoJSVFzzzzjE455RT97W9/03e+852Q719xxRXKysrSz372M61du1Z33XWXLr/8cj399NP2MjfffLN+8Ytf6Pjjj9fxxx+vDz/8UMcee6zq6uoipul//ud/lJeXp5tvvll79uyRJN1yyy36+c9/rhkzZujSSy/V6tWrdf/99+v999/XO++8I7/fL0m6//77dfnll2vy5Mm6+uqrtXbtWp1yyinKysoKCaiM2267TYFAQNdee61qa2sVCAT06aef6vnnn9dpp52mvn37qry8XH/605901FFH6dNPP1VxcXHIOm6//XYFg0HdcMMN+vLLL3XPPffI7/fL6/Vqx44duuWWW7R06VLNmzdPffv21c0339yhYwYAiIMFAHCdv/zlL5Yk6/3334+6TEZGhjVmzBjLsixr+vTp1siRI62amhr7701NTdYRRxxhDRw4sMV6Z8yYYTU1NdmfX3311VZCQoJVUVFhWZZlbd682QoEAtYJJ5wQstxPfvITS5I1d+7cFuucNGmS1dDQYH9u1nHsscdajY2N9ud//OMfLUnWI488YlmWZdXW1lo5OTnWYYcdZtXX19vLzZs3z5JkHXXUUfZnb731liXJ6tevn1VVVRWSHzU1NSHbsSzLWrNmjZWYmGjdeuutLdYxYsQIq66uzv78zDPPtDwejzVr1qyQdUycONHq3bu3BQDYf+gOBwCIKDU1Vbt27dL27du1cOFCnX766dq1a5e2bt2qrVu3atu2bZo5c6a++OILbdy4MeS7F198sTwej/375MmT1djYqHXr1kmS3njjDdXV1emKK64IWe6qq66Kmp6LLrpICQkJ9u9mHVdddVXIeJ2LLrpI6enpevnllyVJH3zwgbZt26aLLrpIPt/eDhBnnXWWsrKyIm5r7ty5LcZCJSYm2ttpbGzUtm3blJqaqsGDB+vDDz9ssY5zzz3XbomSpPHjx8uyLF1wwQUhy40fP14bNmxQQ0ND1H0HAHQuusMBACLavXu38vPz9eWXX8qyLP30pz/VT3/604jLbt68WT169LB/79WrV8jfTbCxY8cOSbKDoYEDB4Ysl5eXFzUw6du3b8jvZh2DBw8O+TwQCKhfv372382/AwYMCFnO5/OpT58+MW1LkpqamvSHP/xB9913n9asWaPGxkb7bzk5OS2WD8+DjIwMSVJJSUmLz5uamlRZWRlxPQCAzkcQBABo4ZtvvlFlZaUGDBigpqYmSdK1116rmTNnRlw+PMBwttg4WZbV7jTtz1nqIm3rl7/8pX7605/qggsu0G233abs7Gx5vV5dddVVdh45RcuDfZE3AID4EAQBAFp4/PHHJUkzZ85Uv379JEl+v18zZszolPX37t1bkvTFF1/Y65ekLVu22K1Fsa5j9erVIeuoq6vTmjVr7LSa5b788ktNmzbNXq6hoUFr166N+V1Izz33nKZNm6aHH3445POKigrl5ubGtA4AQPfAmCAAQIiFCxfqtttuU9++fXXWWWcpPz9fU6dO1Z/+9Cdt2rSpxfLhU1/HYsaMGfL7/brnnntCWkDuuuuuuNYRCAR09913h6zj4YcfVmVlpU444QRJ0rhx45STk6OHHnooZNzNE088EXPAJTW34IS31jz77LMtxkMBALo/WoIAwMXmz5+vVatWqaGhQeXl5Vq4cKEWLFig3r1765///KeSkpIkNb9jZ9KkSRo5cqQuuugi9evXT+Xl5VqyZIm++eabFu/KaUteXp6uvfZa3X777Zo9e7aOP/54ffTRR5o/f37MrSp5eXm68cYb9fOf/1zHHXecTjrpJK1evVr33XefDjvsMJ199tmSmscI3XLLLbriiit09NFH6/TTT9fatWs1b9489e/fP2RihtbMnj1bt956q84//3wdccQRWrlypZ544omQVigAwIGBIAgAXMy8myYQCCg7O1sjR47UXXfdpfPPP19paWn2csOGDdMHH3ygn//855o3b562bdum/Px8jRkzpt3vt/nFL36hpKQkPfDAA3rrrbc0fvx4vf7663YLTixuueUW5eXl6Y9//KOuvvpqZWdn6+KLL9Yvf/nLkJnZLr/8clmWpd/97ne69tprNXr0aP3zn//UlVdeaQd6bfnJT36iPXv26Mknn9TTTz+tQw89VC+//LJuuOGGuPcdANC1PBYjMQEALtTU1KS8vDx997vf1UMPPdTVyQEA7EeMCQIAHPRqampajOd57LHHtH37dk2dOrVrEgUA6DK0BAEADnqLFi3S1VdfrdNOO005OTn68MMP9fDDD2vo0KFatmyZAoFAVycRALAfMSYIAHDQ69Onj0pKSnT33Xdr+/btys7O1rnnnqs77riDAAgAXIiWIAAAAACuwpggAAAAAK5CEAQAAADAVeIaE3TLLbfo5z//echngwcP1qpVqyQ1z77zox/9SE899ZRqa2s1c+ZM3XfffSooKLCXX79+vS699FK99dZbSk1N1dy5c3X77bfL54s9KU1NTSotLVVaWlrML7kDAAAAcPCxLEu7du1ScXGxvN7Y2njinhhh+PDheuONN/auwBG8XH311Xr55Zf17LPPKiMjQ5dffrm++93v6p133pEkNTY26oQTTlBhYaHeffddbdq0Seeee678fr9++ctfxpyG0tJSlZSUxJt0AAAAAAepDRs2qGfPnjEtG9fECLfccouef/55LV++vMXfKisrlZeXpyeffFKnnnqqJGnVqlUaOnSolixZogkTJmj+/PmaPXu2SktL7dahBx54QNdff722bNkS8ww9lZWVyszM1IYNG5Senh5r8gEAAAAcZHbu3KmSkhJVVFQoIyMjpu/E3RL0xRdfqLi4WElJSZo4caJuv/129erVS8uWLVN9fb1mzJhhLztkyBD16tXLDoKWLFmikSNHhnSPmzlzpi699FJ98sknGjNmTMRt1tbWqra21v59165dkqT09HSCIAAAAABxDZOJa2KE8ePHa968eXr11Vd1//33a82aNZo8ebJ
2024-11-23 11:55:22 +04:00
"text/plain": [
"<Figure size 1000x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from sklearn.cluster import AgglomerativeClustering\n",
"from scipy.cluster.hierarchy import dendrogram, linkage\n",
"import matplotlib.pyplot as plt\n",
"\n",
"X = df[['BMI', 'PhysicalHealth', 'MentalHealth', 'SleepTime']]\n",
"\n",
"agg_clustering = AgglomerativeClustering(n_clusters=3)\n",
"clusters = agg_clustering.fit_predict(X)\n",
"\n",
"df['Cluster'] = clusters\n",
"\n",
"linked = linkage(X, 'ward')\n",
"\n",
"plt.figure(figsize=(10, 7))\n",
"dendrogram(linked,\n",
" orientation='top',\n",
" distance_sort='descending',\n",
" show_leaf_counts=True)\n",
"plt.title('Dendrogram')\n",
"plt.show()"
]
},
{
"cell_type": "code",
2024-12-12 19:02:58 +04:00
"execution_count": 67,
2024-11-23 11:55:22 +04:00
"metadata": {},
"outputs": [
{
"data": {
2024-12-12 18:50:47 +04:00
"image/png": "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
2024-11-23 11:55:22 +04:00
"text/plain": [
"<Figure size 1600x2400 with 8 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd\n",
"from sklearn.preprocessing import LabelEncoder\n",
2024-12-11 20:59:23 +04:00
"from sklearn.cluster import MiniBatchKMeans\n",
2024-11-23 11:55:22 +04:00
"import matplotlib.pyplot as plt\n",
"\n",
2024-12-11 20:59:23 +04:00
"def draw_data_2d(data, feature_x, feature_y, labels, subplot):\n",
" subplot.scatter(data.iloc[:, feature_x], data.iloc[:, feature_y], c=labels, cmap='viridis')\n",
" subplot.set_xlabel(data.columns[feature_x])\n",
" subplot.set_ylabel(data.columns[feature_y])\n",
"\n",
2024-11-23 11:55:22 +04:00
"X = df[['BMI', 'PhysicalHealth', 'MentalHealth', 'SleepTime']]\n",
"\n",
2024-12-11 20:59:23 +04:00
"kmeans = MiniBatchKMeans(n_clusters=3, random_state=0, batch_size=100)\n",
"result = kmeans.fit_predict(X)\n",
2024-11-23 11:55:22 +04:00
"\n",
"plt.figure(figsize=(16, 24))\n",
"\n",
"plt.subplot(4, 2, 1)\n",
2024-12-11 20:59:23 +04:00
"draw_data_2d(X, 0, 1, result, plt.subplot(4, 2, 1))\n",
2024-11-23 11:55:22 +04:00
"plt.title('Clusters (BMI vs PhysicalHealth)')\n",
"\n",
"plt.subplot(4, 2, 2)\n",
2024-12-11 20:59:23 +04:00
"draw_data_2d(X, 0, 1, df['HeartDisease'], plt.subplot(4, 2, 2))\n",
2024-11-23 11:55:22 +04:00
"plt.title('True Labels (BMI vs PhysicalHealth)')\n",
"\n",
"plt.subplot(4, 2, 3)\n",
2024-12-11 20:59:23 +04:00
"draw_data_2d(X, 2, 3, result, plt.subplot(4, 2, 3))\n",
2024-11-23 11:55:22 +04:00
"plt.title('Clusters (MentalHealth vs SleepTime)')\n",
"\n",
"plt.subplot(4, 2, 4)\n",
2024-12-11 20:59:23 +04:00
"draw_data_2d(X, 2, 3, df['HeartDisease'], plt.subplot(4, 2, 4))\n",
2024-11-23 11:55:22 +04:00
"plt.title('True Labels (MentalHealth vs SleepTime)')\n",
"\n",
"plt.subplot(4, 2, 5)\n",
2024-12-11 20:59:23 +04:00
"draw_data_2d(X, 0, 2, result, plt.subplot(4, 2, 5))\n",
2024-11-23 11:55:22 +04:00
"plt.title('Clusters (BMI vs MentalHealth)')\n",
"\n",
"plt.subplot(4, 2, 6)\n",
2024-12-11 20:59:23 +04:00
"draw_data_2d(X, 0, 2, df['HeartDisease'], plt.subplot(4, 2, 6))\n",
2024-11-23 11:55:22 +04:00
"plt.title('True Labels (BMI vs MentalHealth)')\n",
"\n",
"plt.subplot(4, 2, 7)\n",
2024-12-11 20:59:23 +04:00
"draw_data_2d(X, 1, 3, result, plt.subplot(4, 2, 7))\n",
2024-11-23 11:55:22 +04:00
"plt.title('Clusters (PhysicalHealth vs SleepTime)')\n",
"\n",
"plt.subplot(4, 2, 8)\n",
2024-12-11 20:59:23 +04:00
"draw_data_2d(X, 1, 3, df['HeartDisease'], plt.subplot(4, 2, 8))\n",
2024-11-23 11:55:22 +04:00
"plt.title('True Labels (PhysicalHealth vs SleepTime)')\n",
"\n",
"plt.tight_layout()\n",
"plt.show()"
]
2024-12-11 20:59:23 +04:00
},
{
"cell_type": "code",
2024-12-12 19:02:58 +04:00
"execution_count": 68,
2024-12-11 20:59:23 +04:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2024-12-12 19:02:58 +04:00
"Cluster 1 (482):\n",
"5, 7, 20, 22, 24, 27, 28, 36, 39, 44, 46, 49, 56, 62, 65, 66, 67, 70, 71, 78, 80, 83, 97, 103, 105, 114, 115, 119, 121, 124, 130, 135, 137, 139, 140, 143, 148, 150, 153, 154, 155, 156, 159, 161, 162, 164, 168, 192, 197, 198, 204, 206, 211, 213, 214, 217, 224, 226, 227, 233, 237, 245, 249, 253, 255, 256, 259, 260, 261, 262, 264, 271, 273, 278, 281, 283, 284, 290, 291, 296, 301, 303, 307, 309, 312, 314, 315, 321, 323, 329, 330, 331, 332, 335, 337, 340, 342, 351, 352, 355, 356, 358, 360, 369, 376, 379, 380, 382, 385, 386, 390, 392, 398, 404, 405, 406, 411, 417, 419, 420, 422, 423, 427, 432, 435, 440, 441, 442, 446, 447, 450, 451, 453, 455, 456, 458, 460, 462, 466, 471, 474, 477, 486, 493, 495, 503, 510, 512, 516, 521, 523, 524, 531, 536, 537, 538, 543, 544, 545, 557, 567, 571, 573, 576, 578, 582, 587, 589, 591, 592, 595, 597, 598, 600, 603, 605, 608, 612, 613, 617, 620, 621, 624, 633, 640, 643, 646, 647, 651, 652, 653, 654, 655, 656, 664, 667, 669, 674, 677, 682, 692, 694, 695, 696, 697, 698, 701, 702, 705, 709, 714, 724, 725, 726, 736, 738, 739, 741, 743, 747, 756, 757, 758, 762, 764, 778, 779, 784, 785, 786, 791, 797, 798, 800, 804, 805, 808, 810, 811, 812, 813, 818, 819, 821, 823, 824, 825, 827, 831, 833, 835, 836, 838, 844, 852, 854, 858, 861, 866, 867, 874, 880, 883, 885, 886, 887, 888, 890, 895, 898, 906, 907, 910, 911, 913, 916, 917, 919, 920, 930, 935, 940, 943, 944, 947, 957, 961, 964, 965, 967, 968, 973, 977, 980, 982, 991, 996, 997, 999, 1001, 1003, 1005, 1013, 1018, 1023, 1025, 1029, 1031, 1035, 1041, 1045, 1046, 1047, 1051, 1053, 1058, 1062, 1063, 1064, 1068, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1078, 1079, 1081, 1084, 1086, 1089, 1090, 1092, 1095, 1096, 1102, 1106, 1107, 1108, 1110, 1111, 1112, 1115, 1123, 1125, 1126, 1135, 1141, 1147, 1148, 1149, 1150, 1151, 1154, 1156, 1161, 1162, 1166, 1175, 1180, 1181, 1185, 1193, 1198, 1202, 1213, 1216, 1223, 1231, 1232, 1237, 1240, 1241, 1242, 1243, 1245, 1250, 1254, 1255, 1256, 1257, 1261, 1271, 1272, 1277, 1280, 1281, 1282, 1284, 1286, 1289, 1292, 1295, 1300, 1302, 1303, 1306, 1308, 1310, 1313, 1314, 1317, 1320, 1321, 1322, 1324, 1325, 1327, 1328, 1329, 1330, 1332, 1334, 1335, 1341, 1344, 1345, 1354, 1355, 1357, 1358, 1364, 1370, 1371, 1374, 1375, 1380, 1382, 1386, 1387, 1388, 1390, 1391, 1400, 1406, 1407, 1408, 1412, 1415, 1423, 1424, 1427, 1430, 1437, 1438, 1439, 1441, 1443, 1446, 1448, 1456, 1457, 1466, 1472, 1480, 1482, 1487, 1490, 1496, 1499, 1512, 1513, 1515, 1518, 1521, 1523, 1527, 1536, 1541, 1542, 1547, 1551, 1555, 1558, 1560, 1568, 1574, 1575, 1576, 1577\n",
2024-12-11 20:59:23 +04:00
"--------\n",
2024-12-12 19:02:58 +04:00
"Cluster 2 (286):\n",
"2, 4, 19, 25, 37, 42, 47, 50, 58, 59, 64, 69, 72, 73, 82, 89, 108, 110, 118, 126, 129, 142, 144, 151, 179, 189, 199, 201, 202, 220, 221, 228, 241, 244, 251, 252, 254, 257, 265, 268, 277, 286, 288, 294, 297, 304, 306, 313, 316, 324, 347, 366, 370, 373, 374, 377, 397, 409, 413, 418, 433, 454, 463, 479, 501, 505, 506, 518, 526, 530, 540, 551, 555, 556, 559, 562, 568, 569, 579, 596, 599, 602, 607, 616, 628, 636, 649, 670, 672, 675, 676, 685, 690, 700, 727, 755, 770, 775, 793, 802, 837, 845, 860, 862, 869, 875, 878, 893, 896, 903, 915, 923, 932, 933, 937, 939, 949, 960, 966, 969, 970, 972, 975, 976, 978, 981, 984, 985, 988, 989, 990, 1002, 1004, 1008, 1010, 1011, 1012, 1016, 1017, 1028, 1032, 1033, 1038, 1042, 1043, 1048, 1050, 1052, 1054, 1060, 1061, 1066, 1067, 1077, 1080, 1082, 1099, 1100, 1101, 1113, 1117, 1119, 1122, 1124, 1131, 1132, 1134, 1136, 1139, 1140, 1144, 1152, 1153, 1155, 1157, 1169, 1176, 1179, 1182, 1187, 1189, 1190, 1200, 1201, 1204, 1207, 1215, 1218, 1224, 1236, 1238, 1247, 1251, 1252, 1253, 1263, 1267, 1268, 1270, 1288, 1290, 1296, 1297, 1298, 1301, 1307, 1311, 1319, 1336, 1340, 1346, 1348, 1349, 1351, 1353, 1359, 1361, 1363, 1368, 1376, 1377, 1378, 1385, 1394, 1401, 1402, 1404, 1410, 1411, 1414, 1418, 1419, 1420, 1425, 1428, 1429, 1432, 1433, 1434, 1436, 1444, 1449, 1451, 1452, 1458, 1460, 1461, 1463, 1464, 1468, 1469, 1474, 1476, 1481, 1492, 1493, 1500, 1501, 1503, 1504, 1506, 1507, 1509, 1510, 1511, 1516, 1520, 1526, 1530, 1533, 1535, 1539, 1540, 1543, 1553, 1554, 1556, 1559, 1562, 1566, 1569, 1570, 1573, 1580, 1581, 1582\n",
2024-12-11 20:59:23 +04:00
"--------\n",
2024-12-12 19:02:58 +04:00
"Cluster 3 (816):\n",
"0, 1, 3, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 21, 23, 26, 29, 30, 31, 32, 33, 34, 35, 38, 40, 41, 43, 45, 48, 51, 52, 53, 54, 55, 57, 60, 61, 63, 68, 74, 75, 76, 77, 79, 81, 84, 85, 86, 87, 88, 90, 91, 92, 93, 94, 95, 96, 98, 99, 100, 101, 102, 104, 106, 107, 109, 111, 112, 113, 116, 117, 120, 122, 123, 125, 127, 128, 131, 132, 133, 134, 136, 138, 141, 145, 146, 147, 149, 152, 157, 158, 160, 163, 165, 166, 167, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 180, 181, 182, 183, 184, 185, 186, 187, 188, 190, 191, 193, 194, 195, 196, 200, 203, 205, 207, 208, 209, 210, 212, 215, 216, 218, 219, 222, 223, 225, 229, 230, 231, 232, 234, 235, 236, 238, 239, 240, 242, 243, 246, 247, 248, 250, 258, 263, 266, 267, 269, 270, 272, 274, 275, 276, 279, 280, 282, 285, 287, 289, 292, 293, 295, 298, 299, 300, 302, 305, 308, 310, 311, 317, 318, 319, 320, 322, 325, 326, 327, 328, 333, 334, 336, 338, 339, 341, 343, 344, 345, 346, 348, 349, 350, 353, 354, 357, 359, 361, 362, 363, 364, 365, 367, 368, 371, 372, 375, 378, 381, 383, 384, 387, 388, 389, 391, 393, 394, 395, 396, 399, 400, 401, 402, 403, 407, 408, 410, 412, 414, 415, 416, 421, 424, 425, 426, 428, 429, 430, 431, 434, 436, 437, 438, 439, 443, 444, 445, 448, 449, 452, 457, 459, 461, 464, 465, 467, 468, 469, 470, 472, 473, 475, 476, 478, 480, 481, 482, 483, 484, 485, 487, 488, 489, 490, 491, 492, 494, 496, 497, 498, 499, 500, 502, 504, 507, 508, 509, 511, 513, 514, 515, 517, 519, 520, 522, 525, 527, 528, 529, 532, 533, 534, 535, 539, 541, 542, 546, 547, 548, 549, 550, 552, 553, 554, 558, 560, 561, 563, 564, 565, 566, 570, 572, 574, 575, 577, 580, 581, 583, 584, 585, 586, 588, 590, 593, 594, 601, 604, 606, 609, 610, 611, 614, 615, 618, 619, 622, 623, 625, 626, 627, 629, 630, 631, 632, 634, 635, 637, 638, 639, 641, 642, 644, 645, 648, 650, 657, 658, 659, 660, 661, 662, 663, 665, 666, 668, 671, 673, 678, 679, 680, 681, 683, 684, 686, 687, 688, 689, 691, 693, 699, 703, 704, 706, 707, 708, 710, 711, 712, 713, 715, 716, 717, 718, 719, 720, 721, 722, 723, 728, 729, 730, 731, 732, 733, 734, 735, 737, 740, 742, 744, 745, 746, 748, 749, 750, 751, 752, 753, 754, 759, 760, 761, 763, 765, 766, 767, 768, 769, 771, 772, 773, 774, 776, 777, 780, 781, 782, 783, 787, 788, 789, 790, 792, 794, 795, 796, 799, 801, 803, 806, 807, 809, 814, 815, 816, 817, 820, 822, 826, 828, 829, 830, 832, 834, 839, 840, 841, 842, 843, 846, 847, 848, 849, 850, 851, 853, 855, 856, 857, 859, 863, 864, 865, 868, 870, 871, 872, 873, 876, 877, 879, 881, 882, 884, 889, 891, 892, 894, 897, 899, 900, 901, 902, 904, 905, 908, 909, 912, 914, 918, 921, 922, 924, 925, 926, 927, 928, 929, 931, 934, 936, 938, 941, 942, 945, 946, 948, 950, 951, 952, 953, 954, 955, 956, 958, 959, 962, 963, 971, 974, 979, 983, 986, 987, 992, 993, 994, 995, 998, 1000, 1006, 1007, 1009, 1014, 1015, 1019, 1020, 1021, 1022, 1024, 1026, 1027, 1030, 1034, 1036, 1037, 1039, 1040, 1044, 1049, 1055, 1056, 1057, 1059, 1065, 1069, 1083, 1085, 1087, 1088, 1091, 1093, 1094, 1097, 1098, 1103, 1104, 1105, 1109, 1114, 1116, 1118, 1120, 1121, 1127, 1128, 1129, 1130, 1133, 1137, 1138, 1142, 1143, 1145, 1146, 1158, 1159, 1160, 1163, 1164, 1165, 1167, 1168, 1170, 1171, 1172, 1173, 1174, 1177, 1178, 1183, 1184, 1186, 1188, 1191, 1192, 1194, 1195, 1196, 1197, 1199, 1203, 1205, 1206, 1208, 1209, 1210, 1211, 1212, 1214, 1217, 1219, 1220, 1221, 1222, 1225, 1226, 1227, 1228, 1229, 1230, 1233, 1234, 1235, 1239, 1244, 1246, 1248, 1249, 1258, 1259, 1260, 1262, 1264, 1265, 1266, 1269, 1273, 1274, 1275, 1276, 1278, 1279, 1283, 1285, 1287, 1291, 1293, 1294, 1299, 1304, 1305, 1309, 1312, 1315, 1316, 1318, 1323, 1326, 1331, 1333, 1337, 1338, 1339, 1342, 1343, 1347, 1350, 1352, 1356, 1360, 1362, 1365, 1366, 1367, 1369, 1372, 1373, 1379, 1381, 1383, 1384, 1389, 1392, 1393, 1395, 1396, 1397, 1398, 1399, 1403, 1405, 1409, 1413, 1416, 1417, 1421, 1422, 1426, 1431, 1435, 1440, 1442, 1445, 1447, 1450, 1453, 1454, 1455, 1459, 1462, 1465, 1467, 1470, 1471, 1473, 1475, 1477, 1478, 1479, 1483, 1484, 1485, 1486, 1488, 1489, 1491, 1494, 1495, 1497, 1498, 1502, 1505, 1508, 1514, 1517, 151
2024-12-11 20:59:23 +04:00
"--------\n"
]
},
{
"data": {
"text/plain": [
2024-12-12 19:02:58 +04:00
"array([[34.91558091, 2.09543568, 1.86929461, 7.1659751 ],\n",
" [29.02968531, 23.47202797, 3.75524476, 6.93356643],\n",
" [25.48561275, 1.03186275, 0.88480392, 7.48039216]])"
2024-12-11 20:59:23 +04:00
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
2024-12-12 19:02:58 +04:00
"0 0\n",
"1 0\n",
"2 0\n",
"3 1\n",
"4 0\n",
" ..\n",
"1579 1\n",
"1580 1\n",
"1581 1\n",
"1582 1\n",
"1583 1\n",
"Name: HeartDisease, Length: 1584, dtype: int64"
2024-12-11 20:59:23 +04:00
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2024-12-12 19:02:58 +04:00
"image/png": "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
2024-12-11 20:59:23 +04:00
"text/plain": [
"<Figure size 1600x1200 with 4 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from sklearn.cluster import KMeans\n",
"import matplotlib.pyplot as plt\n",
"\n",
"def run_kmeans(data, n_clusters, random_state):\n",
" kmeans = KMeans(n_clusters=n_clusters, random_state=random_state)\n",
" labels = kmeans.fit_predict(data)\n",
" centers = kmeans.cluster_centers_\n",
" return labels, centers\n",
"\n",
"def print_cluster_result(data, n_clusters, labels):\n",
" for i in range(n_clusters):\n",
" cluster_indices = [index for index, label in enumerate(labels) if label == i]\n",
" print(f\"Cluster {i+1} ({len(cluster_indices)}):\")\n",
" print(\", \".join(map(str, cluster_indices)))\n",
" print(\"--------\")\n",
"\n",
"def draw_cluster_results(data, feature_x, feature_y, labels, centers, subplot):\n",
" subplot.scatter(data.iloc[:, feature_x], data.iloc[:, feature_y], c=labels, cmap='viridis')\n",
" subplot.scatter(centers[:, feature_x], centers[:, feature_y], marker='x', s=200, linewidths=3, color='r')\n",
" subplot.set_xlabel(data.columns[feature_x])\n",
" subplot.set_ylabel(data.columns[feature_y])\n",
"\n",
"random_state = 9\n",
"n_clusters = 3\n",
"labels, centers = run_kmeans(X, n_clusters, random_state)\n",
"print_cluster_result(X, n_clusters, labels)\n",
"display(centers)\n",
"display(df['HeartDisease'])\n",
"\n",
"plt.figure(figsize=(16, 12))\n",
"draw_cluster_results(X, 0, 1, labels, centers, plt.subplot(2, 2, 1))\n",
"draw_cluster_results(X, 2, 3, labels, centers, plt.subplot(2, 2, 2))\n",
"draw_cluster_results(X, 0, 2, labels, centers, plt.subplot(2, 2, 3))\n",
"draw_cluster_results(X, 1, 3, labels, centers, plt.subplot(2, 2, 4))\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "code",
2024-12-12 19:02:58 +04:00
"execution_count": 69,
2024-12-11 20:59:23 +04:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2024-12-12 19:02:58 +04:00
"[[-5.84622064 -8.51798399]\n",
" [-5.7037399 -4.66415042]\n",
" [21.96082207 -6.57635165]\n",
2024-12-11 20:59:23 +04:00
" ...\n",
2024-12-12 19:02:58 +04:00
" [24.02481154 -4.69225678]\n",
" [24.02481154 -4.69225678]\n",
" [-5.69844894 -3.81424256]]\n"
2024-12-11 20:59:23 +04:00
]
}
],
"source": [
"from sklearn.decomposition import PCA\n",
"\n",
"reduced_data = PCA(n_components=2).fit_transform(X)\n",
"\n",
2024-12-12 19:02:58 +04:00
"print(reduced_data)\n"
2024-12-11 20:59:23 +04:00
]
},
{
"cell_type": "code",
2024-12-12 19:02:58 +04:00
"execution_count": 70,
2024-12-11 20:59:23 +04:00
"metadata": {},
"outputs": [
{
"data": {
2024-12-12 19:02:58 +04:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAABjYAAAJOCAYAAAAUHj4bAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3xN5x8H8M8592ZPCZLYxN6k9t5b7fWzFVWUGm1Vi6JGjaJFlaK22nvvVZvaM7YQZO/c8/z+iNyK5N7ckNyVz/v1yqvNOc8995Mr4zz3eZ7vIwkhBIiIiIiIiIiIiIiIiCyAbOoAREREREREREREREREhuLABhERERERERERERERWQwObBARERERERERERERkcXgwAYREREREREREREREVkMDmwQEREREREREREREZHF4MAGERERERERERERERFZDA5sEBERERERERERERGRxeDABhERERERERERERERWQwObBARERERERERERERkcXgwAYRUSb1999/w8PDA+Hh4el2zdq1a6N27doGty1ZsmS6PTeln3z58qF58+bpek1JkjBu3Lg0PaZTp07o0KFDuuYgIiIiIvPCfollkSQJgwYNSrfrPXjwAJIkYenSpWl6XOXKlfH111+nWw4isjwc2CAii7B06VJIkqT9sLe3R+HChTFo0CC8ePEiWfsXL15gxIgRKFq0KBwdHeHk5AQ/Pz9MnDgRwcHBKT5HxYoVIUkS5s+fb3CuxJuwxA8bGxtkzZoVVatWxXfffYdHjx596JeMZ8+eYdy4cbh06dIHX0MXjUaDsWPHYvDgwXB2dgYAFC9eHGXKlEnWdtOmTZAkCbVq1Up2bvHixZAkCXv37k3xeTLya/gYO3fuNOhN9ve/73R95MuXL8Mz65P4fTh9+nST5khv33zzDTZs2IDLly+bOgoRERERAPZL0psl90vGjRtnUF/B0AGWjHL48GFIkoT169ebNEd6++abbzB37lwEBASYOgoRmYja1AGIiNJi/PjxyJ8/P6Kjo3H8+HHMnz8fO3fuxNWrV+Ho6AgAOHv2LJo2bYrw8HB07doVfn5+AIBz585hypQpOHr0aLIb3jt37uDs2bPIly8fVq5ciQEDBqQpV+fOndG0aVMoioKgoCCcPXsWs2bNwuzZs/Hnn3+iU6dOaf5anz17hh9//BH58uVD2bJl0/x4fbZt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
2024-12-11 20:59:23 +04:00
"text/plain": [
"<Figure size 1600x600 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"\n",
"plt.figure(figsize=(16, 6))\n",
"\n",
"draw_data_2d(\n",
" pd.DataFrame({\"Column1\": reduced_data[:, 0], \"Column2\": reduced_data[:, 1]}),\n",
" 0,\n",
" 1,\n",
2024-12-12 18:50:47 +04:00
" labels=[0] * len(reduced_data), \n",
2024-12-11 20:59:23 +04:00
" subplot=plt.subplot(1, 2, 1),\n",
")\n",
"plt.title('PCA Data (Without True Labels)')\n",
"\n",
"draw_data_2d(\n",
" pd.DataFrame({\"Column1\": reduced_data[:, 0], \"Column2\": reduced_data[:, 1]}),\n",
" 0,\n",
" 1,\n",
" df['HeartDisease'],\n",
" plt.subplot(1, 2, 2),\n",
")\n",
"plt.title('PCA Data (With True Labels)')\n",
"\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "code",
2024-12-12 19:02:58 +04:00
"execution_count": 71,
2024-12-11 20:59:23 +04:00
"metadata": {},
"outputs": [
{
"data": {
2024-12-12 19:02:58 +04:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA1UAAAIjCAYAAADr8zGuAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd5wU9f348dfM9t3rvd/BUY4O0hSkg2DBhj3ma40pajSamJiYGH/RGE2MadaYmNijYi+oKAhIkd57h+u97G2dz++PhYPj7rgDjtu74/18PPYBOzM78569vb15z+fzeX80pZRCCCGEEEIIIcRJ0cMdgBBCCCGEEEJ0ZZJUCSGEEEIIIcQpkKRKCCGEEEIIIU6BJFVCCCGEEEIIcQokqRJCCCGEEEKIUyBJlRBCCCGEEEKcAkmqhBBCCCGEEOIUSFIlhBBCCCGEEKdAkiohhBBCCCGEOAWSVAkhRDczceJEJk6cGO4wTsr8+fPRNI358+eHLYbHH3+cvLw8DMMIy/FvvPFGcnJywnLsjvDss8+SlZWF1+s9rcfRNI3f/va3bd72jjvuOK3xCCG6N0mqhBAd7j//+Q+aprFixYpGy6uqqhg1ahR2u505c+aEKbrOq6ioiJ/+9Kfk5eXhdDpxuVwMHz6chx9+mMrKyg6L4/e//z3vvfdehx2vI1VXV/PYY4/x85//HF0P/YksKyvjj3/8I+PHjycxMZGYmBjOPvts/ve//53wvh966CGGDBlCREQEDoeDgQMH8vOf/5z8/PzTcTrNevrpp/nPf/7TYcc71o033ojP5+O5557r0OMuXryY3/72t+3+u7Jnzx40TWt4mEwmsrKyuOyyy1izZk2T7T0eD08++SSjR48mOjoau91Onz59uOOOO9i2bVuzx7jvvvvQNI2rr766XWMXQrQfc7gDEEIICF1wnnfeeaxbt453332XGTNmhDukTmX58uVccMEF1NbWcv311zN8+HAAVqxYwR/+8AcWLFjA559/3iGx/P73v+eKK67g0ksvbfd9jx8/nvr6eqxWa7vvuy3+/e9/EwgEuPbaaxuWLVmyhF/96ldccMEFPPDAA5jNZmbPns0111zDpk2beOihh1rd765du5g6dSr79u3jyiuv5LbbbsNqtbJu3Tr+9a9/8e6777Z4Qd3enn76aRISErjxxhs75HjHstvt3HDDDfz5z3/mzjvvRNO003Kc+vp6zOYjlzmLFy/moYce4sYbbyQmJqbdj3fttddywQUXEAwG2bx5M8888wyffvopS5cuZejQoQCUlpYyY8YMVq5cyUUXXcR1111HREQEW7du5Y033uD555/H5/M12q9Sitdff52cnBw+/PBDampqiIyMbPf4hRCnRpIqIUTY1dTUMH36dNasWcM777zD+eefH+6QOpXKykouu+wyTCYTq1evJi8vr9H6Rx55hH/+859hiq59eDwerFYruq5jt9vDFseLL77IxRdf3CiGAQMGsH37drKzsxuW/ehHP2Lq1Kk89thj3Hfffbhcrhb3GQgEuPzyyykqKmL+/Pmce+65jdY/8sgjPPbYY+1/Mh0oEAhgGEabk+GrrrqKxx9/nHnz5jF58uTTElNHf47OOussrr/++obnY8eO5eKLL+aZZ55paJW78cYbWb16NW+//TazZs1q9Prf/e53/OpXv2qy3/nz53PgwAG++uorpk+fzjvvvMMNN9xwek9GCHHCpPufECKsamtrmTFjBqtWrWL27NlceOGFx93+t7/9LZqmsW3bNq6//nqio6NJTEzk17/+NUop9u/fzyWXXEJUVBQpKSk88cQTTfbh9Xp58MEH6dWrFzabjczMTO67774mYzxefPFFJk+eTFJSEjabjf79+/PMM8802V9OTg4XXXQRixYtaui+2LNnT1566aVG2/n9fh566CF69+6N3W4nPj6ec889ly+++OK45/zcc89x8OBB/vznPzdJqACSk5N54IEHWnz94e6We/bsabS8ufFL27dvZ9asWaSkpGC328nIyOCaa66hqqoKCI09qaur47///W9Dd6ejWzwOHjzIzTffTHJyMjabjQEDBvDvf/+72eO+8cYbPPDAA6Snp+N0Oqmurm42pokTJzJw4EA2bdrEpEmTcDqdpKen8/jjjzc5171793LxxRfjcrlISkriJz/5CZ999lmbxmnt3r2bdevWMXXq1EbLe/To0SihOvw+XHrppXi9Xnbt2nXc/c6ePZu1a9fyq1/9qklCBRAVFcUjjzzS4utbGmd2uNvZ0V35CgsLuemmm8jIyMBms5Gamsoll1zS8LPPyclh48aNfP311w0/v6PH31VWVnL33XeTmZmJzWajV69ePPbYY43Glx0+7p/+9Cf+8pe/kJubi81mY9OmTQD8/e9/Z8CAATidTmJjYxkxYgSvvfZao9iHDx9OXFwc77///nHfu7/97W+YTKZGXfaeeOIJNE3jnnvuaVgWDAaJjIzk5z//ecOyo8dU/fa3v+VnP/sZEPp5Hj73Y38n3nvvPQYOHNjw2T2VbsiHk8Xdu3cDsGzZMj7++GNuueWWJgkVgM1m409/+lOT5a+++ir9+/dn0qRJTJ06lVdfffWkYxJCnD7SUiWECJu6ujrOP/98li9fzttvv81FF13U5tdeffXV9OvXjz/84Q98/PHHPPzww8TFxfHcc88xefJkHnvsMV599VV++tOfMnLkSMaPHw+AYRhcfPHFLFq0iNtuu41+/fqxfv16nnzySbZt29ZorNAzzzzDgAEDuPjiizGbzXz44Yf86Ec/wjAMbr/99kbx7NixgyuuuIJbbrmFG264gX//+9/ceOONDB8+nAEDBgChC7tHH32UW2+9lVGjRlFdXc2KFStYtWoV06ZNa/FcP/jgAxwOB1dcccUJvLsnzufzMX36dLxeL3feeScpKSkcPHiQjz76iMrKSqKjo3n55Zcb4r/tttsAyM3NBUJjvs4+++yGQf+JiYl8+umn3HLLLVRXV3P33Xc3Ot7vfvc7rFYrP/3pT/F6vcdt5aioqGDGjBlcfvnlXHXVVbz99tv8/Oc/Z9CgQQ0tm3V1dUyePJmCggLuuusuUlJSeO2115g3b16bzn/x4sVAqMWhLQoLCwFISEg47nYffPABAN/97nfbtN9TMWvWLDZu3Midd95JTk4OxcXFfPHFF+zbt4+cnBz+8pe/cOeddxIREdHQKpKcnAyA2+1mwoQJHDx4kO9///tkZWWxePFi7r//fgoKCvjLX/7S6FgvvvgiHo+H2267DZvNRlxcHP/85z/58Y9/zBVXXMFdd92Fx+Nh3bp1LFu2jOuuu67R68866yy++eab457PuHHjMAyDRYsWNXw/LFy4EF3XWbhwYcN2q1evpra2tuH3/FiXX34527Zt4/XXX+fJJ59s+JklJiY2bLNo0SLeeecdfvSjHxEZGcnf/vY3Zs2axb59+4iPj2/Du9/Yzp07ARpeezKfA6/Xy+zZs7n33nuBUBfDm266icLCQlJSUk44JiHEaaSEEKKDvfjiiwpQ2dnZymKxqPfee6/Nr33wwQcVoG677baGZYFAQGVkZChN09Qf/vCHhuUVFRXK4XCoG264oWHZyy+/rHRdVwsXLmy032effVYB6ptvvmlY5na7mxx/+vTpqmfPno2WZWdnK0AtWLCgYVlxcbGy2Wzq3nvvbVg2ZMgQdeGFF7b5XA+LjY1VQ4YMafP2EyZMUBMmTGh4fvj93r17d6Pt5s2bpwA1b948pZRSq1evVoB66623jrt/l8vV6D097JZbblGpqamqtLS00fJrrrlGRUdHN7yfh4/bs2fPJu/xsTEdPh9AvfTSSw3LvF6vSklJUbNmzWpY9sQTTyig0eepvr5e5eXlNdlncx544AEFqJqamuNup5RSZWVlKikpSY0bN67VbYcNG6aio6Nb3e6wG264QWVnZzc8b+49UUqp3bt3K0C9+OKLSqnQ5x1Qf/zjH4+7/wEDBjT6fBz2u9/9TrlcLrVt27ZGy3/xi18ok8mk9u3b1+i4UVFRqri4uNG2l1xyiRowYECbzvO2225TDofjuNsEg0E
2024-12-11 20:59:23 +04:00
"text/plain": [
"<Figure size 1000x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from sklearn.cluster import KMeans\n",
"import matplotlib.pyplot as plt\n",
"\n",
"def fit_kmeans(data, n_clusters, random_state):\n",
" kmeans = KMeans(n_clusters=n_clusters, random_state=random_state)\n",
" kmeans.fit(data)\n",
" return kmeans\n",
"\n",
"def draw_clusters(data, kmeans):\n",
" labels = kmeans.labels_\n",
" centers = kmeans.cluster_centers_\n",
" \n",
" plt.figure(figsize=(10, 6))\n",
" plt.scatter(data[:, 0], data[:, 1], c=labels, cmap='viridis', alpha=0.6)\n",
" plt.scatter(centers[:, 0], centers[:, 1], marker='x', s=200, linewidths=3, color='r')\n",
" plt.xlabel('Principal Component 1')\n",
" plt.ylabel('Principal Component 2')\n",
" plt.title('K-means Clustering (2 Clusters) with PCA')\n",
" plt.show()\n",
"\n",
"kmeans = fit_kmeans(reduced_data, 2, random_state)\n",
"draw_clusters(reduced_data, kmeans)"
]
},
{
"cell_type": "code",
2024-12-12 19:02:58 +04:00
"execution_count": 72,
2024-12-11 20:59:23 +04:00
"metadata": {},
"outputs": [
{
"data": {
2024-12-12 19:02:58 +04:00
"image/png": "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
2024-12-11 20:59:23 +04:00
"text/plain": [
"<Figure size 1000x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from sklearn.cluster import KMeans\n",
"import matplotlib.pyplot as plt\n",
"\n",
"def fit_kmeans(data, n_clusters, random_state):\n",
" kmeans = KMeans(n_clusters=n_clusters, random_state=random_state)\n",
" kmeans.fit(data)\n",
" return kmeans\n",
"\n",
"def draw_clusters(data, kmeans):\n",
" labels = kmeans.labels_\n",
" centers = kmeans.cluster_centers_\n",
" \n",
" plt.figure(figsize=(10, 6))\n",
" plt.scatter(data[:, 0], data[:, 1], c=labels, cmap='viridis', alpha=0.6)\n",
" plt.scatter(centers[:, 0], centers[:, 1], marker='x', s=200, linewidths=3, color='white')\n",
" plt.xlabel('Principal Component 1')\n",
" plt.ylabel('Principal Component 2')\n",
" plt.title('K-means Clustering (PCA-reduced data)')\n",
" plt.show()\n",
"\n",
"kmeans = fit_kmeans(reduced_data, 3, random_state)\n",
"draw_clusters(reduced_data, kmeans)"
]
},
{
"cell_type": "code",
2024-12-12 19:02:58 +04:00
"execution_count": 73,
2024-12-11 20:59:23 +04:00
"metadata": {},
"outputs": [
{
"data": {
2024-12-12 19:02:58 +04:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAABjYAAAJOCAYAAAAUHj4bAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3hTVQMG8PfepHsXWsosUPYQpOy9NwgICMieCiKIoAjKFgREhgNEFJCpbJC99957lj1aoHsn93x/lOajtElTaLP6/p6nj/bek3vfpKE9J2dJQggBIiIiIiIiIiIiIiIiKyCbOwAREREREREREREREZGx2LFBRERERERERERERERWgx0bRERERERERERERERkNdixQUREREREREREREREVoMdG0REREREREREREREZDXYsUFERERERERERERERFaDHRtERERERERERERERGQ12LFBRERERERERERERERWgx0bRERERERERERERERkNdixQUT0SsGCBdGzZ09zxzCLadOmoUSJElAUxdxRzMrS3wPjxo2DJElv/fi6deuibt26mRcoA+bNm4cCBQogPj7eLPcnIiIiys6S65HPnz/PtGv27NkTBQsWzLTrPXjwAI6Ojjh8+HCmXdMavWudP6vdvXsXkiRh0aJFb/X4RYsWQZIk3L17N1NzGePFixdwcXHBli1bTH5vIsp87NggIpt3+/ZtDBgwAIULF4ajoyPc3d1Ro0YNzJ49G7GxsSbJEBMTg3HjxmHfvn0muV9GREREYOrUqfj6668hy///syBJku5LlmXkyZMHjRs3TvM5aLVaLFy4EHXr1oW3tzccHBxQsGBB9OrVC6dOnUrzvr/99hskSUKVKlWy6qlRJsmM92/Pnj2RkJCA33//PfOCEREREb2F1+u5hr7MXXevW7cuypQpY9YMpjRhwgRUqVIFNWrU0B3r2bNnip+Ju7s7ypUrhxkzZqQ5YObcuXPo2rUr8ufPDwcHB3h7e6Nhw4ZYuHAhtFptqvJhYWFwdHSEJEm4evVqlj4/enfLly/HrFmz3vrxOXLkQN++ffHdd99lXigiMhu1uQMQEWWlzZs3o0OHDnBwcED37t1RpkwZJCQk4NChQxgxYgQuX76M+fPnZ3mOmJgYjB8/HgDMNmJen7/++gsajQadO3dOda5Ro0bo3r07hBAICgrCb7/9hvr1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
2024-12-11 20:59:23 +04:00
"text/plain": [
2024-12-12 18:50:31 +04:00
"<Figure size 1600x600 with 2 Axes>"
2024-12-11 20:59:23 +04:00
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"\n",
"labels = [2 if val == 1 else 1 if val == 2 else val for val in kmeans.labels_]\n",
"\n",
2024-12-12 18:50:31 +04:00
"plt.figure(figsize=(16, 6))\n",
2024-12-11 20:59:23 +04:00
"\n",
"draw_data_2d(\n",
" pd.DataFrame({\"Column1\": reduced_data[:, 0], \"Column2\": reduced_data[:, 1]}),\n",
" 0,\n",
" 1,\n",
" labels,\n",
2024-12-12 18:50:31 +04:00
" plt.subplot(1, 2, 1),\n",
2024-12-11 20:59:23 +04:00
")\n",
"plt.title('Clusters (PCA-reduced data)')\n",
"\n",
"draw_data_2d(\n",
" pd.DataFrame({\"Column1\": reduced_data[:, 0], \"Column2\": reduced_data[:, 1]}),\n",
" 0,\n",
" 1,\n",
" df['HeartDisease'],\n",
2024-12-12 18:50:31 +04:00
" plt.subplot(1, 2, 2),\n",
2024-12-11 20:59:23 +04:00
")\n",
"plt.title('True Labels (PCA-reduced data)')\n",
"\n",
"plt.tight_layout()\n",
"plt.show()"
]
2024-12-12 18:50:31 +04:00
},
{
"cell_type": "code",
2024-12-12 19:02:58 +04:00
"execution_count": 74,
2024-12-12 18:50:31 +04:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Clusters Range: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n",
2024-12-12 19:02:58 +04:00
"Inertias: [188339.3786248587, 71215.42904037607, 45411.799539507614, 30940.91324871111, 25825.44168747253, 20648.77565717782, 18422.523745341146, 16603.274611675115, 14473.722814510891, 12572.350229277426]\n"
2024-12-12 18:50:31 +04:00
]
},
{
"data": {
2024-12-12 19:02:58 +04:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA2wAAAIjCAYAAAB/FZhcAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB/KElEQVR4nO3dd3gU5frG8Xs3nVSSkAYBQu8gIEhXQQMiHlREQAUVLEgRsIENLEeKxyMWBLGBvctPUfEgvQkIhB4IEECEEGoapO78/ghZsySBBEJmk3w/17UX2Zl3dp/dbIA7887zWgzDMAQAAAAAcDpWswsAAAAAABSOwAYAAAAATorABgAAAABOisAGAAAAAE6KwAYAAAAATorABgAAAABOisAGAAAAAE6KwAYAAAAATorABgAAAABOisAGoNywWCyaNGmS/f6kSZNksVh0/Phx84pyUrVr19bNN998xZ9n6dKlslgsWrp06UXHrl+/Xh07dpS3t7csFotiYmKueH1lrSTvR0V67tKS9xq+/fZbs0splqNHj6pfv34KCgqSxWLR9OnTS+Vx8/5uAwCJwAbAZHPmzJHFYiny9scff5hd4iWrXbu2LBaLevToUej+9957z/46//zzzxI//o4dOzRp0iTt37//Miu98rKysnTHHXfo5MmTev311/XJJ5+oVq1aV/x5Dx48qIcffli1a9eWh4eHQkJC1LdvX61ateqyHvedd97RnDlzSqfIMpb3M+fp6am///67wP5rr71WzZo1M6Gy8mfs2LH67bffNGHCBH3yySfq2bPnBcenp6fr9ddfV/v27eXv7y9PT081aNBAI0eO1O7du8uoaunzzz8vtXAJ4MpzNbsAAJCkF198UVFRUQW216tXz4RqSo+np6eWLFmihIQEhYWFOez77LPP5OnpqfT09Et67B07duiFF17Qtddeq9q1a5dCtVfO3r17deDAAb333nsaNmxYmTznqlWrdNNNN0mShg0bpiZNmighIUFz5sxRly5d9MYbb2jUqFGX9NjvvPOOgoODde+99zps79q1q86ePSt3d/fLLf+Ky8jI0JQpU/TWW2+ZXUq5tXjxYv3rX//S448/ftGxx48fV8+ePbVhwwbdfPPNGjRokHx8fLRr1y59+eWXmj17tjIzM8ug6tzAtm3bNo0ZM6ZMng/A5SGwAXAKvXr1Utu2bc0uo9R16tRJ69ev11dffaVHH33Uvv3QoUNasWKFbr31Vn333XcmVlg2EhMTJUkBAQGl9phpaWny9vYudN+pU6fUr18/eXl5adWqVapbt65937hx4xQdHa0xY8aoTZs26tixY6nVZLVa5enpWWqPdyW1atVK7733niZMmKCIiAizyylTF/rslERiYmKxP9P33nuvNm3apG+//Va33367w76XXnpJzzzzzGXXYyabzabMzMxy8/kHyhOmRAIo944fP67+/fvLz89PQUFBevTRRwuctcrOztZLL72kunXrysPDQ7Vr19bTTz+tjIwM+5hx48YpKChIhmHYt40aNUoWi0VvvvmmfdvRo0dlsVg0c+bMi9bm6emp2267TZ9//rnD9i+++EJVq1ZVdHR0ocfFxsaqX79+CgwMlKenp9q2basff/zRvn/OnDm64447JEnXXXedfWrl+dcvrVy5Uu3atZOnp6fq1Kmjjz/+uMBz7du3T3fccYcCAwNVpUoVXXPNNfr5558LjDt06JD69u0rb29vhYSEaOzYsQ7vX1HuvfdedevWTZJ0xx13yGKx6Nprr7XvX7x4sbp06SJvb28FBAToX//6l3bu3OnwGHnX9OzYsUODBg1S1apV1blz5yKf891331VCQoJeffVVh7AmSV5eXpo7d64sFotefPFF+/a8qYLLly/XQw89pKCgIPn5+Wnw4ME6deqUfVzt2rW1fft2LVu2zP6+572ewq4jy5tiuGXLFnXr1k1VqlRRvXr17NdpLVu2TO3bt5eXl5caNmyo33//3aHeAwcO6JFHHlHDhg3l5eWloKAg3XHHHZc9Ffbpp59WTk6OpkyZcsFx+/fvl8ViKXQKaFHXle7evVt33323/P39Va1aNT333HMyDEN//fWX/vWvf8nPz09hYWF67bXXCn3OnJwcPf300woLC5O3t7duueUW/fXXXwXGrV27Vj179pS/v7+qVKmibt26FZjuWtLPjnTxn4m8z4phGJoxY4b9c1CUtWvX6ueff9bQoUMLhDVJ8vDw0H/+858ijy/J9yAlJUVjxoxxmAZ8ww03aOPGjZJyP48///yzDhw4YK87/xn6jIwMTZw4UfXq1ZOHh4ciIyP15JNPFvhZt1gsGjlypD777DM1bdpUHh4eWrBggSTpyy+/VJs2beTr6ys/Pz81b95cb7zxRpGvD8CFcYYNgFNISkoq0DzEYrEoKCjoosf2799ftWvX1uTJk/XHH3/ozTff1KlTpxzCybBhwzR37lz169dPjz32mNauXavJkydr586d+uGHHyRJXbp00euvv67t27fbr+FZsWKFrFarVqxYodGjR9u3SbnT34pj0KBBuvHGG7V37157ePj888/Vr18/ubm5FRi/fft2derUSdWrV9f48ePl7e2tr7/+Wn379tV3332nW2+9VV27dtXo0aP15ptv6umnn1bjxo0lyf6nJO3Zs0f9+vXT0KFDNWTIEH344Ye699571aZNGzVt2lRSbvjs2LGjzpw5o9GjRysoKEhz587VLbfcom+//Va33nqrJOns2bPq3r27Dh48qNGjRysiIkKffPKJFi9efNHX/9BDD6l69ep65ZVXNHr0aF199dUKDQ2VJP3+++/q1auX6tSpo0mTJuns2bN666231KlTJ23cuLHAVM877rhD9evX1yuvvOIQrM/3008/ydPTU/379y90f1RUlDp37qzFixfr7Nmz8vLysu8bOXKkAgICNGnSJO3atUszZ87UgQMH7GFs+vTpGjVqlHx8fOxnRfJeT1FOnTqlm2++WQMGDNAdd9yhmTNnasCAAfrss880ZswYPfzwwxo0aJBeffVV9evXT3/99Zd8fX0l5TZrWb16tQYMGKAaNWpo//79mjlzpq699lrt2LFDVapUuej3oKj3YPDgwXrvvfc0fvz4Uj3Lduedd6px48aaMmWKfv75Z7388ssKDAzUu+++q+uvv15Tp07VZ599pscff1xXX311gZ+lf//737JYLHrqqaeUmJio6dOnq0ePHoqJibF/rxYvXqxevXqpTZs2mjhxoqxWqz766CNdf/31WrFihdq1a+fwmMX97BTnZ6Jr16765JNPdM899+iGG27Q4MGDL/h+5P2y5Z577rmUt7NEHn74YX377bcaOXKkmjRpohMnTmjlypXauXOnWrdurWeeeUZJSUk6dOiQXn/9dUmSj4+PpNyzZLfccotWrlypBx98UI0bN9bWrVv1+uuva/fu3Zo3b57Dcy1evFhff/21Ro4cqeDgYNWuXVsLFy7UwIED1b17d02dOlWStHPnTq1atcphlgGAEjAAwEQfffSRIanQm4eHh8NYScbEiRPt9ydOnGhIMm655RaHcY888oghydi8ebNhGIYRExNjSDKGDRvmMO7xxx83JBmLFy82DMMwEhMTDUnGO++8YxiGYZw+fdqwWq3GHXfcYYSGhtqPGz16tBEYGGjYbLYLvrZatWoZvXv3NrKzs42wsDDjpZdeMgzDMHbs2GFIMpYtW2Z//evXr7cf1717d6N58+ZGenq6fZvNZjM6duxo1K9f377tm2++MSQZS5YsKfS5JRnLly+3b0tMTDQ8PDyMxx57zL5tzJgxhiRjxYoV9m0pKSlGVFSUUbt2bSMnJ8cwDMOYPn26Icn4+uuv7ePS0tKMevXqFVlDfkuWLDEkGd98843D9latWhkhISHGiRMn7Ns2b95sWK1WY/DgwfZted/rgQMHXvB58gQEBBgtW7a84JjRo0cbkowtW7YYhvHPZ7FNmzZGZmamfdy0adMMScb//d//2bc1bdrU6NatW5GvM//70a1bN0OS8fnnn9u3xcbGGpIMq9Vq/PHHH/btv/32myHJ+Oijj+z
2024-12-12 18:50:31 +04:00
"text/plain": [
"<Figure size 1000x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from sklearn.decomposition import PCA\n",
"from sklearn.cluster import KMeans\n",
"import matplotlib.pyplot as plt\n",
"\n",
"def get_clusters_inertia(data, random_state, max_clusters=10):\n",
" inertias = []\n",
" clusters_range = range(1, max_clusters + 1)\n",
" \n",
" for n_clusters in clusters_range:\n",
" kmeans = KMeans(n_clusters=n_clusters, random_state=random_state)\n",
" kmeans.fit(data)\n",
" inertias.append(kmeans.inertia_)\n",
" \n",
" return inertias, clusters_range\n",
"\n",
"def draw_elbow_diagram(inertias, clusters_range):\n",
" plt.figure(figsize=(10, 6))\n",
" plt.plot(clusters_range, inertias, marker='o')\n",
" plt.xlabel('Number of Clusters')\n",
" plt.ylabel('Inertia')\n",
" plt.title('Elbow Method for Optimal Number of Clusters')\n",
" plt.show()\n",
"\n",
"random_state = 42\n",
"max_clusters = 10\n",
"\n",
"inertias, clusters_range = get_clusters_inertia(reduced_data, random_state, max_clusters)\n",
"\n",
"print(\"Clusters Range:\", list(clusters_range))\n",
"print(\"Inertias:\", inertias)\n",
"\n",
"draw_elbow_diagram(inertias, clusters_range)"
]
2024-12-12 18:50:47 +04:00
},
{
"cell_type": "code",
2024-12-12 19:02:58 +04:00
"execution_count": 75,
2024-12-12 18:50:47 +04:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Clusters Range: [2, 3, 4, 5, 6, 7, 8, 9, 10]\n",
2024-12-12 19:02:58 +04:00
"Silhouette Scores: [np.float64(0.4061232673047139), np.float64(0.5161974215603345), np.float64(0.41688933894376207), np.float64(0.4317880554700233), np.float64(0.43244492414105384), np.float64(0.4520139981348476), np.float64(0.42287542835353636), np.float64(0.4290740936057577), np.float64(0.45589103429651956)]\n"
2024-12-12 18:50:47 +04:00
]
},
{
"data": {
2024-12-12 19:02:58 +04:00
"image/png": "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6aaboFar4eTkhOHDh2P//v2NPu6xY8dwzz33wMPDA0OGDAEA5OTkYPbs2QgICIBSqUSHDh0wYcIEq51GS9RSHLkislFBQUE4ePAgjhw5YrYC8aKiItx000244447MHnyZHzzzTd45pln0Lt3b9x8880A6j/YjhgxAqdOncKjjz6KTp064euvv8asWbNQXFzc6Af/qzl69CgGDx4Mf39/PPvss3B2dsbWrVtx++2349tvv8XEiRMxbNgwzJ8/H++//z6ee+459OzZEwDQs2dPrFixAo899hhcXFzw/PPPAwB8fHwAABUVFRg+fDiysrLw4IMPomPHjjhw4AAWLlyI7OxsrFix4qrx/fvvvzh16hQ+++wzKBQK3HHHHdi8eXOTScfkyZPRqVMnLF26FAkJCfjkk0/g7e1tMi1o1apV6NWrF8aPHw+5XI4dO3bg4Ycfhk6nwyOPPNLoeV1cXDBx4kRs2bIF77zzDmQymXHfl19+CUEQcO+99wKo/3C0dOlS3H///ejXrx9KSkoQFxeHhIQEjBkzpsnfw2233Ybw8HAsWbIESqUSp06davDB61Lt27fHxo0b8dprr6GsrMyY7PTs2ROCIGD8+PHYs2cP5syZg8jISOzatQtPPfUUsrKy8O6775qc648//sDWrVvx6KOPwsvLq8mRwX379qGoqAj/+9//mhx5mzFjBj777DP8+OOPGDBggHF7WloapkyZgoceeggzZ87EZ599hrvuugs7d+7EmDFjrnidXcnSpUvh6OiIZ599FqdOncIHH3wABwcHSKVSFBUV4eWXX8Y///yD9evXo1OnTnjppZeM972Wa6E5nn/+eWzYsMHso1d79+7F9u3bjbEtXboUt912G55++ml89NFHePjhh1FUVITly5fjvvvuwx9//GFy/6KiItxyyy2YPHkypk6diq1bt2LevHlQKBS47777ANSPPo0fPx779u3DAw88gJ49eyIlJQXvvvsuTp48ie+//97knM29doD6v43Fixdj9OjRmDdvHlJTU7Fq1SrExsZi//79cHBwwIoVK7BhwwZs27YNq1atgouLC8LDwxs9X0VFBXbv3o1hw4ahY8eO1/7CNsPV/kZ79uyJJUuW4KWXXsIDDzyAoUOHAgAGDRoEoP51uvnmmxEVFYVFixZBKpUak/u9e/eiX79+Jo931113oVu3bnj99deNX4jceeedOHr0KB577DEEBwcjLy8Pv/32G86dO2f1o/lEzSIQkU369ddfBZlMJshkMmHgwIHC008/LezatUuoqalpcGxQUJAwc+ZM48979uwRAAh79uwxbhs+fLgAQNiwYYNxW3V1teDr6yvceeedxm0rVqwQAAibNm0ybqupqREGDhwouLi4CCUlJU0+hiAIwtmzZwUAwmeffWbcNmrUKKF3795CVVWVcZtOpxMGDRokdOvWzbjt66+/bvScgiAIvXr1EoYPH95g+yuvvCI4OzsLJ0+eNNn+7LPPCjKZTDh37lyD+1zu0UcfFQIDAwWdTicIQv1rD0A4fPiwyXGLFi0SAAj33XefyfaJEycK7dq1M9lWUVHR4HHGjh0rdO7c2WTb8OHDTZ7Xrl27BADCL7/8YnJceHi4yXERERHCrbfeesXnZYjX4N133xUACPn5+Ve8X2OGDx8u9OrVy2Tb999/LwA
2024-12-12 18:50:47 +04:00
"text/plain": [
"<Figure size 1000x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from sklearn.metrics import silhouette_score\n",
"from sklearn.cluster import KMeans\n",
"from sklearn.preprocessing import StandardScaler\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"\n",
"def get_clusters_silhouette_scores(data, random_state, max_clusters=10):\n",
" silhouette_scores = []\n",
" clusters_range = range(2, max_clusters + 1)\n",
" \n",
" for n_clusters in clusters_range:\n",
" kmeans = KMeans(n_clusters=n_clusters, random_state=random_state)\n",
" labels = kmeans.fit_predict(data)\n",
" score = silhouette_score(data, labels)\n",
" silhouette_scores.append(score)\n",
" \n",
" return silhouette_scores, clusters_range\n",
"\n",
"def draw_silhouettes_diagram(silhouette_scores, clusters_range):\n",
" plt.figure(figsize=(10, 6))\n",
" plt.plot(clusters_range, silhouette_scores, marker='o')\n",
" plt.xlabel('Number of Clusters')\n",
" plt.ylabel('Silhouette Score')\n",
" plt.title('Silhouette Analysis for Optimal Number of Clusters')\n",
" plt.show()\n",
"\n",
"random_state = 42\n",
"max_clusters = 10\n",
"\n",
"scaler = StandardScaler()\n",
"reduced_data = scaler.fit_transform(reduced_data)\n",
"\n",
"silhouette_scores, clusters_range = get_clusters_silhouette_scores(reduced_data, random_state, max_clusters)\n",
"\n",
"print(\"Clusters Range:\", list(clusters_range))\n",
"print(\"Silhouette Scores:\", silhouette_scores)\n",
"\n",
"draw_silhouettes_diagram(silhouette_scores, clusters_range)"
]
},
{
"cell_type": "code",
2024-12-12 19:02:58 +04:00
"execution_count": 76,
2024-12-12 18:50:47 +04:00
"metadata": {},
"outputs": [
{
"data": {
2024-12-12 19:02:58 +04:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAABLYAAAJJCAYAAAC3cr5jAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3xT1f/H8ddJ2qR7UfaeskUZyhJQAXGCiuBiucGFil83OPm6vurPiQvX1wWK+sWBExcOVESGCiqCiOzVPZLz+yM0NG3TpqVtOt7PxyOQ3HvuPZ/c3CY3n5xhrLUWERERERERERGRWsYR7gBEREREREREREQqQoktERERERERERGplZTYEhERERERERGRWkmJLRERERERERERqZWU2BIRERERERERkVpJiS0REREREREREamVlNgSEREREREREZFaSYktERERERERERGplZTYEhERERERERGRWkmJLRGpUZ555hmMMf5bYUOHDvUvnzRpkn/5n3/+GbDN4sWLqzdoqZFmzZrlPyfatGlTrXVPmjTJX/fQoUOrrJ7NmzczefJkmjdvTkREhL/ON954o8rqlNov2HtpfVHa50xds3jx4oDn+ueff1br9jVRdb0/i4hI9VFiS0Sq1Msvv8zIkSNp3LgxkZGRJCYm0rZtW4YOHcpll13GokWLwh1ijRZq0q6+f1Gtj6y1nHrqqTzzzDNs2rQJj8cT7pCA4l+En3nmmYD1u3btol+/fv71DoeDRx99tMRtjTGceOKJJdazaNGiYmV17tcO9SmxVJOFK2m1fPlyZs+ezahRozjooINITEzE7XbTsmVLTjvtND777LNqiSNc6mKyUEQk3CLCHYCI1F0TJkzg+eefD1i2d+9e9u7dy59//smnn37K+vXrGTlypH993759ufvuu6s7VJFKNX78eLp37w5Ay5Ytq6SODRs28OWXX/ofH3/88QwePBiHw+Gvu6bZtm0bw4cPZ/ny5QA4HA6efPJJJk+eHHSbt99+mz/++IN27doFLH/ggQeqNFapu+rT50z79u0DnmtKSkoYo/H517/+VeKPWhs3bmTevHnMmzePO++8k6uvvjoM0YmISG2kxJaIVIn33nsvIKnVu3dvRo4cSVxcHNu2beOHH37gq6++KrZdt27d6NatW3WGKlLpjjnmGI455pgqrWP9+vUBj++//37at29f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
2024-12-12 18:50:47 +04:00
"text/plain": [
"<Figure size 1500x600 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2024-12-12 19:02:58 +04:00
"image/png": "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PaW+rnxnnHEGK1euZOrUqTzwwAPceuutvPDCC8EuyfkOTt6XRud/2c5/CPwbGDhwIImJiTidTuLj42nXrh3nnHMOzzzzTKnHSkSk2jEiIpXgqquuMoABTGJiolm3bl2Ztps6dWpwu4M/ogYMGBBcPnbs2ODyDRs2hGwzdOjQkOf5f23atDGZmZkh+3z88ceNzWYrsjxgYmNjzZdffhmyTfPmzYPr77rrrpB1d911V3Bd8+bNQ9atWbPGpKSkFFuX2+02b7/9dpH1FPU3YMCAkPqK+9uwYYMxxpjt27ebbt26FVvOZrOZJ554okzvkzHGPPnkkyXWa1mWmTp1arHHp169eqZDhw5FbnvHHXdUaF0F34srrrgiuLxnz54h26SlpZnIyMjg+vz347PPPjN2u73EGFatWhXcz9ixY0Pep3wrVqwI2X9Rf7Nnzy712Jf2nuc7lPO74L+zI4880ni93pBtlixZUmJsX375ZUj5u+66y7Ro0SLkPJ81a1aZth0xYkTw8dNPP22MMWbfvn0mOjo6GF/BfycFPxeMMWbhwoUmMTGxxNe/YMGCkG2q8rweOHBgiXWdc845JR7rgu655x5jWVax+5o5c2awbHGfpQcf//zPjnzFffYd/Lld1F9mZmahz+qi/gru99Zbby2xbP/+/U1aWlpIjAevP/j9LireggoemyOOOCJ4rh18Dnz22Wch23344YfG4XAUKluvXj3Tp0+fIj8PSnLkkUcGt3nggQeCy88///zg8vr16weXL168OKTebdu2lfielvY+5J8XB29f3PfrscceW6bXVZSsrCyzatUqc9ppp4Xsc9myZWXeh87/gLKc/6VdNyQnJ5f5uIuIVBfqiigileKoo44KPt65cydt27alW7du9OzZk+7duzNo0CBat25dKXXPnTuXnj17MnToUL788svgOERr167l/fff59xzzwVgwYIFXHfddcFWFM2aNWPUqFGkpaUxdepUMjIy2LdvH2eeeSbr1q0jPj7+kGPy+XycfvrpwTvA9evXZ/To0SQkJDB37lwWLlxIdnY2Y8aMoXv37rRs2ZLbbruNjRs38uCDDwb3c9lllwW7mzVt2pSmTZsSFRXFlClT+P333wHo0aMH55xzTnCb/DFVLrjgAn755RcAoqOjGT16NE2aNOHbb79lzpw5+P1+Jk6cSI8ePejbt2+pr8ntdnPMMcfQrVs36tWrR1RUFPv27ePzzz9n8eLFGGO4/vrrOeecc4iIiCi0/a5du9izZw9jxoyhUaNGvPjii+zcuRMIjJ90++2343K5KqSugq688kqeeeYZjDEsXryYZcuW0aVLFyAwnlNGRkbwuOUPXP78888HBzNu3749I0eOxOFwsHnzZn755Rd+/vnnUo8XBFrT5e+/SZMmnH/++Xi9Xv7880+WL1/OokWLyrSfRx55hPXr1/Pss88Gl916660h52hFnN9LlizB4XBwwQUX0KZNG3777Tc8Hk+ZYsx37733BmOIiIjg/fffZ8iQIWXa9rzzzuObb75h586dPPXUU0yYMIGpU6cGuytdffXVhVo45EtNTWXEiBHBcyq/xVVERATvvPMOK1asCL7+tWvXEhsbC1Tdeb1q1argZBA2m40xY8bQtm1bdu7cyYYNG8o1u+uMGTO46667gs8jIyM599xzad6
2024-12-12 18:50:47 +04:00
"text/plain": [
"<Figure size 1500x600 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2024-12-12 19:02:58 +04:00
"image/png": "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
2024-12-12 18:50:47 +04:00
"text/plain": [
"<Figure size 1500x600 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2024-12-12 19:02:58 +04:00
"image/png": "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
2024-12-12 18:50:47 +04:00
"text/plain": [
"<Figure size 1500x600 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2024-12-12 19:02:58 +04:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAABLYAAAJJCAYAAAC3cr5jAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3hTZfsH8O85J6Mj3Yu2tHQBpWWUvfcoyBCQqUjZqOAGX3ExVPCV1/VDRRAF3AgKKoIM2XvvjWVDgUJbutvk+f1RGps26YC2adrv57q4SM68c3KanNznee5HEkIIEBERERERERER2RjZ2gEQERERERERERE9CCa2iIiIiIiIiIjIJjGxRURERERERERENomJLSIiIiIiIiIisklMbBERERERERERkU1iYouIiIiIiIiIiGwSE1tERERERERERGSTmNgiIiIiIiIiIiKbxMQWERERERERERHZJCa2iKhCWbRoESRJMv7Lq0OHDsbpI0aMME6/cOGCyTqbNm0q36CpQpo2bZrxnAgKCirXfY8YMcK47w4dOpTZfm7cuIGRI0fC398fKpXKuM8VK1aU2T7J9ln6LK0qCvueqWw2bdpk8lovXLhQrutXROX1+UxEROWHiS0iKlM//fQToqOj4ePjA7VaDRcXFwQHB6NDhw54/vnnsWbNGmuHWKEVN2lX1X+oVkVCCAwYMACLFi3CtWvXoNfrrR0SgII/hBctWmQy/+7du2jWrJlxvizLmDt3rtl1JUlCnz59zO5nzZo1BZbluW8bqlJiqSKrCEmr5cuXo2/fvvDz84NGo4GHhwfq1auHp556CmfOnCn3eMpDRTjuRESVjcraARBR5TV8+HB8++23JtOSkpKQlJSECxcuYPPmzbh48SKio6ON85s2bYrZs2eXd6hEpWrIkCGoW7cuACAgIKBM9nHp0iVs377d+LxXr15o27YtZFk27ruiuXXrFrp27YrDhw8DAGRZxoIFCzBy5EiL6/z555/4559/EBISYjL9k08+KdNYqfKqSt8zoaGhJq/V3d3ditH8KyUlBUOHDsUff/xhMv3OnTu4c+cOjh07hjZt2qBWrVpWipCIiGwJE1tEVCb++usvk6RW48aNER0dDZ1Oh1u3buHAgQPYuXNngfUiIyMRGRlZnqESlbru3buje/fuZbqPixcvmjz/+OOPERoaWqb7zMzM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
2024-12-12 18:50:47 +04:00
"text/plain": [
"<Figure size 1500x600 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2024-12-12 19:02:58 +04:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAABLYAAAJJCAYAAAC3cr5jAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3wT9f8H8NfnLqNpumlLCxQ62Ev23nvLkKVIQcABoqCg4AQHOL4OfqgIDkBcCAgqylCZCgjIHrL3Xt07+fz+SBuaNmnT0jYdr+fjUUjuPnefd67X5PK+zxBSSgkiIiIiIiIiIqISRnF1AERERERERERERPnBxBYREREREREREZVITGwREREREREREVGJxMQWERERERERERGVSExsERERERERERFRicTEFhERERERERERlUhMbBERERERERERUYnExBYREREREREREZVITGwREREREREREVGJxMQWERUrixYtghDC+pNZhw4drMtHjRplXX727FmbbTZt2lS0QVOxNGPGDOs5ERoaWqR1jxo1ylp3hw4dCq2eq1evYvTo0ahYsSI0Go21zlWrVhVanVTyOXovLSty+pwpbTZt2mTzWs+ePVuk2xdHZf38JyIqjZjYIqJC9f3336N79+4oX748tFotvL29ERYWhg4dOuDpp5/GunXrXB1iseZs0o4X6mWPlBIPPPAAFi1ahMuXL8NkMrk6JADZvwgvWrTIZv2dO3fQrFkz63pFUTBv3jy72woh0K9fP7v1rFu3LltZnvslQ1lKLBVnrkpaZf27dfRTmDcFXInnPxFRwdO4OgAiKr1GjhyJJUuW2CyLiYlBTEwMzp49i82bN+PcuXPo3r27dX3Tpk3x7rvvFnWoRAVq2LBhqFu3LgAgJCSkUOo4f/48/v77b+vzPn36oG3btlAUxVp3cXPjxg107doV+/fvBwAoioLPP/8co0ePdrjNr7/+itOnTyM8PNxm+Zw5cwo1Viq9ytLnTEREhM1r9fPzc2E0ecOkDxEROYuJLSIqFGvXrrVJajVu3Bjdu3eHh4cHbty4gT179mD79u3ZtqtTpw7q1KlTlKESFbgePXqgR48ehVrHuXPnbJ5/+OGHiIiIKNQ6U1JSIKWEXq/P87ZXr15F586dceTIEQCAqqr46quv8OCDD+a4ndlsxkcffYT333/fuuz48eNYu3ZtnmOg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
2024-12-12 18:50:47 +04:00
"text/plain": [
"<Figure size 1500x600 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2024-12-12 19:02:58 +04:00
"image/png": "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
2024-12-12 18:50:47 +04:00
"text/plain": [
"<Figure size 1500x600 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2024-12-12 19:02:58 +04:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAABLYAAAJJCAYAAAC3cr5jAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3gUVdsG8HtmtiabXkghpFMSQHqvIh2lN0WKYANRUfEFK6DAq362FxXBgtgREFSU3qQX6b2FGgihpPfd8/0RsmaT3RRIdlPu33WF7M6cmfPs7JCdfeYUSQghQEREREREREREVMnIjg6AiIiIiIiIiIjobjCxRURERERERERElRITW0REREREREREVCkxsUVERERERERERJUSE1tERERERERERFQpMbFFRERERERERESVEhNbRERERERERERUKTGxRURERERERERElRITW0REREREREREVCkxsUVEFco333wDSZLMP/l16tTJvHz06NHm5efPn7fYZtOmTfYNmiqkadOmmc+JkJAQu9Y9evRoc92dOnUqt3quXbuGMWPGIDAwECqVylzn8uXLy61Oqvxs/S2tLor6nKlqNm3aZPFaz58/b9ftK6Lqfv4TEVVFTGwRUbn6+eef0b17d9SoUQNqtRpubm4IDQ1Fp06d8Nxzz2H16tWODrFCK2nSjhfq1Y8QAoMGDcI333yD2NhYGI1GR4cEoPAX4W+++cZi/e3bt9GiRQvzelmWMXfuXKvbSpKEhx56yGo9q1evLlSW537lUJ0SSxWZI5NWqampmD17Npo1awYXFxfodDpERERgwoQJuHTpkt3icASe/0REZU/l6ACIqOoaOXIkvvvuO4tlSUlJSEpKwvnz57F582ZcuHAB3bt3N69v3rw53nvvPXuHSlSmhg0bhvr16wMAgoKCyqWOixcvYtu2bebnffr0Qfv27SHLsrnuiiY+Ph5du3bFwYMHAQCyLOPLL7/EmDFjbG7z559/4ty5cwgLC7NY/vHHH5drrFR1VafPmfDwcIvX6unp6cBocsXGxqJz5844deqUxfKzZ8/is88+ww8//IA///wTbdu2dVCERERU2TCxRUTlYtWqVRZJraZNm6J79+4wGAyIj4/Hvn37sGPHjkLbRUdHIzo62p6hEpW5Hj16oEePHuVax4ULFyyef/TRRwgPDy/XOrOysiCEgFar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
2024-12-12 18:50:47 +04:00
"text/plain": [
"<Figure size 1500x600 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2024-12-12 19:02:58 +04:00
"image/png": "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
2024-12-12 18:50:47 +04:00
"text/plain": [
"<Figure size 1500x600 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2024-12-12 19:02:58 +04:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAABLYAAAJJCAYAAAC3cr5jAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3gU1frA8e/MbM2mNwi9d5CO9CYgghQRBQtNbGABFa8dbPADvZZr4VoRbJeioGJBUEQRRJAiRao06R3Sk93z+2OTJZvspkCSTXk/z5OH3Zkzc96dHXZn3zlFU0ophBBCCCGEEEIIIYQoZfRAByCEEEIIIYQQQgghxKWQxJYQQgghhBBCCCGEKJUksSWEEEIIIYQQQgghSiVJbAkhhBBCCCGEEEKIUkkSW0IIIYQQQgghhBCiVJLElhBCCCGEEEIIIYQolSSxJYQQQgghhBBCCCFKJUlsCSGEEEIIIYQQQohSSRJbQgghhBBCCCGEEKJUksSWEKLYffDBB2ia5vnLqlu3bp7lo0aN8izft2+f1zY//fRT8QYtSqQpU6Z4zokaNWoUa92jRo3y1N2tW7ciq+fo0aOMHj2aypUrYzKZPHUuWrSoyOoUpZ+/z9LyIrfvmbLmp59+8nqt+/btK9bty5Ksx+GDDz4IdDhCCCHySRJbQojL9r///Y8+ffpQoUIFzGYzYWFh1KxZk27dunH//fezZMmSQIdYouU3aVfef6iWR0oprr/+ej744AMOHz6M0+kMdEhAzh/C2X8AnjlzhrZt23rW67rOzJkzfW6raRoDBgzwWc+SJUtylJVzv3QoT4mlkixQSau0tDRefvllbr75ZurXr4+u6/m6EfDXX3/xxBNPcPXVVxMdHV3uEk3FdcNECCHKGlOgAxBClG4jRozgww8/9Fp2/vx5zp8/z759+1ixYgX79++nT58+nvVt2rThhRdeKO5QhShUw4YNo0mTJgBUrVq1SOo4cOAAv/76q+d5//796dy5M7que+ouaU6cOEGvXr3YtGkTALqu8+677zJ69Gi/23z99df8/fff1KpVy2v5q6++WqSxirKrPH3P1K5d2+u1RkZGBjAat4SEBB544IECb7dkyRKef/75IohICCFEWSaJLSHEJfvuu++8klqtWrWiT58+BAcHc+LECdavX8/q1atzbNe4cWMaN25cnKEKUeiuvvpqrr766iKtY//+/V7PX3nlFWrXrl2kdaampqKUwmq1Fnjbo0eP0rNnT7Zt2waAYRjMmTOHm266KdftXC4Xr7/+Oi+99JJn2c6dO/nuu+8KHIMo386fP09oaGi5+p6pWrUqDz30UKDDyMFsNtO4cWNat27NDz/8wN69e/O1XUREBC1btqR27dq8/fbbRRylgIv/b4QQorSSrohCiEv2/fffex7XqVOHNWvW8Pzzz/Poo4/y0ksv8dNPP3HixAkmTZrktV1hdVFZuHAh7du3JygoiIiICIYOHcrBgwd9lv3jjz8YMWIENWvWxGazERwcTJMmTXjwwQf5559/cpSvUaOGJ74pU6Z4rctrXKfz588zbdo02rVrR1hYGBaLhWrVqjFq1Ci2bt2ao56aNWt6LevevbtXV4TM+lasWOEpM3v2bL/dS1JSUnj99dfp0qULkZGRWCwW4uLiGDp0qM9EY242btzIuHHjaNeuHZUrV8Zut2Oz2ahevTo33ngjK1euzLFN9uNz7tw5Jk2aRPXq1bFYLNSqVYupU6eilLrsunw5f/48ISEhnhh8/TAaOnSoZ33fvn09y3/55RcGDx5M5cqVsVgsBAcHU6NGDfr27cuUKVM4d+6cp2xuXUY2b97MLbfcQo0aNbBardjtdqpVq0aPHj149NFHOXToUJ6vQ9M0unbt6rWsTp06Pv/fFPT8zt6tdcuWLQwaNIioqCisVit//fVXnvFl988//9C1a1dPUstsNjN37tw8k1q67r4Uef/990lISPAsf+211zzniGEYue7j2LFjPPbYYzRv3pyQkBBsNht16tRh/PjxHDhwIEf54jyvExISeOaZZ2jZsiUhISGYzWZiY2Np3rw5t99+e4GTd2vXrmX06NHUqVOHoKAggoODqVevHqNHj2bPnj15bp9X17TcPvu+/PJLrr76ak+389DQUGrXrs2gQYOYNm0aLpfL07U6ewu9rHVm3+8vv/zCsGHDqFatGlarldDQUNq3b88bb7xBWlpajteQvXvaF198QYcOHQgODqZatWpAwcZy3LVrF8OHDyc6OhqbzUbLli354osvfB6/X375hW7duuFwOIiMjOSGG25g7969Be5CdubMGQzD8Gzz888/e9a9/fbbnuXXXXedZ7nT6fT6bJs7dy7g/z3VNI3u3bt71VuzZs08u/UqpXj33Xdp3rw5NpuN2NhYxo4dy5kzZ/J8XZnCwsK4cOECGzZs4J133vG8L3m58847OX36NMuWLePRRx/Nd325UUqxYMECBgwYQOXKlbFarURGRtKiRQseeOABUlNT89xHbt/7uQ0nkJ6eziuvvEL79u0JDw/HZDIRFRVF48aNGTFiBP/73/+Ai+fr7NmzPduuWLHC735dLhcffvghvXv3JjY2FovFQkxMDP369eObb77JEX/2c2T37t28+OKLNGzYEKvVyogRI4DC/7wSQohio4QQ4hLde++9ClCAio6OVrt3787XdrNmzfJsl/1jqGvXrp7lI0eO9Czfu3ev1zZ9+vTxep75V7duXZWUlOS1z5dfflnpuu6zPKDCwsLU8uXLvbapXr26Z/3kyZO91k2ePNmzrnr16l7rdu7cqWrUqOG3LqvVqubNm+ezHl9/Xbt29arP39/evXuVUkodP35cNW/e3G85XdfVK6+8kq/3SSmlXnvttVzr1TRNzZo1y+/xiYqKUg0bNvS57ZNPPlmodWV9L8aPH+9Z3qZNG69t4uPjVVBQkGd95vuxbNkyZRhGrjH89ddfnv2MHDnS633KtHXrVq/9+/r79ttv8zz2eb3nmS7l/M76/6xFixbK4XB4bbNhw4ZcY1u+fLlX+cmTJ6uaNWt6nedffvllvrYdNGiQ5/Ebb7yhlFLq3LlzKiQkxBNf1v8nWT8XlFJq1apVKjo6OtfX//PPP3ttU5zndbdu3XKt68Ybb8z1WGf19NNPK03T/O5r4cKFnrL+PkuzH//Mz45M/j77sn9u+/pLSkrK8Vnt6y/rfh977LFcy3bu3FnFx8d7xZh9ffb321e8WWU9Ns2aNfOca9nPgWXLlnlt99VXXymTyZSjbFRUlOrQoYPPz4PctGjRwrPN888/71l+yy23eJbHxMR4lq9du9ar3mPHjuX6nub1PmSeF9m39/f92qVLl3y9Ll+yHvP8Hp/s51L2/5P5kZSUpPr165frcThz5oynvL/6cvvezx5n1s/brN8Tvv7atWunlMrf/6/M/SYmJqqrrroq17IPPPCAV4zZ3+Ps/28GDhyolCrczyshhChO0hVRCHHJWrZs6Xl88uRJ6tWrR/PmzWnTpg2tWrWie/fu1KlTp0jqXrJkCW3atKFPnz4sX77cMw7Rrl27WLRoEcOGDQPg559/5oEHHvC0oqhWrRrDhw8nPj6eWbNmkZiYyLlz5xgyZAi7d+8mIiLikmNyOp0MHjzYc7c8JiaGm266icjISJYsWcKqVatISUlhxIgRtGrVilq1avH444+zb98+pk6d6tnPXXfd5eluVrVqVapWrUpwcDAzZ87k77//BqB169bceOONnm0yx1S59dZb2bhxIwAhISHcdNNNVKlShV9//ZXvvvsOl8vFxIkTad26NR07dszzNVmtVq688kqaN29OVFQUwcHBnDt3jh9++IG1a9eilOLBBx/kxhtvxG6359j+1KlTnDlzhhEjRlCpUiXeffddTp48CbjHT3riiSewWCyFUldW99xzD2+++SZKKdauXcvmzZtp2rQp4B7PKTEx0XPcMgcuf/vttz2Dszdo0IChQ4diMpk4cOAAGzduZP369XkeL3C3psvcf5UqVbjllltwOBz8888/bNmyhd9++y1f+3nhhRfYs2cP//3vfz3LHnvsMa9ztDD
2024-12-12 18:50:47 +04:00
"text/plain": [
"<Figure size 1500x600 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2024-12-12 19:02:58 +04:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAABLYAAAJJCAYAAAC3cr5jAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3wTdR8H8M9ddtO9W+guo8yy916yQWSpTHExZIlbAQc8gI+4cQPioyIoqChL9h6yy4ayoUAL3TP5PX+EhqZNOqBtOj7v1yuQ3P3uft9crsnlm9+QhBACRERERERERERE5Yxs7wCIiIiIiIiIiIgeBBNbRERERERERERULjGxRURERERERERE5RITW0REREREREREVC4xsUVEREREREREROUSE1tERERERERERFQuMbFFRERERERERETlEhNbRERERERERERULjGxRURERERERERE5RITW0RU6hYtWgRJksy3nNq3b29ePnLkSPPyCxcuWGyzefPm0g2ayqQZM2aYz4ng4OBSrXvkyJHmutu3b19i9dy4cQOjRo1ClSpVoFQqzXWuXLmyxOqk8s/We2llkd/nTEWzefNmi+d64cKFUt2+Isl5HBYtWmTvcIiIqJCY2CKih/bzzz+jW7du8PHxgUqlgouLC0JCQtC+fXtMnDgRa9eutXeIZVphk3aV/YtqZSSEwGOPPYZFixbh2rVrMBgM9g4JQN4vwrm/AN65cwdNmzY1r5dlGQsWLLC6rSRJ6NOnj9V61q5dm6csz/3yoTIllsoyeyWtMjMzMX/+fDzxxBOoUaMGZFku8IeArKwsrFixAhMnTkTz5s0RGBgIrVYLR0dH1KtXDy+//DJu3rxZKvHbS2n9YEJEVNEo7R0AEZVvw4cPx5IlSyyWJSQkICEhARcuXMCWLVtw8eJFdOvWzby+SZMmmDdvXmmHSlSshgwZgjp16gAAAgICSqSOS5cuYceOHebHvXr1Qps2bSDLsrnusubWrVvo0qULDh8+DACQZRnffPMNRo0aZXObv/76C+fPn0doaKjF8o8++qhEY6WKqzJ9zoSFhVk8V3d3dztGY5KcnIwpU6YUaZvbt2/j0UcfzbM8PT0dR48exdGjR7Fw4UJs2rQJtWvXLq5QiYioAmBii4ge2Jo1ayySWo0aNUK3bt3g6OiIW7du4cCBA9i1a1ee7WrXrs2LUir3HnnkETzyyCMlWsfFixctHn/44YcICwsr0TozMjIghIBGoynytjdu3ECnTp1w/PhxAIBCocD333+Pxx9/PN/tjEYjPv30U3zwwQfmZadPn8aaNWuKHANVbgkJCXB2dq5UnzMBAQF48cUX7R1GHiqVCrVr10bjxo2xYcMGREdHF3q7zp07o0mTJsjMzMSyZctw9uxZAKbE+bPPPovt27eXZOiVTvbfDRFRecWuiET0wNatW2e+Hx4ejj179uC9997Dq6++ig8++ACbN2/GrVu3MG3aNIvtiquLyooVK9CiRQs4ODjAzc0NAwcOxOXLl62W/ffffzF8+HCEhISYuzbUqVMHU6dOxZUrV/KUDw4ONsc3Y8YMi3UFjeuUkJCA2bNno1mzZnBxcYFarUZgYCBGjhyJqKioPPWEhIRYLOvQoYNFV4Ts+rZs2WIus3jxYpvdS9LT0/Hpp5+ibdu2cHd3h1qthp+fHwYOHGg10ZifQ4cOYezYsWjWrBmqVKkCnU4HrVaLoKAgDB482OqXi9zHJz4+HtOmTUNQUBDUajVCQ0Mxa9YsCCEeui5rEhIS4OTkZI7hq6++ylNm4MCB5vXdu3c3L9+2bRv69++PKlWqQK1Ww9HREcHBwejevTtmzJiB+Ph4c9n8uowcPXoUTz75JIKDg6HRaKDT6RAYGIiOHTvi1VdfxdWrVwt8HpIkoV27dhbLwsPDrf7dFPX8zt2t9dixY+jXrx88PDyg0Whw4sSJAuPL7cqVK2jXrp05qaVSqbB06dICk1qybLoU+e6775CcnGxe/sknn5jPEYVCke8+YmJi8NprryEyMhJOTk7QarUIDw/HuHHjcOnSpTzlS/O8Tk5Oxttvv42GDRvCyckJKpUK3t7eiIyMxNNPP13k5N2+ffswatQohIeHw8HBAY6OjqhevTpGjRqFc+fOFbh9QV3T8nvv++OPP/DII4+Yu507OzsjLCwM/fr1w+zZs2E0Gs1dq3O30MtZZ+79btu2DUOGDEFgYCA0Gg2cnZ3RokULfPbZZ8jMzMzzHHJ3g/3999/RsmVLODo6IjAwEEDRxnI8c+YMhg4dCk9PT2i1WjRs2BC///671eO3bds2tG/fHnq9Hu7u7hg0aBCio6OL3IXszp07UCgU5m22bt1qXvfVV1+Zl+dswWQwGCze25YuXQrA9msqSRI6dOhgUW9ISEiB3XqFEPjmm28QGRkJrVYLb29vjBkzBnfu3CnweWVzcXFBYmIiDh48iK+//tr8uuRHqVRi0qRJuHTpEv7++2/MnDkTs2bNwpEjR1CzZk1zuR07diAhIaHQsQghsHz5cvTp0wdVqlSBRqOBu7s7GjRogClTpiAjI6PAfeT3uZ/fcAJZWVn48MMP0aJFC7i6ukKpVMLDwwO1a9fG8OHD8fPPPwO4f74uXrzYvO2WLVts7tdoNGLJkiXo2rUrvL29oVar4eXlhZ49e+Lvv//OE3/uc+Ts2bN4//33ERERAY1Gg+HDhwMo/vcrIqJSI4iIHtCECRMEAAFAeHp6irNnzxZqu4ULF5q3y/021K5dO/PyESNGmJdHR0dbbNOtWzeLx9m3atWqidTUVIt9zp8/X8iybLU8AOHi4iI2bdpksU1QUJB5/fTp0y3WTZ8+3bwuKCjIYt3p06dFcHCwzbo0Go345ZdfrNZj7dauXTuL+mzdoqOjhRBC3Lx5U0RGRtosJ8uy+PDDDwv1OgkhxCeffJJvvZIkiYULF9o8Ph4eHiIiIsLqtm+++Wax1pXztRg3bpx5eZMmTSy2SUpKEg4ODub12a/HP//8IxQKRb4xnDhxwryfESNGWLxO2aKioiz2b+22evXqAo99Qa95tgc5v3P+nTVo0EDo9XqLbQ4ePJhvbJs2bbIoP336dBESEmJxnv/xxx+F2rZfv37m+5999pkQQoj4+Hjh5ORkji/n30nO9wUhhNi5c6fw9PTM9/lv3brVYpvSPK/bt2+fb12DBw/O91jnNHPmTCFJks19rVixwlzW1ntp7uOf/d6RzdZ7X+73bWu31NTUPO/V1m459/vaa6/lW7ZNmzYiKSnJIsbc63O/3tbizSnnsalXr575XMt9Dvzzzz8W2/35559CqVTmKevh4SFatmxp9f0gPw0aNDBv895775mXP/nkk+blXl5e5uX79u2zqDcmJibf17Sg1yH7vMi9va3P17Zt2xbqeVmT85gX9vjkNHXqVItYbt++XajtUlNTRc+ePfM9Dnfu3DGXz7k853tAfp/7uc/5nO+3OT8nrN2aNWsmhCjc31f2flNSUkTnzp3zLTtlyhSLGHO/xrn/bvr27SuEKN73KyKi0sSuiET0wBo2bGi+f/v2bVSvXh2RkZFo0qQJGjVqhA4dOiA8PLxE6l67di2aNGmCbt26YdOmTeZxiM6cOYOVK1diyJAhAICtW7diypQp5lYUgYGBGDp0KJKSkrBw4UKkpKQgPj4eAwYMwNmzZ+Hm5vbAMRkMBvTv39/8a7mXlxcef/xxuLu7Y+3atdi5cyfS09MxfPhwNGrUCKGhoXj99ddx4cIFzJo1y7yf5557ztzdLCAgAAEBAXB0dMSCBQtw/vx5AEDjxo0xePBg8zbZY6oMGzYMhw4dAgA4OTnh8ccfR9WqVbFjxw6sWbMGRqMRkydPRuPGjdGqVasCn5NGo0Hz5s0RGRkJDw8PODo6Ij4+Hhs2bMC+ffsghMDUqVMxePBg6HS6PNvHxsbizp07GD58OPz9/fHNN9/g9u3bAEzjJ73xxhtQq9XFUldO48ePx+effw4hBPbt24ejR4+ibt26AEzjOaWkpJiPW/bA5V999ZV5cPaaNWti4MCBUCqVuHTpEg4dOoQDBw4UeLwAU2u67P1
2024-12-12 18:50:47 +04:00
"text/plain": [
"<Figure size 1500x600 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import math\n",
"import matplotlib.pyplot as plt\n",
"from sklearn.metrics import silhouette_samples, silhouette_score\n",
"from sklearn.cluster import KMeans\n",
"import numpy as np\n",
"\n",
"def get_clusters_silhouettes(data, random_state):\n",
" max_clusters = min(12, int(math.sqrt(len(data))))\n",
" silhouettes = []\n",
" \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",
" silhouettes.append((n_clusters, silhouette_avg, cluster_labels, kmeans.cluster_centers_))\n",
" \n",
" return silhouettes\n",
"\n",
"def draw_silhouettes(data, silhouettes):\n",
" for n_clusters, silhouette_avg, cluster_labels, centers in silhouettes:\n",
" fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))\n",
" \n",
" ax1.set_xlim([-0.1, 1])\n",
" ax1.set_ylim([0, len(data) + (n_clusters + 1) * 10])\n",
" silhouette_values = silhouette_samples(data, cluster_labels)\n",
" y_lower = 10\n",
" \n",
" for i in range(n_clusters):\n",
" cluster_silhouette_values = silhouette_values[cluster_labels == i]\n",
" cluster_silhouette_values.sort()\n",
" cluster_size = cluster_silhouette_values.shape[0]\n",
" y_upper = y_lower + cluster_size\n",
" ax1.fill_betweenx(np.arange(y_lower, y_upper), 0, cluster_silhouette_values, alpha=0.7)\n",
" ax1.text(-0.05, y_lower + 0.5 * cluster_size, str(i))\n",
" y_lower = y_upper + 10\n",
" \n",
" ax1.set_title(\"Silhouette plot for {} clusters\".format(n_clusters))\n",
" ax1.set_xlabel(\"Silhouette coefficient values\")\n",
" ax1.set_ylabel(\"Cluster label\")\n",
" ax1.axvline(x=silhouette_avg, color=\"red\", linestyle=\"--\")\n",
" ax1.set_yticks([])\n",
" \n",
" ax2.scatter(data[:, 0], data[:, 1], c=cluster_labels, cmap='viridis', s=30)\n",
" ax2.scatter(centers[:, 0], centers[:, 1], marker='x', c='red', s=200, alpha=1)\n",
" ax2.set_title(\"Clustered data for {} clusters\".format(n_clusters))\n",
" ax2.set_xlabel(\"Feature space for the 1st feature\")\n",
" ax2.set_ylabel(\"Feature space for the 2nd feature\")\n",
" \n",
" plt.suptitle((\"Silhouette analysis for KMeans clustering with {} clusters\".format(n_clusters)),\n",
" fontsize=14, fontweight='bold')\n",
" plt.show()\n",
"\n",
"random_state = 42\n",
"\n",
"silhouettes = get_clusters_silhouettes(reduced_data, random_state)\n",
"\n",
"draw_silhouettes(reduced_data, silhouettes)"
]
2024-11-23 11:55:22 +04:00
}
],
"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.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}