diff --git a/lab2/lab2.ipynb b/lab2/lab2.ipynb
index 357c70e..d29f23c 100644
--- a/lab2/lab2.ipynb
+++ b/lab2/lab2.ipynb
@@ -36,16 +36,23 @@
},
{
"cell_type": "code",
- "execution_count": 3,
+ "execution_count": 1,
"metadata": {},
"outputs": [
{
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Index(['Unnamed: 0', 'carat', 'cut', 'color', 'clarity', 'depth', 'table',\n",
- " 'price', 'x', 'y', 'z'],\n",
- " dtype='object')\n"
+ "ename": "KeyboardInterrupt",
+ "evalue": "",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
+ "Cell \u001b[1;32mIn[1], line 3\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mpd\u001b[39;00m\n\u001b[1;32m----> 3\u001b[0m df \u001b[38;5;241m=\u001b[39m \u001b[43mpd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread_csv\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m../data/Diamonds-Prices.csv\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[0;32m 4\u001b[0m \u001b[38;5;28mprint\u001b[39m(df\u001b[38;5;241m.\u001b[39mcolumns)\n",
+ "File \u001b[1;32mc:\\Users\\bocchanskyy\\source\\repos\\MAI_PIbd-33_Volkov_NA\\.venv\\Lib\\site-packages\\pandas\\io\\parsers\\readers.py:1026\u001b[0m, in \u001b[0;36mread_csv\u001b[1;34m(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, date_format, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options, dtype_backend)\u001b[0m\n\u001b[0;32m 1013\u001b[0m kwds_defaults \u001b[38;5;241m=\u001b[39m _refine_defaults_read(\n\u001b[0;32m 1014\u001b[0m dialect,\n\u001b[0;32m 1015\u001b[0m delimiter,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 1022\u001b[0m dtype_backend\u001b[38;5;241m=\u001b[39mdtype_backend,\n\u001b[0;32m 1023\u001b[0m )\n\u001b[0;32m 1024\u001b[0m kwds\u001b[38;5;241m.\u001b[39mupdate(kwds_defaults)\n\u001b[1;32m-> 1026\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_read\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfilepath_or_buffer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwds\u001b[49m\u001b[43m)\u001b[49m\n",
+ "File \u001b[1;32mc:\\Users\\bocchanskyy\\source\\repos\\MAI_PIbd-33_Volkov_NA\\.venv\\Lib\\site-packages\\pandas\\io\\parsers\\readers.py:620\u001b[0m, in \u001b[0;36m_read\u001b[1;34m(filepath_or_buffer, kwds)\u001b[0m\n\u001b[0;32m 617\u001b[0m _validate_names(kwds\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnames\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m))\n\u001b[0;32m 619\u001b[0m \u001b[38;5;66;03m# Create the parser.\u001b[39;00m\n\u001b[1;32m--> 620\u001b[0m parser \u001b[38;5;241m=\u001b[39m \u001b[43mTextFileReader\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfilepath_or_buffer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwds\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 622\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m chunksize \u001b[38;5;129;01mor\u001b[39;00m iterator:\n\u001b[0;32m 623\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m parser\n",
+ "File \u001b[1;32mc:\\Users\\bocchanskyy\\source\\repos\\MAI_PIbd-33_Volkov_NA\\.venv\\Lib\\site-packages\\pandas\\io\\parsers\\readers.py:1620\u001b[0m, in \u001b[0;36mTextFileReader.__init__\u001b[1;34m(self, f, engine, **kwds)\u001b[0m\n\u001b[0;32m 1617\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhas_index_names\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m kwds[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhas_index_names\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[0;32m 1619\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles: IOHandles \u001b[38;5;241m|\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m-> 1620\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_engine \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_make_engine\u001b[49m\u001b[43m(\u001b[49m\u001b[43mf\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mengine\u001b[49m\u001b[43m)\u001b[49m\n",
+ "File \u001b[1;32mc:\\Users\\bocchanskyy\\source\\repos\\MAI_PIbd-33_Volkov_NA\\.venv\\Lib\\site-packages\\pandas\\io\\parsers\\readers.py:1898\u001b[0m, in \u001b[0;36mTextFileReader._make_engine\u001b[1;34m(self, f, engine)\u001b[0m\n\u001b[0;32m 1895\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(msg)\n\u001b[0;32m 1897\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m-> 1898\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mmapping\u001b[49m\u001b[43m[\u001b[49m\u001b[43mengine\u001b[49m\u001b[43m]\u001b[49m\u001b[43m(\u001b[49m\u001b[43mf\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1899\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m:\n\u001b[0;32m 1900\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n",
+ "File \u001b[1;32mc:\\Users\\bocchanskyy\\source\\repos\\MAI_PIbd-33_Volkov_NA\\.venv\\Lib\\site-packages\\pandas\\io\\parsers\\c_parser_wrapper.py:93\u001b[0m, in \u001b[0;36mCParserWrapper.__init__\u001b[1;34m(self, src, **kwds)\u001b[0m\n\u001b[0;32m 90\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m kwds[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdtype_backend\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mpyarrow\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[0;32m 91\u001b[0m \u001b[38;5;66;03m# Fail here loudly instead of in cython after reading\u001b[39;00m\n\u001b[0;32m 92\u001b[0m import_optional_dependency(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mpyarrow\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m---> 93\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_reader \u001b[38;5;241m=\u001b[39m \u001b[43mparsers\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mTextReader\u001b[49m\u001b[43m(\u001b[49m\u001b[43msrc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwds\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 95\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39munnamed_cols \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_reader\u001b[38;5;241m.\u001b[39munnamed_cols\n\u001b[0;32m 97\u001b[0m \u001b[38;5;66;03m# error: Cannot determine type of 'names'\u001b[39;00m\n",
+ "\u001b[1;31mKeyboardInterrupt\u001b[0m: "
]
}
],
@@ -1432,7 +1439,7 @@
},
{
"cell_type": "code",
- "execution_count": 26,
+ "execution_count": 6,
"metadata": {},
"outputs": [
{
@@ -1473,7 +1480,7 @@
},
{
"cell_type": "code",
- "execution_count": 27,
+ "execution_count": 7,
"metadata": {},
"outputs": [
{
@@ -1519,47 +1526,83 @@
],
"source": [
"import seaborn as sns\n",
+ "import matplotlib.pyplot as plt\n",
+ "\n",
"\n",
"plt.figure(figsize=(10, 6))\n",
"\n",
+ "\n",
"# Связь между возрастом и состоянием\n",
+ "\n",
"plt.subplot(2, 2, 1)\n",
+ "\n",
"sns.scatterplot(data=df, x=\"Age\", y=\"Networth\")\n",
+ "\n",
"plt.title(\"Связь между возрастом и состоянием\")\n",
+ "\n",
"plt.xlabel(\"Возраст\")\n",
+ "\n",
"plt.ylabel(\"Состояние (млрд)\")\n",
+ "\n",
"plt.show()\n",
"\n",
"\n",
+ "\n",
"# Связь между страной проживания и состоянием (топ-10 стран)\n",
+ "\n",
"plt.subplot(2, 2, 2)\n",
+ "\n",
"top_countries = df[\"Country\"].value_counts().index[:10]\n",
+ "\n",
"sns.boxplot(data=df[df[\"Country\"].isin(top_countries)], x=\"Country\", y=\"Networth\")\n",
+ "\n",
"plt.title(\"Связь между страной проживания и состоянием\")\n",
+ "\n",
"plt.xticks(rotation=90)\n",
+ "\n",
"plt.xlabel(\"Страна\")\n",
+ "\n",
"plt.ylabel(\"Состояние (млрд)\")\n",
+ "\n",
"plt.show()\n",
"\n",
"\n",
+ "\n",
"# Связь между источником дохода и состоянием (топ-10 источников дохода)\n",
+ "\n",
"plt.subplot(2, 2, 3)\n",
+ "\n",
"top_sources = df[\"Source\"].value_counts().index[:10]\n",
+ "\n",
"sns.boxplot(data=df[df[\"Source\"].isin(top_sources)], x=\"Source\", y=\"Networth\")\n",
+ "\n",
"plt.title(\"Связь между источником дохода и состоянием\")\n",
+ "\n",
"plt.xticks(rotation=90)\n",
+ "\n",
"plt.xlabel(\"Источник дохода\")\n",
+ "\n",
"plt.ylabel(\"Состояние (млрд)\")\n",
+ "\n",
"plt.show()\n",
"\n",
+ "\n",
"# Связь между отраслью и состоянием (топ-10 отраслей)\n",
+ "\n",
"plt.subplot(2, 2, 4)\n",
+ "\n",
"top_industries = df[\"Industry\"].value_counts().index[:10]\n",
+ "\n",
"sns.boxplot(data=df[df[\"Industry\"].isin(top_industries)], x=\"Industry\", y=\"Networth\")\n",
+ "\n",
"plt.title(\"Связь между отраслью и состоянием\")\n",
+ "\n",
"plt.xticks(rotation=90)\n",
+ "\n",
"plt.xlabel(\"Отрасль\")\n",
+ "\n",
"plt.ylabel(\"Состояние (млрд)\")\n",
+ "\n",
"plt.show()"
]
},
@@ -1572,7 +1615,7 @@
},
{
"cell_type": "code",
- "execution_count": 28,
+ "execution_count": 8,
"metadata": {},
"outputs": [
{
@@ -1685,7 +1728,7 @@
"max 2578.000000 219.000000 100.000000"
]
},
- "execution_count": 28,
+ "execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
@@ -1711,7 +1754,7 @@
},
{
"cell_type": "code",
- "execution_count": 30,
+ "execution_count": 9,
"metadata": {},
"outputs": [
{
@@ -1754,7 +1797,7 @@
},
{
"cell_type": "code",
- "execution_count": 32,
+ "execution_count": 10,
"metadata": {},
"outputs": [
{
@@ -1788,7 +1831,7 @@
},
{
"cell_type": "code",
- "execution_count": 33,
+ "execution_count": 11,
"metadata": {},
"outputs": [
{
@@ -1824,29 +1867,51 @@
],
"source": [
"# 1. Столбчатая диаграмма по странам\n",
+ "\n",
"plt.figure(figsize=(12, 6))\n",
+ "\n",
"sns.countplot(data=df, x=\"Country\", order=df[\"Country\"].value_counts().index)\n",
+ "\n",
"plt.title(\"Количество людей по странам\")\n",
+ "\n",
"plt.xlabel(\"Страна\")\n",
+ "\n",
"plt.ylabel(\"Количество\")\n",
+ "\n",
"plt.xticks(rotation=45)\n",
+ "\n",
"plt.show()\n",
"\n",
+ "\n",
"# 2. Столбчатая диаграмма по отраслям\n",
+ "\n",
"plt.figure(figsize=(12, 6))\n",
+ "\n",
"sns.countplot(data=df, x=\"Industry\", order=df[\"Industry\"].value_counts().index)\n",
+ "\n",
"plt.title(\"Количество людей по отраслям\")\n",
+ "\n",
"plt.xlabel(\"Отрасль\")\n",
+ "\n",
"plt.ylabel(\"Количество\")\n",
+ "\n",
"plt.xticks(rotation=45)\n",
+ "\n",
"plt.show()\n",
"\n",
+ "\n",
"# 3. Гистограмма для анализа возраста\n",
+ "\n",
"plt.figure(figsize=(10, 5))\n",
+ "\n",
"sns.histplot(df[\"Age\"], bins=30, kde=True)\n",
+ "\n",
"plt.title(\"Распределение возраста\")\n",
+ "\n",
"plt.xlabel(\"Возраст\")\n",
+ "\n",
"plt.ylabel(\"Частота\")\n",
+ "\n",
"plt.show()"
]
},
@@ -1866,7 +1931,7 @@
},
{
"cell_type": "code",
- "execution_count": 49,
+ "execution_count": 12,
"metadata": {},
"outputs": [
{
@@ -1875,7 +1940,7 @@
"((1560, 6), (520, 6), (520, 6))"
]
},
- "execution_count": 49,
+ "execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
@@ -1901,7 +1966,7 @@
},
{
"cell_type": "code",
- "execution_count": 39,
+ "execution_count": 13,
"metadata": {},
"outputs": [
{
@@ -1936,7 +2001,7 @@
" Name: Networth, dtype: float64)"
]
},
- "execution_count": 39,
+ "execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
@@ -1952,9 +2017,21 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 16,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "ename": "ImportError",
+ "evalue": "cannot import name 'SMOTEREG' from 'imblearn.over_sampling' (c:\\Users\\bocchanskyy\\source\\repos\\MAI_PIbd-33_Volkov_NA\\.venv\\Lib\\site-packages\\imblearn\\over_sampling\\__init__.py)",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[1;31mImportError\u001b[0m Traceback (most recent call last)",
+ "Cell \u001b[1;32mIn[16], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mimblearn\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mover_sampling\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m SMOTEREG\n\u001b[0;32m 2\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mimblearn\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01munder_sampling\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m RandomUnderSampler\n\u001b[0;32m 4\u001b[0m oversampler \u001b[38;5;241m=\u001b[39m SMOTEREG(random_state\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m12\u001b[39m)\n",
+ "\u001b[1;31mImportError\u001b[0m: cannot import name 'SMOTEREG' from 'imblearn.over_sampling' (c:\\Users\\bocchanskyy\\source\\repos\\MAI_PIbd-33_Volkov_NA\\.venv\\Lib\\site-packages\\imblearn\\over_sampling\\__init__.py)"
+ ]
+ }
+ ],
"source": [
"from imblearn.over_sampling import RandomOverSampler\n",
"from imblearn.under_sampling import RandomUnderSampler\n",
@@ -1980,9 +2057,9 @@
],
"metadata": {
"kernelspec": {
- "display_name": "Python (.venv)",
+ "display_name": ".venv",
"language": "python",
- "name": ".venv"
+ "name": "python3"
},
"language_info": {
"codemirror_mode": {
diff --git a/lab3/lab3.ipynb b/lab3/lab3.ipynb
new file mode 100644
index 0000000..9b892a8
--- /dev/null
+++ b/lab3/lab3.ipynb
@@ -0,0 +1,1121 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Вариант 4. Данные по инсультам"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Index(['id', 'gender', 'age', 'hypertension', 'heart_disease', 'ever_married',\n",
+ " 'work_type', 'Residence_type', 'avg_glucose_level', 'bmi',\n",
+ " 'smoking_status', 'stroke'],\n",
+ " dtype='object')\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " id | \n",
+ " gender | \n",
+ " age | \n",
+ " hypertension | \n",
+ " heart_disease | \n",
+ " ever_married | \n",
+ " work_type | \n",
+ " Residence_type | \n",
+ " avg_glucose_level | \n",
+ " bmi | \n",
+ " smoking_status | \n",
+ " stroke | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 9046 | \n",
+ " Male | \n",
+ " 67.0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " Yes | \n",
+ " Private | \n",
+ " Urban | \n",
+ " 228.69 | \n",
+ " 36.6 | \n",
+ " formerly smoked | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 51676 | \n",
+ " Female | \n",
+ " 61.0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " Yes | \n",
+ " Self-employed | \n",
+ " Rural | \n",
+ " 202.21 | \n",
+ " NaN | \n",
+ " never smoked | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 31112 | \n",
+ " Male | \n",
+ " 80.0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " Yes | \n",
+ " Private | \n",
+ " Rural | \n",
+ " 105.92 | \n",
+ " 32.5 | \n",
+ " never smoked | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 60182 | \n",
+ " Female | \n",
+ " 49.0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " Yes | \n",
+ " Private | \n",
+ " Urban | \n",
+ " 171.23 | \n",
+ " 34.4 | \n",
+ " smokes | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 1665 | \n",
+ " Female | \n",
+ " 79.0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " Yes | \n",
+ " Self-employed | \n",
+ " Rural | \n",
+ " 174.12 | \n",
+ " 24.0 | \n",
+ " never smoked | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " id gender age hypertension heart_disease ever_married \\\n",
+ "0 9046 Male 67.0 0 1 Yes \n",
+ "1 51676 Female 61.0 0 0 Yes \n",
+ "2 31112 Male 80.0 0 1 Yes \n",
+ "3 60182 Female 49.0 0 0 Yes \n",
+ "4 1665 Female 79.0 1 0 Yes \n",
+ "\n",
+ " work_type Residence_type avg_glucose_level bmi smoking_status \\\n",
+ "0 Private Urban 228.69 36.6 formerly smoked \n",
+ "1 Self-employed Rural 202.21 NaN never smoked \n",
+ "2 Private Rural 105.92 32.5 never smoked \n",
+ "3 Private Urban 171.23 34.4 smokes \n",
+ "4 Self-employed Rural 174.12 24.0 never smoked \n",
+ "\n",
+ " stroke \n",
+ "0 1 \n",
+ "1 1 \n",
+ "2 1 \n",
+ "3 1 \n",
+ "4 1 "
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import pandas as pd\n",
+ "import matplotlib.pyplot as plt\n",
+ "import seaborn as sns\n",
+ "from sklearn.model_selection import train_test_split\n",
+ "from imblearn.over_sampling import RandomOverSampler\n",
+ "from sklearn.preprocessing import StandardScaler\n",
+ "import featuretools as ft\n",
+ "import time\n",
+ "from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score\n",
+ "from sklearn.ensemble import RandomForestClassifier\n",
+ "from sklearn.model_selection import cross_val_score\n",
+ "\n",
+ "df = pd.read_csv(\"../data/healthcare-dataset-stroke-data.csv\")\n",
+ "\n",
+ "print(df.columns)\n",
+ "df.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Бизнес цели и цели технического проекта.\n",
+ "## Бизнес цели:\n",
+ "### 1. Предсказание инсульта: Разработать систему, которая сможет предсказать вероятность инсульта у пациентов на основе их медицинских и социальных данных. Это может помочь медицинским учреждениям и специалистам в более раннем выявлении пациентов с высоким риском.\n",
+ "### 2. Снижение затрат на лечение: Предупреждение инсультов у пациентов позволит снизить затраты на лечение и реабилитацию. Это также поможет улучшить качество медицинских услуг и повысить удовлетворенность пациентов.\n",
+ "### 3. Повышение эффективности профилактики: Выявление факторов риска инсульта на ранней стадии может способствовать более эффективному проведению профилактических мероприятий.\n",
+ "## Цели технического проекта:\n",
+ "### 1. Создание и обучение модели машинного обучения: Разработка модели, способной предсказать вероятность инсульта на основе данных о пациентах (например, возраст, уровень глюкозы, наличие сердечно-сосудистых заболеваний, тип работы, индекс массы тела и т.д.).\n",
+ "### 2. Анализ и обработка данных: Провести предобработку данных (очистка, заполнение пропущенных значений, кодирование категориальных признаков), чтобы улучшить качество и надежность модели.\n",
+ "### 3. Оценка модели: Использовать метрики, такие как точность, полнота и F1-мера, чтобы оценить эффективность модели и минимизировать риск ложных положительных и ложных отрицательных предсказаний."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "id 0\n",
+ "gender 0\n",
+ "age 0\n",
+ "hypertension 0\n",
+ "heart_disease 0\n",
+ "ever_married 0\n",
+ "work_type 0\n",
+ "Residence_type 0\n",
+ "avg_glucose_level 0\n",
+ "bmi 201\n",
+ "smoking_status 0\n",
+ "stroke 0\n",
+ "dtype: int64\n",
+ "\n",
+ "id False\n",
+ "gender False\n",
+ "age False\n",
+ "hypertension False\n",
+ "heart_disease False\n",
+ "ever_married False\n",
+ "work_type False\n",
+ "Residence_type False\n",
+ "avg_glucose_level False\n",
+ "bmi True\n",
+ "smoking_status False\n",
+ "stroke False\n",
+ "dtype: bool\n",
+ "\n",
+ "bmi процент пустых значений: %3.93\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(df.isnull().sum())\n",
+ "print()\n",
+ "\n",
+ "print(df.isnull().any())\n",
+ "print()\n",
+ "\n",
+ "for i in df.columns:\n",
+ " null_rate = df[i].isnull().sum() / len(df) * 100\n",
+ " if null_rate > 0:\n",
+ " print(f\"{i} процент пустых значений: %{null_rate:.2f}\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Видим пустые значения в bmi, заменяем их"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Количество пустых значений в каждом столбце после замены:\n",
+ "id 0\n",
+ "gender 0\n",
+ "age 0\n",
+ "hypertension 0\n",
+ "heart_disease 0\n",
+ "ever_married 0\n",
+ "work_type 0\n",
+ "Residence_type 0\n",
+ "avg_glucose_level 0\n",
+ "bmi 0\n",
+ "smoking_status 0\n",
+ "stroke 0\n",
+ "dtype: int64\n"
+ ]
+ }
+ ],
+ "source": [
+ "df[\"bmi\"] = df[\"bmi\"].fillna(df[\"bmi\"].median())\n",
+ "\n",
+ "missing_values = df.isnull().sum()\n",
+ "\n",
+ "print(\"Количество пустых значений в каждом столбце после замены:\")\n",
+ "print(missing_values)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Index(['gender', 'age', 'hypertension', 'heart_disease', 'ever_married',\n",
+ " 'work_type', 'Residence_type', 'avg_glucose_level', 'bmi',\n",
+ " 'smoking_status', 'stroke'],\n",
+ " dtype='object')\n"
+ ]
+ }
+ ],
+ "source": [
+ "df = df.drop('id', axis = 1)\n",
+ "print(df.columns)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Создаем выборки"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Размер обучающей выборки: (2503, 10)\n",
+ "Размер контрольной выборки: (1074, 10)\n",
+ "Размер тестовой выборки: (1533, 10)\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Разделим данные на признак (X) и переменую (Y)\n",
+ "# Начнем со stroke\n",
+ "X = df.drop(columns=['stroke'])\n",
+ "y = df['stroke']\n",
+ "\n",
+ "# Разбиваем на обучающую и тестовую выборки\n",
+ "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)\n",
+ "\n",
+ "# Разбиваем на обучающую и контрольную выборки\n",
+ "X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.3)\n",
+ "\n",
+ "print(\"Размер обучающей выборки: \", X_train.shape)\n",
+ "print(\"Размер контрольной выборки: \", X_val.shape)\n",
+ "print(\"Размер тестовой выборки: \", X_test.shape)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Оценим сбалансированность сборок"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Распределение классов в обучающей выборке:\n",
+ "stroke\n",
+ "0 0.951658\n",
+ "1 0.048342\n",
+ "Name: proportion, dtype: float64\n",
+ "\n",
+ "Распределение классов в контрольной выборке:\n",
+ "stroke\n",
+ "0 0.947858\n",
+ "1 0.052142\n",
+ "Name: proportion, dtype: float64\n",
+ "\n",
+ "Распределение классов в тестовой выборке:\n",
+ "stroke\n",
+ "0 0.953033\n",
+ "1 0.046967\n",
+ "Name: proportion, dtype: float64\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABboAAAHyCAYAAAAtJXgGAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABpfUlEQVR4nO3deZyNdf/H8ffMmH0sMattxj52Gktosg2DEeqOLHeGCoUK3Soqg5ZJSoSyFC10J4ruImuUNBFSRBIjSwxjG+sMc76/Pzzm/BznzBhLzlx6PR+PeTzmfM/3uq7Pdc7M+V7nfa7zvTyMMUYAAAAAAAAAAFiUp7sLAAAAAAAAAADgehB0AwAAAAAAAAAsjaAbAAAAAAAAAGBpBN0AAAAAAAAAAEsj6AYAAAAAAAAAWBpBNwAAAAAAAADA0gi6AQAAAAAAAACWRtANAAAAAAAAALA0gm4AAAAAuAY2m03p6enatWuXu0sBAAD4xyPoBgAAAIB8OnjwoAYNGqTIyEj5+PgoJCRE1apVU0ZGhrtLAwAA+Ecr5O4CAAAAbrT33ntPvXv3tt/29fVV2bJl1bp1az3//PMKCwtzY3UArOqPP/5Q8+bNdf78eT3++OO6/fbbVahQIfn7+yswMNDd5QEAAPyjEXQDAIBb1ujRo1WuXDmdO3dO3333nd5++20tWrRIW7ZsUUBAgLvLA2Ax/fr1k4+Pj3744QeVKlXK3eUAAADgEgTdAADgltW2bVvVq1dPkvTwww+rRIkSGjdunD7//HN169bNzdUBsJINGzbo66+/1tKlSwm5AQAACiDm6AYAAP8YLVq0kCSlpqZKko4ePar//Oc/qlmzpoKCglSkSBG1bdtWP//8s9Oy586d08iRI1W5cmX5+fkpIiJC9957r3bu3ClJ2r17tzw8PHL9adasmX1dq1atkoeHh+bMmaPhw4crPDxcgYGB6tChg/bu3eu07bVr16pNmzYqWrSoAgIC1LRpU61Zs8blPjZr1szl9keOHOnUd9asWYqJiZG/v7+KFy+url27utx+Xvt2KZvNpvHjx6t69ery8/NTWFiY+vXrp2PHjjn0i4qKUvv27Z22M3DgQKd1uqp97NixTo+pJGVmZiopKUkVK1aUr6+vypQpo6eeekqZmZkuH6tLXf64BQcHKyEhQVu2bMnXsjVq1NCGDRvUuHFj+fv7q1y5cpoyZYpDv6ysLI0YMUIxMTEqWrSoAgMDFRsbq5UrVzr02759u1q0aKHw8HD7fjzyyCM6evSo07Z79ep1xee7V69eioqKclhu79698vf3l4eHh3bv3i3p/5/n9957z6HvyJEjXT4vAwcOdKqnffv2DtvKWedrr72Wy6PnvP6ZM2fKw8NDM2bMcOj38ssvy8PDQ4sWLcp1XdLFv6+cx8HT01Ph4eG6//77tWfPnuuq64cffpCfn5927typ6tWry9fXV+Hh4erXr5/L52bu3Ln2/6/g4GD9+9//1v79+x369OrVS0FBQdq1a5fi4+MVGBiokiVLavTo0TLGONV76XNz8uRJxcTEqFy5cjpw4IC9/bXXXlPjxo1VokQJ+fv7KyYmRvPmzXPY7vU+xgAAAAURZ3QDAIB/jJxQukSJEpKkXbt2acGCBercubPKlSuntLQ0TZ06VU2bNtXWrVtVsmRJSVJ2drbat2+vFStWqGvXrnriiSd08uRJLVu2TFu2bFGFChXs2+jWrZvatWvnsN1hw4a5rOell16Sh4eHnn76aR06dEjjx49XXFycNm3aJH9/f0nS119/rbZt2yomJkZJSUny9PTUzJkz1aJFC61evVoNGjRwWm/p0qWVnJwsSTp16pQeffRRl9t+/vnn1aVLFz388MM6fPiwJk6cqLvuuks//fSTihUr5rRM3759FRsbK0n67LPPNH/+fIf7+/XrZ58f/fHHH1dqaqomTZqkn376SWvWrJG3t7fLx+FqHD9+3L5vl7LZbOrQoYO+++479e3bV1WrVtXmzZv1xhtv6Pfff9eCBQuuuO7o6Gg9++yzMsZo586dGjdunNq1a+cQkObm2LFjateunbp06aJu3brpk08+0aOPPiofHx89+OCDkqSMjAy988476tatm/r06aOTJ0/q3XffVXx8vNatW6c6depIkk6fPq3SpUvr7rvvVpEiRbRlyxZNnjxZ+/fv1xdffOG07eDgYL3xxhv22w888MAV6x0xYoTOnTt3xX7u0Lt3b3322WcaMmSIWrVqpTJlymjz5s0aNWqUHnroIaf/L1diY2PVt29f2Ww2bdmyRePHj9dff/2l1atXX3NdR44c0blz5/Too4+qRYsWeuSRR7Rz505NnjxZa9eu1dq1a+Xr6yvp/68TUL9+fSUnJystLU0TJkzQmjVrnP6/srOz1aZNG91xxx169dVXtXjxYiUlJenChQsaPXq0y1rOnz+vf/3rX9qzZ4/WrFmjiIgI+30TJkxQhw4d1KNHD2VlZenjjz9W586d9eWXXyohIeGGPcYAAAAFjgEAALjFzJw500gyy5cvN4cPHzZ79+41H3/8sSlRooTx9/c3+/btM8YYc+7cOZOdne2wbGpqqvH19TWjR4+2t82YMcNIMuPGjXPals1msy8nyYwdO9apT/Xq1U3Tpk3tt1euXGkkmVKlSpmMjAx7+yeffGIkmQkTJtjXXalSJRMfH2/fjjHGnDlzxpQrV860atXKaVuNGzc2NWrUsN8+fPiwkWSSkpLsbbt37zZeXl7mpZdeclh28+bNplChQk7tO3bsMJLM+++/b29LSkoylx5Krl692kgys2fPdlh28eLFTu2RkZEmISHBqfYBAwaYyw9PL6/9qaeeMqGhoSYmJsbhMf3www+Np6enWb16tcPyU6ZMMZLMmjVrnLZ3qaZNmzqszxhjhg8fbiSZQ4cOXXFZSeb111+3t2VmZpo6deqY0NBQk5WVZYwx5sKFCyYzM9Nh2WPHjpmwsDDz4IMP5rmN/v37m6CgIKf2Hj16mHLlyjm0Xf6YJSYmmsjISPvtLVu2GE9PT9O2bVsjyaSmphpjjPnzzz+NJDNjxgyH9V3+XOdsY8CAAU71JCQkOGwrr/+LvNZ/4MABU7x4cdOqVSuTmZlp6tata8qWLWtOnDiR63pyREZGmsTERIe27t27m4CAgOuqK+d2y5YtzYULF+ztOa83EydONMYYk5WVZUJDQ02NGjXM2bNn7f2+/PJLI8mMGDHC3paYmGgkmccee8zeZrPZTEJCgvHx8TGHDx92qHfmzJnGZrOZHj16mICAALN27Vqnus+cOeNwOysry9SoUcO0aNHCof16HmMAAICCiKlLAADALSsuLk4hISEqU6aMunbtqqCgIM2fP98+v66vr688PS8eDmVnZ+vIkSMKCgpSlSpVtHHjRvt6Pv30UwUHB+uxxx5z2sblUzpcjZ49e6pw4cL22/fdd58iIiLs0wZs2rRJO3bsUPfu3XXkyBGlp6crPT1dp0+fVsuWLfXtt9/KZrM5rPPcuXPy8/PLc7ufffaZbDabunTpYl9nenq6wsPDValSJaepNLKysiTJfraqK3PnzlXRokXVqlUrh3XGxMQoKCjIaZ3nz5936Jeenn7FM4z379+viRMn6vnnn1dQUJDT9qtWraro6GiHdeZMV3P59l3Jqenw4cNKSUnR/PnzVatWLQUHB19x2UKFCqlfv3722z4+PurXr58OHTqkDRs2SJK8vLzk4+Mj6eIZ6EePHtWFCxdUr149h7+3HCdOnFBaWppWrFihhQsX6q677nLqk5WVlefz4sqwYcN0++23q3Pnzg7tISEhkqR9+/blaz3nzp1zeg7Pnz/vsu+ZM2eUnp6uY8eOOUzJkZvw8HBNnjxZy5YtU2xsrDZt2qQZM2aoSJEi+aotMzNT6enpOnTokJYtW6avv/5aLVu2vO66JGnIkCHy8vKy337ggQcUFhamhQsXSpLWr1+vQ4cOqX///g7/iwkJCYqOjrb3u9Sl08DkTAuTlZWl5cuXO/UdOnSoZs+erU8++cTlNzpyvg0iXfymwYkTJxQbG+v0N3a9jzEAAEBBw9QlAADgljV58mRVrlxZhQoVUlhYmKpUqWIPtqWLYeOECRP01ltvKTU1VdnZ2fb7cqY3kS5OeVKlShUVKnRjD50qVarkcNvDw0MVK1a0z5m8Y8cOSVJiYmKu6zhx4oRuu+02++309HSn9V5ux44dMsbk2u/yKUaOHz8uSU7h8uXrPHHihEJDQ13ef+jQIYfbS5cutQer+ZWUlKSSJUuqX79+TnMO79ixQ9u2bct1nZdv35Xvv//eYflKlSppwYIF+fowo2TJkgoMDHRoq1y5sqSL8yvfcccdkqT3339fr7/+un777TeHULhcuXJO64yPj9fatWslSW3atNGcOXOc+hw/fjzP5+Vy3333nb744gutWLHCaUoWf39/1a1bV9OmTVNcXJz97+PMmTMu1/Xuu+/q3XffdWqPjIx0aktKSlJSUpIkyc/PTy1atND48ePz/Fvt2rWrZs2apYULF6pv374ug+rcfPzxx/r444/tt+vXr6933nnnuurK+TuIjo52aPfy8lKlSpXs/7d//vmnJKlKlSpO64iOjtZ3333n0Obp6any5cs7tF36t3OpqVOn6ocffpAkp7nvc3z55Zd68cUXtWnTJof56V39HV/PYwwAAFDQEHQDAIBbVoMGDVSvXr1c73/55Zf1/PPP68EHH9QLL7yg4sWLy9PTU4MGDXI6U9odcmoYO3asff7my10acmZlZenAgQNq1arVFdfr4eGhr776yuHMVFfrlKSDBw9KungGaF7rDA0N1ezZs13ef3kA3bBhQ7344osObZMmTdLnn3/ucvlt27bpvffe06xZs1zO9W2z2VSzZk2NGzfO5fJlypTJtfYctWrV0uuvvy5JOnz4sN588001a9ZMGzduzHPf82vWrFnq1auXOnXqpKFDhyo0NFReXl5KTk62zx9/qYkTJyo9PV1bt25VcnKyHnnkEc2aNcuhz8GDB10Gy7l5+umnFR8frxYtWjhddFKSpkyZoo4dO6px48ZXXFfHjh2dLkj53HPP2f9eLtW3b1917txZ2dnZ2rZtm0aOHKlOnTrp119/zXX9R44c0fr16yVJW7dulc1mc/igKi+tW7fW0KFDJV08Q33MmDFq3ry51q9f73DG89XUdely7vLDDz/opZde0o8//qjBgwerTZs2Dt84WL16tTp06KC77rpLb731liIiIuTt7a2ZM2fqo48+clrf9TzGAAAABQ1BNwAA+MeaN2+emjdv7nRW6vHjxx3CowoVKmjt2rU6f/78DbmgYo6cM7ZzGGP0xx9/qFatWvbtSlKRIkUUFxd3xfX9/PPPOn/+fJ7hfs56jTEqV66c/czRvGzdulUeHh4uz1C9dJ3Lly9XkyZN8hUIBgcHO+1TXheMHDZsmOrUqaP7778/1+3//PPPatmy5TVPJ3Pbbbc51NSsWTOVLFlSM2fOzPWCojn++usvnT592uGs7t9//12SFBUVJeni31v58uX12WefOdSYc0bx5erXry9Jatu2rUJDQ9WzZ089++yzqlq1qqSLU6388ccfatOmTb72b8GCBUpJSXE5TUqOBg0aaNeuXfrll1908uRJSdIHH3ygDz/80Klv6dKlnZ7D8ePHuwy6K1WqZO8bHx+vM2fO6Nlnn83zQp8DBgzQyZMnlZycrGHDhmn8+PEaMmRIvvY1IiLCobYqVaqocePGWrBggbp163ZNdeWcdb99+3aHM7BtNpt27NihunXrSvr/M9q3b99unzonx/bt250+mLDZbNq1a5fD/+Llfzs5HnzwQQ0fPlx//fWXqlWrpsGDBzs8N59++qn8/Py0ZMkShyltZs6c6fJxup7HGAAAoKDh43oAAPCP5eXl5TQv79y5c7V//36Htn/9619KT0/XpEmTnNaR33l9Xfnggw/sYaJ0MQg9cOCA2rZtK0mKiYlRhQoV9Nprr+nUqVNOyx8+fNipdi8vL7Vv3z7P7d57773y8vLSqFGjnOo3xujIkSP22xcuXNCnn36qBg0a5DlFRpcuXZSdna0XXnjB6b4LFy7Ypz+5FikpKfr888/1yiuv5Bpid+nSRfv379f06dOd7jt79qxOnz591ds9e/asJDlM/5CbCxcuaOrUqfbbWVlZmjp1qkJCQhQTEyNJ9rPnL33M165dq5SUlCuuPz093amWzz//XGfPnnUKU13Jzs7W8OHD1b1791y/HZDD399fDRs2VFxcnOLi4pym1bgRcr6t4OobBdLF/4U5c+bolVde0TPPPKOuXbvqueeeswfAVyu/z2VedbVs2VK+vr568803Hb7xMXv2bKWlpdn/7+rVq6fQ0FBNmTLFYXtfffWVtm3bpoSEBKd1X/raYozRpEmT5O3t7TSVSGxsrKSLU+WMGTNGs2bN0tKlS+33e3l5ycPDw2Eapt27d7v8EOlGP8YAAADuxhndAADgH6t9+/YaPXq0evfurcaNG2vz5s2aPXu2U7DXs2dPffDBBxoyZIjWrVun2NhYnT59WsuXL1f//v3VsWPHa9p+8eLFdeedd6p3795KS0vT+PHjVbFiRfXp00fSxbl733nnHbVt21bVq1dX7969VapUKe3fv18rV65UkSJF9MUXX+j06dOaPHmy3nzzTVWuXFmrVq2ybyMnIP/ll1+UkpKiRo0aqUKFCnrxxRc1bNgw7d69W506dVLhwoWVmpqq+fPnq2/fvvrPf/6j5cuX6/nnn9cvv/yiL774Is99adq0qfr166fk5GRt2rRJrVu3lre3t3bs2KG5c+dqwoQJuu+++67pcVq6dKlatWqV51ntDzzwgD755BM98sgjWrlypZo0aaLs7Gz99ttv+uSTT7RkyZIrnumelpZmnxokPT1dU6dOVaFCha74wYH0/8Hj7t27VblyZc2ZM0ebNm3StGnT7N8CaN++vT777DPdc889SkhIUGpqqqZMmaJq1ao5fJAxevRo7d+/XzVq1JCvr682btyomTNnqlatWqpVq5bOnDmjpKQkvfXWW2rcuLFat259xfr27dsnHx8f+4VOb7bt27dr8eLFstls2rp1q8aOHav69evbLwx7qUOHDunRRx9V8+bN7VOjTJo0SStXrlSvXr303XffXXF6jV27dtmfy/3792vSpEkqUqSIU3B8NXUVL15czz33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29y3b5+8vLyUnJwsSerVq5fLr9N6eHho5MiR9tt//vmn+vfvrypVqsjf318lSpRQ586dtXv3boflVq1aJQ8PD61atcre9uOPP6pVq1YqXLiwAgMD1axZM61evdphuffee08eHh5av369vS09Pd2pDklq3769U82rV69W586dVbZsWfn6+qpMmTIaPHiwzp4967Rv8+bNU7169VS4cGF5eHjYf1577TWnvq5qzPkJCAhQzZo19c477zj069Wrl4KCgvJc1+X7lZ/nNcehQ4f00EMPKSwsTH5+fqpdu7bef/99hz67d++279Mbb7yhyMhI+fv7q2nTptqyZYtTvZc/nrNmzZKnp6deeeUVe9svv/yiXr16qXz58vLz81N4eLgefPBBHTlyJM99BQAr27Rpkzp27KiIiAgtWbLEZcg9d+5cxcTEyN/fX8HBwfr3v/+t/fv3O/TJbWyYN2+ew7jZrFkzh7HG1U8ODw8PDRw4ULNnz1aVKlXk5+enmJgYffvtt07b+emnn9S2bVsVKVJEQUFBatmypX744QeX+5xbDe+9955Dnxo1alzx8cup8XKuxvLXXntNjRs3VokSJeTv76+YmBjNmzfPadlTp07pySefVPny5eXt7e1QY3p6ep71XL5vwcHBSkhIcBobc6s7R84xQc5x0I8//iibzaasrCzVq1dPfn5+KlGihLp166Y9e/Y4Lf/1118rNjZWgYGBKlasmDp27Kht27Y59Bk5cqQ8PDz022+/qUuXLipSpIhKlCihJ554QufOnXOq99LjigsXLqhdu3YqXry4tm7dam+fOXOmWrRoodDQUPn6+qpatWp6++2383zMAAAXZWZmKikpSRUrVrS/53zqqaeUmZnp1HfWrFlq0KCBAgICdNttt+muu+7S0qVLJUlRUVF5jvOXjo+nT5/Wk08+qTJlysjX11dVqlTRa6+95hTGX7q8l5eXSpUqpb59++r48eP2PllZWRoxYoRiYmJUtGhRBQYGKjY2VitXrnSqP+c9Z9myZeXl5WVf95Xe516+f56engoPD9f999/vMB5e+n41NznjYI4ffvhBfn5+2rlzp6pXry5fX1+Fh4erX79+Onr0qNPyV3N8tmvXLsXHxyswMFAlS5bU6NGjHR7jnHovPRY6efKkYmJiVK5cOR04cMDent/jGcAVpi6BpX3xxReKiopSbGys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LpjMzEyHPseOHTNhYWHmwQcftLedPXvWeHp6mn79+jn0zc/7XGOMiYyMNImJiQ5t3bt3NwEBAfbb+XkPnjMOXn67ZcuW5sKFC/b2nDF44sSJxpirPz6TZB577DF7m81mMwkJCcbHx8d+XHHpsZDNZjM9evQwAQEBZu3atU515/d4BnCFqUtgWSdPnpQkFS5cOM9+OfdnZGTY2+rXr6+mTZvab/v7+6t///46ePCg/RPWuLg4lSxZUrNnz7b327Jli3755Rf9+9//treFhobq0KFDysrKyrMOf39/++/nz5/XkSNHVLFiRRUrVszlp7onTpzQoUOHtGzZMsXHxztclKlEiRLq1auXNmzYoLS0tDy3m1+X1nf69Gmlp6ercePGMsbop59+st938uRJeXp6XvUZdpc6duyY0tPTtWvXLr3xxhvy8vJyeD5ypKenKz093enrxbnJz/O6aNEihYeH28/wliRvb289/vjjOnXqlL755huHdXbq1MnhIh0NGjRQw4YNtWjRIqft79q1SwkJCapTp44+/PBDeXo6vsRe+hifO3dO6enpuuOOOyQp35/sA4BV9OrVS3v37lX37t21dOlSh28H5Vi/fr0OHTqk/v37y8/Pz96ekJCg6Ohoh29k5cgZG3J+co4HrlWjRo0UExNjv122bFl17NhRS5YsUXZ2trKzs7V06VJ16tTJfr0PSYqIiFD37t313XffORxjSBe/2pxzRlResrOz7fuR13FEzphx6c/58+ed+l06zhw7dkwnTpxQbGys0xhz8uRJlShR4or15eb8+fNKT0/X4cOHlZKSovnz56tWrVr2M64vr/vIkSOy2Wz5WveAAQMc9qNZs2aKiYmx/y0cOHBAmzZtUq9evVS8eHF7v1q1aqlVq1Yux+fLz7R+7LHHJMll30mTJik5OVlvvvmmOnbs6HT/pbWdOHFC6enpatq0qXbt2qUTJ07kax8B4J9o7ty5qlq1qqKjox3GsxYtWkiSffqPBQsWyGazacSIEU7vp672G7CLFi2Sl5eXHn/8cYf2J598UsYYffXVVw7tZ86cUXp6ug4ePKhPP/1UP//8s1q2bGm/38vLSz4+PpIunqF+9OhRXbhwQfXq1XMYa0+fPi2bzXZdY21mZqbS09PtmcDXX3/tUMvlNR87dizfc6MPGTLE4VvrDzzwgMLCwuxj7bUcn106XVnO9GVZWVlavny5U9+hQ4dq9uzZ+uSTT9SgQQOn+/N7PAO4QtANy8oJsK/0BtdVIB4dHe3UL+drTjlzRXp6eqpHjx5asGCBzpw5I0maPXu2/Pz81LlzZ/tyjRs31rlz5/Tcc89p37599gH7cmfPntWIESPsc4MFBwcrJCREx48fd/nGqFOnTgoLC1NGRoaqVKlyxXqv1549e+xvGoOCghQSEmIPjS+tr1GjRrLZbHriiSe0c+dO+6B6NW6//XaFhISoQoUKmjFjhiZNmuQ0wJ0+fVohISEKCQmRv7+/ypYtqwkTJuS53vw8r3/++acqVarkdNCU0+/PP/90aK9UqZLTOitXruz0uJ8+fVrx8fFKS0vT0aNHXR6EHT16VE888YTCwsLk7++vkJAQlStXTpJ4cwzglnP06FHNmjVL77//vurUqaMnnnjC6bUu5zXX1TgXHR3t9Jp86diQ8/Pggw9eV525vc6fOXNGhw8f1uHDh3XmzJlcx2Kbzaa9e/c6tB8/fjxfc3D+9ttvDmNdlSpV9NFHHzn1e/fdd532O2ee0kt9+eWXuuOOO+Tn56fixYsrJCREb7/9ttPj3qhRI82fP1/z5s3TgQMHlJ6ebj/WyY/vv/9eISEhCg0NVePGjXXhwgXNnTvXaezLqTs4OFj+/v666667HK4lcqmcZXMbyy8dxyXXfzNVq1ZVenq6Tp8+7dB++XNcoUIFeXp6Oo3lX331lX0KM1dzlUrSmjVrFBcXZ58bPCQkRMOHD5fEWA4AedmxY4d+/fVXp/GscuXKki7OaS1dnPbM09PTYdqoa/Xnn3+qZMmSTifH5fbeb+zYsQoJCVFERITuu+8+xcbGasyYMQ593n//fdWqVct+LYmQkBAtXLjQYQwoUaKEKlWqpHfeeUdLly7VoUOHlJ6e7nIu8tx8/PHHCgkJUVhYmFq3bq0yZco4XdtKkpKSkhQSEqLixYsrICBACQkJ2rFjh8t15jbWenl5qVKlSvkaa10dn3l6ejqcDCDJ/rxePtZOnTpVr7/+uiTlmiPk93gGcIU5umFZRYsWVUREhH755Zc8+/3yyy8qVaqUihQpIsnx08Er6dmzp8aOHasFCxaoW7du+uijj9S+fXuHC2l16NBBDz74oMaOHauxY8fmuq7HHntMM2fO1KBBg9SoUSMVLVpUHh4e6tq1q8uznF577TVVqlTJ5dlEN1p2drZatWqlo0eP6umnn1Z0dLQCAwO1f/9+9erVy6G+rl27auPGjZo4caKmTZt2TdubNWuWwsLCdO7cOX399dcaMGCA/Pz81KtXL3sfPz8/ffHFF5IuflgxY8YMDRo0SBEREerSpYvTOq/mef07pKenKzAwUF988YU6deqk5ORkJSUlOfTp0qWLvv/+ew0dOlR16tRRUFCQbDab2rRpk+8z3QDAKsaOHWv/YHjatGm64447NGzYML311lvXvM5Lx4Ycq1evznX+R3c5ePCg4uPjr9gvKipK06dPl3Rx3sw333xTDzzwgMqXL2//xo8kdezY0enCjs8995wOHjxov7169Wp16NBBd911l9566y1FRETI29tbM2fOdArPp02bpm7dujl8cH81atWqZX+TmjOPdrNmzbRx40aFh4c71W2MUWpqqkaPHq327du7fAN+M8fx3M4IXLdunfr06aPAwEC9+OKL6ty5s8Ob/J07d6ply5aKjo7WuHHjVKZMGfn4+GjRokV64403GMsBIA82m001a9bUuHHjXN5fpkyZm1yRswceeEA9e/aUzWbTrl279MILL6h9+/Zavny5PDw8NGvWLPXq1UudOnXS0KFDFRoaKi8vLyUnJ2vnzp0O65ozZ4569OjhdDwQGBiYr1pat26toUOHSpL27dunMWPGqHnz5lq/fr3DmNm3b1917txZ2dnZ2rZtm0aOHKlOnTrp119/dVqnu98zSxcviPnSSy/pxx9/1ODBg9WmTRuHb4RdzfEM4ApBNyytffv2mj59ur777jvdeeedTvevXr1au3fvVr9+/ext5cqV0/bt2536/vbbb5LkcAGjGjVqqG7dupo9e7ZKly6tPXv2aOLEiU7LvvvuuxoxYoR27txpf5PTqlUrhz7z5s1TYmKi/Y2hdPErvZdexflSMTExatq0qYKCgvJd77XavHmzfv/9d73//vvq2bOnvX3ZsmVOfT09PfXaa69p8+bNSk1N1VtvvaW0tDSH6VyupEmTJva627dvr19//VXJyckOQbeXl5fDxSkTEhJUvHhxLV682GXQnd/nNTIyUr/88otsNpvDWd05/SIjIx2Wd/Vm/Pfff3d63AMCArR48WJFR0dr8ODBevnll9WlSxf72QLHjh3TihUrNGrUKI0YMSLP9QPAreDSiyXXr19fAwYM0OTJk9WzZ097iJvzmrt9+3b7V5dzbN++3ek1+fKxQVKu42h+5fY6HxAQoJCQEEkXX+NzG2M8PT0d3pzv27dPJ0+etL/+5yUwMNBhf2JjY1WqVCktXbrUIeguXbq0036PHz/eIej+9NNP5efnpyVLljhMmzJz5kyn7UZFRWnWrFmqWbOmHnzwQXXq1EkffPCB/WJbV3Lbbbc51NOsWTOVLFlSM2fO1LBhw3KtOygoSD169HCYEi1HzjecXP0t/Pbbbw7jeE6/y/32228KDg52ChF27NhhX7908ULfNpvNaSxv1aqV3n77bZ07d04LFixQ3759tWrVKnsw/sUXXygzM1P/+9//VLZsWftyOV+3BwDkrkKFCvapQPKagqRChQqy2WzaunWrw8Udr0VkZKSWL1+ukydPOpzVndt7v/LlyzuMW0WLFlX37t31ww8/qFGjRpo3b57Kly+vzz77zGEfLj/BSZLq1q2r6dOnKzY2VqNHj9Ydd9yhsWPHas2aNfmqPSIiwqGWKlWqqHHjxvaT8HJUqlTJ3i8+Pl5nzpzRs88+6/IC0ZeOtZeegW2z2bRjxw7VrVvX4XHJ7/FZzgcDOWdxSxePpSTnvOLBBx/U8OHD9ddff6latWoaPHiww/HH1RzPAK4wdQksbejQofL391e/fv105MgRh/uOHj2qRx55RAEBAfZPQiWpXbt2Wrdunb7//nt727lz5/T2228rPDzcYZ5O6eKnukuXLtX48eNVokQJtW3b1mUtkZGRatGiheLi4pzejEoX35xfPmfWxIkTlZ2dnev+eXh4qHXr1lqyZIm2bdvmsG/vv/++6tWrp7CwsFyXz6+c+bkurc8Yk+tUIRMnTtTXX3+t2bNnKy4uTk2aNLmu7Z89e/aKX+PKqe3SucQuld/ntV27djp48KDmzJlj73fhwgVNnDhRQUFBTnOFL1iwQPv377ffXrdundauXev0dxASEmL/Ctjo0aNVunRp9enTx6nuy/8Gxo8fn+d+A8Ct4qWXXlJERIT69u2rCxcuSJLq1aun0NBQTZkyxWEc+Oqrr7Rt2zYlJCT87XWlpKQ4zPm4d+9eff7552rdurW8vLzk5eWl1q1b6/PPP3f4+m1aWpo++ugj3XnnnfZvjUkXv2osyemNYX7kfFie21iXFy8vL3l4eDgcV+zevVsLFixw6nvhwgX16NFD1atX1xtvvKG4uDinrxxfjbNnz0rSFcfyvPavbt26Cg8Pd/pbWL16tdavX6/27dtLuvjGv06dOnr//fcdPuTYsmWLli5dqnbt2jmte/LkyQ63c05auHwsb9y4sby8vBQYGKgpU6bo22+/tZ9xf2ndl47lJ06c4M03AORDly5dtH//fofX1Rxnz561TzvVqVMneXp6avTo0U7flMnvHNQ52rVrp+zsbE2aNMmh/Y033pCHh0eu7+0vrUv6//HN1Tiwdu1apaSkOC2bkZGhBx54QB06dNBzzz2nuLg4RUREXFX9edWSm7zG2pYtW8rX11dvvvmmw2M7e/ZspaWl2cfaazk+u/QxNsZo0qRJ8vb2dppXPDY2VpJUsmRJjRkzRrNmzXKYju1qjmcAVzijG5ZWqVIlvf/+++rRo4dq1qyphx56SOXKldPu3bv17rvvKj09Xf/9739VoUIF+zJPPfWUZs+erbZt2+rxxx9XcHCwZs2apa1bt2r27NkqVMjx36J79+566qmnNH/+fD366KPy9va+plrbt2+vDz/8UEWLFlW1atWUkpKi5cuXX/ECFS+88IKWLFmipk2b6rHHHlNAQICmT5+u48ePa968eU79U1JS7HOE51wc648//tDixYvtfQ4fPqyzZ89q8eLFatOmjaKjo1WhQgX95z//0f79+1WkSBF9+umnLufM+vXXX/XUU09p5MiRql+//jU9FgsWLFBwcLB96pLVq1dr0KBBDn2ys7PtNZ88eVIzZ87U6dOn1alTJ5frzO/z2rdvX02dOtV+Mc+oqCjNmzdPa9as0fjx453mb6tYsaLuvPNOPfroo8rMzLR/4PHUU0/lun/+/v6aNm2a4uLi9Pbbb6t///4qUqSI7rrrLr366qs6f/68/Yy91NTUa3oMAcBqChcurIkTJ+ree+/V66+/rqefflre3t4aM2aMevfuraZNm6pbt25KS0vThAkTFBUVpcGDB//tddWoUUPx8fF6/PHH5evra59aZdSoUfY+L774opYtW6Y777xT/fv3V6FChTR16lRlZmbq1VdflXQx+E5KStI777yjrl27upxr+nKnTp2yj3VHjx7Vm2++KW9v72sK+BMSEjRu3Di1adNG3bt316FDhzR58mRVrFjRaZq3UaNGafPmzfrpp5+u6bgmLS1Ns2bNknRx6q6pU6eqUKFC9jfIOfbs2aPFixfbpy556aWXFBkZqbp16zqdSV+oUCG9+uqr6tmzp2JjY9WjRw/7tCilS5fW008/be87duxYtW3bVo0aNdJDDz2ks2fPauLEiSpatKhGjhzpVG9qaqo6dOigNm3aKCUlRbNmzVL37t1Vu3btXPcxPj5e//73v/XUU0/p7rvvVkREhFq3bi0fHx/dfffd6tevn06dOqXp06crNDRUBw4cuOrHEQD+SR544AF98skneuSRR7Ry5Uo1adJE2dnZ+u233/TJJ59oyZIlqlevnipWrKhnn31WL7zwgmJjY3XvvffK19dXP/74o0qWLKnk5OR8b/Puu+9W8+bN9eyzz2r37t2qXbu2li5dqs8//1yDBg1yyAmki9Oezpo1S8YY7dy50z4G1atXT9LF9/SfffaZ7rnnHiUkJCg1NVVTpkxRtWrVdOrUKYd1DRgwQGfPnnU5r3Z+7Nq1yz7W7t+/X5MmTVKRIkWcguPt27dr8eLF9rPgx44dq/r166tUqVJO6yxevLiee+45Pf/884qPj1fHjh21a9cuTZo0SbVr19bDDz8sSVd9fObn56fFixcrMTFRDRs21FdffaWFCxdq+PDh9m/HudK3b1999NFHeuSRR7Rlyxb7HOP5PZ4BXDLALeCXX34x3bp1MxEREcbb29uEh4ebbt26mc2bN7vsv3PnTnPfffeZokWLGj8/P1O/fn2zYMGCXNffrl07I8l8//33+a5JkklKSrLfPnbsmOndu7cJDg42QUFBJj4+3vz2228mMjLSJCYm2vutXLnSSDIrV660t23YsMG0bt3aBAUFmYCAAHPXXXeZb775xmF7M2fONJKu+ifH1q1bTVxcnAkKCjLBwcGmT58+5ueffzaSzMyZM40xxpw7d87UqlXL3HnnnebChQv2ZVNTU40kM3bs2Dwfk8tr9PHxMRUrVjQjRoww586ds/dLTEx06BcUFGRuv/128+GHH+b6+BqT/+c1LS3N/lz4+PiYmjVr2vfR1T69/vrrpkyZMsbX19fExsaan3/+2aFvYmKiiYyMdNpO7969TZEiRcy+ffuMMcbs27fP3HPPPaZYsWKmaNGipnPnzuavv/5yuS8AYFU5r/U//vijy/s7duxoAgICzK5du+xtc+bMMXXr1jW+vr6mePHipkePHvbXzhyJiYkmMDDQaX1z5851Gjdz5LyWX/4an0OSGTBggJk1a5apVKmS8fX1NXXr1nW5ro0bN5r4+Hj7WNy8eXOH44I1a9aYihUrmpEjR5rMzMwr1tG0aVOHsa5YsWKmSZMm5quvvnJZ4+USEhKcxp53333Xvh/R0dFm5syZJikpyWG8X716tfHy8jJTp051WDan3+HDh10+Vleqe9GiRU515/x4eHiY8PBwc++995pt27YZY/7/7yQ1NdVhuU8++cThb6Fbt27mzz//dKpj+fLlpkmTJsbf398UKVLE3H333Wbr1q0u92nr1q3mvvvuM4ULFza33XabGThwoDl79qxTvZePxenp6SYkJMTcc8899rb//e9/platWsbPz89ERUWZMWPGmBkzZrjcFwD4pxkwYIDDmHO5rKwsM2bMGFO9enXj6+trbrvtNhMTE2NGjRplTpw44dB3xowZ9vHgtttuM02bNjXLli1zWqer98+XOnnypBk8eLApWbKk8fb2NpUqVTJjx441NpvNod+Vxi1jjLHZbObll182kZGR9mOGL7/80un94H//+1/j4eFhFi9e7LCN3I5lLhcZGelQT3BwsGndurVJSUmx98k5tsj58fT0NKVLlzaJiYn2Y6jLjwFyTJ482URHRxtvb28TFhZm+vXrZ44cOeLU72qOz3bu3Glat25tAgICTFhYmElKSjLZ2dlO9V5+TLZ9+3bj5+dnBg8ebG/Lz/EMkBsPY67yux/AP9A999yjzZs3648//nB3KTfM7t27Va5cuav++tc/Rc7jM3bsWP3nP/9xdzkAgL+Bh4eHBgwY4PSVZtwaRo4cqVGjRunw4cMOF7oCAAA3Rq9evTRv3jynM9oBd2GObuAKDhw4oIULF+qBBx5wdykAAAAAAAAAXGCObiAXqampWrNmjd555x15e3urX79+7i7phvL391d8fLy7ywAAAAAAAACuG2d0A7n45ptv9MADDyg1NVXvv/++wsPD3V3SDRUWFuZwgUoAAAAAAADAqtw6R/e3336rsWPHasOGDTpw4IDmz5+vTp065bnMqlWrNGTIEP36668qU6aMnnvuOfXq1eum1AsAAAAAAAAAKHjcekb36dOnVbt2bU2ePDlf/VNTU5WQkKDmzZtr06ZNGjRokB5++GEtWbLkb64UAAAAAAAAAFBQufWM7kt5eHhc8Yzup59+WgsXLtSWLVvsbV27dtXx48eZggEAAAAAAAAA/qEsdTHKlJQU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",
+ "text/plain": [
+ "