You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ML-For-Beginners/translations/ru/2-Regression/2-Data/solution/R/lesson_2-R.ipynb

668 lines
32 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

{
"nbformat": 4,
"nbformat_minor": 2,
"metadata": {
"colab": {
"name": "lesson_2-R.ipynb",
"provenance": [],
"collapsed_sections": [],
"toc_visible": true
},
"kernelspec": {
"name": "ir",
"display_name": "R"
},
"language_info": {
"name": "R"
},
"coopTranslator": {
"original_hash": "f3c335f9940cfd76528b3ef918b9b342",
"translation_date": "2025-08-29T23:13:36+00:00",
"source_file": "2-Regression/2-Data/solution/R/lesson_2-R.ipynb",
"language_code": "ru"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"# Построение модели регрессии: подготовка и визуализация данных\n",
"\n",
"## **Линейная регрессия для тыкв - Урок 2**\n",
"#### Введение\n",
"\n",
"Теперь, когда у вас есть все необходимые инструменты для начала работы с построением моделей машинного обучения с использованием Tidymodels и Tidyverse, вы готовы начать задавать вопросы вашим данным. Работая с данными и применяя решения на основе машинного обучения, крайне важно уметь задавать правильные вопросы, чтобы максимально раскрыть потенциал вашего набора данных.\n",
"\n",
"В этом уроке вы узнаете:\n",
"\n",
"- Как подготовить данные для построения модели.\n",
"\n",
"- Как использовать `ggplot2` для визуализации данных.\n",
"\n",
"Вопрос, на который вы хотите получить ответ, определит, какой тип алгоритмов машинного обучения вы будете использовать. А качество полученного ответа будет во многом зависеть от характера ваших данных.\n",
"\n",
"Давайте разберем это на практическом примере.\n",
"\n",
"<p >\n",
" <img src=\"../../images/unruly_data.jpg\"\n",
" width=\"700\"/>\n",
" <figcaption>Иллюстрация от @allison_horst</figcaption>\n"
],
"metadata": {
"id": "Pg5aexcOPqAZ"
}
},
{
"cell_type": "markdown",
"source": [
"## 1. Импорт данных о тыквах и вызов Tidyverse\n",
"\n",
"Для работы с данными в этом уроке нам понадобятся следующие пакеты:\n",
"\n",
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) — это [набор пакетов для R](https://www.tidyverse.org/packages), созданный для того, чтобы сделать работу с данными быстрее, проще и интереснее!\n",
"\n",
"Вы можете установить их следующим образом:\n",
"\n",
"`install.packages(c(\"tidyverse\"))`\n",
"\n",
"Скрипт ниже проверяет, установлены ли у вас необходимые пакеты для выполнения этого модуля, и устанавливает их, если каких-то не хватает.\n"
],
"metadata": {
"id": "dc5WhyVdXAjR"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n",
"pacman::p_load(tidyverse)"
],
"outputs": [],
"metadata": {
"id": "GqPYUZgfXOBt"
}
},
{
"cell_type": "markdown",
"source": [
"Теперь давайте запустим несколько пакетов и загрузим [данные](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv), предоставленные для этого урока!\n"
],
"metadata": {
"id": "kvjDTPDSXRr2"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Load the core Tidyverse packages\n",
"library(tidyverse)\n",
"\n",
"# Import the pumpkins data\n",
"pumpkins <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/2-Regression/data/US-pumpkins.csv\")\n",
"\n",
"\n",
"# Get a glimpse and dimensions of the data\n",
"glimpse(pumpkins)\n",
"\n",
"\n",
"# Print the first 50 rows of the data set\n",
"pumpkins %>% \n",
" slice_head(n =50)"
],
"outputs": [],
"metadata": {
"id": "VMri-t2zXqgD"
}
},
{
"cell_type": "markdown",
"source": [
"Быстрый вызов `glimpse()` сразу показывает, что есть пропуски и смесь строковых данных (`chr`) и числовых данных (`dbl`). Поле `Date` имеет тип \"символы\", а также есть странный столбец под названием `Package`, где данные представляют собой смесь значений, таких как `sacks`, `bins` и других. Данные, по сути, немного хаотичны 😤.\n",
"\n",
"На самом деле, довольно редко встречается набор данных, который полностью готов к использованию для создания модели машинного обучения прямо \"из коробки\". Но не переживайте, в этом уроке вы научитесь подготавливать необработанный набор данных с использованием стандартных библиотек R 🧑‍🔧. Вы также освоите различные техники визуализации данных. 📈📊\n",
"<br>\n",
"\n",
"> Напоминание: Оператор pipe (`%>%`) выполняет операции в логической последовательности, передавая объект дальше в функцию или выражение. Вы можете представить оператор pipe как выражение \"а затем\" в вашем коде.\n"
],
"metadata": {
"id": "REWcIv9yX29v"
}
},
{
"cell_type": "markdown",
"source": [
"## 2. Проверка на отсутствие данных\n",
"\n",
"Одна из самых распространенных проблем, с которыми сталкиваются специалисты по данным, — это неполные или отсутствующие данные. В R отсутствующие или неизвестные значения обозначаются специальным значением `NA` (Not Available).\n",
"\n",
"Как же определить, что в датафрейме есть пропущенные значения?\n",
"<br>\n",
"- Один из простых способов — использовать базовую функцию R `anyNA`, которая возвращает логические значения `TRUE` или `FALSE`.\n"
],
"metadata": {
"id": "Zxfb3AM5YbUe"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"pumpkins %>% \n",
" anyNA()"
],
"outputs": [],
"metadata": {
"id": "G--DQutAYltj"
}
},
{
"cell_type": "markdown",
"source": [
"Отлично, похоже, что некоторые данные отсутствуют! Это хорошее место для начала.\n",
"\n",
"- Другой способ — использовать функцию `is.na()`, которая показывает, какие элементы столбца отсутствуют, возвращая логическое значение `TRUE`.\n"
],
"metadata": {
"id": "mU-7-SB6YokF"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"pumpkins %>% \n",
" is.na() %>% \n",
" head(n = 7)"
],
"outputs": [],
"metadata": {
"id": "W-DxDOR4YxSW"
}
},
{
"cell_type": "markdown",
"source": [
"Хорошо, задача выполнена, но с таким большим датафреймом это было бы неэффективно и практически невозможно просмотреть все строки и столбцы по отдельности😴.\n",
"\n",
"- Более интуитивный способ — это вычислить сумму пропущенных значений для каждого столбца:\n"
],
"metadata": {
"id": "xUWxipKYY0o7"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"pumpkins %>% \n",
" is.na() %>% \n",
" colSums()"
],
"outputs": [],
"metadata": {
"id": "ZRBWV6P9ZArL"
}
},
{
"cell_type": "markdown",
"source": [
"Гораздо лучше! Данных не хватает, но, возможно, это не будет иметь значения для выполнения задачи. Посмотрим, что покажет дальнейший анализ.\n",
"\n",
"> Вместе с потрясающим набором пакетов и функций, R обладает очень хорошей документацией. Например, используйте `help(colSums)` или `?colSums`, чтобы узнать больше о функции.\n"
],
"metadata": {
"id": "9gv-crB6ZD1Y"
}
},
{
"cell_type": "markdown",
"source": [
"## 3. Dplyr: Грамматика манипуляций с данными\n",
"\n",
"<p >\n",
" <img src=\"../../images/dplyr_wrangling.png\"\n",
" width=\"569\"/>\n",
" <figcaption>Иллюстрация от @allison_horst</figcaption>\n",
"\n",
"\n",
"<!--![Иллюстрация от \\@allison_horst](../../../../../../translated_images/dplyr_wrangling.f5f99c64fd4580f1377fee3ea428b6f8fd073845ec0f8409d483cfe148f0984e.ru.png)<br/>Иллюстрация от \\@allison_horst-->\n"
],
"metadata": {
"id": "o4jLY5-VZO2C"
}
},
{
"cell_type": "markdown",
"source": [
"[`dplyr`](https://dplyr.tidyverse.org/), пакет из Tidyverse, представляет собой грамматику манипуляции данными, которая предлагает набор удобных глаголов для решения наиболее распространённых задач обработки данных. В этом разделе мы рассмотрим некоторые из глаголов dplyr! \n",
"<br>\n"
],
"metadata": {
"id": "i5o33MQBZWWw"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::select()\n",
"\n",
"`select()` — это функция из пакета `dplyr`, которая помогает выбрать столбцы для сохранения или исключения.\n",
"\n",
"Чтобы упростить работу с вашим датафреймом, удалите несколько его столбцов, используя `select()`, оставив только те, которые вам нужны.\n",
"\n",
"Например, в этом упражнении наш анализ будет включать столбцы `Package`, `Low Price`, `High Price` и `Date`. Давайте выберем эти столбцы.\n"
],
"metadata": {
"id": "x3VGMAGBZiUr"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Select desired columns\n",
"pumpkins <- pumpkins %>% \n",
" select(Package, `Low Price`, `High Price`, Date)\n",
"\n",
"\n",
"# Print data set\n",
"pumpkins %>% \n",
" slice_head(n = 5)"
],
"outputs": [],
"metadata": {
"id": "F_FgxQnVZnM0"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::mutate()\n",
"\n",
"`mutate()` — это функция из пакета `dplyr`, которая помогает создавать или изменять столбцы, сохраняя существующие столбцы.\n",
"\n",
"Общая структура функции `mutate` выглядит так:\n",
"\n",
"`data %>% mutate(new_column_name = what_it_contains)`\n",
"\n",
"Давайте попробуем использовать `mutate` на примере столбца `Date`, выполняя следующие операции:\n",
"\n",
"1. Преобразуем даты (в настоящее время они имеют тип character) в формат месяца (это даты США, поэтому формат — `MM/DD/YYYY`).\n",
"\n",
"2. Извлечем месяц из дат в новый столбец.\n",
"\n",
"В R пакет [lubridate](https://lubridate.tidyverse.org/) упрощает работу с данными типа Date-time. Поэтому давайте использовать `dplyr::mutate()`, `lubridate::mdy()`, `lubridate::month()` и посмотрим, как достичь указанных целей. Мы можем удалить столбец Date, так как он больше не понадобится в последующих операциях.\n"
],
"metadata": {
"id": "2KKo0Ed9Z1VB"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Load lubridate\n",
"library(lubridate)\n",
"\n",
"pumpkins <- pumpkins %>% \n",
" # Convert the Date column to a date object\n",
" mutate(Date = mdy(Date)) %>% \n",
" # Extract month from Date\n",
" mutate(Month = month(Date)) %>% \n",
" # Drop Date column\n",
" select(-Date)\n",
"\n",
"# View the first few rows\n",
"pumpkins %>% \n",
" slice_head(n = 7)"
],
"outputs": [],
"metadata": {
"id": "5joszIVSZ6xe"
}
},
{
"cell_type": "markdown",
"source": [
"Ура! 🤩\n",
"\n",
"Теперь давайте создадим новый столбец `Price`, который будет представлять среднюю цену тыквы. Для этого возьмем среднее значение из столбцов `Low Price` и `High Price`, чтобы заполнить новый столбец Price.\n",
"<br>\n"
],
"metadata": {
"id": "nIgLjNMCZ-6Y"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Create a new column Price\n",
"pumpkins <- pumpkins %>% \n",
" mutate(Price = (`Low Price` + `High Price`)/2)\n",
"\n",
"# View the first few rows of the data\n",
"pumpkins %>% \n",
" slice_head(n = 5)"
],
"outputs": [],
"metadata": {
"id": "Zo0BsqqtaJw2"
}
},
{
"cell_type": "markdown",
"source": [
"Дааа!💪\n",
"\n",
"\"Но постойте!\", скажете вы, пробежавшись по всему набору данных с помощью `View(pumpkins)`, \"Здесь что-то странное!\"🤔\n",
"\n",
"Если вы посмотрите на столбец `Package`, то увидите, что тыквы продаются в самых разных конфигурациях. Некоторые продаются в мерах `1 1/9 bushel`, некоторые в мерах `1/2 bushel`, некоторые поштучно, некоторые на вес (в фунтах), а некоторые в больших коробках с разной шириной.\n",
"\n",
"Давайте это проверим:\n"
],
"metadata": {
"id": "p77WZr-9aQAR"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Verify the distinct observations in Package column\n",
"pumpkins %>% \n",
" distinct(Package)"
],
"outputs": [],
"metadata": {
"id": "XISGfh0IaUy6"
}
},
{
"cell_type": "markdown",
"source": [
"Удивительно!👏\n",
"\n",
"Тыквы, похоже, очень сложно взвешивать с одинаковой точностью, поэтому давайте отфильтруем их, выбрав только те тыквы, в которых строка *bushel* находится в столбце `Package`, и поместим это в новый датафрейм `new_pumpkins`.\n"
],
"metadata": {
"id": "7sMjiVujaZxY"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::filter() и stringr::str_detect()\n",
"\n",
"[`dplyr::filter()`](https://dplyr.tidyverse.org/reference/filter.html): создает подмножество данных, содержащее только **строки**, которые удовлетворяют вашим условиям, в данном случае тыквы со строкой *bushel* в столбце `Package`.\n",
"\n",
"[stringr::str_detect()](https://stringr.tidyverse.org/reference/str_detect.html): определяет наличие или отсутствие шаблона в строке.\n",
"\n",
"Пакет [`stringr`](https://github.com/tidyverse/stringr) предоставляет простые функции для выполнения распространенных операций со строками.\n"
],
"metadata": {
"id": "L8Qfcs92ageF"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Retain only pumpkins with \"bushel\"\n",
"new_pumpkins <- pumpkins %>% \n",
" filter(str_detect(Package, \"bushel\"))\n",
"\n",
"# Get the dimensions of the new data\n",
"dim(new_pumpkins)\n",
"\n",
"# View a few rows of the new data\n",
"new_pumpkins %>% \n",
" slice_head(n = 5)"
],
"outputs": [],
"metadata": {
"id": "hy_SGYREampd"
}
},
{
"cell_type": "markdown",
"source": [
"Вы можете видеть, что мы сократили данные до примерно 415 строк, содержащих тыквы в бушелях.🤩\n",
"<br>\n"
],
"metadata": {
"id": "VrDwF031avlR"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::case_when()\n",
"\n",
"**Но подождите! Есть еще кое-что, что нужно сделать**\n",
"\n",
"Вы заметили, что количество бушелей варьируется от строки к строке? Вам нужно нормализовать цены, чтобы показывать стоимость за бушель, а не за 1 1/9 или 1/2 бушеля. Пора заняться математикой, чтобы стандартизировать это.\n",
"\n",
"Мы будем использовать функцию [`case_when()`](https://dplyr.tidyverse.org/reference/case_when.html), чтобы *изменить* столбец Price в зависимости от некоторых условий. `case_when` позволяет векторизовать несколько выражений `if_else()`.\n"
],
"metadata": {
"id": "mLpw2jH4a0tx"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Convert the price if the Package contains fractional bushel values\n",
"new_pumpkins <- new_pumpkins %>% \n",
" mutate(Price = case_when(\n",
" str_detect(Package, \"1 1/9\") ~ Price/(1 + 1/9),\n",
" str_detect(Package, \"1/2\") ~ Price/(1/2),\n",
" TRUE ~ Price))\n",
"\n",
"# View the first few rows of the data\n",
"new_pumpkins %>% \n",
" slice_head(n = 30)"
],
"outputs": [],
"metadata": {
"id": "P68kLVQmbM6I"
}
},
{
"cell_type": "markdown",
"source": [
"Теперь мы можем проанализировать стоимость за единицу, основываясь на их измерении в бушелях. Однако все это изучение бушелей тыкв показывает, насколько `важно` `понимать природу ваших данных`!\n",
"\n",
"> ✅ Согласно [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308), вес бушеля зависит от типа продукта, так как это объемная мера. \"Бушель помидоров, например, должен весить 56 фунтов... Листья и зелень занимают больше места при меньшем весе, поэтому бушель шпината весит всего 20 фунтов.\" Все это довольно сложно! Давайте не будем заморачиваться с переводом бушелей в фунты, а вместо этого оценим стоимость по бушелям. Однако все это изучение бушелей тыкв показывает, насколько важно понимать природу ваших данных!\n",
">\n",
"> ✅ Вы заметили, что тыквы, продаваемые половинными бушелями, очень дорогие? Можете понять, почему? Подсказка: маленькие тыквы намного дороже больших, вероятно, потому что их гораздо больше в одном бушеле, учитывая неиспользованное пространство, занимаемое одной большой полой тыквой для пирога.\n"
],
"metadata": {
"id": "pS2GNPagbSdb"
}
},
{
"cell_type": "markdown",
"source": [
"Теперь, наконец, ради чистого приключения 💁‍♀️, давайте также переместим столбец \"Месяц\" на первую позицию, то есть `перед` столбцом \"Пакет\".\n",
"\n",
"Для изменения позиций столбцов используется `dplyr::relocate()`.\n"
],
"metadata": {
"id": "qql1SowfbdnP"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Create a new data frame new_pumpkins\n",
"new_pumpkins <- new_pumpkins %>% \n",
" relocate(Month, .before = Package)\n",
"\n",
"new_pumpkins %>% \n",
" slice_head(n = 7)"
],
"outputs": [],
"metadata": {
"id": "JJ1x6kw8bixF"
}
},
{
"cell_type": "markdown",
"source": [
"Отличная работа!👌 Теперь у вас есть чистый, аккуратный набор данных, на основе которого можно построить новую регрессионную модель!\n"
],
"metadata": {
"id": "y8TJ0Za_bn5Y"
}
},
{
"cell_type": "markdown",
"source": [
"## 4. Визуализация данных с помощью ggplot2\n",
"\n",
"<p >\n",
" <img src=\"../../images/data-visualization.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Инфографика от Дасани Мадипалли</figcaption>\n",
"\n",
"\n",
"<!--![Инфографика от Дасани Мадипалли](../../../../../../translated_images/data-visualization.54e56dded7c1a804d00d027543f2881cb32da73aeadda2d4a4f10f3497526114.ru.png){width=\"600\"}-->\n",
"\n",
"Существует *мудрое* высказывание, которое звучит так:\n",
"\n",
"> \"Простой график принес больше информации в сознание аналитика данных, чем любое другое устройство.\" --- Джон Тьюки\n",
"\n",
"Часть работы специалиста по данным заключается в том, чтобы продемонстрировать качество и характер данных, с которыми он работает. Для этого они часто создают интересные визуализации, такие как графики, диаграммы и чарты, показывающие различные аспекты данных. Таким образом, они могут визуально показать взаимосвязи и пробелы, которые иначе было бы сложно обнаружить.\n",
"\n",
"Визуализации также могут помочь определить, какой метод машинного обучения наиболее подходит для данных. Например, диаграмма рассеяния, которая, кажется, следует линии, указывает на то, что данные хорошо подходят для задачи линейной регрессии.\n",
"\n",
"R предлагает несколько систем для создания графиков, но [`ggplot2`](https://ggplot2.tidyverse.org/index.html) является одной из самых элегантных и универсальных. `ggplot2` позволяет создавать графики, **комбинируя независимые компоненты**.\n",
"\n",
"Давайте начнем с простого графика рассеяния для столбцов Price и Month.\n",
"\n",
"В этом случае мы начнем с [`ggplot()`](https://ggplot2.tidyverse.org/reference/ggplot.html), укажем набор данных и эстетическое отображение (с помощью [`aes()`](https://ggplot2.tidyverse.org/reference/aes.html)), а затем добавим слои (например, [`geom_point()`](https://ggplot2.tidyverse.org/reference/geom_point.html)) для создания графика рассеяния.\n"
],
"metadata": {
"id": "mYSH6-EtbvNa"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Set a theme for the plots\n",
"theme_set(theme_light())\n",
"\n",
"# Create a scatter plot\n",
"p <- ggplot(data = new_pumpkins, aes(x = Price, y = Month))\n",
"p + geom_point()"
],
"outputs": [],
"metadata": {
"id": "g2YjnGeOcLo4"
}
},
{
"cell_type": "markdown",
"source": [
"Является ли этот график полезным 🤷? Есть ли в нем что-то удивительное?\n",
"\n",
"Он не особенно полезен, так как просто отображает ваши данные в виде набора точек за определенный месяц.\n",
"<br>\n"
],
"metadata": {
"id": "Ml7SDCLQcPvE"
}
},
{
"cell_type": "markdown",
"source": [
"### **Как сделать это полезным?**\n",
"\n",
"Чтобы графики отображали полезные данные, обычно необходимо как-то сгруппировать данные. Например, в нашем случае нахождение средней цены тыкв за каждый месяц даст больше понимания скрытых закономерностей в наших данных. Это подводит нас к еще одному быстрому обзору **dplyr**:\n",
"\n",
"#### `dplyr::group_by() %>% summarize()`\n",
"\n",
"Групповая агрегация в R может быть легко выполнена с помощью\n",
"\n",
"`dplyr::group_by() %>% summarize()`\n",
"\n",
"- `dplyr::group_by()` изменяет единицу анализа с полного набора данных на отдельные группы, такие как по месяцам.\n",
"\n",
"- `dplyr::summarize()` создает новый датафрейм с одним столбцом для каждой переменной группировки и одним столбцом для каждой из указанных вами статистик сводки.\n",
"\n",
"Например, мы можем использовать `dplyr::group_by() %>% summarize()` для группировки тыкв по столбцу **Month**, а затем найти **среднюю цену** для каждого месяца.\n"
],
"metadata": {
"id": "jMakvJZIcVkh"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Find the average price of pumpkins per month\r\n",
"new_pumpkins %>%\r\n",
" group_by(Month) %>% \r\n",
" summarise(mean_price = mean(Price))"
],
"outputs": [],
"metadata": {
"id": "6kVSUa2Bcilf"
}
},
{
"cell_type": "markdown",
"source": [
"Кратко!✨\n",
"\n",
"Категориальные признаки, такие как месяцы, лучше всего представлять с помощью столбчатой диаграммы 📊. Слои, отвечающие за создание столбчатых диаграмм, — это `geom_bar()` и `geom_col()`. Обратитесь к `?geom_bar`, чтобы узнать больше.\n",
"\n",
"Давайте создадим одну!\n"
],
"metadata": {
"id": "Kds48GUBcj3W"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Find the average price of pumpkins per month then plot a bar chart\r\n",
"new_pumpkins %>%\r\n",
" group_by(Month) %>% \r\n",
" summarise(mean_price = mean(Price)) %>% \r\n",
" ggplot(aes(x = Month, y = mean_price)) +\r\n",
" geom_col(fill = \"midnightblue\", alpha = 0.7) +\r\n",
" ylab(\"Pumpkin Price\")"
],
"outputs": [],
"metadata": {
"id": "VNbU1S3BcrxO"
}
},
{
"cell_type": "markdown",
"source": [
"🤩🤩 Это более полезная визуализация данных! Кажется, она показывает, что самые высокие цены на тыквы наблюдаются в сентябре и октябре. Соответствует ли это вашим ожиданиям? Почему да или почему нет?\n",
"\n",
"Поздравляем с завершением второго урока 👏! Вы подготовили свои данные для построения модели, а затем раскрыли больше инсайтов с помощью визуализаций!\n"
],
"metadata": {
"id": "zDm0VOzzcuzR"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Отказ от ответственности**: \nЭтот документ был переведен с помощью сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Хотя мы стремимся к точности, пожалуйста, учитывайте, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода.\n"
]
}
]
}