AIM-PIbd-32-Chubykina-P-P/lab_2/lab2.ipynb

1316 lines
539 KiB
Plaintext
Raw Normal View History

2024-10-11 19:51:41 +04:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Объекты вокруг земли\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Проблемная область: космические объекты и их угроза для Земли\n",
"\n",
"Объект наблюдения: астероиды и другие малые тела Солнечной системы\n",
"\n",
"Атрибуты: имя объекта, минимальный и максимальный оценочные диаметры, относительная скорость, расстояние промаха, орбитальное тело, объекты программы \"Сентри\", абсолютная звездная величина, опасность\n",
"\n",
"Пример бизнес-цели: \n",
"\n",
" 1. Разработка и продажа страховых продуктов для космических рисков. Цель технического проекта: разработка системы оценки рисков и ценообразования для страховых продуктов, защищающих от космических угроз.\n",
"\n",
" 2. Разработка и продажа технологий для мониторинга и предотвращения космических угроз. Цель технического проекта: создание системы мониторинга и прогнозирования траекторий небесных тел для предотвращения космических угроз.\n",
"\n",
" 3. Образовательные программы и сервисы. Цель технического проекта: разработка интерактивных образовательных материалов и сервисов, основанных на данных о небесных телах.\n",
"\n",
"Актуальность: Исследования астероидов и разработка технологий для их отклонения не только помогают защитить Землю от потенциальных угроз, но и стимулируют научные открытия в различных областях, включая астрономию, физику, инженерию и образование. Эта тема имеет важное значение для будущего нашей планеты и человечества в целом."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Index(['id', 'name', 'est_diameter_min', 'est_diameter_max',\n",
" 'relative_velocity', 'miss_distance', 'orbiting_body', 'sentry_object',\n",
" 'absolute_magnitude', 'hazardous'],\n",
" dtype='object')\n"
]
}
],
"source": [
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"\n",
"# вывод всех столбцов\n",
"df = pd.read_csv(\"..//static//csv//neo.csv\")\n",
"print(df.columns)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Проверяем на выбросы"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Количество выбросов в столбце 'relative_velocity': 1574\n",
"Количество выбросов в столбце 'miss_distance': 0\n",
"Количество выбросов в столбце 'absolute_magnitude': 101\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABdEAAAISCAYAAAAjjoaeAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdeXhU5fn/8ffMJDPZ92UIBAiLLAKiVAUXQEBQ0bqgdQfcsdAWteoXa1WgldaW0v7qvlSogooLWnEBlE1lUZFNkD0hJCH7vmdmzu+PISNDEgiQZLJ8Xtc1l+TMM+fcZzLmmbnnPvdjMgzDQERERERERERERERE6jD7OgARERERERERERERkdZKSXQRERERERERERERkQYoiS4iIiIiIiIiIiIi0gAl0UVEREREREREREREGqAkuoiIiIiIiIiIiIhIA5REFxERERERERERERFpgJLoIiIiIiIiIiIiIiINUBJdRERERERERERERKQBSqKLiIiIiIiIiIiIiDRASXRpU7p3787kyZN9HUa797e//Y0ePXpgsVgYPHhwsx6rOX6nkydPpnv37k26T1+bP38+JpOJlJSUZtn/U089hclkapZ9i4iciOb3ltFS83tzz1mnwmQy8dRTT3l+bo0xiog0Bc2pLaOp59TJkycTEhJy+oGdhJSUFEwmE/Pnz2/R43YULf0Z+9j3OtL0lEQXn6n98PL999/Xe//IkSMZMGDAaR/n008/1R+Sk7B8+XIeeeQRLrzwQl5//XWefvppX4dUr4yMDJ566im2bNni61DaraeffpoPP/zQ12GISBuj+b11aivze2tWXl7OU089xerVq30dioh0EJpTWyfNqZoTT5U+Y7dtSqJLm7J7925eeeWVk3rMp59+ysyZM5spovZn5cqVmM1mXnvtNSZOnMgVV1zh65DqlZGRwcyZM+tNor/yyivs3r275YNqwx5//HEqKiq8tmmCF5GWovm9+bXk/H777bdTUVFBt27dmu0Yp+tUYiwvL2fmzJlKGIhIq6Y5tfm1lc/MzUlz4onpM3b7oyS6tCk2mw1/f39fh3FSysrKfB3CScnOziYwMBCr1XpKjy8vL2/iiE6ev78/NpvN12G0KX5+fgQEBPg6DBHpoDS/N7/Tnd9PhsViISAgoFW3CWsLMYqInArNqc2vJedUabv0Gbv9URJd2pRj+7vV1NQwc+ZMevfuTUBAANHR0Vx00UWsWLECcPcVe+655wB3f6jaW62ysjIeeughEhMTsdls9OnTh7///e8YhuF13IqKCn77298SExNDaGgov/zlL0lPT6/Tc6q259XOnTu55ZZbiIyM5KKLLgJg27ZtTJ48mR49ehAQEIDdbufOO+8kLy/P61i1+9izZw+33XYb4eHhxMbG8sc//hHDMDh06BBXX301YWFh2O125s6d26jnzuFwMHv2bHr27InNZqN79+489thjVFVVecaYTCZef/11ysrKPM/V8fqj1V4+uGnTJoYPH05QUBCPPfYYAFVVVTz55JP06tULm81GYmIijzzyiNfx6pOfn8/vf/97Bg4cSEhICGFhYVx++eVs3brVM2b16tWce+65ANxxxx11Yj26J3pNTQ1RUVHccccddY5VXFxMQEAAv//97z3bTjXuo/3973/HZDJx8ODBOvfNmDEDq9VKQUGBZ9vGjRu57LLLCA8PJygoiBEjRvDNN9806ljPP/88Z555JjabjYSEBKZOnUphYWGdcRs3buSKK64gMjKS4OBgBg0axL/+9S/P/cf2azOZTJSVlbFgwQLP8zt58mRWrVqFyWRiyZIldY6xaNEiTCYT69evb1TsIiK1NL+3zvl927ZtjBgxgqCgIHr16sV7770HwJo1azj//PMJDAykT58+fPHFF16Pr6/f+Pfff8+4ceOIiYkhMDCQpKQk7rzzTq/Hvf322wwZMoTQ0FDCwsIYOHCg11zVGFVVVTzwwAPExsZ6fqdpaWl1xp1sjCkpKcTGxgIwc+ZMz/NY+zo52dfBvn37mDx5MhEREYSHh3PHHXfUW4jw5ptvct555xEUFERkZCTDhw9n+fLlXmM+++wzLr74YoKDgwkNDWX8+PHs2LHjpJ43EWk/NKe2rjn1q6++4oYbbqBr166ez5cPPPBAnQrlWgcOHGDcuHEEBweTkJDArFmz6jzXjZkvDxw4wA033EBUVBRBQUEMHTqUTz755ITPwciRIxk5cmSd7Ud/xj7RnAiwa9curr/+eqKioggICOAXv/gF//vf/054/GOZTCamTZvGu+++S//+/QkMDGTYsGFs374dgJdeeolevXoREBDAyJEj66x1cjLPf+0xAgICGDBgAEuWLKmz3lptH/m///3vvPzyy57Xyrnnnst3333ntb/GfsY+9vk93j6g8e91ANLT07nzzjuJj4/HZrNx5pln8p///Kehp1tOwM/XAYgUFRWRm5tbZ3tNTc0JH/vUU08xZ84c7r77bs477zyKi4v5/vvv+eGHH7j00ku57777yMjIYMWKFbzxxhtejzUMg1/+8pesWrWKu+66i8GDB7Ns2TIefvhh0tPTmTdvnmfs5MmTWbx4MbfffjtDhw5lzZo1jB8/vsG4brjhBnr37s3TTz/tmfBWrFjBgQMHuOOOO7Db7ezYsYOXX36ZHTt2sGHDhjp/GG+88Ub69evHX/7yFz755BP+9Kc/ERUVxUsvvcSoUaP461//ysKFC/n973/Pueeey/Dhw4/7XN19990sWLCA66+/noceeoiNGzcyZ84cfvrpJ09C9I033uDll1/m22+/5dVXXwXgggsuOO5+8/LyuPzyy7npppu47bbbiI+Px+Vy8ctf/pKvv/6ae++9l379+rF9+3bmzZvHnj17jnv50oEDB/jwww+54YYbSEpKIisri5deeokRI0awc+dOEhIS6NevH7NmzeKJJ57g3nvv5eKLL24wVn9/f6699lo++OADXnrpJa9qgQ8//JCqqipuuukmgNOK+2i/+tWveOSRR1i8eDEPP/yw132LFy9m7NixREZGAu5LAS+//HKGDBnCk08+idls5vXXX2fUqFF89dVXnHfeeQ0e56mnnmLmzJmMGTOG+++/n927d/PCCy/w3Xff8c0333gqUFasWMGVV15Jp06d+N3vfofdbuenn35i6dKl/O53v6t332+88Ybn/6t7770XgJ49ezJ06FASExNZuHAh1157rddjFi5cSM+ePRk2bFijnicRad80v7ft+b2goIArr7ySm266iRtuuIEXXniBm266iYULFzJ9+nSmTJnCLbfcwt/+9jeuv/56Dh06RGhoaL37ys7OZuzYscTGxvJ///d/REREkJKSwgcffOAZs2LFCm6++WZGjx7NX//6VwB++uknvvnmmwbnqoaejzfffJNbbrmFCy64gJUrVx73d9rYGGNjY3nhhRe4//77ufbaa7nuuusAGDRokCf+k3kd/OpXvyIpKYk5c+bwww8/8OqrrxIXF+c5d3AnJp566ikuuOACZs2ahdVqZePGjaxcuZKxY8cC7t/tpEmTGDduHH/9618pLy/nhRde4KKLLmLz5s3tbqF1kY5Kc2rbnVPfffddysvLuf/++4mOjubbb7/l3//+N2lpabz77rteY51OJ5dddhlDhw7lmWee4fPPP+fJJ5/E4XAwa9Ysz3N0ovkyKyuLCy64gPLycn77298SHR3NggUL+OUvf8l7771X53PcyTrRnLhjxw4uvPBCOnfuzP/93/8RHBzM4sWLueaaa3j//fdP+vhfffUV//vf/5g6dSoAc+bM4corr+SRRx7h+eef59e//jUFBQU888wz3HnnnaxcudLz2MY+/5988gk33ngjAwcOZM6cORQUFHDXXXfRuXPnemNatGgRJSUl3HfffZhMJp555hmuu+46Dhw40OCVIA19xj5ZjX2vk5WVxdChQz1fRMTGxvLZZ59x1113UVxczPTp00/62B2eIeIjr7/+ugEc93bmmWd6PaZbt27GpEmTPD+fddZZxvjx4497nKlTpxr1vdQ//PBDAzD+9Kc/eW2//vrrDZPJZOzbt88wDMP
"text/plain": [
"<Figure size 1500x1000 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"\n",
"# Выбираем числовые столбцы\n",
"numeric_columns = ['relative_velocity', 'miss_distance', 'absolute_magnitude']\n",
"\n",
"# Выбираем столбцы для анализа\n",
"columns_to_check = ['relative_velocity', 'miss_distance', 'absolute_magnitude']\n",
"\n",
"# Функция для подсчета выбросов\n",
"def count_outliers(df, columns):\n",
" outliers_count = {}\n",
" for col in columns:\n",
" Q1 = df[col].quantile(0.25)\n",
" Q3 = df[col].quantile(0.75)\n",
" IQR = Q3 - Q1\n",
" lower_bound = Q1 - 1.5 * IQR\n",
" upper_bound = Q3 + 1.5 * IQR\n",
" \n",
" # Считаем количество выбросов\n",
" outliers = df[(df[col] < lower_bound) | (df[col] > upper_bound)]\n",
" outliers_count[col] = len(outliers)\n",
" \n",
" return outliers_count\n",
"\n",
"# Подсчитываем выбросы\n",
"outliers_count = count_outliers(df, columns_to_check)\n",
"\n",
"# Выводим количество выбросов для каждого столбца\n",
"for col, count in outliers_count.items():\n",
" print(f\"Количество выбросов в столбце '{col}': {count}\")\n",
" \n",
"# Создаем гистограммы\n",
"plt.figure(figsize=(15, 10))\n",
"for i, col in enumerate(numeric_columns, 1):\n",
" plt.subplot(2, 3, i)\n",
" sns.histplot(df[col], kde=True)\n",
" plt.title(f'Histogram of {col}')\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"В столбцах 'relative_velocity'и 'absolute_magnitude' присутствуют выбросы. Теперь можно очистить их от выбросов"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Количество выбросов в столбце 'relative_velocity': 248\n",
"Количество выбросов в столбце 'absolute_magnitude': 0\n",
"Количество удаленных строк: 265\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABc8AAAJOCAYAAABhpf9JAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3RU5fr28e9kkkx6r0AIgdCRFhFQKYoSFAUVUURRLGABPNiPel6Vo1g41p/12EAR7B0QBQUEBOkdqQktJCG919nvHzFzCEkgQJKdcn3WytLs/cyea89MwjN3nrm3xTAMAxERERERERERERERcXAyO4CIiIiIiIiIiIiISEOj4rmIiIiIiIiIiIiIyAlUPBcREREREREREREROYGK5yIiIiIiIiIiIiIiJ1DxXERERERERERERETkBCqei4iIiIiIiIiIiIicQMVzEREREREREREREZETqHguIiIiIiIiIiIiInICFc9FRERERERERERERE6g4rlIM9CmTRvGjx9vdowm7z//+Q9t27bFarXSs2fPer3vp556CovFUqvHXLp0KRaLhaVLl9bqcc1Q1z8DFouFp556qs6Ofzy73U63bt2YPn36GR+jKf1OqOp1OmbMGK677jrzQomISJPVlP4NbcjqYl49a9YsLBYL69atq5Xj1ZReM7Wjvt+bDB48mMGDB9f6cS+//HImTJhwxrevq1xmiI+Px2KxMGvWLMe2f/7zn/Tt29e8UCJVUPFcpJE51aRv8ODBdOvW7azvZ8GCBfVWDGwKfvnlFx5++GEuuOACZs6cybPPPlvt2PHjx2OxWBxfNpuNDh068MQTT1BQUFCPqcu89dZbFSYsZrr33nuxWCzs3bu32jGPP/44FouFLVu21GOy0/PHH3/w1FNPkZGRUevH/vTTTzl06BCTJ0+utG/fvn3ceeedtG3bFjc3N3x8fLjgggt47bXXyM/Pr/UsDdUjjzzC119/zebNm82OIiIiDZjm1Q3T6cyrj3fddddhsVh45JFH6jhh/amrefrgwYOxWCy0b9++yv2LFi1yvFf56quvav3+a8vcuXN59dVXzY5RYytXruSXX36p8jWalJTEgw8+SKdOnfDw8MDT05OYmBieeeaZOnlP0VBNnTqVzZs388MPP5gdRcTB2ewAIlL3du3ahZPT6f2tbMGCBbz55pua6NfQb7/9hpOTEx988AGurq6nHG+z2Xj//fcByMzM5Pvvv+fpp59m3759zJkzp67jVvDWW28RFBRUaUXMwIEDyc/Pr9H51JYbb7yR119/nblz5/LEE09UOebTTz/lnHPOoXv37vWW61Ty8/Nxdv7fP6l//PEH06ZNY/z48fj5+dXqff3nP/9hzJgx+Pr6Vtg+f/58Ro8ejc1m4+abb6Zbt24UFRWxYsUKHnroIbZv3867775bq1kaql69enHuuefy0ksv8fHHH5sdR0REmhDNq+ve6c6rAbKysvjxxx9p06YNn376Kc8//3ytfyrTDNXN02uDm5sbe/fuZc2aNZx33nkV9s2ZMwc3NzdTFvZUp6r3JnPnzmXbtm1MnTrVvGCn4T//+Q9DhgwhOjq6wva1a9dy+eWXk5OTw0033URMTAwA69at4/nnn+f333/nl19+MSNyvQsLC2PkyJG8+OKLjBgxwuw4IoBWnos0CzabDRcXF7NjnJbc3FyzI5yW5ORk3N3dazzBd3Z25qabbuKmm25i0qRJ/Pzzz/Tr149PP/2UpKSkOk5bM05OTri5uZ32G8Sz0bdvX6Kjo/n000+r3L9q1Sri4uK48cYb6y1TTbi5uVUonteVjRs3snnz5kotSeLi4hgzZgyRkZHs2LGD1157jQkTJjBp0iQ+/fRTduzYQdeuXes8X0Ny3XXX8c0335CTk2N2FBERaUI0r657pzuvBvj6668pLS3lww8/5NChQ/z+++91mLBpaNeuHR07dqw07y4oKODbb79l+PDhJiWrmhnvTWpTcnIy8+fPrzSPz8jI4Oqrr8ZqtbJx40bee+897rrrLu666y7ef/999u3bx8CBA01KbY7rrruOFStWsH//frOjiAAqnos0Cyf22SsuLmbatGm0b98eNzc3AgMDufDCC1m0aBFQ1lbkzTffBKjQXqRcbm4uDzzwABEREdhsNjp27MiLL76IYRgV7jc/P597772XoKAgvL29GTFiBEeOHKnUH7q8X/eOHTsYO3Ys/v7+XHjhhQBs2bKF8ePHO9pQhIWFcdttt5GamlrhvsqPsXv3bm666SZ8fX0JDg7m//2//4dhGBw6dIiRI0fi4+NDWFgYL730Uo0eu5KSEp5++mnatWuHzWajTZs2PPbYYxQWFjrGWCwWZs6cSW5uruOxOt2PV1osFi688EIMw6g0Sfjpp58YMGAAnp6eeHt7M3z4cLZv337KY86cOZOLL76YkJAQbDYbXbp04e23364wpk2bNmzfvp1ly5Y5spf30Duxr+DkyZPx8vIiLy+v0n3dcMMNhIWFUVpaeta5b7zxRv766y82bNhQad/cuXOxWCzccMMNABQWFvLkk08SHR2NzWYjIiKChx9+uMLzU539+/czevRoAgIC8PDwoF+/fsyfP7/SuIKCAp566ik6dOiAm5sb4eHhXHPNNezbt88x5vjX9FNPPcVDDz0EQFRUlONxjY+PZ9CgQfTo0aPKPB07diQ2Nvakmb/77jtcXV0rTaBnzJhBTk4OH3zwAeHh4ZVuFx0dzT/+8Y+THjsjI4OpU6c6fq6jo6N54YUXsNvtFca9+OKLnH/++QQGBuLu7k5MTEyVH+e1WCxMnjyZ7777jm7dumGz2ejatSsLFy6sNPbIkSPcdttthIaGOsZ9+OGHlcYdPnyYq666Ck9PT0JCQrjvvvuqfa4vvfRScnNzHb/XREREaoPm1Q1zXj1nzhwuvfRSLrroIjp37nzST3Lm5eVx5513EhgYiI+PDzfffDPp6ekVxqxbt47Y2FiCgoJwd3cnKiqK2267rcKYmj53J6ruWkXlbYTi4+OBk8/ToeZzt5O54YYb+Pzzzyvc5scffyQvL6/K68ccOHCAe+65h44dO+Lu7k5gYCCjR492ZD7eli1bGDRoEO7u7rRq1YpnnnmGmTNnVjjH8vO84oorWLFiBeeddx5ubm60bdu20qcHT3xvMnjwYObPn8+BAwccj0+bNm2qfCyrO0a5d999l3bt2uHu7s55553H8uXLq3y8zua9x/z58ykpKeGSSy6psP2///0vR44c4eWXX6ZTp06VbhcaGsq//vWvkx67prlq8v4Qav6cQM1fhxkZGYwfPx5fX1/8/Py45ZZbqm1HU/4Yff/99yc9b5H6orYtIo1UZmYmKSkplbYXFxef8rZPPfUUzz33HHfccQfnnXceWVlZrFu3jg0bNnDppZdy5513kpCQwKJFi5g9e3aF2xqGwYgRI1iyZAm33347PXv25Oeff+ahhx7iyJEjvPLKK46x48eP54svvmDcuHH069ePZcuWnXQFw+jRo2nfvj3PPvusY9K5aNEi9u/fz6233kpYWJij9cT27dtZvXp1pYnn9ddfT+fOnXn++eeZP38+zzzzDAEBAfz3v//l4osv5oUXXmDOnDk8+OCD9OnT55R/xb/jjjv46KOPuPbaa3nggQf4888/ee6559i5cyfffvstALNnz+bdd99lzZo1jlYs559//imfhxOVT+78/f0d22bPns0tt9xCbGwsL7zwAnl5ebz99ttceOGFbNy40TFBrMrbb79N165dGTFiBM7Ozvz444/cc8892O12Jk2aBMCrr77KlClT8PLy4vHHHwfKJmhVuf7663nzzTcd7UHK5eXl8eOPPzJ+/HisVutZ577xxhuZNm0ac+fOpXfv3o7tpaWlfPHFFwwYMIDWrVtjt9sZMWIEK1asYOLEiXTu3JmtW7fyyiuvsHv3br777rtq7yMpKYnzzz+fvLw87r33XgIDA/noo48YMWIEX331FVdffbXjPq+44gp+/fVXxowZwz/+8Q+ys7NZtGgR27Zto127dpWOfc0117B7924+/fRTXnnlFYKCggAIDg5
"text/plain": [
"<Figure size 1500x600 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"\n",
"# Выбираем столбцы для анализа\n",
"columns_to_check = ['relative_velocity', 'absolute_magnitude']\n",
"\n",
"# Функция для подсчета выбросов\n",
"def count_outliers(df, columns):\n",
" outliers_count = {}\n",
" for col in columns:\n",
" Q1 = df[col].quantile(0.25)\n",
" Q3 = df[col].quantile(0.75)\n",
" IQR = Q3 - Q1\n",
" lower_bound = Q1 - 1.5 * IQR\n",
" upper_bound = Q3 + 1.5 * IQR\n",
" \n",
" # Считаем количество выбросов\n",
" outliers = df[(df[col] < lower_bound) | (df[col] > upper_bound)]\n",
" outliers_count[col] = len(outliers)\n",
" \n",
" return outliers_count\n",
"\n",
"# Подсчитываем выбросы\n",
"outliers_count = count_outliers(df, columns_to_check)\n",
"\n",
"# Выводим количество выбросов для каждого столбца\n",
"for col, count in outliers_count.items():\n",
" print(f\"Количество выбросов в столбце '{col}': {count}\")\n",
"# Выбираем столбцы для очистки\n",
"columns_to_clean = ['relative_velocity', 'absolute_magnitude']\n",
"\n",
"# Функция для удаления выбросов\n",
"def remove_outliers(df, columns):\n",
" for col in columns:\n",
" Q1 = df[col].quantile(0.25)\n",
" Q3 = df[col].quantile(0.75)\n",
" IQR = Q3 - Q1\n",
" lower_bound = Q1 - 1.5 * IQR\n",
" upper_bound = Q3 + 1.5 * IQR\n",
" \n",
" # Удаляем строки, содержащие выбросы\n",
" df = df[(df[col] >= lower_bound) & (df[col] <= upper_bound)]\n",
" \n",
" return df\n",
"\n",
"# Удаляем выбросы\n",
"df_cleaned = remove_outliers(df, columns_to_clean)\n",
"\n",
"# Выводим количество удаленных строк\n",
"print(f\"Количество удаленных строк: {len(df) - len(df_cleaned)}\")\n",
"\n",
"# Создаем гистограммы для очищенных данных\n",
"plt.figure(figsize=(15, 6))\n",
"\n",
"# Гистограмма для relative_velocity\n",
"plt.subplot(1, 2, 1)\n",
"sns.histplot(df_cleaned['relative_velocity'], kde=True)\n",
"plt.title('Histogram of Relative Velocity (Cleaned)')\n",
"plt.xlabel('Relative Velocity')\n",
"plt.ylabel('Frequency')\n",
"\n",
"# Гистограмма для absolute_magnitude\n",
"plt.subplot(1, 2, 2)\n",
"sns.histplot(df_cleaned['absolute_magnitude'], kde=True)\n",
"plt.title('Histogram of Absolute Magnitude (Cleaned)')\n",
"plt.xlabel('Absolute Magnitude')\n",
"plt.ylabel('Frequency')\n",
"\n",
"plt.tight_layout()\n",
"plt.show()\n",
"\n",
"# Сохраняем очищенный датасет\n",
"df_cleaned.to_csv(\"..//static//csv//neo.csv\", index=False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Можно заметить, что выбросов стало меньше"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Количество пропущенных значений в каждом столбце:\n",
"id 0\n",
"name 0\n",
"est_diameter_min 0\n",
"est_diameter_max 0\n",
"relative_velocity 0\n",
"miss_distance 0\n",
"orbiting_body 0\n",
"sentry_object 0\n",
"absolute_magnitude 0\n",
"hazardous 0\n",
"dtype: int64\n"
]
}
],
"source": [
"import pandas as pd\n",
"\n",
"# Проверка на пропущенные значения\n",
"missing_values = df.isnull().sum()\n",
"\n",
"# Вывод результатов\n",
"print(\"Количество пропущенных значений в каждом столбце:\")\n",
"print(missing_values)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Пропущенных значений в датасете нет. Можно перейти к созданию выборок"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Размер обучающей выборки: (53494, 9)\n",
"Размер контрольной выборки: (17832, 9)\n",
"Размер тестовой выборки: (17832, 9)\n"
]
}
],
"source": [
"import pandas as pd\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"# Предположим, что ваш датасет называется df\n",
"# df = pd.read_csv('your_dataset.csv') # Загрузите ваш датасет, если он в формате CSV\n",
"\n",
"# Разделение на признаки (X) и целевую переменную (y)\n",
"# Предположим, что 'hazardous' - это целевая переменная\n",
"X = df.drop('hazardous', axis=1)\n",
"y = df['hazardous']\n",
"\n",
"# Разбиение на обучающую и остальную выборку (контрольную + тестовую)\n",
"X_train, X_rem, y_train, y_rem = train_test_split(X, y, train_size=0.6, random_state=42)\n",
"\n",
"# Разбиение остатка на контрольную и тестовую выборки\n",
"X_val, X_test, y_val, y_test = train_test_split(X_rem, y_rem, test_size=0.5, random_state=42)\n",
"\n",
"# Вывод размеров выборок\n",
"print(\"Размер обучающей выборки:\", X_train.shape)\n",
"print(\"Размер контрольной выборки:\", X_val.shape)\n",
"print(\"Размер тестовой выборки:\", X_test.shape)"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Распределение классов в обучающей выборке:\n",
"hazardous\n",
"False 0.905989\n",
"True 0.094011\n",
"Name: proportion, dtype: float64\n",
"\n",
"Распределение классов в контрольной выборке:\n",
"hazardous\n",
"False 0.905956\n",
"True 0.094044\n",
"Name: proportion, dtype: float64\n",
"\n",
"Распределение классов в тестовой выборке:\n",
"hazardous\n",
"False 0.906012\n",
"True 0.093988\n",
"Name: proportion, dtype: float64\n"
]
}
],
"source": [
"import pandas as pd\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"# Разделение на признаки (X) и целевую переменную (y)\n",
"# Предположим, что 'hazardous' - это целевая переменная\n",
"X = df.drop('hazardous', axis=1)\n",
"y = df['hazardous']\n",
"\n",
"# Разбиение на обучающую и остальную выборку (контрольную + тестовую)\n",
"X_train, X_rem, y_train, y_rem = train_test_split(X, y, train_size=0.6, random_state=42, stratify=y)\n",
"\n",
"# Разбиение остатка на контрольную и тестовую выборки\n",
"X_val, X_test, y_val, y_test = train_test_split(X_rem, y_rem, test_size=0.5, random_state=42, stratify=y_rem)\n",
"\n",
"# Функция для анализа сбалансированности\n",
"def analyze_balance(y_train, y_val, y_test):\n",
" print(\"Распределение классов в обучающей выборке:\")\n",
" print(y_train.value_counts(normalize=True))\n",
" \n",
" print(\"\\nРаспределение классов в контрольной выборке:\")\n",
" print(y_val.value_counts(normalize=True))\n",
" \n",
" print(\"\\nРаспределение классов в тестовой выборке:\")\n",
" print(y_test.value_counts(normalize=True))\n",
"\n",
"# Анализ сбалансированности\n",
"analyze_balance(y_train, y_val, y_test)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Выборки хорошо сбалансированы и не нуждаются в корректировках"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Диабет у индейцев Пима"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Проблемная область: медицина и эпидемиология\n",
"\n",
"Объект наблюдения: женщины индейского племени Пима, проживающие вблизи Финикса, штат Аризона, США\n",
"\n",
"Атрибуты: беременность, глюкоза, артериальное давление, толщина кожи, инсулин, индекс массы тела, родословная диабета, возраст, исход\n",
"\n",
"Пример бизнес-цели: \n",
"\n",
" 1. Повышение эффективности скрининга диабета. Цель технического проекта: Разработать и обучить модель машинного обучения с точностью предсказания не менее 85% для автоматизированного скрининга диабета на основе данных датасета \"Диабет у индейцев Пима\".\n",
"\n",
" 2. Снижение медицинских расходов. Цель технического проекта: Оптимизировать модель прогнозирования таким образом, чтобы минимизировать количество ложноотрицательных результатов (пациенты с диабетом, которые не были выявлены), что позволит снизить затраты на лечение осложнений.\n",
"\n",
" 3. Повышение качества жизни пациентов. Цель технического проекта: Разработать интерфейс для модели, который будет предоставлять пациентам персонализированные рекомендации по профилактике и лечению диабета на основе их индивидуальных рисков, определенных моделью."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Index(['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin',\n",
" 'BMI', 'DiabetesPedigreeFunction', 'Age', 'Outcome'],\n",
" dtype='object')\n"
]
}
],
"source": [
"import pandas as pd \n",
"df = pd.read_csv(\"..//static//csv//diabetes.csv\")\n",
"print(df.columns)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Проверяем на выбросы"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Количество выбросов в столбце 'Pregnancies': 4\n",
"Количество выбросов в столбце 'Glucose': 5\n",
"Количество выбросов в столбце 'BloodPressure': 45\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABdIAAAISCAYAAADIuT2dAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAD2s0lEQVR4nOzdeXxU9fX/8ffMJJnsCdkTCBC2sC8CIqKIiiKIlYq1tC5oVdqKti61La24oBV3Ub9Ua9uf0lZqa6tUUUFAcUUQFGTfZM2+kH2dmfv7YzIjEQghZHJnMq/n4zEPzb137pyZSfjce+6552MxDMMQAAAAAAAAAAA4LqvZAQAAAAAAAAAA4M9IpAMAAAAAAAAA0AIS6QAAAAAAAAAAtIBEOgAAAAAAAAAALSCRDgAAAAAAAABAC0ikAwAAAAAAAADQAhLpAAAAAAAAAAC0gEQ6AAAAAAAAAAAtIJEOAAAAAAAAAEALSKSjU+rZs6euv/56s8Po9B5//HH16tVLNptNw4cPNzucTmX16tWyWCxavXq12aEAQEDiWKBj+PJYYMKECZowYUK77hMAcHoYXzuGL8ZXM88x77//flkslg5/XaC9kUiH33v55ZdlsVi0fv36466fMGGCBg8efNqv88477+j+++8/7f0Ei/fee0+//vWvNW7cOL300kt6+OGHT7jt9ddfL4vF4n3ExsZq2LBhevLJJ1VfX9+BUQMAAhHHAv7pVI4FPD7++GNdddVV6tq1q8LCwhQXF6cxY8Zo3rx5Kigo6ICoAQAejK/+6XTOtUNCQpSZmakZM2Zo27ZtHRj1qevZs2ez2FNSUnTuuefqjTfeMDs04IRCzA4A8IWdO3fKaj2160TvvPOOFi5cyADfSu+//76sVqv++te/Kiws7KTb2+12/eUvf5EklZWV6b///a9+9atf6YsvvtCrr77q63ADzvjx41VbW9uqzxYAcCyOBXzvVI8F7r33Xj344IPq1auXrr/+evXq1Ut1dXXasGGDnnzySS1atEh79+7tgMgBAG3F+Op7p3Ou7XA4tHfvXr3wwgtatmyZtm3bpoyMDF+H3GbDhw/XXXfdJUnKzc3Vn/70J11xxRV6/vnn9bOf/czk6IBjkUhHp2S3280O4ZRVV1crKirK7DBarbCwUBEREa1O9IaEhOiaa67x/nzLLbdozJgx+te//qWnnnrquIO7YRiqq6tTREREu8UdKKxWq8LDw80OAwACFscCvncqxwL/+te/9OCDD+qqq67S3//+92Oe8/TTT+vpp5/2VagAgHbC+Op7p3uuLUlnnXWWpk6dqrfffls333yzL8JsF127dm0W+3XXXac+ffro6aefPmEi3eFwyOVyBVTRWaD9DuLEaO2CTum7fdsaGxv1wAMPqG/fvgoPD1diYqLOOeccrVixQpL7dqiFCxdKUrNbizyqq6t11113KTMzU3a7XdnZ2XriiSdkGEaz162trdUvfvELJSUlKSYmRt/73veUk5Mji8XS7Oq7pz/Ytm3b9OMf/1hdunTROeecI0n6+uuvvVVa4eHhSktL009+8hOVlJQ0ey3PPnbt2qVrrrlGcXFxSk5O1ty5c2UYhg4dOqTLL79csbGxSktL05NPPtmqz87hcOjBBx9U7969Zbfb1bNnT/3ud79r1oLFYrHopZdeUnV1tfezevnll1u1fw+r1erte7p//35J7u9t6tSpWr58uUaNGqWIiAj96U9/kuSuYr/99tu930GfPn306KOPyuVyNdtvSUmJrr32WsXGxio+Pl4zZ87Upk2bjonx+uuvV3R0tHJycjRt2jRFR0crOTlZv/rVr+R0Opvt84knntDZZ5+txMRERUREaOTIkfrPf/5zzHuyWCy69dZbtWTJEg0ePFh2u12DBg3SsmXLjtk2JydHN954ozIyMmS325WVlaWf//znamhokHTi/nVr167VJZdcori4OEVGRuq8887Tp59+2mybyspK3X777erZs6fsdrtSUlJ00UUX6csvvzzp9wIAnQXHAv51LHDvvfcqKSnphNV1cXFxJ61U9LQg8Bw3eLQ0Zk6ZMkVdunRRVFSUhg4dqmeeeabZNu+//77OPfdcRUVFKT4+Xpdffrm2b9/ebJvWjqutGaMBINAxvvrX+HoiaWlpktxJ9pN57bXXNHLkSEVERCgpKUnXXHONcnJyjtmuNWOmJH3yyScaPXq0wsPD1bt3b+85fWvjHjBggPbt2yfJnSuwWCx64okntGDBAu9n52lbs2PHDl155ZVKSEhQeHi4Ro0apTfffLPZPk/2OypJ+fn5uuGGG9StWzfZ7Xalp6fr8ssvb3bM8d3fNY/v/k14jlc+/PBD3XLLLUpJSVG3bt286999913v5xgTE6NLL71UW7dubfVnBHNRkY6AUV5eruLi4mOWNzY2nvS5999/v+bPn6+bbrpJZ555pioqKrR+/Xp9+eWXuuiii/TTn/5Uubm5WrFihf7+9783e65hGPre976nDz74QDfeeKOGDx+u5cuX6+6771ZOTk6z6qnrr79e//73v3XttdfqrLPO0ocffqhLL730hHH94Ac/UN++ffXwww97DxRWrFihb775RjfccIPS0tK0detWvfjii9q6das+//zzYybo+OEPf6gBAwbokUce0dtvv62HHnpICQkJ+tOf/qQLLrhAjz76qF555RX96le/0ujRozV+/PgWP6ubbrpJixYt0pVXXqm77rpLa9eu1fz587V9+3Zvr7K///3vevHFF7Vu3TrvLWRnn332Sb+H7/Lcvp2YmOhdtnPnTv3oRz/ST3/6U918883Kzs5WTU2NzjvvPOXk5OinP/2punfvrs8++0xz5sxRXl6eFixYIElyuVy67LLLtG7dOv385z9X//799b///U8zZ8487us7nU5NmjRJY8aM0RNPPKGVK1fqySefVO/evfXzn//cu90zzzyj733ve7r66qvV0NCgV199VT/4wQ+0dOnSY77fTz75RK+//rpuueUWxcTE6Nlnn9X06dN18OBB7/vMzc3VmWeeqbKyMs2aNUv9+/dXTk6O/vOf/6impuaEV9bff/99TZ48WSNHjtR9990nq9Wql156SRdccIE+/vhjnXnmmZKkn/3sZ/rPf/6jW2+9VQMHDlRJSYk++eQTbd++XWecccYpf08A4C84FgjMY4Fdu3Zp165duummmxQdHd3ia7eXFStWaOrUqUpPT9cvf/lLpaWlafv27Vq6dKl++ctfSpJWrlypyZMnq1evXrr//vtVW1ur5557TuPGjdOXX36pnj17SmrduNraMRoA/BHja2COr0fzfH9Op1PffPONfvOb3ygxMVFTp05t8Xkvv/yybrjhBo0ePVrz589XQUGBnnnmGX366af66quvFB8fL6n1Y+bmzZt18cUXKzk5Wffff78cDofuu+8+paamnvQ9SO7fuUOHDjXLEUjSSy+9pLq6Os2aNUt2u10JCQnaunWrxo0bp65du+q3v/2toqKi9O9//1vTpk3Tf//7X33/+9+XdPLfUUmaPn26tm7dqttuu009e/ZUYWGhVqxYoYMHD3rf26m65ZZblJycrHvvvVfV1dWS3N/vzJkzNWnSJD366KOqqanR888/r3POOUdfffVVm18LHcgA/NxLL71kSGrxMWjQoGbP6dGjhzFz5kzvz8OGDTMuvfTSFl9n9uzZxvH+JJYsWWJIMh566KFmy6+88krDYrEYe/bsMQzDMDZs2GBIMm6//fZm211//fWGJOO+++7zLrvvvvsMScaPfvSjY16vpqbmmGX//Oc/DUnGRx99dMw+Zs2a5V3mcDiMbt26GRaLxXjkkUe8y48cOWJEREQ0+0yOZ+PGjYYk46abbmq2/Fe/+pUhyXj//fe9y2bOnGlERUW1uL/vbltUVGQUFRUZe/bsMR5++GHDYrEYQ4cO9W7Xo0cPQ5KxbNmyZs9/8MEHjaioKGPXrl3Nlv/2t781bDabcfDgQcMwDOO///2vIclYsGCBdxun02lccMEFhiTjpZdeahaTJGPevHnN9jlixAhj5MiRzZZ99ztpaGgwBg8ebFxwwQX
"text/plain": [
"<Figure size 1500x1000 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"\n",
"df = pd.read_csv(\"..//static//csv//diabetes.csv\")\n",
"\n",
"# Выбираем числовые столбцы\n",
"numeric_columns = ['Pregnancies', 'Glucose', 'BloodPressure']\n",
"\n",
"# Выбираем столбцы для анализа\n",
"columns_to_check = ['Pregnancies', 'Glucose', 'BloodPressure']\n",
"\n",
"# Функция для подсчета выбросов\n",
"def count_outliers(df, columns):\n",
" outliers_count = {}\n",
" for col in columns:\n",
" Q1 = df[col].quantile(0.25)\n",
" Q3 = df[col].quantile(0.75)\n",
" IQR = Q3 - Q1\n",
" lower_bound = Q1 - 1.5 * IQR\n",
" upper_bound = Q3 + 1.5 * IQR\n",
" \n",
" # Считаем количество выбросов\n",
" outliers = df[(df[col] < lower_bound) | (df[col] > upper_bound)]\n",
" outliers_count[col] = len(outliers)\n",
" \n",
" return outliers_count\n",
"\n",
"# Подсчитываем выбросы\n",
"outliers_count = count_outliers(df, columns_to_check)\n",
"\n",
"# Выводим количество выбросов для каждого столбца\n",
"for col, count in outliers_count.items():\n",
" print(f\"Количество выбросов в столбце '{col}': {count}\")\n",
" \n",
"# Создаем гистограммы\n",
"plt.figure(figsize=(15, 10))\n",
"for i, col in enumerate(numeric_columns, 1):\n",
" plt.subplot(2, 3, i)\n",
" sns.histplot(df[col], kde=True)\n",
" plt.title(f'Histogram of {col}')\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Можем заметить, что количество выбросов очень мало. Сделаем очистку от выбросов для столцба 'BloodPressure'"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Количество удаленных строк: 45\n",
"Количество выбросов в столбце 'BloodPressure': 4\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAwcAAAJOCAYAAADieHtfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACJj0lEQVR4nOzdd3hUZeL28e/MJJPee6WEAJFeBBGsoAjCitgFe/u9Ym+r69oLoiu2VVHXRV17xQqIgChK7yX0Ekjvvc6c94+E0UgLIclJuT/XlUtz5sycO5MJmTvPeZ5jMQzDQEREREREOjyr2QFERERERKR1UDkQERERERFA5UBEREREROqoHIiIiIiICKByICIiIiIidVQOREREREQEUDkQEREREZE6KgciIiIiIgKoHIiIiIiISB2VAxFpsM6dO3P11VebHaPde+655+jatSs2m43+/fs3yWP+/PPPWCwWfv755yZ5vGPx6KOPYrFYWvy4HcW+ffvw9PTkt99+a9T99+zZg8Vi4Z133mnaYCb56+uturqauLg4XnvtNRNTibQdKgciHdQ777yDxWJh5cqVh7z99NNPp3fv3sd9nB9++IFHH330uB+no/jxxx+57777GD58ODNnzuTpp58+7L5XX301FovF9eHm5kZcXByXXnopmzdvbsHUTeOvX4+/vz/9+vXj+eefp7Ky0ux4rdbjjz/O0KFDGT58+EG3/fzzz0ycOJHIyEjsdjvh4eGMHz+eL7/80oSk5nB3d+euu+7iqaeeoqKiwuw4Iq2em9kBRKTt2Lp1K1brsf1N4YcffuDVV19VQWigBQsWYLVaefvtt7Hb7Ufd38PDg//85z8A1NTUsHPnTmbMmMGcOXPYvHkz0dHRzR25Sf356ykoKOCLL77gnnvuYcWKFXz88ccmp2t9srOzeffdd3n33XcPuu2RRx7h8ccfJzExkZtuuolOnTqRm5vLDz/8wAUXXMAHH3zA5ZdfbkLqlnfNNddw//338+GHH3LttdeaHUekVVM5EJEG8/DwMDvCMSstLcXHx8fsGA2WlZWFl5dXg4oBgJubG5MnT6637aSTTmLcuHF8//333HDDDc0Rs9n89eu5+eabGTp0KJ988gnTp08/ZNkxDIOKigq8vLxaMupxqampwel0Nvj7fDjvv/8+bm5ujB8/vt72zz//nMcff5wLL7yQDz/8EHd3d9dt9957L3PnzqW6uvq4jt2WBAYGcvbZZ/POO++oHIgchU4rEpEG++ucg+rqah577DESExPx9PQkJCSEESNGMG/ePKD2NJFXX30VoN7pIgeUlpZy9913ExcXh4eHBz169OBf//oXhmHUO255eTm33XYboaGh+Pn58be//Y3U1FQsFku9EYkD5xpv3ryZyy+/nKCgIEaMGAHA+vXrufrqq+natSuenp5ERkZy7bXXkpubW+9YBx5j27ZtTJ48mYCAAMLCwnjooYcwDIN9+/Zx3nnn4e/vT2RkJM8//3yDnruamhqeeOIJEhIS8PDwoHPnzvzjH/+od7qMxWJh5syZlJaWup6rxpwHHhkZCdS+0T6azz77jEGDBuHl5UVoaCiTJ08mNTX1oP0WLFjAKaecgo+PD4GBgZx33nkkJycftN/ixYs58cQT8fT0JCEhgTfeeOOY8/+Z1Wrl9NNPB2rPjYfa1+G4ceOYO3cugwcPxsvLy3WcgoIC7rjjDtdrqlu3bkybNg2n01nvcT/++GMGDRqEn58f/v7+9OnTh5deesl1+9Fe21B76t2BbH929dVX07lzZ9fnB87p/9e//sWLL77oeg0cOPVry5YtXHjhhQQHB+Pp6cngwYP55ptvGvT8zJo1i6FDh+Lr61tv+0MPPURwcDD//e9/6xWDA0aPHs24ceOO+NgNyZWXl8c999xDnz598PX1xd/fnzFjxrBu3bp6+x2Y8/Lpp5/y1FNPERsbi6enJyNHjmTHjh0HHXvZsmWcc845BAQE4O3tzWmnnXbIORXH8no766yzWLx4MXl5eUf8ukU6Oo0ciHRwhYWF5OTkHLS9IX9VfPTRR5k6dSrXX389Q4YMoaioiJUrV7J69WrOOussbrrpJtLS0pg3bx7/+9//6t3XMAz+9re/sXDhQq677jr69+/P3Llzuffee0lNTeWFF15w7Xv11Vfz6aefcsUVV3DSSSexaNEizj333MPmuuiii0hMTOTpp592FY158+axa9currnmGiIjI9m0aRNvvvkmmzZtYunSpQdNmL3kkktISkrimWee4fvvv+fJJ58kODiYN954gzPPPJNp06bxwQcfcM8993DiiSdy6qmnHvG5uv7663n33Xe58MILufvuu1m2bBlTp04lOTmZr776CoD//e9/vPnmmyxfvtx1as3JJ5981O/Dge+fw+Fg165d/P3vfyckJOSob/7eeecdrrnmGk488USmTp1KZmYmL730Er/99htr1qwhMDAQgJ9++okxY8bQtWtXHn30UcrLy3nllVcYPnw4q1evdr0R3rBhA2effTZhYWE8+uij1NTU8MgjjxAREXHUr+FIdu7cCUBISIhr29atW7nsssu46aabuOGGG+jRowdlZWWcdtpppKamctNNNxEfH8/vv//OAw88QHp6Oi+++CJQ+1q47LLLGDlyJNOmTQMgOTmZ3377jdtvvx04+mu7MWbOnElFRQU33ngjHh4eBAcHs2nTJoYPH05MTAz3338/Pj4+fPrpp0yYMIEvvviC888//7CPV11dzYoVK/h//+//1du+fft2tmzZwrXXXoufn1+jsjY0165du5g1axYXXXQRXbp0ITMzkzfeeIPTTjvtkKe1PfPMM1itVu655x4KCwt59tlnmTRpEsuWLXPts2DBAsaMGcOgQYN45JFHsFqtzJw5kzPPPJNff/2VIUOGAMf+ehs0aBCGYfD7778f9WdDpEMzRKRDmjlzpgEc8aNXr1717tOpUyfjqquucn3er18/49xzzz3icaZMmWIc6p+aWbNmGYDx5JNP1tt+4YUXGhaLxdixY4dhGIaxatUqAzDuuOOOevtdffXVBmA88sgjrm2PPPKIARiXXXbZQccrKys7aNtHH31kAMYvv/xy0GPceOONrm01NTVGbGysYbFYjGeeeca1PT8/3/Dy8qr3nBzK2rVrDcC4/vrr622/5557DMBYsGCBa9tVV11l+Pj4HPHx/rzvob5vMTExxqpVq+rtu3DhQgMwFi5caBiGYVRVVRnh4eFG7969jfLyctd+3333nQEYDz/8sGtb//79jfDwcCM3N9e1bd26dYbVajWuvPJK17YJEyYYnp6ext69e13bNm/ebNhstkO+Bg719fj4+BjZ2dlGdna2sWPHDuPpp582LBaL0bdvX9d+nTp1MgBjzpw59e7/xBNPGD4+Psa2bdvqbb///vsNm81mpKSkGIZhGLfffrvh7+9v1NTUHDZLQ17bp512mnHaaacd8uvo1KmT6/Pdu3cbgOHv729kZWXV23fkyJFGnz59jIqKCtc2p9NpnHzyyUZiYuIRj79jxw4DMF555ZV627/++msDMF544YUj3v+v+WbOnHnMuSoqKgyHw3HQ43l4eBiPP/64a9uB119SUpJRWVnp2v7SSy8ZgLFhwwbXMRITE43Ro0cbTqfTtV9ZWZnRpUsX46yzznJtO9bXW1pamgEY06ZNa9DzItJR6bQikQ7u1VdfZd68eQd99O3b96j3DQwMZNOmTWzfvv2Yj/vDDz9gs9m47bbb6m2/++67MQyD2bNnAzBnzhyg9tzzP7v11lsP+9j/93//d9C2P5+PXlFRQU5ODieddBIAq1evPmj/66+/3vX/NpuNwYMHYxgG1113nWt7YGAgPXr0YNeuXYfNArVfK8Bdd91Vb/vdd98NwPfff3/E+x+Jp6en63s2d+5c3njjDXx9fRk7dizbtm077P1WrlxJVlYWN998M56enq7t5557Lj179nRlSk9PZ+3atVx99dUEBwe79uvbty9nnXWW62tzOBzMnTuXCRMmEB8f79ovKSmJ0aNHN/jrKS0tJSwsjLCwMLp168Y//vEPhg0b5hpdOaB
"text/plain": [
"<Figure size 1500x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
" \n",
"# Выбираем столбцы для очистки\n",
"columns_to_clean = ['BloodPressure']\n",
"\n",
"# Функция для удаления выбросов\n",
"def remove_outliers(df, columns):\n",
" for col in columns:\n",
" Q1 = df[col].quantile(0.25)\n",
" Q3 = df[col].quantile(0.75)\n",
" IQR = Q3 - Q1\n",
" lower_bound = Q1 - 1.5 * IQR\n",
" upper_bound = Q3 + 1.5 * IQR\n",
" \n",
" # Удаляем строки, содержащие выбросы\n",
" df = df[(df[col] >= lower_bound) & (df[col] <= upper_bound)]\n",
" \n",
" return df\n",
"\n",
"# Удаляем выбросы\n",
"df_cleaned = remove_outliers(df, columns_to_clean)\n",
"\n",
"# Выводим количество удаленных строк\n",
"print(f\"Количество удаленных строк: {len(df) - len(df_cleaned)}\")\n",
"\n",
"df = df_cleaned\n",
"\n",
"# Выбираем столбцы для анализа\n",
"columns_to_check = ['BloodPressure']\n",
"\n",
"# Функция для подсчета выбросов\n",
"def count_outliers(df, columns):\n",
" outliers_count = {}\n",
" for col in columns:\n",
" Q1 = df[col].quantile(0.25)\n",
" Q3 = df[col].quantile(0.75)\n",
" IQR = Q3 - Q1\n",
" lower_bound = Q1 - 1.5 * IQR\n",
" upper_bound = Q3 + 1.5 * IQR\n",
" \n",
" # Считаем количество выбросов\n",
" outliers = df[(df[col] < lower_bound) | (df[col] > upper_bound)]\n",
" outliers_count[col] = len(outliers)\n",
" \n",
" return outliers_count\n",
"\n",
"# Подсчитываем выбросы\n",
"outliers_count = count_outliers(df, columns_to_check)\n",
"\n",
"# Выводим количество выбросов для каждого столбца\n",
"for col, count in outliers_count.items():\n",
" print(f\"Количество выбросов в столбце '{col}': {count}\")\n",
" \n",
"\n",
"# Создаем гистограммы для очищенных данных\n",
"plt.figure(figsize=(15, 6))\n",
"\n",
"# Гистограмма для relative_velocity\n",
"plt.subplot(1, 2, 1)\n",
"sns.histplot(df_cleaned['BloodPressure'], kde=True)\n",
"plt.title('Histogram of Blood Pressure (Cleaned)')\n",
"plt.xlabel('Blood Pressure')\n",
"plt.ylabel('Frequency')\n",
"\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Проверка на пропущенные значения"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Количество пропущенных значений в каждом столбце:\n",
"Pregnancies 0\n",
"Glucose 0\n",
"BloodPressure 0\n",
"SkinThickness 0\n",
"Insulin 0\n",
"BMI 0\n",
"DiabetesPedigreeFunction 0\n",
"Age 0\n",
"Outcome 0\n",
"dtype: int64\n"
]
}
],
"source": [
"import pandas as pd\n",
"\n",
"# Проверка на пропущенные значения\n",
"missing_values = df.isnull().sum()\n",
"\n",
"# Вывод результатов\n",
"print(\"Количество пропущенных значений в каждом столбце:\")\n",
"print(missing_values)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Пропущенных значений нет. Делаем разбиение на выборки"
]
},
{
"cell_type": "code",
"execution_count": 41,
2024-10-11 19:51:41 +04:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Размер обучающей выборки: 433\n",
"Размер контрольной выборки: 145\n",
"Размер тестовой выборки: 145\n"
2024-10-11 19:51:41 +04:00
]
}
],
"source": [
"import pandas as pd\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"# Разделение на признаки (X) и целевую переменную (y)\n",
"X = df.drop('Outcome', axis=1) # Признаки\n",
"y = df['Outcome'] # Целевая переменная\n",
2024-10-11 19:51:41 +04:00
"\n",
"# Разбиение на обучающую и оставшуюся часть (контрольная + тестовая)\n",
"X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.4, random_state=42)\n",
2024-10-11 19:51:41 +04:00
"\n",
"# Разбиение оставшейся части на контрольную и тестовую выборки\n",
"X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)\n",
2024-10-11 19:51:41 +04:00
"\n",
"# Вывод размеров выборок\n",
"print(\"Размер обучающей выборки:\", X_train.shape[0])\n",
"print(\"Размер контрольной выборки:\", X_val.shape[0])\n",
"print(\"Размер тестовой выборки:\", X_test.shape[0])"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Сбалансированность обучающей выборки:\n",
"Outcome\n",
"0 0.658199\n",
"1 0.341801\n",
"Name: proportion, dtype: float64\n",
"\n",
"Сбалансированность контрольной выборки:\n",
"Outcome\n",
"0 0.655172\n",
"1 0.344828\n",
"Name: proportion, dtype: float64\n",
"\n",
"Сбалансированность тестовой выборки:\n",
"Outcome\n",
"0 0.662069\n",
"1 0.337931\n",
"Name: proportion, dtype: float64\n"
]
}
],
"source": [
"import pandas as pd\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"# Разделение на признаки (X) и целевую переменную (y)\n",
"X = df.drop('Outcome', axis=1) # Признаки\n",
"y = df['Outcome'] # Целевая переменная\n",
"\n",
"# Разбиение на обучающую и оставшуюся часть (контрольная + тестовая)\n",
"X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.4, random_state=42, stratify=y)\n",
"\n",
"# Разбиение оставшейся части на контрольную и тестовую выборки\n",
"X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42, stratify=y_temp)\n",
"\n",
"# Функция для проверки сбалансированности выборок\n",
"def check_balance(y_train, y_val, y_test):\n",
" print(\"Сбалансированность обучающей выборки:\")\n",
" print(y_train.value_counts(normalize=True))\n",
" \n",
" print(\"\\nСбалансированность контрольной выборки:\")\n",
" print(y_val.value_counts(normalize=True))\n",
" \n",
" print(\"\\nСбалансированность тестовой выборки:\")\n",
" print(y_test.value_counts(normalize=True))\n",
"\n",
"# Проверка сбалансированности\n",
"check_balance(y_train, y_val, y_test)"
2024-10-11 19:51:41 +04:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Выборки относительно сбалансированы, но не идеально. Сделаем приращение данных методом выборки с избытком (oversampling)"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Сбалансированность обучающей выборки после SMOTE:\n",
"Outcome\n",
"0 0.5\n",
"1 0.5\n",
"Name: proportion, dtype: float64\n",
"Сбалансированность обучающей выборки:\n",
"Outcome\n",
"0 0.5\n",
"1 0.5\n",
"Name: proportion, dtype: float64\n",
"\n",
"Сбалансированность контрольной выборки:\n",
"Outcome\n",
"0 0.655172\n",
"1 0.344828\n",
"Name: proportion, dtype: float64\n",
"\n",
"Сбалансированность тестовой выборки:\n",
"Outcome\n",
"0 0.662069\n",
"1 0.337931\n",
"Name: proportion, dtype: float64\n"
]
}
],
"source": [
"import pandas as pd\n",
"from sklearn.model_selection import train_test_split\n",
"from imblearn.over_sampling import SMOTE\n",
"\n",
"# Предположим, что ваш датасет уже загружен в DataFrame df\n",
"# df = pd.read_csv('your_dataset.csv')\n",
"\n",
"# Разделение на признаки (X) и целевую переменную (y)\n",
"X = df.drop('Outcome', axis=1) # Признаки\n",
"y = df['Outcome'] # Целевая переменная\n",
"\n",
"# Разбиение на обучающую и оставшуюся часть (контрольная + тестовая)\n",
"X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.4, random_state=42, stratify=y)\n",
"\n",
"# Разбиение оставшейся части на контрольную и тестовую выборки\n",
"X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42, stratify=y_temp)\n",
"\n",
"# Применение SMOTE для балансировки обучающей выборки\n",
"smote = SMOTE(random_state=42)\n",
"X_train_resampled, y_train_resampled = smote.fit_resample(X_train, y_train)\n",
"\n",
"# Функция для проверки сбалансированности выборок\n",
"def check_balance(y_train, y_val, y_test):\n",
" print(\"Сбалансированность обучающей выборки:\")\n",
" print(y_train.value_counts(normalize=True))\n",
" \n",
" print(\"\\nСбалансированность контрольной выборки:\")\n",
" print(y_val.value_counts(normalize=True))\n",
" \n",
" print(\"\\nСбалансированность тестовой выборки:\")\n",
" print(y_test.value_counts(normalize=True))\n",
"\n",
"# Проверка сбалансированности после SMOTE\n",
"print(\"Сбалансированность обучающей выборки после SMOTE:\")\n",
"print(y_train_resampled.value_counts(normalize=True))\n",
"\n",
"# Проверка сбалансированности контрольной и тестовой выборок\n",
"check_balance(y_train_resampled, y_val, y_test)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Покемоны"
2024-10-11 19:51:41 +04:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Проблемная область: серия игр \"Pokémon\"\n",
"\n",
"Объект наблюдения: покемоны - вымышленные существа, обладающие уникальными характеристиками и способностями\n",
2024-10-11 19:51:41 +04:00
"\n",
"Атрибуты: изображение, индекс, имя, тип 1, тип 2, показатель силы, очки здоровья, атака, защита, специальная атака, специальная защита, скорость\n",
2024-10-11 19:51:41 +04:00
"\n",
"Пример бизнес-цели: \n",
"\n",
" 1. Разработка рекомендательной системы для выбора покемона в игре. Цель технического проекта: Разработать алгоритм машинного обучения, который будет анализировать характеристики покемонов и предлагать игрокам наиболее подходящих покемонов для выбора в зависимости от их стиля игры, предпочтений и целей.\n",
2024-10-11 19:51:41 +04:00
"\n",
" 2. Анализ сильных и слабых сторон покемонов для оптимизации баланса игры. Цель технического проекта: Провести статистический анализ данных о покемонах для выявления дисбаланса в игре, такого как слишком сильные или слабые типы покемонов, несбалансированные характеристики и т.д.\n",
2024-10-11 19:51:41 +04:00
"\n",
" 3. Создание веб-приложения для поиска и сравнения покемонов. Цель технического проекта: Разработать веб-приложение, которое позволит пользователям искать покемонов по различным критериям (название, тип, характеристики) и сравнивать их между собой."
2024-10-11 19:51:41 +04:00
]
},
{
"cell_type": "code",
"execution_count": 50,
2024-10-11 19:51:41 +04:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Index(['Image', 'Index', 'Name', 'Type 1', 'Type 2', 'Total', 'HP', 'Attack',\n",
" 'Defense', 'SP. Atk.', 'SP. Def', 'Speed'],\n",
2024-10-11 19:51:41 +04:00
" dtype='object')\n"
]
}
],
"source": [
"import pandas as pd \n",
"df = pd.read_csv(\"..//static//csv//pokedex.csv\")\n",
2024-10-11 19:51:41 +04:00
"print(df.columns)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Проверка на выбросы"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Количество выбросов в столбце 'HP': 27\n",
"Количество выбросов в столбце 'Attack': 13\n",
"Количество выбросов в столбце 'Defense': 25\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABdEAAAISCAYAAAAjjoaeAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdeXhTZdo/8O9J0qZr0qZbGmhp2dpStgqCKCpIlcVBQB3FQcQNZhzRV3Fc+CkoyAyCjqLIC8PrjKMO6DjjyLiibIoKVihUtkJZSoG26Za2adI2zXJ+f6SJVih0SXKS5vu5rlxjz/LkTmB4eu5zn/sRRFEUQURERERERERERERE55FJHQARERERERERERERkb9iEp2IiIiIiIiIiIiIqB1MohMRERERERERERERtYNJdCIiIiIiIiIiIiKidjCJTkRERERERERERETUDibRiYiIiIiIiIiIiIjawSQ6EREREREREREREVE7mEQnIiIiIiIiIiIiImoHk+hERERERERERERERO1gEp1IQmlpabj77rulDqPHe/HFF9G3b1/I5XIMHz5c6nCIiEhinH99oyfOv3//+98hCAL27t0rdShERD0K52bf8Je5efPmzRg+fDjCwsIgCALq6uoki4Woo5hEJ/KQS11UjRs3DoMHD+72+3z22Wd47rnnuj1OsPjyyy/xxBNP4KqrrsKbb76JP/3pT+0ee/fddyMqKqrd/YIgYP78+e6fT58+DUEQ3C+5XI7U1FTMmDEDBQUFnvwYRETUDs6//qkz8+/P3XbbbRAEAU8++eQF97f359DY2IjnnnsOX331VTeiJiIiT+Dc7J86e23882vdqKgo9O3bF7feeis++OADOByOLsdRU1OD2267DeHh4VizZg3eeecdREZGdnk8Il9RSB0AUTA7duwYZLLO3cv67LPPsGbNGv6y0EHbt2+HTCbDX//6V4SGhnrlPe644w5MmTIFdrsdhYWFWLt2LT7//HN8//33PabyjoioJ+H8631dmX+NRiM+/vhjpKWl4d1338ULL7wAQRDaHNPen0NjYyOWLFkCwJmcISKiwMK52fs6OzcrlUq88cYbAICmpiaUlJTg448/xq233opx48bhv//9L1QqVafj2LNnDxoaGvD8888jNze30+cTSYVJdCIJKZVKqUPoNLPZHFB3iSsrKxEeHu61BDoA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
"text/plain": [
"<Figure size 1500x1000 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"\n",
"df = pd.read_csv(\"..//static//csv//pokedex.csv\")\n",
"\n",
"# Выбираем числовые столбцы\n",
"numeric_columns = ['HP', 'Attack', 'Defense']\n",
"\n",
"# Выбираем столбцы для анализа\n",
"columns_to_check = ['HP', 'Attack', 'Defense']\n",
"\n",
"# Функция для подсчета выбросов\n",
"def count_outliers(df, columns):\n",
" outliers_count = {}\n",
" for col in columns:\n",
" Q1 = df[col].quantile(0.25)\n",
" Q3 = df[col].quantile(0.75)\n",
" IQR = Q3 - Q1\n",
" lower_bound = Q1 - 1.5 * IQR\n",
" upper_bound = Q3 + 1.5 * IQR\n",
" \n",
" # Считаем количество выбросов\n",
" outliers = df[(df[col] < lower_bound) | (df[col] > upper_bound)]\n",
" outliers_count[col] = len(outliers)\n",
" \n",
" return outliers_count\n",
"\n",
"# Подсчитываем выбросы\n",
"outliers_count = count_outliers(df, columns_to_check)\n",
"\n",
"# Выводим количество выбросов для каждого столбца\n",
"for col, count in outliers_count.items():\n",
" print(f\"Количество выбросов в столбце '{col}': {count}\")\n",
" \n",
"# Создаем гистограммы\n",
"plt.figure(figsize=(15, 10))\n",
"for i, col in enumerate(numeric_columns, 1):\n",
" plt.subplot(2, 3, i)\n",
" sns.histplot(df[col], kde=True)\n",
" plt.title(f'Histogram of {col}')\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Во всех проверенных столбцах присутствуют выбросы. Удалим их."
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Количество удаленных строк: 0\n",
"Количество выбросов в столбце 'HP': 0\n",
"Количество выбросов в столбце 'Attack': 0\n",
"Количество выбросов в столбце 'Defense': 0\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABdEAAAISCAYAAAAjjoaeAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3hUZfrG8e9Meu8VEhIgQOgIgigqCEpbsLGKi4oV3bX8FNfCWkFXRF3Fwuq67lpBXVfFjiKgKNIx1NATAglJSO9t5vz+CMwaIZQwyZkk9+e65tLMOXPmngnwznnmPc9rMQzDQEREREREREREREREjmI1O4CIiIiIiIiIiIiIiKtSEV1EREREREREREREpBEqoouIiIiIiIiIiIiINEJFdBERERERERERERGRRqiILiIiIiIiIiIiIiLSCBXRRUREREREREREREQaoSK6iIiIiIiIiIiIiEgjVEQXEREREREREREREWmEiugiIiIiIiIiIiIiIo1QEV3ERAkJCVx33XVmx2jznnnmGTp37oybmxv9+/c3O46IiJhM42/LaIvj75tvvonFYmHdunVmRxERaVM0NrcMVxmbFy1aRP/+/fH29sZisVBUVGRaFpGTpSK6iJOc6KRq+PDh9O7d+7Sf56uvvuKxxx477eO0F99++y333Xcf55xzDm+88QZPPvlko/ted911+Pv7N7rdYrFw++23O35OT0/HYrE4bm5ubsTHx3PppZeSkpLizJchIiKN0Pjrmk5l/P21K664AovFwv3333/M7Y39HioqKnjsscf4/vvvTyO1iIg4g8Zm13Sq58a/Ptf19/enc+fOTJo0iY8++gi73d7kHPn5+VxxxRX4+Pgwb9483nnnHfz8/Jp8PJGW4m52AJH2bMeOHVitp/Zd1ldffcW8efP0YeEkLV26FKvVyr/+9S88PT2b5Tmuuuoqxo0bh81mIzU1lVdeeYWvv/6aVatWtZmZdyIibYnG3+bXlPG3pKSEzz//nISEBN577z2eeuopLBZLg30a+z1UVFQwc+ZMoL44IyIirYvG5uZ3qmOzl5cXr7/+OgCVlZXs27ePzz//nEmTJjF8+HA+/fRTAgMDTznH2rVrKS0t5fHHH2fUqFGn/HgRs6iILmIiLy8vsyOcsvLy8lb1LXFubi4+Pj7NVkAHOOOMM7j66qsdP59zzjlMnDiRV155hX/84x/N9rwiItI0Gn+bX1PG348++gibzca///1vLrjgApYvX87555/fjClFRMRVaGxufqc6Nru7uzc4zwV44okneOqpp5gxYwY333wzH3zwQZNyAAQHB5/yY0XMpHYuIib6bd+32tpaZs6cSVJSEt7e3oSFhTFs2DAWL14M1F9SNW/ePIAGl1YdUV5ezj333ENcXBxeXl50796dZ599FsMwGjxvZWUld955J+Hh4QQEBDBx4kQyMzOxWCwNvsV/7LHHsFgsbNu2jT/84Q+EhIQwbNgwADZt2sR1111H586d8fb2Jjo6mhtuuIH8/PwGz3XkGDt37uTqq68mKCiIiIgIHn74YQzDYP/+/Vx88cUEBgYSHR3N3/72t5N67+rq6nj88cfp0qULXl5eJCQk8Je//IXq6mrHPhaLhTfeeIPy8nLHe/Xmm2+e1PFPxwUXXABAWlpasz+XiIicOo2/rjn+zp8/nwsvvJARI0aQnJzM/PnzG2xv7PeQnp5OREQEADNnznTcf+Q9Pdn3DCAzM5Mbb7yR2NhYvLy8SExM5I9//CM1NTWN5i4sLGTw4MF07NiRHTt2nPB1iojI0TQ2u+bYfCwPPPAAF110ER9++CE7d+5ssO3rr7/m3HPPxc/Pj4CAAMaPH8/WrVsd24cPH87UqVMBOPPMM7FYLA1+76tXr2bMmDEEBQXh6+vL+eefz4oVKxo8x5H3cffu3Vx33XUEBwcTFBTE9ddfT0VFRYN9Fy9ezLBhwwgODsbf35/u3bvzl7/8pcE+1dXVPProo3Tt2hUvLy/i4uK47777Grx/IqCZ6CJOV1xcTF5e3lH319bWnvCxjz32GLNnz+amm25i8ODBlJSUsG7dOjZs2MCFF17ILbfcQlZWFosXL+add95p8FjDMJg4cSLLli3jxhtvpH///nzzzTfce++9ZGZm8vzzzzv2ve666/jPf/7DNddcw1lnncUPP/zA+PHjG831+9//nqSkJJ588knHh47Fixezd+9err/+eqKjo9m6dSuvvfYaW7duZdWqVUddfn3llVeSnJzMU089xZdffskTTzxBaGgo//jHP7jggguYM2cO8+fP589//jNnnnkm55133nHfq5tuuom33nqLSZMmcc8997B69Wpmz55Namoqn3zyCQDvvPMOr732GmvWrHFchnb22Wef8PdwrN/fqdizZw8AYWFhp3UcERE5eRp/W/f4m5WVxbJly3jrrbeA+lZpzz//PC+//LJjxlxjv4eIiAheeeUV/vjHP3LppZdy2WWXAdC3b99Tes+ysrIYPHgwRUVFTJs2jR49epCZmcl///tfKioqjjlzLy8vjwsvvJCCggJ++OEHunTpctzXKSLSnmhsbt1j8/Fcc801fPvttyxevJhu3bo5nmPq1KmMHj2aOXPmUFFRwSuvvMKwYcP45ZdfSEhI4MEHH6R79+689tprzJo1i8TERMfYuXTpUsaOHcvAgQN59NFHsVqtvPHGG1xwwQX8+OOPDB48uEGGK664gsTERGbPns2GDRt4/fXXiYyMZM6cOQBs3bqV3/3ud/Tt25dZs2bh5eXF7t27GxTl7XY7EydO5KeffmLatGkkJyezefNmnn/+eXbu3MnChQub/B5JG2SIiFO88cYbBnDcW69evRo8plOnTsbUqVMdP/fr188YP378cZ/ntttuM471V3fhwoUGYDzxxBMN7p80aZJhsViM3bt3G4ZhGOvXrzcA46677mqw33XXXWcAxqOPPuq479FHHzUA46qrrjrq+SoqKo6677333jMAY/ny5UcdY9q0aY776urqjI4dOxoWi8V46qmnHPcXFhYaPj4+Dd6TY0lJSTEA46abbmpw/5///GcDMJYuXeq4b+rUqYafn99xj/frfU/0O7ztttsc+6elpRmAMXPmTOPQoUNGdna28f333xsDBgwwAOOjjz46qecVEZGm0/jb+sdfwzCMZ5991vDx8TFKSkoMwzCMnTt3GoDxySefNNivsd/DoUOHjnofjzjZ9+zaa681rFarsXbt2qP2t9vthmH878/b2rVrjYMHDxq9evUyOnfubKSnp5/0axURaes0Nrf+sflE+/7yyy8GYNx9992GYRhGaWmpERwcbNx8880N9svOzjaCgoIa3P/rsfQIu91uJCUlGaNHj3aMuYZR/94mJiYaF154oeO+I+/jDTfc0OC5Lr30UiMsLMzx8/PPP28AxqFDhxp9He+8845htVqNH3/8scH9r776qgEYK1asaPSx0v6onYuIk82bN4/FixcfdTsyG+p4goOD2bp1K7t27Trl5/3qq69wc3PjzjvvbHD/Pffcg2EYfP311wAsWrQIgD/96U8N9rvjjjsaPfatt9561H0+Pj6O/6+qqiIvL4+zzjoLgA0bNhy1/0033eT4fzc3NwYNGoRhGNx4442O+4ODg+nevTt79+5tNAvUv1aA6dOnN7j/nnvuAeDLL7887uOPx9vb+5i/vyOXDR7Lo48+SkREBNHR0QwfPpw9e/YwZ84cx0w4ERFpfhp/W/f4O3/+fMaPH09AQAAASUlJDBw48KiWLk1xMu+Z3W5n4cKFTJgwgUGDBh11jN/OIjxw4ADnn38+tbW1LF++nE6dOp12ThGRtkZjc+sem4/H398fgNLSUqB+Nn5RURFXXXUVeXl5jpubmxtDhgxh2bJlxz1eSkoKu3bt4g9/+AP5+fmOx5eXlzNy5EiWL1+O3W5v8Jjf/i7OPfdc8vPzKSkpAf7Xc/3TTz896rFHfPjhhyQnJ9OjR48GuY+0aD1Rbmlf1M5FxMkGDx58zJOvkJCQE7YJmTVrFhdffDHdunWjd+/ejBkzhmuuueakPmTs27eP2NhYx8nnEcn
"text/plain": [
"<Figure size 1500x1000 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
" \n",
"# Выбираем столбцы для очистки\n",
"columns_to_clean = ['HP', 'Attack', 'Defense']\n",
"\n",
"# Функция для удаления выбросов\n",
"def remove_outliers(df, columns):\n",
" for col in columns:\n",
" Q1 = df[col].quantile(0.25)\n",
" Q3 = df[col].quantile(0.75)\n",
" IQR = Q3 - Q1\n",
" lower_bound = Q1 - 1.5 * IQR\n",
" upper_bound = Q3 + 1.5 * IQR\n",
" \n",
" # Удаляем строки, содержащие выбросы\n",
" df = df[(df[col] >= lower_bound) & (df[col] <= upper_bound)]\n",
" \n",
" return df\n",
"\n",
"# Удаляем выбросы\n",
"df_cleaned = remove_outliers(df, columns_to_clean)\n",
"\n",
"# Выводим количество удаленных строк\n",
"print(f\"Количество удаленных строк: {len(df) - len(df_cleaned)}\")\n",
"\n",
"df = df_cleaned\n",
"\n",
"# Выбираем столбцы для анализа\n",
"columns_to_check = ['HP', 'Attack', 'Defense']\n",
"\n",
"# Функция для подсчета выбросов\n",
"def count_outliers(df, columns):\n",
" outliers_count = {}\n",
" for col in columns:\n",
" Q1 = df[col].quantile(0.25)\n",
" Q3 = df[col].quantile(0.75)\n",
" IQR = Q3 - Q1\n",
" lower_bound = Q1 - 1.5 * IQR\n",
" upper_bound = Q3 + 1.5 * IQR\n",
" \n",
" # Считаем количество выбросов\n",
" outliers = df[(df[col] < lower_bound) | (df[col] > upper_bound)]\n",
" outliers_count[col] = len(outliers)\n",
" \n",
" return outliers_count\n",
"\n",
"# Подсчитываем выбросы\n",
"outliers_count = count_outliers(df, columns_to_check)\n",
"\n",
"# Выводим количество выбросов для каждого столбца\n",
"for col, count in outliers_count.items():\n",
" print(f\"Количество выбросов в столбце '{col}': {count}\")\n",
" \n",
"\n",
"# Создаем гистограммы\n",
"plt.figure(figsize=(15, 10))\n",
"for i, col in enumerate(columns_to_clean, 1):\n",
" plt.subplot(2, 3, i)\n",
" sns.histplot(df[col], kde=True)\n",
" plt.title(f'Histogram of {col}')\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Проверка на пропущенные значения"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Количество пропущенных значений в каждом столбце:\n",
"Image 0\n",
"Index 0\n",
"Name 0\n",
"Type 1 0\n",
"Type 2 526\n",
"Total 0\n",
"HP 0\n",
"Attack 0\n",
"Defense 0\n",
"SP. Atk. 0\n",
"SP. Def 0\n",
"Speed 0\n",
"dtype: int64\n"
]
}
],
"source": [
"import pandas as pd\n",
"\n",
"# Проверка на пропущенные значения\n",
"missing_values = df.isnull().sum()\n",
"\n",
"# Вывод результатов\n",
"print(\"Количество пропущенных значений в каждом столбце:\")\n",
"print(missing_values)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"В датасете присутствуют пропущенные значения. Удалим их."
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Количество пропущенных значений в каждом столбце после удаления:\n",
"Image 0\n",
"Index 0\n",
"Name 0\n",
"Type 1 0\n",
"Type 2 0\n",
"Total 0\n",
"HP 0\n",
"Attack 0\n",
"Defense 0\n",
"SP. Atk. 0\n",
"SP. Def 0\n",
"Speed 0\n",
"dtype: int64\n"
]
}
],
"source": [
"# Удаление пропущенных значений в столбце 'Type 2'\n",
"df = df.dropna(subset=['Type 2'])\n",
"\n",
"# Проверка на пропущенные значения после удаления\n",
"missing_values_after_drop = df.isnull().sum()\n",
"\n",
"# Вывод результатов после удаления\n",
"print(\"\\nКоличество пропущенных значений в каждом столбце после удаления:\")\n",
"print(missing_values_after_drop)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Пропущенные значения удалены. Сделаем разбиение для выборки"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Размер обучающей выборки: (378, 11) (378,)\n",
"Размер контрольной выборки: (126, 11) (126,)\n",
"Размер тестовой выборки: (126, 11) (126,)\n"
]
}
],
"source": [
"import pandas as pd\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"# Разделение на признаки (X) и целевую переменную (y)\n",
"# Предположим, что 'Total' - это целевая переменная\n",
"X = df.drop(columns=['Total'])\n",
"y = df['Total']\n",
"\n",
"# Разбиение на обучающую и остальную выборку (60% обучающая, 40% остальная)\n",
"X_train, X_rem, y_train, y_rem = train_test_split(X, y, train_size=0.6, random_state=42)\n",
"\n",
"# Разбиение остальной выборки на контрольную и тестовую (50% контрольная, 50% тестовая)\n",
"X_valid, X_test, y_valid, y_test = train_test_split(X_rem, y_rem, test_size=0.5, random_state=42)\n",
"\n",
"# Вывод размеров выборок\n",
"print(\"Размер обучающей выборки:\", X_train.shape, y_train.shape)\n",
"print(\"Размер контрольной выборки:\", X_valid.shape, y_valid.shape)\n",
"print(\"Размер тестовой выборки:\", X_test.shape, y_test.shape)"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Анализ сбалансированности выборки:\n",
"\n",
"Обучающая выборка:\n",
"count 378.000000\n",
"mean 462.941799\n",
"std 116.093563\n",
"min 185.000000\n",
"25% 377.750000\n",
"50% 485.000000\n",
"75% 535.000000\n",
"max 700.000000\n",
"Name: Total, dtype: float64\n",
"\n",
"Контрольная выборка:\n",
"count 126.000000\n",
"mean 455.753968\n",
"std 102.380599\n",
"min 198.000000\n",
"25% 402.000000\n",
"50% 478.000000\n",
"75% 520.000000\n",
"max 700.000000\n",
"Name: Total, dtype: float64\n",
"\n",
"Тестовая выборка:\n",
"count 126.000000\n",
"mean 462.547619\n",
"std 110.064680\n",
"min 205.000000\n",
"25% 362.500000\n",
"50% 485.000000\n",
"75% 530.000000\n",
"max 680.000000\n",
"Name: Total, dtype: float64\n"
]
}
],
"source": [
"import pandas as pd\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"# Разделение на признаки (X) и целевую переменную (y)\n",
"# Предположим, что 'Total' - это целевая переменная\n",
"X = df.drop(columns=['Total'])\n",
"y = df['Total']\n",
"\n",
"# Разбиение на обучающую и остальную выборку (60% обучающая, 40% остальная)\n",
"X_train, X_rem, y_train, y_rem = train_test_split(X, y, train_size=0.6, random_state=42)\n",
"\n",
"# Разбиение остальной выборки на контрольную и тестовую (50% контрольная, 50% тестовая)\n",
"X_valid, X_test, y_valid, y_test = train_test_split(X_rem, y_rem, test_size=0.5, random_state=42)\n",
"\n",
"# Функция для анализа сбалансированности выборки\n",
"def analyze_balance(y_train, y_valid, y_test):\n",
" print(\"Анализ сбалансированности выборки:\")\n",
" \n",
" # Описание для обучающей выборки\n",
" print(\"\\nОбучающая выборка:\")\n",
" print(y_train.describe())\n",
" \n",
" # Описание для контрольной выборки\n",
" print(\"\\nКонтрольная выборка:\")\n",
" print(y_valid.describe())\n",
" \n",
" # Описание для тестовой выборки\n",
" print(\"\\nТестовая выборка:\")\n",
" print(y_test.describe())\n",
"\n",
"# Анализ сбалансированности выборки\n",
"analyze_balance(y_train, y_valid, y_test)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Выборка сбалансирована"
]
2024-10-11 19:51:41 +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
}