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/br/2-Regression/2-Data/solution/R/lesson_2-R.ipynb

668 lines
24 KiB

{
"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:16:14+00:00",
"source_file": "2-Regression/2-Data/solution/R/lesson_2-R.ipynb",
"language_code": "br"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"# Construir um modelo de regressão: preparar e visualizar dados\n",
"\n",
"## **Regressão Linear para Abóboras - Aula 2**\n",
"#### Introdução\n",
"\n",
"Agora que você já está equipado com as ferramentas necessárias para começar a construir modelos de aprendizado de máquina com Tidymodels e o Tidyverse, está pronto para começar a fazer perguntas sobre seus dados. Ao trabalhar com dados e aplicar soluções de aprendizado de máquina, é muito importante entender como formular a pergunta certa para desbloquear adequadamente o potencial do seu conjunto de dados.\n",
"\n",
"Nesta aula, você aprenderá:\n",
"\n",
"- Como preparar seus dados para a construção de modelos.\n",
"\n",
"- Como usar `ggplot2` para visualização de dados.\n",
"\n",
"A pergunta que você precisa responder determinará o tipo de algoritmos de aprendizado de máquina que você utilizará. E a qualidade da resposta que você obtiver dependerá fortemente da natureza dos seus dados.\n",
"\n",
"Vamos ver isso na prática por meio de um exercício.\n",
"\n",
"<p >\n",
" <img src=\"../../images/unruly_data.jpg\"\n",
" width=\"700\"/>\n",
" <figcaption>Arte por @allison_horst</figcaption>\n"
],
"metadata": {
"id": "Pg5aexcOPqAZ"
}
},
{
"cell_type": "markdown",
"source": [
"## 1. Importando dados de abóboras e invocando o Tidyverse\n",
"\n",
"Vamos precisar dos seguintes pacotes para explorar e manipular esta lição:\n",
"\n",
"- `tidyverse`: O [tidyverse](https://www.tidyverse.org/) é uma [coleção de pacotes R](https://www.tidyverse.org/packages) projetada para tornar a ciência de dados mais rápida, fácil e divertida!\n",
"\n",
"Você pode instalá-los assim:\n",
"\n",
"`install.packages(c(\"tidyverse\"))`\n",
"\n",
"O script abaixo verifica se você possui os pacotes necessários para completar este módulo e os instala para você caso algum esteja faltando.\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": [
"Agora, vamos iniciar alguns pacotes e carregar os [dados](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) fornecidos para esta lição!\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": [
"Um rápido `glimpse()` mostra imediatamente que há valores em branco e uma mistura de strings (`chr`) e dados numéricos (`dbl`). A coluna `Date` está no formato de texto e há também uma coluna estranha chamada `Package`, onde os dados são uma mistura de `sacks`, `bins` e outros valores. Na verdade, os dados estão um pouco bagunçados 😤.\n",
"\n",
"De fato, não é muito comum receber um conjunto de dados completamente pronto para ser usado na criação de um modelo de ML diretamente. Mas não se preocupe, nesta lição, você aprenderá como preparar um conjunto de dados bruto usando bibliotecas padrão do R 🧑‍🔧. Você também aprenderá várias técnicas para visualizar os dados. 📈📊\n",
"<br>\n",
"\n",
"> Um lembrete: O operador pipe (`%>%`) realiza operações em sequência lógica, passando um objeto adiante para uma função ou expressão. Você pode pensar no operador pipe como se estivesse dizendo \"e então\" no seu código.\n"
],
"metadata": {
"id": "REWcIv9yX29v"
}
},
{
"cell_type": "markdown",
"source": [
"## 2. Verificar dados ausentes\n",
"\n",
"Um dos problemas mais comuns que os cientistas de dados precisam lidar é com dados incompletos ou ausentes. O R representa valores ausentes ou desconhecidos com um valor especial chamado sentinela: `NA` (Not Available).\n",
"\n",
"Então, como saberíamos que o data frame contém valores ausentes? \n",
"<br>\n",
"- Uma maneira direta seria usar a função base do R `anyNA`, que retorna os objetos lógicos `TRUE` ou `FALSE`.\n"
],
"metadata": {
"id": "Zxfb3AM5YbUe"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"pumpkins %>% \n",
" anyNA()"
],
"outputs": [],
"metadata": {
"id": "G--DQutAYltj"
}
},
{
"cell_type": "markdown",
"source": [
"Ótimo, parece que há alguns dados faltando! Esse é um bom ponto de partida.\n",
"\n",
"- Outra maneira seria usar a função `is.na()`, que indica quais elementos individuais da coluna estão ausentes com um valor lógico `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": [
"Certo, trabalho concluído, mas com um dataframe tão grande como este, seria ineficiente e praticamente impossível revisar todas as linhas e colunas individualmente😴.\n",
"\n",
"- Uma maneira mais intuitiva seria calcular a soma dos valores ausentes para cada coluna:\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": [
"Muito melhor! Há dados faltando, mas talvez isso não importe para a tarefa em questão. Vamos ver o que uma análise mais aprofundada revela.\n",
"\n",
"> Junto com os incríveis conjuntos de pacotes e funções, o R possui uma documentação muito boa. Por exemplo, use `help(colSums)` ou `?colSums` para saber mais sobre a função.\n"
],
"metadata": {
"id": "9gv-crB6ZD1Y"
}
},
{
"cell_type": "markdown",
"source": [
"## 3. Dplyr: Uma Gramática para Manipulação de Dados\n",
"\n",
"<p >\n",
" <img src=\"../../images/dplyr_wrangling.png\"\n",
" width=\"569\"/>\n",
" <figcaption>Arte por @allison_horst</figcaption>\n",
"\n",
"\n",
"<!--![Arte por \\@allison_horst](../../../../../../translated_images/dplyr_wrangling.f5f99c64fd4580f1377fee3ea428b6f8fd073845ec0f8409d483cfe148f0984e.br.png)<br/>Arte por \\@allison_horst-->\n"
],
"metadata": {
"id": "o4jLY5-VZO2C"
}
},
{
"cell_type": "markdown",
"source": [
"[`dplyr`](https://dplyr.tidyverse.org/), um pacote do Tidyverse, é uma gramática de manipulação de dados que oferece um conjunto consistente de verbos para ajudar a resolver os desafios mais comuns de manipulação de dados. Nesta seção, vamos explorar alguns dos verbos do dplyr! \n",
"<br>\n"
],
"metadata": {
"id": "i5o33MQBZWWw"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::select()\n",
"\n",
"`select()` é uma função do pacote `dplyr` que ajuda você a escolher colunas para manter ou excluir.\n",
"\n",
"Para tornar seu data frame mais fácil de trabalhar, remova várias de suas colunas usando `select()`, mantendo apenas as colunas que você precisa.\n",
"\n",
"Por exemplo, neste exercício, nossa análise envolverá as colunas `Package`, `Low Price`, `High Price` e `Date`. Vamos selecionar essas colunas.\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()` é uma função do pacote `dplyr` que ajuda a criar ou modificar colunas, mantendo as colunas existentes.\n",
"\n",
"A estrutura geral do `mutate` é:\n",
"\n",
"`data %>% mutate(nome_da_nova_coluna = o_que_ela_contem)`\n",
"\n",
"Vamos experimentar o `mutate` usando a coluna `Date` e realizando as seguintes operações:\n",
"\n",
"1. Converter as datas (atualmente do tipo caractere) para um formato de mês (essas são datas no formato dos EUA, ou seja, `MM/DD/YYYY`).\n",
"\n",
"2. Extrair o mês das datas para uma nova coluna.\n",
"\n",
"No R, o pacote [lubridate](https://lubridate.tidyverse.org/) facilita o trabalho com dados de data e hora. Então, vamos usar `dplyr::mutate()`, `lubridate::mdy()`, `lubridate::month()` e ver como alcançar os objetivos acima. Podemos descartar a coluna `Date`, já que não precisaremos mais dela nas operações subsequentes.\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": [
"Uhuu! 🤩\n",
"\n",
"Agora, vamos criar uma nova coluna chamada `Price`, que representa o preço médio de uma abóbora. Para isso, vamos calcular a média das colunas `Low Price` e `High Price` para preencher a nova coluna 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": [
"Yeees!💪\n",
"\n",
"\"Mas espere!\", você dirá depois de dar uma olhada rápida no conjunto de dados com `View(pumpkins)`, \"Tem algo estranho aqui!\"🤔\n",
"\n",
"Se você observar a coluna `Package`, verá que as abóboras são vendidas em várias configurações diferentes. Algumas são vendidas em medidas de `1 1/9 bushel`, outras em medidas de `1/2 bushel`, algumas por abóbora, outras por libra, e algumas em grandes caixas com larguras variadas.\n",
"\n",
"Vamos verificar isso:\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": [
"Incrível!👏\n",
"\n",
"Parece que abóboras são muito difíceis de pesar de forma consistente, então vamos filtrá-las selecionando apenas as abóboras que contêm a string *bushel* na coluna `Package` e colocar isso em um novo data frame `new_pumpkins`.\n"
],
"metadata": {
"id": "7sMjiVujaZxY"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::filter() e stringr::str_detect()\n",
"\n",
"[`dplyr::filter()`](https://dplyr.tidyverse.org/reference/filter.html): cria um subconjunto dos dados contendo apenas as **linhas** que atendem às suas condições, neste caso, abóboras com a string *bushel* na coluna `Package`.\n",
"\n",
"[stringr::str_detect()](https://stringr.tidyverse.org/reference/str_detect.html): detecta a presença ou ausência de um padrão em uma string.\n",
"\n",
"O pacote [`stringr`](https://github.com/tidyverse/stringr) fornece funções simples para operações comuns com strings.\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": [
"Você pode ver que reduzimos para cerca de 415 linhas de dados contendo abóboras por alqueire. 🤩\n"
],
"metadata": {
"id": "VrDwF031avlR"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::case_when()\n",
"\n",
"**Mas espere! Ainda há mais uma coisa a fazer**\n",
"\n",
"Você percebeu que a quantidade de alqueires varia por linha? É necessário normalizar os preços para que sejam exibidos por alqueire, e não por 1 1/9 ou 1/2 alqueire. Hora de fazer alguns cálculos para padronizar isso.\n",
"\n",
"Usaremos a função [`case_when()`](https://dplyr.tidyverse.org/reference/case_when.html) para *modificar* a coluna Price dependendo de algumas condições. `case_when` permite que você vetorize múltiplas declarações `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": [
"Agora, podemos analisar o preço por unidade com base na medida de alqueire. Todo esse estudo sobre alqueires de abóboras, no entanto, mostra como é `importante` `entender a natureza dos seus dados`!\n",
"\n",
"> ✅ De acordo com [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308), o peso de um alqueire depende do tipo de produto, já que é uma medida de volume. \"Um alqueire de tomates, por exemplo, deve pesar 56 libras... Folhas e verduras ocupam mais espaço com menos peso, então um alqueire de espinafre pesa apenas 20 libras.\" É tudo bem complicado! Vamos evitar fazer uma conversão de alqueire para libra e, em vez disso, precificar pelo alqueire. Todo esse estudo sobre alqueires de abóboras, no entanto, mostra como é muito importante entender a natureza dos seus dados!\n",
">\n",
"> ✅ Você percebeu que as abóboras vendidas por meio alqueire são muito caras? Consegue descobrir o motivo? Dica: abóboras pequenas são muito mais caras do que as grandes, provavelmente porque há muito mais delas por alqueire, considerando o espaço não utilizado ocupado por uma grande abóbora oca de torta.\n"
],
"metadata": {
"id": "pS2GNPagbSdb"
}
},
{
"cell_type": "markdown",
"source": [
"Agora, por pura diversão 💁‍♀️, vamos também mover a coluna Mês para a primeira posição, ou seja, `antes` da coluna `Pacote`.\n",
"\n",
"`dplyr::relocate()` é usado para alterar as posições das colunas.\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": [
"Bom trabalho!👌 Agora você tem um conjunto de dados limpo e organizado para construir seu novo modelo de regressão! \n",
"<br>\n"
],
"metadata": {
"id": "y8TJ0Za_bn5Y"
}
},
{
"cell_type": "markdown",
"source": [
"## 4. Visualização de dados com ggplot2\n",
"\n",
"<p >\n",
" <img src=\"../../images/data-visualization.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Infográfico por Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"<!--![Infográfico por Dasani Madipalli](../../../../../../translated_images/data-visualization.54e56dded7c1a804d00d027543f2881cb32da73aeadda2d4a4f10f3497526114.br.png){width=\"600\"}-->\n",
"\n",
"Existe um *sábio* ditado que diz o seguinte:\n",
"\n",
"> \"O gráfico simples trouxe mais informações à mente do analista de dados do que qualquer outro dispositivo.\" --- John Tukey\n",
"\n",
"Parte do papel do cientista de dados é demonstrar a qualidade e a natureza dos dados com os quais está trabalhando. Para isso, eles frequentemente criam visualizações interessantes, como gráficos, diagramas e tabelas, mostrando diferentes aspectos dos dados. Dessa forma, eles conseguem mostrar visualmente relações e lacunas que, de outra maneira, seriam difíceis de identificar.\n",
"\n",
"As visualizações também podem ajudar a determinar a técnica de aprendizado de máquina mais apropriada para os dados. Um gráfico de dispersão que parece seguir uma linha, por exemplo, indica que os dados são bons candidatos para um exercício de regressão linear.\n",
"\n",
"O R oferece vários sistemas para criar gráficos, mas [`ggplot2`](https://ggplot2.tidyverse.org/index.html) é um dos mais elegantes e versáteis. O `ggplot2` permite compor gráficos **combinando componentes independentes**.\n",
"\n",
"Vamos começar com um gráfico de dispersão simples para as colunas Price e Month.\n",
"\n",
"Neste caso, começaremos com [`ggplot()`](https://ggplot2.tidyverse.org/reference/ggplot.html), fornecendo um conjunto de dados e um mapeamento estético (com [`aes()`](https://ggplot2.tidyverse.org/reference/aes.html)) e, em seguida, adicionaremos camadas (como [`geom_point()`](https://ggplot2.tidyverse.org/reference/geom_point.html)) para gráficos de dispersão.\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": [
"Este é um gráfico útil 🤷? Algo nele te surpreende?\n",
"\n",
"Não é particularmente útil, já que tudo o que ele faz é mostrar seus dados como uma distribuição de pontos em um determinado mês.\n",
"<br>\n"
],
"metadata": {
"id": "Ml7SDCLQcPvE"
}
},
{
"cell_type": "markdown",
"source": [
"### **Como tornamos isso útil?**\n",
"\n",
"Para exibir dados úteis em gráficos, geralmente é necessário agrupar os dados de alguma forma. Por exemplo, no nosso caso, calcular o preço médio das abóboras para cada mês forneceria mais insights sobre os padrões subjacentes em nossos dados. Isso nos leva a mais uma abordagem do **dplyr**:\n",
"\n",
"#### `dplyr::group_by() %>% summarize()`\n",
"\n",
"A agregação agrupada no R pode ser facilmente realizada usando\n",
"\n",
"`dplyr::group_by() %>% summarize()`\n",
"\n",
"- `dplyr::group_by()` altera a unidade de análise do conjunto de dados completo para grupos individuais, como por mês.\n",
"\n",
"- `dplyr::summarize()` cria um novo data frame com uma coluna para cada variável de agrupamento e uma coluna para cada estatística resumida que você especificou.\n",
"\n",
"Por exemplo, podemos usar `dplyr::group_by() %>% summarize()` para agrupar as abóboras com base na coluna **Month** e, em seguida, calcular o **preço médio** para cada mês.\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": [
"Sucinto!✨\n",
"\n",
"Características categóricas, como meses, são melhor representadas usando um gráfico de barras 📊. As camadas responsáveis por gráficos de barras são `geom_bar()` e `geom_col()`. Consulte `?geom_bar` para saber mais.\n",
"\n",
"Vamos criar um agora!\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": [
"🤩🤩 Esta é uma visualização de dados mais útil! Parece indicar que o preço mais alto para abóboras ocorre em setembro e outubro. Isso atende às suas expectativas? Por que sim ou por que não?\n",
"\n",
"Parabéns por concluir a segunda lição 👏! Você preparou seus dados para a construção do modelo e, em seguida, descobriu mais insights usando visualizações!\n"
],
"metadata": {
"id": "zDm0VOzzcuzR"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Aviso Legal**: \nEste documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automáticas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte oficial. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.\n"
]
}
]
}