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/1-Tools/solution/R/lesson_1-R.ipynb

447 lines
17 KiB

{
"nbformat": 4,
"nbformat_minor": 2,
"metadata": {
"colab": {
"name": "lesson_1-R.ipynb",
"provenance": [],
"collapsed_sections": [],
"toc_visible": true
},
"kernelspec": {
"name": "ir",
"display_name": "R"
},
"language_info": {
"name": "R"
},
"coopTranslator": {
"original_hash": "c18d3bd0bd8ae3878597e89dcd1fa5c1",
"translation_date": "2025-08-29T23:09:43+00:00",
"source_file": "2-Regression/1-Tools/solution/R/lesson_1-R.ipynb",
"language_code": "br"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [],
"metadata": {
"id": "YJUHCXqK57yz"
}
},
{
"cell_type": "markdown",
"source": [
"## Introdução à Regressão - Aula 1\n",
"\n",
"#### Colocando em perspectiva\n",
"\n",
"✅ Existem muitos tipos de métodos de regressão, e qual você escolhe depende da resposta que está buscando. Se você quiser prever a altura provável de uma pessoa com uma determinada idade, usaria `regressão linear`, pois está procurando um **valor numérico**. Se estiver interessado em descobrir se um tipo de culinária deve ser considerado vegano ou não, estará buscando uma **atribuição de categoria**, então usaria `regressão logística`. Você aprenderá mais sobre regressão logística mais adiante. Pense um pouco sobre algumas perguntas que você pode fazer aos dados e quais desses métodos seriam mais apropriados.\n",
"\n",
"Nesta seção, você trabalhará com um [pequeno conjunto de dados sobre diabetes](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html). Imagine que você queira testar um tratamento para pacientes diabéticos. Modelos de aprendizado de máquina podem ajudar a determinar quais pacientes responderiam melhor ao tratamento, com base em combinações de variáveis. Mesmo um modelo de regressão muito básico, quando visualizado, pode mostrar informações sobre variáveis que ajudariam você a organizar seus ensaios clínicos teóricos.\n",
"\n",
"Dito isso, vamos começar esta tarefa!\n",
"\n",
"<p >\n",
" <img src=\"../../images/encouRage.jpg\"\n",
" width=\"630\"/>\n",
" <figcaption>Arte por @allison_horst</figcaption>\n",
"\n",
"<!--![Arte por \\@allison_horst](../../../../../../translated_images/encouRage.e75d5fe0367fb9136b78104baf4e2032a7622bc42a2bc34c0ad36c294eeb83f5.br.jpg)<br>Arte por @allison_horst-->\n"
],
"metadata": {
"id": "LWNNzfqd6feZ"
}
},
{
"cell_type": "markdown",
"source": [
"## 1. Carregando nosso conjunto de ferramentas\n",
"\n",
"Para esta tarefa, vamos precisar dos seguintes pacotes:\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",
"- `tidymodels`: O [tidymodels](https://www.tidymodels.org/) é uma [coleção de pacotes](https://www.tidymodels.org/packages/) para modelagem e aprendizado de máquina.\n",
"\n",
"Você pode instalá-los com o seguinte comando:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\"))`\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": "FIo2YhO26wI9"
}
},
{
"cell_type": "code",
"execution_count": 2,
"source": [
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n",
"pacman::p_load(tidyverse, tidymodels)"
],
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"Loading required package: pacman\n",
"\n"
]
}
],
"metadata": {
"id": "cIA9fz9v7Dss",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "2df7073b-86b2-4b32-cb86-0da605a0dc11"
}
},
{
"cell_type": "markdown",
"source": [
"Agora, vamos carregar esses pacotes incríveis e torná-los disponíveis na nossa sessão atual do R. (Isso é apenas para ilustração, `pacman::p_load()` já fez isso por você)\n"
],
"metadata": {
"id": "gpO_P_6f9WUG"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# load the core Tidyverse packages\r\n",
"library(tidyverse)\r\n",
"\r\n",
"# load the core Tidymodels packages\r\n",
"library(tidymodels)\r\n"
],
"outputs": [],
"metadata": {
"id": "NLMycgG-9ezO"
}
},
{
"cell_type": "markdown",
"source": [
"## 2. O conjunto de dados de diabetes\n",
"\n",
"Neste exercício, vamos demonstrar nossas habilidades de regressão fazendo previsões em um conjunto de dados de diabetes. O [conjunto de dados de diabetes](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt) inclui `442 amostras` de dados relacionados ao diabetes, com 10 variáveis preditoras, `idade`, `sexo`, `índice de massa corporal`, `pressão arterial média` e `seis medições de soro sanguíneo`, além de uma variável de resultado `y`: uma medida quantitativa da progressão da doença um ano após a linha de base.\n",
"\n",
"|Número de observações|442|\n",
"|----------------------|:---|\n",
"|Número de preditores|As primeiras 10 colunas são preditivas numéricas|\n",
"|Resultado/Alvo|A coluna 11 é uma medida quantitativa da progressão da doença um ano após a linha de base|\n",
"|Informações dos preditores|- idade em anos\n",
"||- sexo\n",
"||- bmi índice de massa corporal\n",
"||- bp pressão arterial média\n",
"||- s1 tc, colesterol total no soro\n",
"||- s2 ldl, lipoproteínas de baixa densidade\n",
"||- s3 hdl, lipoproteínas de alta densidade\n",
"||- s4 tch, colesterol total / HDL\n",
"||- s5 ltg, possivelmente logaritmo do nível de triglicerídeos no soro\n",
"||- s6 glu, nível de açúcar no sangue|\n",
"\n",
"> 🎓 Lembre-se, isso é aprendizado supervisionado, e precisamos de um alvo chamado 'y'.\n",
"\n",
"Antes de manipular os dados com R, você precisa importar os dados para a memória do R ou estabelecer uma conexão com os dados que o R possa usar para acessá-los remotamente.\n",
"\n",
"> O pacote [readr](https://readr.tidyverse.org/), que faz parte do Tidyverse, oferece uma maneira rápida e amigável de ler dados retangulares no R.\n",
"\n",
"Agora, vamos carregar o conjunto de dados de diabetes fornecido neste URL de origem: <https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html>\n",
"\n",
"Além disso, faremos uma verificação básica nos dados usando `glimpse()` e exibiremos as primeiras 5 linhas usando `slice()`.\n",
"\n",
"Antes de prosseguir, vamos também introduzir algo que você encontrará frequentemente no código R 🥁🥁: o operador pipe `%>%`\n",
"\n",
"O operador pipe (`%>%`) realiza operações em sequência lógica, passando um objeto para frente em uma função ou expressão de chamada. Você pode pensar no operador pipe como dizendo \"e então\" no seu código.\n"
],
"metadata": {
"id": "KM6iXLH996Cl"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Import the data set\r\n",
"diabetes <- read_table2(file = \"https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt\")\r\n",
"\r\n",
"\r\n",
"# Get a glimpse and dimensions of the data\r\n",
"glimpse(diabetes)\r\n",
"\r\n",
"\r\n",
"# Select the first 5 rows of the data\r\n",
"diabetes %>% \r\n",
" slice(1:5)"
],
"outputs": [],
"metadata": {
"id": "Z1geAMhM-bSP"
}
},
{
"cell_type": "markdown",
"source": [
"`glimpse()` nos mostra que esses dados possuem 442 linhas e 11 colunas, com todas as colunas sendo do tipo de dado `double`.\n",
"\n",
"<br>\n",
"\n",
"> glimpse() e slice() são funções do [`dplyr`](https://dplyr.tidyverse.org/). Dplyr, parte do Tidyverse, é uma gramática de manipulação de dados que fornece um conjunto consistente de verbos para ajudar a resolver os desafios mais comuns de manipulação de dados.\n",
"\n",
"<br>\n",
"\n",
"Agora que temos os dados, vamos focar em uma única característica (`bmi`) como alvo para este exercício. Isso exigirá que selecionemos as colunas desejadas. Então, como fazemos isso?\n",
"\n",
"[`dplyr::select()`](https://dplyr.tidyverse.org/reference/select.html) nos permite *selecionar* (e opcionalmente renomear) colunas em um data frame.\n"
],
"metadata": {
"id": "UwjVT1Hz-c3Z"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Select predictor feature `bmi` and outcome `y`\r\n",
"diabetes_select <- diabetes %>% \r\n",
" select(c(bmi, y))\r\n",
"\r\n",
"# Print the first 5 rows\r\n",
"diabetes_select %>% \r\n",
" slice(1:10)"
],
"outputs": [],
"metadata": {
"id": "RDY1oAKI-m80"
}
},
{
"cell_type": "markdown",
"source": [
"## 3. Dados de Treinamento e Teste\n",
"\n",
"É uma prática comum em aprendizado supervisionado *dividir* os dados em dois subconjuntos: um conjunto (geralmente maior) para treinar o modelo e um conjunto menor \"reservado\" para verificar como o modelo se saiu.\n",
"\n",
"Agora que temos os dados prontos, podemos verificar se uma máquina pode ajudar a determinar uma divisão lógica entre os números neste conjunto de dados. Podemos usar o pacote [rsample](https://tidymodels.github.io/rsample/), que faz parte do framework Tidymodels, para criar um objeto que contém as informações sobre *como* dividir os dados, e então usar mais duas funções do rsample para extrair os conjuntos de treinamento e teste criados:\n"
],
"metadata": {
"id": "SDk668xK-tc3"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"set.seed(2056)\r\n",
"# Split 67% of the data for training and the rest for tesing\r\n",
"diabetes_split <- diabetes_select %>% \r\n",
" initial_split(prop = 0.67)\r\n",
"\r\n",
"# Extract the resulting train and test sets\r\n",
"diabetes_train <- training(diabetes_split)\r\n",
"diabetes_test <- testing(diabetes_split)\r\n",
"\r\n",
"# Print the first 3 rows of the training set\r\n",
"diabetes_train %>% \r\n",
" slice(1:10)"
],
"outputs": [],
"metadata": {
"id": "EqtHx129-1h-"
}
},
{
"cell_type": "markdown",
"source": [
"## 4. Treinar um modelo de regressão linear com Tidymodels\n",
"\n",
"Agora estamos prontos para treinar nosso modelo!\n",
"\n",
"No Tidymodels, você especifica modelos usando `parsnip()` ao definir três conceitos:\n",
"\n",
"- O **tipo** do modelo diferencia modelos como regressão linear, regressão logística, modelos de árvore de decisão, entre outros.\n",
"\n",
"- O **modo** do modelo inclui opções comuns como regressão e classificação; alguns tipos de modelo suportam ambos, enquanto outros possuem apenas um modo.\n",
"\n",
"- O **motor** do modelo é a ferramenta computacional que será usada para ajustar o modelo. Frequentemente, são pacotes do R, como **`\"lm\"`** ou **`\"ranger\"`**.\n",
"\n",
"Essas informações de modelagem são capturadas em uma especificação de modelo, então vamos criar uma!\n"
],
"metadata": {
"id": "sBOS-XhB-6v7"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Build a linear model specification\r\n",
"lm_spec <- \r\n",
" # Type\r\n",
" linear_reg() %>% \r\n",
" # Engine\r\n",
" set_engine(\"lm\") %>% \r\n",
" # Mode\r\n",
" set_mode(\"regression\")\r\n",
"\r\n",
"\r\n",
"# Print the model specification\r\n",
"lm_spec"
],
"outputs": [],
"metadata": {
"id": "20OwEw20--t3"
}
},
{
"cell_type": "markdown",
"source": [
"Depois que um modelo foi *especificado*, ele pode ser `estimado` ou `treinado` usando a função [`fit()`](https://parsnip.tidymodels.org/reference/fit.html), geralmente utilizando uma fórmula e alguns dados.\n",
"\n",
"`y ~ .` significa que ajustaremos `y` como a quantidade/objetivo previsto, explicado por todos os preditores/características, ou seja, `.` (neste caso, temos apenas um preditor: `bmi`).\n"
],
"metadata": {
"id": "_oDHs89k_CJj"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Build a linear model specification\r\n",
"lm_spec <- linear_reg() %>% \r\n",
" set_engine(\"lm\") %>%\r\n",
" set_mode(\"regression\")\r\n",
"\r\n",
"\r\n",
"# Train a linear regression model\r\n",
"lm_mod <- lm_spec %>% \r\n",
" fit(y ~ ., data = diabetes_train)\r\n",
"\r\n",
"# Print the model\r\n",
"lm_mod"
],
"outputs": [],
"metadata": {
"id": "YlsHqd-q_GJQ"
}
},
{
"cell_type": "markdown",
"source": [
"A partir do resultado do modelo, podemos observar os coeficientes aprendidos durante o treinamento. Eles representam os coeficientes da linha de melhor ajuste que nos dá o menor erro geral entre a variável real e a prevista. \n",
"<br>\n",
"\n",
"## 5. Fazer previsões no conjunto de teste\n",
"\n",
"Agora que treinamos um modelo, podemos usá-lo para prever a progressão da doença y para o conjunto de dados de teste usando [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html). Isso será usado para traçar a linha entre os grupos de dados.\n"
],
"metadata": {
"id": "kGZ22RQj_Olu"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Make predictions for the test set\r\n",
"predictions <- lm_mod %>% \r\n",
" predict(new_data = diabetes_test)\r\n",
"\r\n",
"# Print out some of the predictions\r\n",
"predictions %>% \r\n",
" slice(1:5)"
],
"outputs": [],
"metadata": {
"id": "nXHbY7M2_aao"
}
},
{
"cell_type": "markdown",
"source": [
"Uhuu! 💃🕺 Acabamos de treinar um modelo e usá-lo para fazer previsões!\n",
"\n",
"Ao fazer previsões, a convenção do tidymodels é sempre produzir um tibble/data frame de resultados com nomes de colunas padronizados. Isso facilita a combinação dos dados originais com as previsões em um formato utilizável para operações subsequentes, como criação de gráficos.\n",
"\n",
"`dplyr::bind_cols()` une de forma eficiente várias data frames por coluna.\n"
],
"metadata": {
"id": "R_JstwUY_bIs"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Combine the predictions and the original test set\r\n",
"results <- diabetes_test %>% \r\n",
" bind_cols(predictions)\r\n",
"\r\n",
"\r\n",
"results %>% \r\n",
" slice(1:5)"
],
"outputs": [],
"metadata": {
"id": "RybsMJR7_iI8"
}
},
{
"cell_type": "markdown",
"source": [
"## 6. Plotar resultados do modelo\n",
"\n",
"Agora é hora de visualizar isso 📈. Vamos criar um gráfico de dispersão com todos os valores de `y` e `bmi` do conjunto de teste e, em seguida, usar as previsões para desenhar uma linha no lugar mais apropriado, entre os agrupamentos de dados do modelo.\n",
"\n",
"O R possui vários sistemas para criar gráficos, mas o `ggplot2` é um dos mais elegantes e versáteis. Ele permite que você componha gráficos **combinando componentes independentes**.\n"
],
"metadata": {
"id": "XJbYbMZW_n_s"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Set a theme for the plot\r\n",
"theme_set(theme_light())\r\n",
"# Create a scatter plot\r\n",
"results %>% \r\n",
" ggplot(aes(x = bmi)) +\r\n",
" # Add a scatter plot\r\n",
" geom_point(aes(y = y), size = 1.6) +\r\n",
" # Add a line plot\r\n",
" geom_line(aes(y = .pred), color = \"blue\", size = 1.5)"
],
"outputs": [],
"metadata": {
"id": "R9tYp3VW_sTn"
}
},
{
"cell_type": "markdown",
"source": [
"✅ Pense um pouco sobre o que está acontecendo aqui. Uma linha reta está passando por vários pequenos pontos de dados, mas o que exatamente ela está fazendo? Você consegue perceber como deveria ser possível usar essa linha para prever onde um novo ponto de dados, ainda não visto, deveria se encaixar em relação ao eixo y do gráfico? Tente colocar em palavras o uso prático desse modelo.\n",
"\n",
"Parabéns, você construiu seu primeiro modelo de regressão linear, fez uma previsão com ele e a exibiu em um gráfico!\n"
],
"metadata": {
"id": "zrPtHIxx_tNI"
}
},
{
"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 automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. 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"
]
}
]
}