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

777 lines
347 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": 35,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Размер обучающей выборки: (433, 8)\n",
"Размер контрольной выборки: (145, 8)\n",
"Размер тестовой выборки: (145, 8)\n"
]
}
],
"source": [
"import pandas as pd\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"# Разделение на признаки (X) и целевую переменную (y)\n",
"X = df.drop('Insulin', axis=1)\n",
"y = df['Insulin']\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": "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": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Index(['summary', 'city', 'state', 'date_time', 'shape', 'duration', 'stats',\n",
" 'report_link', 'text', 'posted', 'city_latitude', 'city_longitude'],\n",
" dtype='object')\n"
]
}
],
"source": [
"import pandas as pd \n",
"df = pd.read_csv(\"..//static//csv//nuforc_reports.csv\")\n",
"print(df.columns)"
]
}
],
"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
}