937 lines
158 KiB
Plaintext
Raw Normal View History

2024-10-26 21:00:49 +04:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Выбранные темы: прогнозирование стоимости страховки, данные о населении, цены на автомобили."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Выделим вспомогательные функции"
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.preprocessing import LabelEncoder\n",
"from imblearn.over_sampling import RandomOverSampler\n",
"from imblearn.under_sampling import RandomUnderSampler\n",
"import seaborn as sns\n",
"import numpy as np\n",
"\n",
"label_encoder = LabelEncoder()\n",
"\n",
"# Функция для применения oversampling\n",
"def apply_oversampling(X, y):\n",
" oversampler = RandomOverSampler(random_state=42)\n",
" X_resampled, y_resampled = oversampler.fit_resample(X, y)\n",
" return X_resampled, y_resampled\n",
"\n",
"# Функция для применения undersampling\n",
"def apply_undersampling(X, y):\n",
" undersampler = RandomUnderSampler(random_state=42)\n",
" X_resampled, y_resampled = undersampler.fit_resample(X, y)\n",
" return X_resampled, y_resampled\n",
"\n",
"def split_stratified_into_train_val_test(\n",
" df_input,\n",
" stratify_colname=\"y\",\n",
" frac_train=0.6,\n",
" frac_val=0.15,\n",
" frac_test=0.25,\n",
" random_state=None,\n",
"):\n",
" \"\"\"\n",
" Splits a Pandas dataframe into three subsets (train, val, and test)\n",
" following fractional ratios provided by the user, where each subset is\n",
" stratified by the values in a specific column (that is, each subset has\n",
" the same relative frequency of the values in the column). It performs this\n",
" splitting by running train_test_split() twice.\n",
"\n",
" Parameters\n",
" ----------\n",
" df_input : Pandas dataframe\n",
" Input dataframe to be split.\n",
" stratify_colname : str\n",
" The name of the column that will be used for stratification. Usually\n",
" this column would be for the label.\n",
" frac_train : float\n",
" frac_val : float\n",
" frac_test : float\n",
" The ratios with which the dataframe will be split into train, val, and\n",
" test data. The values should be expressed as float fractions and should\n",
" sum to 1.0.\n",
" random_state : int, None, or RandomStateInstance\n",
" Value to be passed to train_test_split().\n",
"\n",
" Returns\n",
" -------\n",
" df_train, df_val, df_test :\n",
" Dataframes containing the three splits.\n",
" \"\"\"\n",
"\n",
" if frac_train + frac_val + frac_test != 1.0:\n",
" raise ValueError(\n",
" \"fractions %f, %f, %f do not add up to 1.0\"\n",
" % (frac_train, frac_val, frac_test)\n",
" )\n",
"\n",
" if stratify_colname not in df_input.columns:\n",
" raise ValueError(\"%s is not a column in the dataframe\" % (stratify_colname))\n",
"\n",
" X = df_input # Contains all columns.\n",
" y = df_input[\n",
" [stratify_colname]\n",
" ] # Dataframe of just the column on which to stratify.\n",
"\n",
" # Split original dataframe into train and temp dataframes.\n",
" df_train, df_temp, y_train, y_temp = train_test_split(\n",
" X, y, stratify=y, test_size=(1.0 - frac_train), random_state=random_state\n",
" )\n",
"\n",
" # Split the temp dataframe into val and test dataframes.\n",
" relative_frac_test = frac_test / (frac_val + frac_test)\n",
" df_val, df_test, y_val, y_test = train_test_split(\n",
" df_temp,\n",
" y_temp,\n",
" stratify=y_temp,\n",
" test_size=relative_frac_test,\n",
" random_state=random_state,\n",
" )\n",
"\n",
" assert len(df_input) == len(df_train) + len(df_val) + len(df_test)\n",
"\n",
" return df_train, df_val, df_test"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Анализ наборов данных"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"1) Прогнозирование стоимости страховки"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Проблемная область: Медицинское страхование.\n",
"\n",
"Описание: Набор данных содержит информацию о клиентах медицинского страхования, включая возраст, пол, индекс массы тела (ИМТ), количество детей, курение, регион и стоимость страхового взноса.\n",
"\n",
"Связи между объектами: Нет явных связей, кроме того, что все объекты относятся к клиентам медицинского страхования.\n",
"\n",
"Бизнес-цель: Оптимизация тарифов страховых взносов.\n",
"\n",
"Эффект для бизнеса: Снижение рисков и повышение прибыльности за счет более точного определения стоимости страхования для разных групп клиентов.\n",
"\n",
"Цель технического проекта: Разработка модели машинного обучения для прогнозирования стоимости страхового взноса на основе характеристик клиента.\n",
"\n",
"Входные признаки: Возраст, пол, ИМТ, количество детей, курение, регион.\n",
"\n",
"Целевой признак: Стоимость страхового взноса."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Данный график позволят увидеть изменения стоимости страховки от возраста."
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"RangeIndex: 2772 entries, 0 to 2771\n",
"Data columns (total 7 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 age 2772 non-null int64 \n",
" 1 sex 2772 non-null object \n",
" 2 bmi 2772 non-null float64\n",
" 3 children 2772 non-null int64 \n",
" 4 smoker 2772 non-null object \n",
" 5 region 2772 non-null object \n",
" 6 charges 2772 non-null float64\n",
"dtypes: float64(2), int64(2), object(3)\n",
"memory usage: 151.7+ KB\n",
"age 0\n",
"sex 0\n",
"bmi 0\n",
"children 0\n",
"smoker 0\n",
"region 0\n",
"charges 0\n",
"dtype: int64\n",
" age bmi children charges\n",
"count 2772.000000 2772.000000 2772.000000 2772.000000\n",
"mean 39.109668 30.701349 1.101732 13261.369959\n",
"std 14.081459 6.129449 1.214806 12151.768945\n",
"min 18.000000 15.960000 0.000000 1121.873900\n",
"25% 26.000000 26.220000 0.000000 4687.797000\n",
"50% 39.000000 30.447500 1.000000 9333.014350\n",
"75% 51.000000 34.770000 2.000000 16577.779500\n",
"max 64.000000 53.130000 5.000000 63770.428010\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df1 = pd.read_csv(\"../data/Medical_insurance.csv\")\n",
"df1.info()\n",
"print(df1.isnull().sum())\n",
"print(df1.describe())\n",
"\n",
"plt.scatter(df1[\"charges\"], df1[\"age\"])\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Зашумленность: Возможны ошибки в данных, например, некорректные значения ИМТ.\n",
"\n",
"Смещение: Может быть смещение в данных, например, если выборка нерепрезентативна по полу или региону.\n",
"\n",
"Актуальность: Данные должны быть актуальными, чтобы модель давала точные прогнозы.\n",
"\n",
"Выбросы: Выбросы в данных, например, очень высокие значения стоимости страхового взноса.\n",
"\n",
"Просачивание данных: Не должно быть просачивания данных, например, если стоимость страхового взноса используется в качестве признака."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Примеры решения обнаруженных проблем:\n",
"\n",
"Зашумленность: Очистка данных, удаление или исправление ошибочных значений.\n",
"\n",
"Смещение: Балансировка данных, использование техники выборки.\n",
"\n",
"Актуальность: Использование актуальных данных.\n",
"\n",
"Выбросы: Удаление выбросов или использование техники обработки выбросов.\n",
"\n",
"Просачивание данных: Удаление целевого признака из обучающих данных."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Оценка:\n",
"\n",
"Информативность: Высокая, так как данные содержат много релевантных признаков для прогнозирования стоимости страхового взноса.\n",
"\n",
"Степень покрытия: Высокая, так как данные содержат информацию о большом количестве клиентов.\n",
"\n",
"Соответствие реальным данным: Высокое, так как данные взяты из реальной базы данных медицинского страхования.\n",
"\n",
"Согласованность меток: Высокая, так как данные имеют четко определенные метки."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Чтобы устранить проблемы прощенных строк, необходимо удалить строки с пропущенными значениями."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Разбиение набора данных на обучающую, контрольную и тестовую выборки\n",
"\n",
"Также потребуется приращение данных, если выборки несбалансированы по какому-либо признаку"
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Обучающая выборка: (1663, 4)\n",
"Charges_Grouped\n",
"0 386\n",
"4 277\n",
"1 271\n",
"2 251\n",
"3 244\n",
"5 234\n",
"Name: count, dtype: int64\n",
"Обучающая выборка после oversampling: (2316, 4)\n",
"Charges_Grouped\n",
"3 386\n",
"5 386\n",
"0 386\n",
"1 386\n",
"4 386\n",
"2 386\n",
"Name: count, dtype: int64\n",
"Контрольная выборка: (554, 4)\n",
"Charges_Grouped\n",
"0 129\n",
"4 92\n",
"1 90\n",
"2 84\n",
"3 81\n",
"5 78\n",
"Name: count, dtype: int64\n",
"Тестовая выборка: (555, 4)\n",
"Charges_Grouped\n",
"0 129\n",
"4 93\n",
"1 91\n",
"2 83\n",
"3 81\n",
"5 78\n",
"Name: count, dtype: int64\n"
]
}
],
"source": [
"data = df1[[\"age\", \"charges\", \"children\"]].copy()\n",
"data[\"Charges_Grouped\"] = pd.cut(data[\"age\"], bins=6, labels=False)\n",
"\n",
"interval_counts = data[\"Charges_Grouped\"].value_counts().sort_index()\n",
"\n",
"min_samples_per_interval = 10\n",
"for interval, count in interval_counts.items():\n",
" if count < min_samples_per_interval:\n",
" data.loc[data[\"Charges_Grouped\"] == interval, \"Charges_Grouped\"] = -1\n",
"\n",
"\n",
"df_insurance_train, df_insurance_val, df_insurance_test = split_stratified_into_train_val_test(\n",
" data, stratify_colname=\"Charges_Grouped\", frac_train=0.60, frac_val=0.20, frac_test=0.20)\n",
"\n",
"print(\"Обучающая выборка: \", df_insurance_train.shape)\n",
"print(df_insurance_train[\"Charges_Grouped\"].value_counts())\n",
"\n",
"X_resampled, y_resampled = apply_oversampling(df_insurance_train, df_insurance_train[\"Charges_Grouped\"])\n",
"df_insurance_train_adasyn = pd.DataFrame(X_resampled)\n",
"\n",
"print(\"Обучающая выборка после oversampling: \", df_insurance_train_adasyn.shape)\n",
"print(df_insurance_train_adasyn[\"Charges_Grouped\"].value_counts())\n",
"\n",
"print(\"Контрольная выборка: \", df_insurance_val.shape)\n",
"print(df_insurance_val[\"Charges_Grouped\"].value_counts())\n",
"\n",
"print(\"Тестовая выборка: \", df_insurance_test.shape)\n",
"print(df_insurance_test[\"Charges_Grouped\"].value_counts())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Данные хорошо подходят для построения модели прогнозирования стоимости страхового взноса. Возможны проблемы с зашумленностью и смещением данных."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"2. Цены на автомобили"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Проблемная область: Автомобильная индустрия.\n",
"\n",
"Описание: Набор данных содержит информацию о характеристиках автомобилей, таких как марка, модель, год выпуска, пробег, тип топлива, тип трансмиссии и цена продажи. Нет явных связей, кроме того, что все объекты относятся к автомобилям.\n",
"\n",
"Бизнес-цель: Оптимизация ценообразования на вторичном рынке автомобилей.\n",
"\n",
"Эффект для бизнеса: Увеличение продаж и прибыли за счет более точной оценки рыночной стоимости автомобилей.\n",
"\n",
"Цель технического проекта: Разработка модели машинного обучения для прогнозирования рыночной стоимости автомобиля на основе его характеристик.\n",
"\n",
"Входные признаки: Марка, модель, год выпуска, пробег, тип топлива, тип трансмиссии.\n",
"\n",
"Целевой признак: Цена продажи."
]
},
{
"cell_type": "code",
"execution_count": 70,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"RangeIndex: 19237 entries, 0 to 19236\n",
"Data columns (total 18 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 ID 19237 non-null int64 \n",
" 1 Price 19237 non-null int64 \n",
" 2 Levy 19237 non-null object \n",
" 3 Manufacturer 19237 non-null object \n",
" 4 Model 19237 non-null object \n",
" 5 Prod. year 19237 non-null int64 \n",
" 6 Category 19237 non-null object \n",
" 7 Leather interior 19237 non-null object \n",
" 8 Fuel type 19237 non-null object \n",
" 9 Engine volume 19237 non-null object \n",
" 10 Mileage 19237 non-null object \n",
" 11 Cylinders 19237 non-null float64\n",
" 12 Gear box type 19237 non-null object \n",
" 13 Drive wheels 19237 non-null object \n",
" 14 Doors 19237 non-null object \n",
" 15 Wheel 19237 non-null object \n",
" 16 Color 19237 non-null object \n",
" 17 Airbags 19237 non-null int64 \n",
"dtypes: float64(1), int64(4), object(13)\n",
"memory usage: 2.6+ MB\n",
"ID 0\n",
"Price 0\n",
"Levy 0\n",
"Manufacturer 0\n",
"Model 0\n",
"Prod. year 0\n",
"Category 0\n",
"Leather interior 0\n",
"Fuel type 0\n",
"Engine volume 0\n",
"Mileage 0\n",
"Cylinders 0\n",
"Gear box type 0\n",
"Drive wheels 0\n",
"Doors 0\n",
"Wheel 0\n",
"Color 0\n",
"Airbags 0\n",
"dtype: int64\n",
" ID Price Prod. year Cylinders Airbags\n",
"count 1.923700e+04 1.923700e+04 19237.000000 19237.000000 19237.000000\n",
"mean 4.557654e+07 1.855593e+04 2010.912824 4.582991 6.582627\n",
"std 9.365914e+05 1.905813e+05 5.668673 1.199933 4.320168\n",
"min 2.074688e+07 1.000000e+00 1939.000000 1.000000 0.000000\n",
"25% 4.569837e+07 5.331000e+03 2009.000000 4.000000 4.000000\n",
"50% 4.577231e+07 1.317200e+04 2012.000000 4.000000 6.000000\n",
"75% 4.580204e+07 2.207500e+04 2015.000000 4.000000 12.000000\n",
"max 4.581665e+07 2.630750e+07 2020.000000 16.000000 16.000000\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAtEAAAIjCAYAAADFk0cVAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACx+UlEQVR4nOzdd3hTZfsH8G+6Gd1AS6FCRWQLCspeWigUlK0MBQXBn4KC+AqiyNQXQZmi8qKvoL6gyBAHiJQhoFT2Hi5AEGgZbSltoSM5vz8eT5rdJM04yfl+rqtX0pOT5OnTjDt37nM/GkmSJBARERERkd0CvD0AIiIiIiJfwyCaiIiIiMhBDKKJiIiIiBzEIJqIiIiIyEEMoomIiIiIHMQgmoiIiIjIQQyiiYiIiIgcxCCaiIiIiMhBDKKJiIiIFEaSJGRlZeH333/39lDICgbRREROWLx4MXJycvS/L1iwAPn5+d4bEBH5vJs3b2Ly5MmoV68eQkJCEBsbi7vvvhu//vqrt4dGFmi47De525IlS/DVV1/h8OHDyMrKQmxsLOrVq4cRI0bg8ccfR0AAP8uR70lJSUGDBg3w0ksvYefOnfi///s/3Lhxg49nInLK9evX0bFjR5w/fx7PP/882rZti5CQEAQHB6NVq1YIDQ319hDJBINocrvWrVujevXqePDBBxEREYGcnBz88ssv+OKLL/DYY4/h888/9/YQiRy2Y8cOPPLII8jNzUVAQADmzp2LcePGeXtYROSjhg8fjq+//ho7d+5Eo0aNvD0csgODaHK74uJiBAcHm21//vnnsXjxYpw9exa1a9f2/MCIyiknJwenTp1CYmIiatas6e3hEJGPunLlCqpXr44lS5Zg5MiR3h4O2YnfO5LbWQqgAegDZ8Ovv7/++mv06NEDCQkJCA0NRZ06dTBz5kxotVqj63bq1AkajUb/U6VKFfTo0QPHjx832k+j0WDatGlG295++21oNBp06tTJaPvt27cxbdo03H333QgLC0P16tXRt29f/PnnnwCAc+fOQaPRYPny5UbXGz16NDQaDZ588kn9tuXLl0Oj0SAkJARXr1412j89PV0/7v379xtdtnr1ajRv3hwVKlRAlSpV8Pjjj+PixYtmc3f69Gk8+uijqFq1KipUqIB69erhtddeAwBMmzbNaG4s/fz444/6eWzcuLHZ7dtrz549SE1NRXR0NCpVqoR77rkHCxcu1F/+5JNPonLlyjhz5gxSUlJQqVIlJCQkYMaMGTD9/K7T6bBgwQI0atQIYWFhiIuLwzPPPIPs7Gyz+5X/F5Z+zp07p99P/j+YzvO1a9csPjYuXryI4cOHIy4uDqGhoWjUqBE+/vhjo31+/PFH/RxGRUWhdevWqFmzJnr06GHxNk3J11+zZo3ZZZUrVzZ6HMm+//57tG/fHpUqVUJ4eDh69OiBEydOGO0jz7WpNWvWGP3PgbL/79Ye65acOXMGAwYMQExMDCpWrIhWrVphw4YNZn+vrR9bc2br+j/99JN+v0OHDqF79+6IiIhA5cqV8dBDD+GXX36xeJtPPvmkxdsznXt7X48sMX0ehoeH44EHHsD69euN9nPmf2Ft/KbP76lTpyI4ONjsNQgARo0ahaioKNy+fVu/7fvvv0fHjh0RHh6OiIgI3H///Vi5cqXRWE1fN998800EBAQY7bdr1y4MGDAAd9xxB0JDQ5GYmIgXX3wRt27dKnPesrKy8K9//QtNmjRB5cqVERERge7du+PIkSNG+5k+LkJDQ3H33Xdj1qxZ+tcWR14LAftef+W5b9asmdnYZ82aBY1GY/Y8LCkpwcyZM1GnTh2Ehoaidu3aePXVV1FYWKjfZ9++fdDpdCgqKkKLFi0QFhaG2NhYDBo0COfPnzcbg2ni6cKFC6hQoYLZa6CluZJ/TG9Dfi4nJCQgICBAv1953iP8XZC3B0DqkZOTg5KSEty8eRMHDhzAO++8g4EDB+KOO+7Q77N8+XJUrlwZ48ePR+XKlbFt2zZMmTIFubm5ePvtt41ur379+njttdcgSRL+/PNPzJs3D6mpqWYvOKZjmDVrltl2rVaLnj17YuvWrRg4cCDGjh2LmzdvIi0tDcePH0edOnUs3t4ff/yBDz/80Or9BQYG4n//+x9efPFF/bZly5YhLCzM6M1L/tufeuop3H///Zg1axYyMzOxcOFC/Pzzzzh06BCioqIAAEePHkX79u0RHByMUaNGoXbt2vjzzz/x7bff4s0330Tfvn1x11136W/3xRdfRIMGDTBq1Cj9tgYNGlgds73S0tLQs2dPVK9eHWPHjkV8fDxOnTqF7777DmPHjtXvp9Vq0a1bN7Rq1Qpz5szBpk2bMHXqVJSUlGDGjBn6/Z555hn9HLzwwgs4e/YsFi9ejEOHDuHnn3+2+GFs0KBBSE1NBQBs3LixXKVBmZmZaNWqFTQaDcaMGYOqVavi+++/x4gRI5Cbm2uzVGPnzp3YuHGj0/dty2effYZhw4YhJSUFs2fPRkFBAT744AO0a9cOhw4d8uq3OJmZmWjTpg0KCgrwwgsvIDY2Fp988gkeeeQRrFmzBn369EGDBg3w2Wef6a+zdOlSnDp1CvPnz9dvu+eee8q8rxdeeAH333+/0bZ69eoBAE6cOIH27dsjIiICEyZMQHBwMP7zn/+gU6dO2LFjB1q2bGl2e6Ghofjoo4/0vz/99NNm+zjyemSN/Ldfu3YN77//PgYMGIDjx4/rx+4s0/EDIhBbtGiR/vcnnngCM2bMwKpVqzBmzBj99qKiIqxZswb9+vVDWFiY/m8dPnw4GjVqhEmTJiEqKgqHDh3Cpk2bMHjwYItjWLZsGSZPnoy5c+ca7bN69WoUFBTg2WefRWxsLPbu3Yt3330Xf//9N1avXm3z7zpz5gzWr1+PAQMGICkpCZmZmfjPf/6Djh074uTJk0hISDDa/9VXX0WDBg1w69YtrFq1Cq+++iqqVauGESNGOPRaaO/rLwAEBQXhxIkTOHToEO6991799uXLl+vn09DTTz+NTz75BP3798dLL72EPXv2YNasWTh16hS++uorAKIeGgDGjBmD5s2b46233sLVq1exaNEi/PTTTzh06BCqVKlidd6mTJli9p5iSp4rQDwPDd8rtVotHnnkEfz1118YN24c7r77bmg0Grz55ps2b1P1JCIPqVevngRA/zN06FCpuLjYaJ+CggKz6z3zzDNSxYoVpdu3b+u3dezYUerYsaPRfq+++qoEQLpy5Yp+GwBp6tSp+t8nTJggVatWTWrevLnR9T/++GMJgDRv3jyz+9fpdJIkSdLZs2clANKyZcv0lz366KNS48aNpcTERGnYsGH67cuWLZMASIMGDZKaNGmi356fny9FRERIgwcPlgBI+/btkyRJkoqKiqRq1apJjRs3lm7duqXf/7vvvpMASFOmTNFv69ChgxQeHi799ddfFsdpqlatWkZjM9SxY0epUaNGFi+zpaSkREpKSpJq1aolZWdnWx3HsGHDJADS888/b3R5jx49pJCQEOnq1auSJEnSrl27JADSihUrjG5r06ZNFrf/9ttvEgDpnXfe0W97++23JQDS2bNn9dvk/4M8z7KrV6+aPTZGjBghVa9eXbp27ZrRvgMHDpQiIyP1j83t27dLAKTt27fr92nZsqXUvXt3s9u0RL7+6tWrzS6rVKmS0f/q5s2bUlRUlDRy5Eij/TIyMqTIyEij7cOGDZMqVapkdpurV682G29Z/3dLj3VLxo0bJwGQdu3aZTTmpKQkqXbt2pJWqzW7zrBhw6RatWrZvF1DtuZL1rt3bykkJET6888/9dsuXbokhYeHSx06dDDbf/DgwVLlypWNtpnOvSTZ/3pkydSpUyXTt9jNmzdLAKQvv/xSv82Z/4Uj/+vWrVtLLVu2NNpv3bp1Rvvl5ORI4eHhUsuWLY1efyTJ+Pls+Lq7YcMGKSgoSHrppZfMxmFp3mbNmiVpNBqz1y1Tt2/fNnvcnD17VgoNDZVmzJih32bpeXj79m0pICBAeu655yzetrXXQkdef+W5f/jhh6UxY8bot+/atUuqUKGC1Lt3b6P
"text/plain": [
"<Figure size 800x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df2 = pd.read_csv(\"../data/car_price_prediction.csv\")\n",
"df2.info()\n",
"print(df2.isnull().sum())\n",
"print(df2.describe())\n",
"\n",
"mean_price_per_year = df2.groupby('Prod. year')['Price'].mean()\n",
"plt.figure(figsize=(8, 6))\n",
"mean_price_per_year.plot(kind='line', marker='o', color='blue')\n",
"plt.title('Зависимость средней цены от года выпуска автомобиля')\n",
"plt.xlabel('Год выпуска')\n",
"plt.ylabel('Средняя цена ($)')\n",
"plt.grid(True)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Зашумленность: Возможны ошибки в данных, например, некорректные значения пробега.\n",
"\n",
"Смещение: Может быть смещение в данных, например, если выборка нерепрезентативна по марке или модели автомобиля.\n",
"\n",
"Актуальность: Данные должны быть актуальными, чтобы модель давала точные прогнозы.\n",
"\n",
"Выбросы: Возможны выбросы в данных, например, очень высокие или низкие значения цены продажи.\n",
"\n",
"Просачивание данных: Не должно быть просачивания данных, например, если цена продажи используется в качестве признака.\n",
"\n",
"Решение этих проблем:\n",
"\n",
"Зашумленность: Очистка данных, удаление или исправление ошибочных значений.\n",
"\n",
"Смещение: Балансировка данных, использование техники выборки.\n",
"\n",
"Актуальность: Использование актуальных данных.\n",
"\n",
"Выбросы: Удаление выбросов или использование техники обработки выбросов.\n",
"\n",
"Просачивание данных: Удаление целевого признака из обучающих данных."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Оценка:\n",
"\n",
"Информативность: Высокая, так как данные содержат много релевантных признаков для прогнозирования стоимости страхового взноса.\n",
"\n",
"Степень покрытия: Высокая, так как данные содержат информацию о большом количестве клиентов.\n",
"\n",
"Соответствие реальным данным: Высокое, так как данные взяты из реальной базы данных медицинского страхования.\n",
"\n",
"Согласованность меток: Высокая, так как данные имеют четко определенные метки."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Разбиение набора данных на обучающую, контрольную и тестовую выборки\n",
"\n",
"Также потребуется приращение данных, если выборки несбалансированы по какому-либо признаку"
]
},
{
"cell_type": "code",
"execution_count": 72,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Обучающая выборка: (11541, 4)\n",
"Price_Grouped\n",
" 0 7371\n",
" 1 2761\n",
" 2 935\n",
" 3 272\n",
" 4 96\n",
" 5 50\n",
" 6 22\n",
" 7 13\n",
"-1 9\n",
" 8 8\n",
" 9 4\n",
"Name: count, dtype: int64\n",
"Обучающая выборка после oversampling: (81081, 4)\n",
"Price_Grouped\n",
" 0 7371\n",
" 1 7371\n",
" 2 7371\n",
" 5 7371\n",
" 3 7371\n",
" 4 7371\n",
" 7 7371\n",
" 6 7371\n",
" 8 7371\n",
"-1 7371\n",
" 9 7371\n",
"Name: count, dtype: int64\n",
"Контрольная выборка: (3847, 4)\n",
"Price_Grouped\n",
" 0 2457\n",
" 1 920\n",
" 2 311\n",
" 3 91\n",
" 4 32\n",
" 5 17\n",
" 6 8\n",
" 7 4\n",
" 8 3\n",
"-1 3\n",
" 9 1\n",
"Name: count, dtype: int64\n",
"Тестовая выборка: (3848, 4)\n",
"Price_Grouped\n",
" 0 2458\n",
" 1 921\n",
" 2 312\n",
" 3 90\n",
" 4 32\n",
" 5 17\n",
" 6 7\n",
" 7 4\n",
" 8 3\n",
"-1 3\n",
" 9 1\n",
"Name: count, dtype: int64\n"
]
}
],
"source": [
"df2 = df2[df2['Price'] <= 10000000]\n",
"\n",
"data = df2[[\"Price\", \"Prod. year\", \"Airbags\"]].copy()\n",
"data[\"Price_Grouped\"] = pd.cut(data[\"Price\"], bins=50, labels=False)\n",
"\n",
"interval_counts = data[\"Price_Grouped\"].value_counts().sort_index()\n",
"\n",
"min_samples_per_interval = 5\n",
"for interval, count in interval_counts.items():\n",
" if count < min_samples_per_interval:\n",
" data.loc[data[\"Price_Grouped\"] == interval, \"Price_Grouped\"] = -1\n",
"\n",
"df_price_train, df_price_val, df_price_test = split_stratified_into_train_val_test(\n",
" data, stratify_colname=\"Price_Grouped\", frac_train=0.60, frac_val=0.20, frac_test=0.20)\n",
"\n",
"print(\"Обучающая выборка: \", df_price_train.shape)\n",
"print(df_price_train[\"Price_Grouped\"].value_counts())\n",
"\n",
"\n",
"X_resampled, y_resampled = apply_oversampling(df_price_train, df_price_train[\"Price_Grouped\"])\n",
"df_price_train_adasyn = pd.DataFrame(X_resampled)\n",
"\n",
"print(\"Обучающая выборка после oversampling: \", df_price_train_adasyn.shape)\n",
"print(df_price_train_adasyn[\"Price_Grouped\"].value_counts())\n",
"\n",
"\n",
"print(\"Контрольная выборка: \", df_price_val.shape)\n",
"print(df_price_val[\"Price_Grouped\"].value_counts())\n",
"\n",
"print(\"Тестовая выборка: \", df_price_test.shape)\n",
"print(df_price_test[\"Price_Grouped\"].value_counts())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Данные хорошо подходят для построения модели прогнозирования цены продажи автомобиля. Возможны проблемы с зашумленностью и смещением данных."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"3. Цены на кофе"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Проблемная область: Финансы и инвестиции.\n",
"\n",
"Описание: Набор данных содержит исторические данные о ценах на акции Starbucks (тикер: SBUX) с 1992 по 2021 год. Данные включают информацию о ценах открытия, закрытия, максимальных и минимальных ценах, объеме торгов и скорректированных ценах закрытия.\n",
"\n",
"Связи между объектами: Данные представлены временным рядом, где каждая строка соответствует одному торговому дню. Между объектами существует временная зависимость, так как цены на акции зависят от предыдущих значений.\n",
"\n",
"Бизнес-цель: Прогнозирование будущих цен на акции Starbucks.\n",
"\n",
"Эффект для бизнеса:\n",
"\n",
"Для инвесторов: Повышение точности прогнозов позволяет инвесторам принимать более обоснованные решения о покупке и продаже акций, что может привести к увеличению прибыли.\n",
"\n",
"Для компании Starbucks: Понимание динамики цен на акции может помочь в разработке стратегий привлечения инвестиций и повышения рыночной стоимости компании."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Цель технического проекта: Разработка модели машинного обучения для прогнозирования цены закрытия акций Starbucks на следующий день.\n",
"\n",
"Входные признаки:\n",
"\n",
"Open (цена открытия)\n",
"\n",
"High (максимальная цена)\n",
"\n",
"Low (минимальная цена)\n",
"\n",
"Close (цена закрытия)\n",
"\n",
"Volume (объем торгов)\n",
"\n",
"Adj Close (скорректированная цена закрытия)\n",
"\n",
"Целевой признак: Close (цена закрытия на следующий день)."
]
},
{
"cell_type": "code",
"execution_count": 76,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"RangeIndex: 8036 entries, 0 to 8035\n",
"Data columns (total 7 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 Date 8036 non-null object \n",
" 1 Open 8036 non-null float64\n",
" 2 High 8036 non-null float64\n",
" 3 Low 8036 non-null float64\n",
" 4 Close 8036 non-null float64\n",
" 5 Adj Close 8036 non-null float64\n",
" 6 Volume 8036 non-null int64 \n",
"dtypes: float64(5), int64(1), object(1)\n",
"memory usage: 439.6+ KB\n",
"Date 0\n",
"Open 0\n",
"High 0\n",
"Low 0\n",
"Close 0\n",
"Adj Close 0\n",
"Volume 0\n",
"dtype: int64\n",
" Open High Low Close Adj Close \\\n",
"count 8036.000000 8036.000000 8036.000000 8036.000000 8036.000000 \n",
"mean 30.054280 30.351487 29.751322 30.058857 26.674025 \n",
"std 33.615577 33.906613 33.314569 33.615911 31.728090 \n",
"min 0.328125 0.347656 0.320313 0.335938 0.260703 \n",
"25% 4.392031 4.531250 4.304922 4.399610 3.414300 \n",
"50% 13.325000 13.493750 13.150000 13.330000 10.352452 \n",
"75% 55.250000 55.722501 54.852499 55.267499 47.464829 \n",
"max 126.080002 126.320000 124.809998 126.059998 118.010414 \n",
"\n",
" Volume \n",
"count 8.036000e+03 \n",
"mean 1.470459e+07 \n",
"std 1.340021e+07 \n",
"min 1.504000e+06 \n",
"25% 7.817750e+06 \n",
"50% 1.169815e+07 \n",
"75% 1.778795e+07 \n",
"max 5.855088e+08 \n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df3 = pd.read_csv(\"../data/Starbucks Dataset.csv\")\n",
"df3.info()\n",
"print(df3.isnull().sum())\n",
"print(df3.describe())\n",
"\n",
"plt.plot(df3[\"Date\"], df3[\"High\"])\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Зашумленность: Возможны случайные колебания цен, которые могут быть вызваны внешними факторами.\n",
"\n",
"Смещение: Нет явного смещения, так как данные представляют собой временной ряд.\n",
"\n",
"Актуальность: Данные актуальны до 2021 года, но для более точного прогнозирования могут потребоваться более свежие данные.\n",
"\n",
"Выбросы: Возможны выбросы в данных, например, резкие скачки цен, вызванные внешними событиями (кризисы, слияния и поглощения).\n",
"\n",
"Просачивание данных: Не должно быть просачивания данных, так как целевой признак (цена закрытия на следующий день) не должен использоваться в качестве признака."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Примеры их решений:\n",
"\n",
"Зашумленность: Использование методов сглаживания временных рядов, таких как скользящее среднее или экспоненциальное сглаживание.\n",
"\n",
"Выбросы: Удаление выбросов или использование техники обработки выбросов, такой как Winsorization.\n",
"\n",
"Актуальность: Обновление данных до последней доступной даты."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Оценка набора данных:\n",
"\n",
"Информативность: Высокая, так как данные содержат много релевантных признаков для прогнозирования цен на акции.\n",
"\n",
"Степень покрытия: Высокая, так как данные охватывают длительный период времени (1992-2021).\n",
"\n",
"Соответствие реальным данным: Высокое, так как данные взяты из реальной торговой платформы.\n",
"\n",
"Согласованность меток: Высокая, так как данные имеют четко определенные метки."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Выборки сбалансированы, так как данные представляют собой временной ряд, и каждая строка соответствует одному торговому дню.\n",
"Данные представлены в виде временного ряда, поэтому не требуется исмпользовать методы приращения данных."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Для временных рядов методы oversampling и undersampling обычно не применяются, так как они могут нарушить временную структуру данных."
]
},
{
"cell_type": "code",
"execution_count": 78,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Обучающая выборка: (4821, 4)\n",
"Volume_Grouped\n",
" 0 2802\n",
" 1 1460\n",
" 2 369\n",
" 3 111\n",
" 4 40\n",
" 5 18\n",
"-1 10\n",
" 6 7\n",
" 7 4\n",
"Name: count, dtype: int64\n",
"Контрольная выборка: (1607, 4)\n",
"Volume_Grouped\n",
" 0 934\n",
" 1 487\n",
" 2 123\n",
" 3 37\n",
" 4 13\n",
" 5 6\n",
"-1 4\n",
" 6 2\n",
" 7 1\n",
"Name: count, dtype: int64\n",
"Тестовая выборка: (1608, 4)\n",
"Volume_Grouped\n",
" 0 934\n",
" 1 487\n",
" 2 124\n",
" 3 37\n",
" 4 14\n",
" 5 6\n",
"-1 3\n",
" 6 2\n",
" 7 1\n",
"Name: count, dtype: int64\n"
]
}
],
"source": [
"data = df3[[\"Volume\", \"High\", \"Low\"]].copy()\n",
"data[\"Volume_Grouped\"] = pd.cut(data[\"Volume\"], bins=50, labels=False)\n",
"\n",
"interval_counts = data[\"Volume_Grouped\"].value_counts().sort_index()\n",
"\n",
"min_samples_per_interval = 5\n",
"for interval, count in interval_counts.items():\n",
" if count < min_samples_per_interval:\n",
" data.loc[data[\"Volume_Grouped\"] == interval, \"Volume_Grouped\"] = -1\n",
"\n",
"\n",
"df_coffee_train, df_coffee_val, df_coffee_test = split_stratified_into_train_val_test(\n",
" data, stratify_colname=\"Volume_Grouped\", frac_train=0.60, frac_val=0.20, frac_test=0.20)\n",
"\n",
"print(\"Обучающая выборка: \", df_coffee_train.shape)\n",
"print(df_coffee_train[\"Volume_Grouped\"].value_counts())\n",
"\n",
"print(\"Контрольная выборка: \", df_coffee_val.shape)\n",
"print(df_coffee_val[\"Volume_Grouped\"].value_counts())\n",
"\n",
"print(\"Тестовая выборка: \", df_coffee_test.shape)\n",
"print(df_coffee_test[\"Volume_Grouped\"].value_counts())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Вывод:\n",
"\n",
"Данные хорошо подходят для построения модели прогнозирования цен на акции Starbucks.\n",
"\n",
"Возможны проблемы с зашумленностью и выбросами в данных.\n",
"\n",
"Для улучшения качества модели можно использовать методы сглаживания временных рядов и обработки выбросов."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "aimvenv",
"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.6"
}
},
"nbformat": 4,
"nbformat_minor": 2
}