{ "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-09-03T19:42:25+00:00", "source_file": "2-Regression/1-Tools/solution/R/lesson_1-R.ipynb", "language_code": "pt" } }, "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á procurando. Se quiser prever a altura provável de uma pessoa com uma determinada idade, utilizaria `regressão linear`, pois está à procura de um **valor numérico**. Se estiver interessado em descobrir se um tipo de culinária deve ser considerado vegano ou não, está à procura de uma **atribuição de categoria**, então utilizaria `regressão logística`. Aprenderá mais sobre regressão logística mais adiante. Pense um pouco sobre algumas perguntas que pode fazer aos dados e qual desses métodos seria mais apropriado.\n", "\n", "Nesta seção, irá trabalhar com um [pequeno conjunto de dados sobre diabetes](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html). Imagine que queria testar um tratamento para pacientes diabéticos. Modelos de Machine Learning 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 a organizar os seus ensaios clínicos teóricos.\n", "\n", "Dito isso, vamos começar esta tarefa!\n", "\n", "

\n", " \n", "

Arte por @allison_horst
\n", "\n", "\n" ], "metadata": { "id": "LWNNzfqd6feZ" } }, { "cell_type": "markdown", "source": [ "## 1. Carregar o 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 aprendizagem automática.\n", "\n", "Pode instalá-los com o seguinte comando:\n", "\n", "`install.packages(c(\"tidyverse\", \"tidymodels\"))`\n", "\n", "O script abaixo verifica se tem os pacotes necessários para completar este módulo e instala-os caso algum esteja em falta.\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 estes pacotes incríveis e torná-los disponíveis na nossa sessão atual de R. (Isto é apenas para ilustração, `pacman::p_load()` já fez isso por si)\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 sobre diabetes\n", "\n", "Neste exercício, vamos demonstrar nossas habilidades de regressão fazendo previsões com um conjunto de dados sobre diabetes. O [conjunto de dados sobre diabetes](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt) inclui `442 amostras` de dados relacionados à 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ção sobre os preditores|- idade em anos\n", "||- sexo\n", "||- bmi índice de massa corporal\n", "||- bp pressão arterial média\n", "||- s1 tc, colesterol sérico total\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", "\n", "\n", "> 🎓 Lembre-se, isto é aprendizagem supervisionada, e precisamos de um alvo chamado 'y'.\n", "\n", "Antes de poder manipular dados com R, é necessário 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 sobre diabetes fornecido neste URL de origem: \n", "\n", "Além disso, faremos uma verificação básica nos nossos dados usando `glimpse()` e exibiremos as primeiras 5 linhas usando `slice()`.\n", "\n", "Antes de avançarmos, 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 adiante para 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()` mostra-nos que estes dados têm 442 linhas e 11 colunas, sendo todas as colunas do tipo de dados `double`.\n", "\n", "
\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", "
\n", "\n", "Agora que temos os dados, vamos focar numa única característica (`bmi`) como alvo para este exercício. Isto exigirá que selecionemos as colunas desejadas. Então, como fazemos isso?\n", "\n", "[`dplyr::select()`](https://dplyr.tidyverse.org/reference/select.html) permite-nos *selecionar* (e opcionalmente renomear) colunas num 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 Treino e Teste\n", "\n", "É uma prática comum em aprendizagem supervisionada *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 comportou.\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 depois usar mais duas funções do rsample para extrair os conjuntos de treino 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 o nosso modelo!\n", "\n", "No Tidymodels, especifica-se os modelos utilizando `parsnip()` ao definir três conceitos:\n", "\n", "- O **tipo** de modelo diferencia modelos como regressão linear, regressão logística, modelos de árvores 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 têm apenas um modo.\n", "\n", "- O **motor** do modelo é a ferramenta computacional que será usada para ajustar o modelo. Muitas vezes, são pacotes R, como **`\"lm\"`** ou **`\"ranger\"`**\n", "\n", "Estas informações sobre o modelo são capturadas numa especificação de modelo, então vamos construir 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 de um modelo ter sido *especificado*, pode ser `estimado` ou `treinado` utilizando a função [`fit()`](https://parsnip.tidymodels.org/reference/fit.html), normalmente com uma fórmula e alguns dados.\n", "\n", "`y ~ .` significa que ajustaremos `y` como a quantidade/variável alvo prevista, explicada 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 treino. Eles representam os coeficientes da linha de melhor ajuste que nos proporciona o menor erro geral entre a variável real e a prevista.\n", "
\n", "\n", "## 5. Fazer previsões no conjunto de teste\n", "\n", "Agora que treinámos um modelo, podemos utilizá-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). Isto 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": [ "Woohoo! 💃🕺 Acabámos de treinar um modelo e utilizámo-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. Isto facilita a combinação dos dados originais com as previsões num formato utilizável para operações subsequentes, como a criação de gráficos.\n", "\n", "`dplyr::bind_cols()` une eficientemente 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. Representar os resultados do modelo\n", "\n", "Agora é hora de ver isto visualmente 📈. 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 tem vários sistemas para criar gráficos, mas o `ggplot2` é um dos mais elegantes e versáteis. Este permite compor 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": [ "✅ Pensa um pouco sobre o que está a acontecer aqui. Uma linha reta está a passar por muitos pequenos pontos de dados, mas o que está realmente a fazer? Consegues perceber como deverias ser capaz de usar esta linha para prever onde um novo ponto de dados, ainda não visto, deveria encaixar em relação ao eixo y do gráfico? Tenta expressar em palavras a utilidade prática deste modelo.\n", "\n", "Parabéns, construíste o teu primeiro modelo de regressão linear, criaste uma previsão com ele e exibiste-a num 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, é importante ter em conta que traduções automáticas podem conter erros ou imprecisões. O documento original na sua língua nativa deve ser considerado a fonte autoritária. 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 incorretas decorrentes da utilização desta tradução.\n" ] } ] }