901 lines
363 KiB
Plaintext
Raw Normal View History

2024-12-21 15:33:58 +04:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Объекты вокруг земли\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Проблемная область: космические объекты и их угроза для Земли\n",
"\n",
"Объект наблюдения: астероиды и другие малые тела Солнечной системы\n",
"\n",
"Атрибуты: \n",
"1. id: Идентификатор объекта.\n",
"2. name: Название астероида.\n",
"3. est_diameter_min: Оценка минимального диаметра астероида. \n",
"4. est_diameter_max: Оценка максимального диаметра астероида.\n",
"5. relative_velocity: Относительная скорость объекта по отношению к Земле.\n",
"6. miss_distance: Расстояние, на котором объект пройдет мимо Земли.\n",
"7. orbiting_body: Указывает, вокруг какого тела объект может вращаться или к которому он относится. \n",
"8. sentry_object: Указывает, был ли объект зарегистрирован в системе мониторинга угроз (например, в системе Sentry NASA). (Да/Нет)\n",
"9. absolute_magnitude: Абсолютная величина объекта.\n",
"10. hazardous: Указывает, представляет ли объект опасность для Земли. (Да/Нет)\n",
"\n",
"Пример бизнес-цели: \n",
"\n",
" 1. Разработка и продажа страховых продуктов для космических рисков. Цель технического проекта: разработка системы оценки рисков и ценообразования для страховых продуктов, защищающих от космических угроз.\n",
"\n",
" 2. Разработка и продажа технологий для мониторинга и предотвращения космических угроз. Цель технического проекта: создание системы мониторинга и прогнозирования траекторий небесных тел для предотвращения космических угроз.\n",
"\n",
" 3. Образовательные программы и сервисы. Цель технического проекта: разработка интерактивных образовательных материалов и сервисов, основанных на данных о небесных телах.\n",
"\n",
"Актуальность: Исследования астероидов и разработка технологий для их отклонения не только помогают защитить Землю от потенциальных угроз, но и стимулируют научные открытия в различных областях, включая астрономию, физику, инженерию и образование. Эта тема имеет важное значение для будущего нашей планеты и человечества в целом."
]
},
{
"cell_type": "code",
"execution_count": 52,
"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(\"data/neo.csv\")\n",
"print(df.columns)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Проверяем на выбросы"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABdAAAAISCAYAAADMTO2gAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdeXhU5fn/8ffMJJmsk5CQlYQQtrAFUESIC6BQIqKtilutIq7FQlvUqsVaFe1XrC1Sf3VtbcEKVMFdUCGsLoAgQggECFvYs5B9T2bm/P6ImTImQAIkk4TP67rmInPOM+fc52TIM+ee59yPyTAMAxERERERERERERERcWP2dAAiIiIiIiIiIiIiIm2REugiIiIiIiIiIiIiIo1QAl1EREREREREREREpBFKoIuIiIiIiIiIiIiINEIJdBERERERERERERGRRiiBLiIiIiIiIiIiIiLSCCXQRUREREREREREREQaoQS6iIiIiIiIiIiIiEgjlEAXEREREREREREREWmEEujSLnTr1o1JkyZ5OowO7y9/+Qvdu3fHYrEwePDgFt1XS/xOJ02aRLdu3c7pNj1t7ty5mEwmsrKyWmT7Tz/9NCaTqUW2LSJyMurXW0dr9est3VedCZPJxNNPP+163hZjFBE5U+pHW8e57kcnTZpEYGDg2QfWDFlZWZhMJubOnduq+z1ftPb19I8/30jrUQJdWl39Bcx3333X6PpRo0YxYMCAs97PZ599pj8szbBs2TIeffRRLr30UubMmcNzzz3n6ZAadfToUZ5++mm2bNni6VA6rOeee46PPvrI02GISDuhfr1tai/9eltWUVHB008/zerVqz0dioh0YOpH2yb1o+oHz5SupzsmJdClXdi1axf//Oc/m/Wazz77jBkzZrRQRB3PypUrMZvN/Otf/2LixIlcffXVng6pUUePHmXGjBmNJtD/+c9/smvXrtYPqh174oknqKysdFumDl9EWpr69ZbXmv36HXfcQWVlJfHx8S22j7N1JjFWVFQwY8YMJQ5EpM1RP9ry2sv1cUtSP3h6up4+fyiBLu2C1WrF29vb02E0S3l5uadDaJbc3Fz8/Pzw8fE5o9dXVFSc44iaz9vbG6vV6ukw2hUvLy98fX09HYaInGfUr7e8s+3Xm8NiseDr69umS4K1hxhFRJpK/WjLa81+VNovXU+fP5RAl3bhxzXeamtrmTFjBr169cLX15ewsDAuu+wyUlNTgbraYq+88gpQVyOq/lGvvLychx9+mLi4OKxWK4mJifz1r3/FMAy3/VZWVvKb3/yGzp07ExQUxE9/+lOOHDnSoO5Ufd2rjIwMbrvtNjp16sRll10GwNatW5k0aRLdu3fH19eXqKgo7r77bvLz8932Vb+NzMxMbr/9doKDgwkPD+ePf/wjhmFw6NAhfvazn2Gz2YiKimLWrFlNOnd2u51nn32WHj16YLVa6datG48//jjV1dWuNiaTiTlz5lBeXu46V6eqkVZ/G+GmTZsYMWIE/v7+PP744wBUV1fz1FNP0bNnT6xWK3FxcTz66KNu+2tMQUEBv/vd70hKSiIwMBCbzca4ceNIS0tztVm9ejVDhw4F4K677moQ64k10GtrawkNDeWuu+5qsK+SkhJ8fX353e9+51p2pnGf6K9//Ssmk4kDBw40WDd9+nR8fHwoLCx0Lfv222+56qqrCA4Oxt/fn5EjR/LNN980aV+vvvoq/fv3x2q1EhMTw5QpUygqKmrQ7ttvv+Xqq6+mU6dOBAQEMHDgQF566SXX+h/XbDOZTJSXl/PWW2+5zu+kSZNYtWoVJpOJDz/8sME+FixYgMlkYt26dU2KXURE/Xrb7Ne3bt3KyJEj8ff3p2fPnrz33nsArFmzhmHDhuHn50diYiLLly93e31j9cW/++47UlJS6Ny5M35+fiQkJHD33Xe7ve6dd95hyJAhBAUFYbPZSEpKcuujmqK6upoHH3yQ8PBw1+/08OHDDdo1N8asrCzCw8MBmDFjhus81r9Pmvs+2LNnD5MmTSIkJITg4GDuuuuuRgcfzJs3j4svvhh/f386derEiBEjWLZsmVubzz//nMsvv5yAgACCgoIYP34827dvb9Z5E5H2Tf1o2+pHv/rqK2666Sa6du3qupZ88MEHG4xMrrdv3z5SUlIICAggJiaGZ555psG5bkofuW/fPm666SZCQ0Px9/dn+PDhLFmy5LTnYNSoUYwaNarB8hOvp0/XDwLs3LmTG2+8kdDQUHx9fbnooov45JNPTrv/HzOZTEydOpVFixbRr18//Pz8SE5OJj09HYA33niDnj174uvry6hRoxrMZ9Kc81+/D19fXwYMGMCHH37YYC61+rrxf/3rX/nHP/7heq8MHTqUjRs3um2vqdfTPz6/p9oGNP3zDcCRI0e4++67iYyMxGq10r9/f/7973+f7HTLGfLydABy/iouLub48eMNltfW1p72tU8//TQzZ87k3nvv5eKLL6akpITvvvuO77//np/85Cf88pe/5OjRo6SmpvL222+7vdYwDH7605+yatUq7rnnHgYPHszSpUt55JFHOHLkCLNnz3a1nTRpEgsXLuSOO+5g+PDhrFmzhvHjx580rptuuolevXrx3HPPuTrA1NRU9u3bx1133UVUVBTbt2/nH//4B9u3b2f9+vUN/lDecsst9O3bl+eff54lS5bwpz/9idDQUN544w2uvPJK/vznPzN//nx+97vfMXToUEaMGHHKc3Xvvffy1ltvceONN/Lwww/z7bffMnPmTHbs2OFKhr799tv84x//YMOGDbz55psAXHLJJafcbn5+PuPGjePWW2/l9ttvJzIyEqfTyU9/+lO+/vpr7r//fvr27Ut6ejqzZ88mMzPzlLcx7du3j48++oibbrqJhIQEcnJyeOONNxg5ciQZGRnExMTQt29fnnnmGZ588knuv/9+Lr/88pPG6u3tzfXXX88HH3zAG2+84TZy4KOPPqK6uppbb70V4KziPtHNN9/Mo48+ysKFC3nkkUfc1i1cuJCxY8fSqVMnoO6WwHHjxjFkyBCeeuopzGYzc+bM4corr+Srr77i4osvPul+nn76aWbMmMGYMWN44IEH2LVrF6+99hobN27km2++cY1GSU1N5ZprriE6Oprf/va3REVFsWPHDhYvXsxvf/vbRrf99ttvu/5f3X///QD06NGD4cOHExcXx/z587n++uvdXjN//nx69OhBcnJyk86TiHRM6tfbd79eWFjINddcw6233spNN93Ea6+9xq233sr8+fOZNm0akydP5rbbbuMvf/kLN954I4cOHSIoKKjRbeXm5jJ27FjCw8P5/e9/T0hICFlZWXzwwQeuNqmpqfz85z9n9OjR/PnPfwZgx44dfPPNNyfto052PubNm8dtt93GJZdcwsqVK0/5O21qjOHh4bz22ms88MADXH/99dxwww0ADBw40BV/c94HN998MwkJCcycOZPvv/+eN998k4iICNexQ12C4umnn+aSSy7hmWeewcfHh2+//ZaVK1cyduxYoO53e+edd5KSksKf//xnKioqeO2117jsssvYvHlzh5tMXeR8on60/fajixYtoqKiggceeICwsDA2bNjA3//+dw4fPsyiRYvc2jocDq666iqGDx/OCy+8wBdffMFTTz2F3W7nmWeecZ2j0/WROTk5XHLJJVRUVPCb3/yGsLAw3nrrLX7605/y3nvvNbhma67T9YPbt2/n0ksvpUuXLvz+978nICCAhQsXct111/H+++83e/9fffUVn3zyCVOmTAFg5syZXHPNNTz66KO8+uqr/OpXv6KwsJAXXniBu+++m5UrV7pe29Tzv2TJEm655RaSkpKYOXMmhYWF3HPPPXTp0qXRmBYsWEBpaSm//OUvMZlMvPDCC9xwww3s27fvpHeAnOx6urma+vkmJyeH4cOHu76ECA8P5/PPP+eee+6hpKSEadOmNXvfchKGSCubM2eOAZzy0b9/f7fXxMfHG3feeafr+aBBg4zx48efcj9TpkwxGnuLf/TRRwZg/OlPf3JbfuONNxomk8nYs2ePYRiGsWnTJgM
"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_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",
"plt.figure(figsize=(15, 10))\n",
"for i, col in enumerate(columns_to_check, 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": 54,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Количество выбросов в столбце 'relative_velocity': 1\n",
"Количество выбросов в столбце 'absolute_magnitude': 0\n",
"Количество удаленных строк: 1\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABc8AAAJOCAYAAABhpf9JAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3RUdf7/8efMpHfSA4QQCL0IhCpSFCUIihXFguAqigu6oKuuuj+VtXf9qujaUBHslSIISJEmEHqHQOjpvZe5vz9iZglJIECSm8Drcc4czb2fufd1Zybhzns+874WwzAMRERERERERERERETEwWp2ABERERERERERERGRhkbFcxERERERERERERGRk6h4LiIiIiIiIiIiIiJyEhXPRUREREREREREREROouK5iIiIiIiIiIiIiMhJVDwXERERERERERERETmJiuciIiIiIiIiIiIiIidR8VxERERERERERERE5CQqnouIiIiIiIiIiIiInETFc5ELQMuWLRk3bpzZMc57r7zyCq1atcJms9GtW7d63ffTTz+NxWKp1W0uXboUi8XC0qVLa3W7Zqjr3wGLxcLTTz9dZ9s/kd1up3Pnzjz33HNnvY3z6W9CVa/T0aNHc9NNN5kXSkREzlvn07+hDVldnFd/+umnWCwW1q9fXyvbqym9ZmpHfb83GTx4MIMHD6717Q4fPpzx48ef9f3rKpcZ4uPjsVgsfPrpp45l//rXv+jTp495oUSqoOK5SCNzupO+wYMH07lz53Pez7x58+qtGHg++O2333jkkUfo378/06dP5/nnn6927Lhx47BYLI6bq6srbdu25cknn6SgoKAeU5eZNm1ahRMWMz3wwANYLBb27dtX7ZgnnngCi8XCli1b6jHZmVm1ahVPP/00GRkZtb7tL7/8ksOHDzNp0qRK6+Li4rj33ntp1aoVbm5u+Pj40L9/f9566y3y8/NrPUtD9eijj/L999+zefNms6OIiEgDpvPqhulMzqtPdNNNN2GxWHj00UfrOGH9qavz9MGDB2OxWGjTpk2V6xcuXOh4r/Ldd9/V+v5ry6xZs3jzzTfNjlFjK1eu5LfffqvyNZqYmMg///lP2rdvj4eHB56enkRHR/Pss8/WyXuKhmry5Mls3ryZX375xewoIg5OZgcQkbq3e/durNYz+6xs3rx5vPvuuzrRr6Hff/8dq9XKxx9/jIuLy2nHu7q68tFHHwGQmZnJzz//zDPPPENcXBwzZ86s67gVTJs2jcDAwEozYgYOHEh+fn6Njqe23Hbbbbz99tvMmjWLJ598ssoxX375JV26dKFr1671lut08vPzcXL63z+pq1atYurUqYwbNw4/P79a3dcrr7zC6NGj8fX1rbB87ty5jBo1CldXV+644w46d+5MUVERK1as4OGHH2b79u188MEHtZqloerevTs9e/bktdde4/PPPzc7joiInEd0Xl33zvS8GiArK4vZs2fTsmVLvvzyS1588cVa/1amGao7T68Nbm5u7Nu3j7Vr19K7d+8K62bOnImbm5spE3uqU9V7k1mzZrFt2zYmT55sXrAz8MorrzBkyBCioqIqLF+3bh3Dhw8nJyeH22+/nejoaADWr1/Piy++yPLly/ntt9/MiFzvQkNDueaaa3j11VcZOXKk2XFEAM08F7kguLq64uzsbHaMM5Kbm2t2hDOSlJSEu7t7jU/wnZycuP3227n99tuZOHEiCxYsoG/fvnz55ZckJibWcdqasVqtuLm5nfEbxHPRp08foqKi+PLLL6tcv3r1ag4cOMBtt91Wb5lqws3NrULxvK5s3LiRzZs3V2pJcuDAAUaPHk1ERAQ7duzgrbfeYvz48UycOJEvv/ySHTt20KlTpzrP15DcdNNN/PDDD+Tk5JgdRUREziM6r657Z3peDfD9999TWlrKJ598wuHDh1m+fHkdJjw/tG7dmnbt2lU67y4oKODHH39kxIgRJiWrmhnvTWpTUlISc+fOrXQen5GRwXXXXYfNZmPjxo18+OGHTJgwgQkTJvDRRx8RFxfHwIEDTUptjptuuokVK1awf/9+s6OIACqei1wQTu6zV1xczNSpU2nTpg1ubm4EBARwySWXsHDhQqCsrci7774LUKG9SLnc3FweeughwsPDcXV1pV27drz66qsYhlFhv/n5+TzwwAMEBgbi7e3NyJEjOXr0aKX+0OX9unfs2MGtt95KkyZNuOSSSwDYsmUL48aNc7ShCA0N5W9/+xupqakV9lW+jT179nD77bfj6+tLUFAQ/+///T8Mw+Dw4cNcc801+Pj4EBoaymuvvVajx66kpIRnnnmG1q1b4+rqSsuWLXn88ccpLCx0jLFYLEyfPp3c3FzHY3WmX6+0WCxccsklGIZR6STh119/ZcCAAXh6euLt7c2IESPYvn37abc5ffp0LrvsMoKDg3F1daVjx4689957Fca0bNmS7du3s2zZMkf28h56J/cVnDRpEl5eXuTl5VXa1y233EJoaCilpaXnnPu2225j165dbNiwodK6WbNmYbFYuOWWWwAoLCzkqaeeIioqCldXV8LDw3nkkUcqPD/V2b9/P6NGjcLf3x8PDw/69u3L3LlzK40rKCjg6aefpm3btri5uREWFsb1119PXFycY8yJr+mnn36ahx9+GIDIyEjH4xofH8+gQYO46KKLqszTrl07YmJiTpn5p59+wsXFpdIJ9Msvv0xOTg4ff/wxYWFhle4XFRXFP/7xj1NuOyMjg8mTJzt+r6OionjppZew2+0Vxr366qtcfPHFBAQE4O7uTnR0dJVf57VYLEyaNImffvqJzp074+rqSqdOnZg/f36lsUePHuVvf/sbISEhjnGffPJJpXFHjhzh2muvxdPTk+DgYKZMmVLtc33FFVeQm5vr+LsmIiJSG3Re3TDPq2fOnMkVV1zBpZdeSocOHU75Tc68vDzuvfdeAgIC8PHx4Y477iA9Pb3CmPXr1xMTE0NgYCDu7u5ERkbyt7/9rcKYmj53J6vuWkXlbYTi4+OBU5+nQ83P3U7llltu4euvv65wn9mzZ5OXl1fl9WMOHjzI3//+d9q1a4e7uzsBAQGMGjXKkflEW7ZsYdCgQbi7u9O8eXOeffZZpk+fXuEYy4/zqquuYsWKFfTu3Rs3NzdatWpV6duDJ783GTx4MHPnzuXgwYOOx6dly5ZVPpbVbaPcBx98QOvWrXF3d6d379788ccfVT5e5/LeY+7cuZSUlHD55ZdXWP7f//6Xo0eP8vrrr9O+fftK9wsJCeHf//73Kbdd01w1eX8INX9OoOavw4yMDMaNG4evry9+fn6MHTu22nY05Y/Rzz//fMrjFqkvatsi0khlZmaSkpJSaXlxcfFp7/v000/zwgsvcPfdd9O7d2+ysrJYv349GzZs4IorruDee+/l2LFjLFy4kBkzZlS4r2EYjBw5kiVLlnDXXXfRrVs3FixYwMMPP8zRo0d54403HGPHjRvHN998w5gxY+jbty/Lli075QyGUaNG0aZNG55//nnHSefChQvZv38/d955J6GhoY7WE9u3b2fNmjWVTjxvvvlmOnTowIsvvsjcuXN59tln8ff357///S+XXXYZL730EjNnzuSf//wnvXr1Ou2n+HfffTefffYZN954Iw899BB//vknL7zwAjt37uTHH38EYMaMGXzwwQesXbvW0Yrl4osvPu3zcLLyk7smTZo4ls2YMYOxY8cSExPDSy+9RF5eHu+99x6XXHIJGzdudJwgVuW9996jU6dOjBw5EicnJ2bPns3f//537HY7EydOBODNN9/k/vvvx8vLiyeeeAIoO0Grys0338y7777raA9SLi8vj9mzZzNu3DhsNts5577tttuYOnUqs2bNokePHo7lpaWlfPPNNwwYMIAWLVpgt9sZOXIkK1as4J577qFDhw5s3bqVN954gz179vDTTz9Vu4/ExEQuvvhi8vLyeOCBBwgICOCzzz5j5MiRfPfdd1x33XWOfV511VUsXryY0aNH849//IPs7GwWLlzItm3baN26daVtX3/99ezZs4cvv/ySN954g8DAQACCgoI
"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",
"# Выбираем столбцы для очистки\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(\"data//neo.csv\", index=False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Можно заметить, что выбросов стало меньше"
]
},
{
"cell_type": "code",
"execution_count": 55,
"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": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Размер обучающей выборки: (53307, 9)\n",
"Размер контрольной выборки: (17769, 9)\n",
"Размер тестовой выборки: (17769, 9)\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)\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": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Распределение классов в обучающей выборке:\n",
"hazardous\n",
"False 0.906448\n",
"True 0.093552\n",
"Name: proportion, dtype: float64\n",
"\n",
"Распределение классов в контрольной выборке:\n",
"hazardous\n",
"False 0.90641\n",
"True 0.09359\n",
"Name: proportion, dtype: float64\n",
"\n",
"Распределение классов в тестовой выборке:\n",
"hazardous\n",
"False 0.906466\n",
"True 0.093534\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('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",
"# Функция анализирует и выводит распределение классов (например, классов опасных и неопасных объектов) для каждой из выборок\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",
"1. Pregnancies: Число беременностей у пациентки.\n",
"2. Glucose: Уровень глюкозы в крови перед тестированием.\n",
"3. BloodPressure: Артериальное давление.\n",
"4. SkinThickness: Толщина кожи в области трицепса. Этот показатель используется для оценки жировых отложений.\n",
"5. Insulin: Уровень инсулина в крови.\n",
"6. BMI (Body Mass Index): Индекс массы тела. Это показатель, рассчитываемый на основе веса и рост, который помогает определить избыточный вес или ожирение.\n",
"7. DiabetesPedigreeFunction: Функция родословной диабета. Этот индекс отражает семейную историю диабета и помогает указать на генетическую предрасположенность к заболеванию.\n",
"8. Age: Возраст пациентки. Вероятность развития диабета увеличивается с возрастом.\n",
"9. Outcome: Результат теста на диабет (0 — отсутствие диабета, 1 — наличие диабета).\n",
"\n",
"Пример бизнес-цели: \n",
"\n",
" 1. Повышение эффективности скрининга диабета. Цель технического проекта: Разработать и обучить модель машинного обучения с точностью предсказания не менее 85% для автоматизированного скрининга диабета на основе данных датасета \"Диабет у индейцев Пима\".\n",
"\n",
" 2. Снижение медицинских расходов. Цель технического проекта: Оптимизировать модель прогнозирования таким образом, чтобы минимизировать количество ложноотрицательных результатов (пациенты с диабетом, которые не были выявлены), что позволит снизить затраты на лечение осложнений.\n",
"\n",
" 3. Повышение качества жизни пациентов. Цель технического проекта: Разработать интерфейс для модели, который будет предоставлять пациентам персонализированные рекомендации по профилактике и лечению диабета на основе их индивидуальных рисков, определенных моделью."
]
},
{
"cell_type": "code",
"execution_count": 58,
"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(\"data//diabetes.csv\")\n",
"print(df.columns)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Проверяем на наличие выбросов"
]
},
{
"cell_type": "code",
"execution_count": null,
"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(\"data//diabetes.csv\")\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(columns_to_check, 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": null,
"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",
"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_clean)\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",
"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": 61,
"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": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Размер обучающей выборки: 433\n",
"Размер контрольной выборки: 145\n",
"Размер тестовой выборки: 145\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)\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)\n",
"\n",
"# Вывод размеров выборок\n",
"print(\"Размер обучающей выборки:\", X_train.shape[0])\n",
"print(\"Размер контрольной выборки:\", X_val.shape[0])\n",
"print(\"Размер тестовой выборки:\", X_test.shape[0])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Разбивка на выборки сделана, проведем проверку на сбалансированность выборок"
]
},
{
"cell_type": "code",
"execution_count": null,
"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)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Выборки относительно сбалансированы, но не идеально. Сделаем приращение данных методом выборки с избытком (oversampling)"
]
},
{
"cell_type": "code",
"execution_count": null,
"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",
"# Разделение на признаки (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": [
"## Магазины"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Проблемная область: Магазины (Розничная торговля и управление запасами)\n",
"\n",
"Объект наблюдения: Розничные магазины и их параметры\n",
"\n",
"Атрибуты:\n",
"\n",
"1. Store ID: Идентификатор магазина.\n",
"2. Store_Area: Площадь магазина.\n",
"3. Items_Available: Общее количество доступных товаров в магазине.\n",
"4. Daily_Customer_Count: Количество клиентов, посещающих магазин ежедневно.\n",
"5. Store_Sales: Общая сумма продаж магазина за день.\n",
"\n",
"Пример бизнес-цели: \n",
"\n",
" 1. Оптимизация управления запасами: Разработка системы управления запасами на основе анализа данных о ежедневном потоке клиентов и продажах. Это позволит сократить издержки на хранение и улучшить уровень обслуживания.\n",
"\n",
" 2. Анализ покупательского поведения: Создание аналитических инструментов для мониторинга поведения клиентов, что позволит адаптировать ассортимент и повысить лояльность покупателей.\n",
"\n",
" 3. Маркетинговые стратегии: Разработка таргетированных маркетинговых кампаний, основанных на данных о продажах и количестве клиентов, для увеличения прибыли магазина.\n",
"\n",
" 4. Расширение сети магазинов: Проведение глубокого анализа показателей рентабельности и клиентского потока для принятия решений о расширении или открытии новых магазин с учетом полученных данных."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}