Aula 6 – Manipulação de dados com dplyr, tidyr e introdução ao ggplot2
Autor
Prof. Marcelo Ribeiro
Objetivo da Aula
Compreender e aplicar, com os pacotes dplyr e tidyr, operações essenciais de manipulação de dados, incluindo classificação de casos, junção, agregação, divisão, seleção, recodificação e criação de novas variáveis, além de introduzir a construção de gráficos com ggplot2 e seus principais parâmetros.
Comentário do professor
Nesta aula, retomaremos os mesmos tópicos centrais da aula anterior, mas agora utilizando a sintaxe do tidyverse, especialmente os pacotes dplyr e tidyr. O objetivo é mostrar aos alunos uma forma mais fluida, legível e profissional de manipulação de dados em R.
1. Introdução
Nas aulas anteriores, estudamos a lógica das principais operações de manipulação de dados utilizando estruturas do R base. Agora avançaremos para uma abordagem muito utilizada em Estatística, Ciência de Dados e análise aplicada: a gramática de manipulação do tidyverse.
De modo geral, essa abordagem organiza o trabalho com dados por meio de funções com papéis bem definidos, como:
selecionar colunas;
filtrar linhas;
criar ou transformar variáveis;
agrupar casos;
resumir informações;
juntar bases;
reorganizar a estrutura de um conjunto de dados;
e construir gráficos de forma declarativa.
Comentário do professor
A principal vantagem didática do tidyverse é que ele separa as tarefas analíticas em verbos consistentes. Isso torna o código mais legível, mais previsível e mais fácil de encadear.
2. Carregando os pacotes
library(dplyr)
Warning: package 'dplyr' was built under R version 4.4.3
Attaching package: 'dplyr'
The following objects are masked from 'package:stats':
filter, lag
The following objects are masked from 'package:base':
intersect, setdiff, setequal, union
library(tidyr)
Warning: package 'tidyr' was built under R version 4.4.3
library(ggplot2)
Warning: package 'ggplot2' was built under R version 4.4.3
Comentário do professor
A função library() carrega um pacote já instalado no R. - dplyr: manipulação de dados; - tidyr: reorganização de bases em formato tidy; - ggplot2: construção de gráficos.
3. Conjunto de dados da aula
Utilizaremos um conjunto de dados sintético em contexto compatível com o curso de Estatística e Ciência de Dados.
A função tibble() cria uma tabela moderna do tidyverse. Conceitualmente, ela é semelhante a um data.frame, mas possui impressão mais organizada e comportamento mais consistente em várias operações de manipulação.
4. Selecionar casos e variáveis com dplyr
No tidyverse, duas funções centrais para esse tipo de tarefa são:
select() para colunas;
filter() para linhas.
4.1 Selecionando variáveis com select()
Execute este código
dados %>%select(nome, turma, nota_r, projetos)
Comentário do professor
A função select() seleciona colunas. - seus argumentos correspondem aos nomes das variáveis que desejamos manter; - o operador %>% encaminha o resultado de uma etapa para a próxima.
4.2 Selecionando casos com filter()
Execute este código
dados %>%filter(nota_r >=8)
Comentário do professor
A função filter() seleciona linhas com base em condições lógicas. Neste exemplo, permanecem apenas os casos com nota_r >= 8.
4.3 Combinando filter() e select()
Execute este código
dados %>%filter(frequencia >=90, projetos >=3) %>%select(nome, turma, frequencia, projetos, nota_r)
Comentário do professor
Dentro de filter(), múltiplas condições separadas por vírgula são interpretadas como conjunção lógica, isto é, como se estivéssemos usando “e”.
Ilustração 4.1 – Fluxo de seleção com dplyr
flowchart LR
A["Base original"] --> B["filter()"]
B --> C["select()"]
C --> D["Subconjunto final"]
5. Classificar casos e recodificar valores com mutate() e case_when()
Uma das tarefas mais importantes em análise de dados é criar classificações e recodificações com base em regras analíticas.
5.1 Criando uma classificação com mutate() e case_when()
A função mutate() cria ou modifica colunas. A função case_when() permite definir regras condicionais de forma mais legível do que vários ifelse() aninhados. - cada linha de regra tem a forma condição ~ resultado; - TRUE ~ ... funciona como caso final padrão.
flowchart LR
A["Variável original"] --> B["mutate() + case_when()"]
B --> C["Nova variável categórica"]
Ideia central
No tidyverse, a classificação de casos e a recodificação de valores costumam ser feitas com mutate(), pois essa função concentra a lógica de criação e transformação de colunas.
6. Calcular novas variáveis com mutate()
Criar variáveis derivadas é uma etapa central no fluxo de análise.
Uma grande vantagem de mutate() é permitir criar diversas variáveis novas em uma única chamada, mantendo a leitura do código bastante organizada.
7. Agregar casos com group_by() e summarise()
A agregação no tidyverse é, em geral, construída em duas etapas:
definir os grupos com group_by();
resumir os dados com summarise().
7.1 Média da nota por turma
Execute este código
dados %>%group_by(turma) %>%summarise(media_nota =mean(nota_r) )
Comentário do professor
A função group_by() declara a variável de agrupamento.
A função summarise() reduz cada grupo a uma ou mais medidas resumo.
7.2 Resumindo várias medidas ao mesmo tempo
Execute este código
dados %>%group_by(turma) %>%summarise(media_nota =mean(nota_r),media_estudo =mean(horas_estudo),total_projetos =sum(projetos) )
7.3 Agregando por mais de uma variável
Execute este código
dados %>%group_by(turma, linguagem) %>%summarise(media_nota =mean(nota_r),.groups ="drop" )
Comentário do professor
O argumento .groups = "drop" remove a estrutura de agrupamento após o resumo. Isso costuma ser útil para evitar efeitos inesperados em etapas posteriores.
Ilustração 7.1 – Agregação com grupos
flowchart LR
A["Base completa"] --> B["group_by()"]
B --> C["summarise()"]
C --> D["Tabela resumo por grupos"]
8. Dividir bases de dados com group_split()
Quando queremos separar a base em subconjuntos, uma opção elegante é group_split().
8.1 Separando a base por turma
Execute este código
bases_turma <- dados %>%group_by(turma) %>%group_split()bases_turma
<list_of<
tbl_df<
id : integer
nome : character
turma : character
linguagem : character
horas_estudo: double
projetos : double
nota_r : double
frequencia : double
>
>[2]>
[[1]]
# A tibble: 6 × 8
id nome turma linguagem horas_estudo projetos nota_r frequencia
<int> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 1 Ana A R 12 3 8.7 92
2 2 Bruno A Python 8 1 6.1 85
3 5 Eva A R 11 2 7.5 88
4 7 Giovana A Python 6 1 5.4 75
5 9 Isabela A R 13 4 8.8 94
6 11 Karen A R 16 5 9.7 98
[[2]]
# A tibble: 6 × 8
id nome turma linguagem horas_estudo projetos nota_r frequencia
<int> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 3 Carla B R 15 4 9.2 97
2 4 Daniel B Python 7 1 5.8 78
3 6 Felipe B Python 9 2 6.9 83
4 8 Heitor B R 14 5 9.5 99
5 10 Joao B Python 10 3 7.2 86
6 12 Lucas B Python 5 1 4.9 72
Comentário do professor
A função group_split() divide uma base em uma lista de subconjuntos, respeitando os grupos definidos previamente por group_by().
8.2 Separando por linguagem
Execute este código
bases_linguagem <- dados %>%group_by(linguagem) %>%group_split()bases_linguagem
<list_of<
tbl_df<
id : integer
nome : character
turma : character
linguagem : character
horas_estudo: double
projetos : double
nota_r : double
frequencia : double
>
>[2]>
[[1]]
# A tibble: 6 × 8
id nome turma linguagem horas_estudo projetos nota_r frequencia
<int> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 2 Bruno A Python 8 1 6.1 85
2 4 Daniel B Python 7 1 5.8 78
3 6 Felipe B Python 9 2 6.9 83
4 7 Giovana A Python 6 1 5.4 75
5 10 Joao B Python 10 3 7.2 86
6 12 Lucas B Python 5 1 4.9 72
[[2]]
# A tibble: 6 × 8
id nome turma linguagem horas_estudo projetos nota_r frequencia
<int> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 1 Ana A R 12 3 8.7 92
2 3 Carla B R 15 4 9.2 97
3 5 Eva A R 11 2 7.5 88
4 8 Heitor B R 14 5 9.5 99
5 9 Isabela A R 13 4 8.8 94
6 11 Karen A R 16 5 9.7 98
8.3 Acessando um subconjunto específico
Execute este código
bases_linguagem[[1]]
Comentário do professor
Como o resultado de group_split() é uma lista, cada subconjunto pode ser acessado por índices com [[ ]].
9. Juntar casos ou variáveis com bind_*() e join()
A função bind_cols() junta objetos por colunas. Assim como no caso do R base, é preciso garantir compatibilidade entre o número e a ordem das observações.
9.3 Juntando bases por chave com left_join()
Agora vamos acrescentar informações externas à base principal.
Execute este código
dados_extra <-tibble(id =c(1, 3, 5, 7, 9, 11),bolsa =c("sim", "nao", "sim", "nao", "sim", "sim"))dados_join <- dados %>%left_join(dados_extra, by ="id")dados_join
Comentário do professor
A função left_join(x, y, by) mantém todas as linhas da base x e adiciona as informações correspondentes de y, usando a variável-chave informada em by.
Ilustração 9.1 – Junção por chave
flowchart LR
A["Base principal"] --> C["left_join(by = 'id')"]
B["Base auxiliar"] --> C
C --> D["Base combinada"]
10. Reorganizar bases com tidyr
O pacote tidyr é especialmente importante quando precisamos mudar a estrutura de uma base, tornando-a mais apropriada para análise ou visualização.
A função pivot_longer() aumenta o número de linhas e reduz o número de colunas. - cols: colunas que serão empilhadas; - names_to: nome da nova coluna que guardará os nomes das variáveis originais; - values_to: nome da nova coluna que guardará os valores.
10.3 Transformando de formato longo para largo com pivot_wider()
Execute este código
avaliacoes_wide <- avaliacoes_long %>%pivot_wider(names_from = avaliacao,values_from = nota )avaliacoes_wide
Comentário do professor
A função pivot_wider() faz o caminho inverso: - names_from: coluna cujos valores serão transformados em nomes de colunas; - values_from: coluna que contém os valores a serem redistribuídos.
Ilustração 10.1 – Reorganização da base
flowchart LR
A["Formato largo"] --> B["pivot_longer()"]
B --> C["Formato longo"]
C --> D["pivot_wider()"]
D --> E["Formato largo novamente"]
Comentário do professor
Uma base em formato tidy favorece a manipulação com dplyr e a construção de gráficos com ggplot2. Por isso, reorganizar corretamente os dados costuma ser uma etapa essencial no fluxo analítico.
11. Introdução ao ggplot2
O ggplot2 organiza a construção de gráficos por camadas. Em termos gerais, um gráfico é construído a partir de:
uma base de dados;
um mapeamento estético com aes();
uma ou mais camadas geométricas;
elementos de rótulo e tema.
11.1 Estrutura geral do ggplot()
A forma mais básica é:
ggplot(dados, aes(x = variavel_x, y = variavel_y)) +geom_...( )
Comentário do professor
A função ggplot(data, aes(...)) inicializa o gráfico. - data: base de dados; - aes(): mapeamento entre variáveis e elementos visuais, como eixo x, eixo y, cor, forma ou preenchimento. Depois disso, adicionamos camadas com +.
11.2 Gráfico de dispersão com geom_point()
Execute este código
ggplot(dados, aes(x = horas_estudo, y = nota_r)) +geom_point()
Na camada geom_point(): - color: cor da borda/ponto; - size: tamanho dos pontos; - alpha: transparência.
11.4 Adicionando títulos e rótulos
Execute este código
ggplot(dados, aes(x = horas_estudo, y = nota_r)) +geom_point(color ="darkred", size =3, alpha =0.8) +labs(title ="Relação entre horas de estudo e nota em R",x ="Horas de estudo por semana",y ="Nota em R" )
Comentário do professor
A função labs() controla títulos e rótulos do gráfico: - title: título principal; - x: rótulo do eixo horizontal; - y: rótulo do eixo vertical; - também pode ser usada para nomear legendas, como color e fill.
11.5 Aplicando um tema
Execute este código
ggplot(dados, aes(x = horas_estudo, y = nota_r)) +geom_point(color ="darkred", size =3, alpha =0.8) +labs(title ="Relação entre horas de estudo e nota em R",x ="Horas de estudo por semana",y ="Nota em R" ) +theme_minimal()
Comentário do professor
As funções theme_*() controlam a aparência geral do gráfico. theme_minimal() produz um gráfico com aparência limpa e bastante utilizada em relatórios e apresentações.
11.6 Gráfico de barras com geom_col()
Primeiro, vamos construir uma base resumo.
resumo_linguagem <- dados %>%group_by(linguagem) %>%summarise(media_nota =mean(nota_r),.groups ="drop" )resumo_linguagem
Agora, o gráfico:
Execute este código
ggplot(resumo_linguagem, aes(x = linguagem, y = media_nota, fill = linguagem)) +geom_col() +labs(title ="Média da nota em R por linguagem preferida",x ="Linguagem",y ="Média da nota" ) +theme_minimal()
Comentário do professor
A função geom_col() constrói barras cujas alturas já estão previamente calculadas na base.
O argumento fill controla a cor de preenchimento das barras.
11.7 Histograma com geom_histogram()
Execute este código
ggplot(dados, aes(x = nota_r)) +geom_histogram(bins =5, fill ="steelblue", color ="white") +labs(title ="Distribuição da nota em R",x ="Nota em R",y ="Frequência" ) +theme_minimal()
Comentário do professor
A função geom_histogram() constrói histogramas. - bins: número de classes; - fill: cor de preenchimento; - color: cor da borda.
11.8 Adicionando uma reta de tendência
Execute este código
ggplot(dados, aes(x = horas_estudo, y = nota_r)) +geom_point(color ="darkred", size =3, alpha =0.8) +geom_smooth(method ="lm", se =FALSE, color ="navy", linewidth =1) +labs(title ="Relação entre horas de estudo e nota em R",x ="Horas de estudo por semana",y ="Nota em R" ) +theme_minimal()
`geom_smooth()` using formula = 'y ~ x'
Comentário do professor
A função geom_smooth() adiciona uma curva ou reta de tendência. - method = "lm": ajusta uma regressão linear; - se = FALSE: remove a faixa de confiança; - color: define a cor da linha; - linewidth: controla a espessura da linha.
Ilustração 11.1 – Lógica de construção do ggplot2
flowchart LR
A["Dados"] --> B["ggplot(data, aes(...))"]
B --> C["geom_*()"]
C --> D["labs()"]
D --> E["theme_*()"]
Ideia central
No ggplot2, um gráfico não é apenas “desenhado”; ele é construído por camadas. Quando o aluno compreende essa lógica, passa a ter muito mais autonomia para montar gráficos novos.
12. Integração entre dplyr, tidyr e ggplot2
Uma das grandes forças do tidyverse é a integração entre seus pacotes. Vamos ver um exemplo que combina transformação e visualização.
Execute este código
dados %>%mutate(faixa_estudo =case_when( horas_estudo <8~"baixa", horas_estudo <12~"media",TRUE~"alta" ) ) %>%group_by(faixa_estudo) %>%summarise(media_nota =mean(nota_r),.groups ="drop" ) %>%ggplot(aes(x = faixa_estudo, y = media_nota, fill = faixa_estudo)) +geom_col() +labs(title ="Nota média por faixa de estudo",x ="Faixa de estudo",y ="Média da nota" ) +theme_minimal()
Comentário do professor
Este exemplo ilustra um fluxo muito comum em Ciência de Dados: - criar variáveis; - resumir por grupos; - e, imediatamente depois, representar os resultados em um gráfico.
13. Erros comuns e boas práticas
Erros comuns
usar select() achando que ele filtra linhas;
usar filter() achando que ele seleciona colunas;
esquecer de usar group_by() antes de summarise() quando o objetivo é resumir por grupos;
usar bind_cols() em objetos com observações desalinhadas;
usar pivot_longer() ou pivot_wider() sem compreender a estrutura original da base;
construir gráficos no ggplot2 sem compreender o papel de aes() e das camadas.
Boas práticas
escreva o código em etapas logicamente encadeadas;
dê nomes claros às variáveis criadas;
confira a estrutura da base após transformações importantes;
use select() e filter() de forma conceitualmente distinta;
ao construir gráficos, pense separadamente em dados, mapeamentos, geometrias, rótulos e tema.
14. Exercícios propostos
Exercício 1
Utilizando mutate() e case_when(), crie uma variável chamada perfil_academico segundo as regras:
"excelente" se nota_r >= 9 e projetos >= 4;
"bom" se nota_r >= 7.5 e frequencia >= 85;
"regular" se nota_r >= 6;
"insuficiente" caso contrário.
Apresente apenas as colunas:
nome
nota_r
projetos
frequencia
perfil_academico
Exercício 2
Selecione apenas os estudantes que satisfazem simultaneamente as condições:
turma == "A" ou linguagem == "R";
horas_estudo >= 10;
nota_r >= 7.
Em seguida, apresente somente as colunas:
nome
turma
linguagem
horas_estudo
nota_r
Exercício 3
Usando group_by() e summarise(), calcule por turma:
a média de nota_r;
a média de horas_estudo;
a soma de projetos.
Exercício 4
Divida a base segundo a variável linguagem com group_split() e calcule a média de nota_r apenas para o subconjunto dos estudantes que preferem Python.
Exercício 5
Crie uma nova variável chamada faixa_estudo com mutate() e case_when(), segundo as categorias:
"baixa" se horas_estudo < 8;
"media" se 8 <= horas_estudo < 12;
"alta" se horas_estudo >= 12.
Apresente apenas as colunas:
nome
horas_estudo
faixa_estudo
Exercício 6
Crie uma nova variável chamada indice_global, definida por
Em seguida, ordene a base em ordem decrescente de indice_global e apresente apenas os 5 primeiros casos.
Exercício 7
Construa, com ggplot2, um gráfico de dispersão entre horas_estudo e nota_r, com:
título "Relação entre horas de estudo e nota em R";
rótulos adequados nos eixos;
pontos na cor "darkred";
tamanho size = 3;
transparência alpha = 0.8.
Depois, adicione a reta de regressão linear, na cor "navy" e com linewidth = 1.
Exercício 8
Crie uma tabela resumo com a média de nota_r por faixa_estudo e, em seguida, construa um gráfico de barras com:
geom_col();
título adequado;
categorias no eixo horizontal;
barras coloridas por grupo;
theme_minimal().
Exercício 9
Considere a base avaliacoes apresentada nesta aula. Reorganize-a com pivot_longer() para obter uma versão longa com as colunas:
id
avaliacao
nota
Exercício 10
Usando o objeto criado no exercício anterior, reconstrua a estrutura larga com pivot_wider().
Comentário do professor
Os exercícios desta aula foram pensados para consolidar o uso dos principais verbos do tidyverse, articulando manipulação, reorganização e visualização de dados em um mesmo fluxo analítico.
Código fonte
---title: "Aula 6 – Manipulação de dados com dplyr, tidyr e introdução ao ggplot2"author: "Prof. Marcelo Ribeiro"format: html: toc: true toc-location: left number-sections: false theme: cosmo css: estilo.css page-layout: full code-fold: false code-tools: true df-print: paged embed-resources: true mermaid: theme: neutrallang: pt-BReditor: visual---## Objetivo da AulaCompreender e aplicar, com os pacotes **dplyr** e **tidyr**, operações essenciais de manipulação de dados, incluindo classificação de casos, junção, agregação, divisão, seleção, recodificação e criação de novas variáveis, além de introduzir a construção de gráficos com **ggplot2** e seus principais parâmetros.::: {.callout-note title="Comentário do professor"}Nesta aula, retomaremos os mesmos tópicos centrais da aula anterior, mas agora utilizando a sintaxe do **tidyverse**, especialmente os pacotes **dplyr** e **tidyr**. O objetivo é mostrar aos alunos uma forma mais fluida, legível e profissional de manipulação de dados em R.:::## 1. IntroduçãoNas aulas anteriores, estudamos a lógica das principais operações de manipulação de dados utilizando estruturas do R base. Agora avançaremos para uma abordagem muito utilizada em Estatística, Ciência de Dados e análise aplicada: a gramática de manipulação do **tidyverse**.De modo geral, essa abordagem organiza o trabalho com dados por meio de funções com papéis bem definidos, como:- selecionar colunas;- filtrar linhas;- criar ou transformar variáveis;- agrupar casos;- resumir informações;- juntar bases;- reorganizar a estrutura de um conjunto de dados;- e construir gráficos de forma declarativa.::: {.callout-note title="Comentário do professor"}A principal vantagem didática do tidyverse é que ele separa as tarefas analíticas em verbos consistentes. Isso torna o código mais legível, mais previsível e mais fácil de encadear.:::## 2. Carregando os pacotes```{r}library(dplyr)library(tidyr)library(ggplot2)```::: {.callout-note title="Comentário do professor"}A função `library()` carrega um pacote já instalado no R.- `dplyr`: manipulação de dados;- `tidyr`: reorganização de bases em formato tidy;- `ggplot2`: construção de gráficos.:::## 3. Conjunto de dados da aulaUtilizaremos um conjunto de dados sintético em contexto compatível com o curso de Estatística e Ciência de Dados.```{r}dados <-tibble(id =1:12,nome =c("Ana", "Bruno", "Carla", "Daniel", "Eva", "Felipe","Giovana", "Heitor", "Isabela", "Joao", "Karen", "Lucas"),turma =c("A", "A", "B", "B", "A", "B", "A", "B", "A", "B", "A", "B"),linguagem =c("R", "Python", "R", "Python", "R", "Python","Python", "R", "R", "Python", "R", "Python"),horas_estudo =c(12, 8, 15, 7, 11, 9, 6, 14, 13, 10, 16, 5),projetos =c(3, 1, 4, 1, 2, 2, 1, 5, 4, 3, 5, 1),nota_r =c(8.7, 6.1, 9.2, 5.8, 7.5, 6.9, 5.4, 9.5, 8.8, 7.2, 9.7, 4.9),frequencia =c(92, 85, 97, 78, 88, 83, 75, 99, 94, 86, 98, 72))dados```::: {.callout-note title="Comentário do professor"}A função `tibble()` cria uma tabela moderna do tidyverse. Conceitualmente, ela é semelhante a um `data.frame`, mas possui impressão mais organizada e comportamento mais consistente em várias operações de manipulação.:::## 4. Selecionar casos e variáveis com `dplyr`No tidyverse, duas funções centrais para esse tipo de tarefa são:- `select()` para colunas;- `filter()` para linhas.## 4.1 Selecionando variáveis com `select()`::: {.callout-tip title="Execute este código"}```{r}dados %>%select(nome, turma, nota_r, projetos)```:::::: {.callout-note title="Comentário do professor"}A função `select()` seleciona colunas.- seus argumentos correspondem aos nomes das variáveis que desejamos manter;- o operador `%>%` encaminha o resultado de uma etapa para a próxima.:::### 4.2 Selecionando casos com `filter()`::: {.callout-tip title="Execute este código"}```{r}dados %>%filter(nota_r >=8)```:::::: {.callout-note title="Comentário do professor"}A função `filter()` seleciona linhas com base em condições lógicas. Neste exemplo, permanecem apenas os casos com `nota_r >= 8`.:::### 4.3 Combinando `filter()` e `select()`::: {.callout-tip title="Execute este código"}```{r}dados %>%filter(frequencia >=90, projetos >=3) %>%select(nome, turma, frequencia, projetos, nota_r)```:::::: {.callout-note title="Comentário do professor"}Dentro de `filter()`, múltiplas condições separadas por vírgula são interpretadas como conjunção lógica, isto é, como se estivéssemos usando “e”.:::#### Ilustração 4.1 – Fluxo de seleção com `dplyr````{mermaid}flowchart LRA["Base original"] --> B["filter()"]B --> C["select()"]C --> D["Subconjunto final"]```## 5. Classificar casos e recodificar valores com `mutate()` e `case_when()`Uma das tarefas mais importantes em análise de dados é criar classificações e recodificações com base em regras analíticas.## 5.1 Criando uma classificação com `mutate()` e `case_when()`::: {.callout-tip title="Execute este código"}```{r}dados_classificados <- dados %>%mutate(desempenho =case_when( nota_r <6~"baixo", nota_r <8~"intermediario",TRUE~"alto" ) )dados_classificados %>%select(nome, nota_r, desempenho)```:::::: {.callout-note title="Comentário do professor"}A função `mutate()` cria ou modifica colunas.A função `case_when()` permite definir regras condicionais de forma mais legível do que vários `ifelse()` aninhados.- cada linha de regra tem a forma `condição ~ resultado`;- `TRUE ~ ...` funciona como caso final padrão.:::### 5.2 Classificação por múltiplos critérios::: {.callout-tip title="Execute este código"}```{r}dados_classificados <- dados %>%mutate(perfil =case_when( nota_r >=9& projetos >=4~"excelente", nota_r >=7.5& frequencia >=85~"bom", nota_r >=6~"regular",TRUE~"insuficiente" ) )dados_classificados %>%select(nome, nota_r, projetos, frequencia, perfil)```:::### 5.3 Recodificando uma variável em faixas::: {.callout-tip title="Execute este código"}```{r}dados_recodificados <- dados %>%mutate(faixa_estudo =case_when( horas_estudo <8~"baixa", horas_estudo <12~"media",TRUE~"alta" ) )dados_recodificados %>%select(nome, horas_estudo, faixa_estudo)```:::#### Ilustração 5.1 – Classificação e recodificação```{mermaid}flowchart LRA["Variável original"] --> B["mutate() + case_when()"]B --> C["Nova variável categórica"]```::: {.callout-important title="Ideia central"}No tidyverse, a classificação de casos e a recodificação de valores costumam ser feitas com `mutate()`, pois essa função concentra a lógica de criação e transformação de colunas.:::## 6. Calcular novas variáveis com `mutate()`Criar variáveis derivadas é uma etapa central no fluxo de análise.### 6.1 Criando um escore simples::: {.callout-tip title="Execute este código"}```{r}dados_score <- dados %>%mutate(score = nota_r +0.5* projetos )dados_score %>%select(nome, nota_r, projetos, score)```:::### 6.2 Criando uma medida relativa::: {.callout-tip title="Execute este código"}```{r}dados_eficiencia <- dados %>%mutate(eficiencia = nota_r / horas_estudo )dados_eficiencia %>%select(nome, nota_r, horas_estudo, eficiencia)```:::### 6.3 Criando várias variáveis em uma única etapa::: {.callout-tip title="Execute este código"}```{r}dados_novos <- dados %>%mutate(score = nota_r +0.5* projetos,eficiencia = nota_r / horas_estudo,alto_desempenho = nota_r >=8 )dados_novos %>%select(nome, score, eficiencia, alto_desempenho)```:::::: {.callout-note title="Comentário do professor"}Uma grande vantagem de `mutate()` é permitir criar diversas variáveis novas em uma única chamada, mantendo a leitura do código bastante organizada.:::## 7. Agregar casos com `group_by()` e `summarise()`A agregação no tidyverse é, em geral, construída em duas etapas:1. definir os grupos com `group_by()`;2. resumir os dados com `summarise()`.### 7.1 Média da nota por turma::: {.callout-tip title="Execute este código"}```{r}dados %>%group_by(turma) %>%summarise(media_nota =mean(nota_r) )```:::::: {.callout-note title="Comentário do professor"}A função `group_by()` declara a variável de agrupamento. A função `summarise()` reduz cada grupo a uma ou mais medidas resumo.:::### 7.2 Resumindo várias medidas ao mesmo tempo::: {.callout-tip title="Execute este código"}```{r}dados %>%group_by(turma) %>%summarise(media_nota =mean(nota_r),media_estudo =mean(horas_estudo),total_projetos =sum(projetos) )```:::### 7.3 Agregando por mais de uma variável::: {.callout-tip title="Execute este código"}```{r}dados %>%group_by(turma, linguagem) %>%summarise(media_nota =mean(nota_r),.groups ="drop" )```:::::: {.callout-note title="Comentário do professor"}O argumento `.groups = "drop"` remove a estrutura de agrupamento após o resumo. Isso costuma ser útil para evitar efeitos inesperados em etapas posteriores.:::#### Ilustração 7.1 – Agregação com grupos```{mermaid}flowchart LRA["Base completa"] --> B["group_by()"]B --> C["summarise()"]C --> D["Tabela resumo por grupos"]```## 8. Dividir bases de dados com `group_split()`Quando queremos separar a base em subconjuntos, uma opção elegante é `group_split()`.### 8.1 Separando a base por turma::: {.callout-tip title="Execute este código"}```{r}bases_turma <- dados %>%group_by(turma) %>%group_split()bases_turma```:::::: {.callout-note title="Comentário do professor"}A função `group_split()` divide uma base em uma lista de subconjuntos, respeitando os grupos definidos previamente por `group_by()`.:::### 8.2 Separando por linguagem::: {.callout-tip title="Execute este código"}```{r}bases_linguagem <- dados %>%group_by(linguagem) %>%group_split()bases_linguagem```:::### 8.3 Acessando um subconjunto específico::: {.callout-tip title="Execute este código"}```{r}bases_linguagem[[1]]```:::::: {.callout-note title="Comentário do professor"}Como o resultado de `group_split()` é uma lista, cada subconjunto pode ser acessado por índices com `[[ ]]`.:::## 9. Juntar casos ou variáveis com `bind_*()` e `join()`## 9.1 Juntando casos com `bind_rows()`::: {.callout-tip title="Execute este código"}```{r}novos_casos <-tibble(id =13:15,nome =c("Marina", "Nicolas", "Olivia"),turma =c("C", "C", "C"),linguagem =c("R", "Python", "R"),horas_estudo =c(14, 9, 12),projetos =c(4, 2, 3),nota_r =c(9.0, 6.7, 8.4),frequencia =c(96, 84, 91))dados_ampliados <-bind_rows(dados, novos_casos)dados_ampliados```:::::: {.callout-note title="Comentário do professor"}A função `bind_rows()` empilha tabelas por linhas. Ela é análoga à ideia de `rbind()`, mas se integra naturalmente ao fluxo tidyverse.:::## 9.2 Juntando variáveis com `bind_cols()`::: {.callout-tip title="Execute este código"}```{r}monitorias <-tibble(monitorias =c(2, 1, 3, 0, 1, 1, 0, 4, 2, 2, 3, 0))dados_colunas <-bind_cols(dados, monitorias)dados_colunas```:::::: {.callout-note title="Comentário do professor"}A função `bind_cols()` junta objetos por colunas. Assim como no caso do R base, é preciso garantir compatibilidade entre o número e a ordem das observações.:::## 9.3 Juntando bases por chave com `left_join()`Agora vamos acrescentar informações externas à base principal.::: {.callout-tip title="Execute este código"}```{r}dados_extra <-tibble(id =c(1, 3, 5, 7, 9, 11),bolsa =c("sim", "nao", "sim", "nao", "sim", "sim"))dados_join <- dados %>%left_join(dados_extra, by ="id")dados_join```:::::: {.callout-note title="Comentário do professor"}A função `left_join(x, y, by)` mantém todas as linhas da base `x` e adiciona as informações correspondentes de `y`, usando a variável-chave informada em `by`.:::#### Ilustração 9.1 – Junção por chave```{mermaid}flowchart LRA["Base principal"] --> C["left_join(by = 'id')"]B["Base auxiliar"] --> CC --> D["Base combinada"]```## 10. Reorganizar bases com `tidyr`O pacote `tidyr` é especialmente importante quando precisamos mudar a estrutura de uma base, tornando-a mais apropriada para análise ou visualização.## 10.1 Base em formato largo```{r}avaliacoes <-tibble(id =1:5,prova1 =c(7.5, 6.0, 8.2, 5.7, 9.1),prova2 =c(8.0, 6.5, 8.8, 6.1, 9.4),prova3 =c(8.4, 7.0, 9.0, 6.3, 9.5))avaliacoes```## 10.2 Transformando de formato largo para longo com `pivot_longer()`::: {.callout-tip title="Execute este código"}```{r}avaliacoes_long <- avaliacoes %>%pivot_longer(cols =starts_with("prova"),names_to ="avaliacao",values_to ="nota" )avaliacoes_long```:::::: {.callout-note title="Comentário do professor"}A função `pivot_longer()` aumenta o número de linhas e reduz o número de colunas.- `cols`: colunas que serão empilhadas;- `names_to`: nome da nova coluna que guardará os nomes das variáveis originais;- `values_to`: nome da nova coluna que guardará os valores.:::## 10.3 Transformando de formato longo para largo com `pivot_wider()`::: {.callout-tip title="Execute este código"}```{r}avaliacoes_wide <- avaliacoes_long %>%pivot_wider(names_from = avaliacao,values_from = nota )avaliacoes_wide```:::::: {.callout-note title="Comentário do professor"}A função `pivot_wider()` faz o caminho inverso:- `names_from`: coluna cujos valores serão transformados em nomes de colunas;- `values_from`: coluna que contém os valores a serem redistribuídos.:::#### Ilustração 10.1 – Reorganização da base```{mermaid}flowchart LRA["Formato largo"] --> B["pivot_longer()"]B --> C["Formato longo"]C --> D["pivot_wider()"]D --> E["Formato largo novamente"]```::: {.callout-important title="Comentário do professor"}Uma base em formato tidy favorece a manipulação com `dplyr` e a construção de gráficos com `ggplot2`. Por isso, reorganizar corretamente os dados costuma ser uma etapa essencial no fluxo analítico.:::## 11. Introdução ao `ggplot2`O `ggplot2` organiza a construção de gráficos por camadas. Em termos gerais, um gráfico é construído a partir de:- uma base de dados;- um mapeamento estético com `aes()`;- uma ou mais camadas geométricas;- elementos de rótulo e tema.### 11.1 Estrutura geral do `ggplot()`A forma mais básica é:```{r}#| eval: falseggplot(dados, aes(x = variavel_x, y = variavel_y)) +geom_...( )```::: {.callout-note title="Comentário do professor"}A função `ggplot(data, aes(...))` inicializa o gráfico.- `data`: base de dados;- `aes()`: mapeamento entre variáveis e elementos visuais, como eixo x, eixo y, cor, forma ou preenchimento.Depois disso, adicionamos camadas com `+`.:::### 11.2 Gráfico de dispersão com `geom_point()`::: {.callout-tip title="Execute este código"}```{r}ggplot(dados, aes(x = horas_estudo, y = nota_r)) +geom_point()```:::### 11.3 Acrescentando parâmetros estéticos::: {.callout-tip title="Execute este código"}```{r}ggplot(dados, aes(x = horas_estudo, y = nota_r)) +geom_point(color ="darkred", size =3, alpha =0.8)```:::::: {.callout-note title="Comentário do professor"}Na camada `geom_point()`:- `color`: cor da borda/ponto;- `size`: tamanho dos pontos;- `alpha`: transparência.:::### 11.4 Adicionando títulos e rótulos::: {.callout-tip title="Execute este código"}```{r}ggplot(dados, aes(x = horas_estudo, y = nota_r)) +geom_point(color ="darkred", size =3, alpha =0.8) +labs(title ="Relação entre horas de estudo e nota em R",x ="Horas de estudo por semana",y ="Nota em R" )```:::::: {.callout-note title="Comentário do professor"}A função `labs()` controla títulos e rótulos do gráfico:- `title`: título principal;- `x`: rótulo do eixo horizontal;- `y`: rótulo do eixo vertical;- também pode ser usada para nomear legendas, como `color` e `fill`.:::### 11.5 Aplicando um tema::: {.callout-tip title="Execute este código"}```{r}ggplot(dados, aes(x = horas_estudo, y = nota_r)) +geom_point(color ="darkred", size =3, alpha =0.8) +labs(title ="Relação entre horas de estudo e nota em R",x ="Horas de estudo por semana",y ="Nota em R" ) +theme_minimal()```:::::: {.callout-note title="Comentário do professor"}As funções `theme_*()` controlam a aparência geral do gráfico. `theme_minimal()` produz um gráfico com aparência limpa e bastante utilizada em relatórios e apresentações.:::### 11.6 Gráfico de barras com `geom_col()`Primeiro, vamos construir uma base resumo.```{r}resumo_linguagem <- dados %>%group_by(linguagem) %>%summarise(media_nota =mean(nota_r),.groups ="drop" )resumo_linguagem```Agora, o gráfico:::: {.callout-tip title="Execute este código"}```{r}ggplot(resumo_linguagem, aes(x = linguagem, y = media_nota, fill = linguagem)) +geom_col() +labs(title ="Média da nota em R por linguagem preferida",x ="Linguagem",y ="Média da nota" ) +theme_minimal()```:::::: {.callout-note title="Comentário do professor"}A função `geom_col()` constrói barras cujas alturas já estão previamente calculadas na base. O argumento `fill` controla a cor de preenchimento das barras.:::### 11.7 Histograma com `geom_histogram()`::: {.callout-tip title="Execute este código"}```{r}ggplot(dados, aes(x = nota_r)) +geom_histogram(bins =5, fill ="steelblue", color ="white") +labs(title ="Distribuição da nota em R",x ="Nota em R",y ="Frequência" ) +theme_minimal()```:::::: {.callout-note title="Comentário do professor"}A função `geom_histogram()` constrói histogramas.- `bins`: número de classes;- `fill`: cor de preenchimento;- `color`: cor da borda.:::### 11.8 Adicionando uma reta de tendência::: {.callout-tip title="Execute este código"}```{r}ggplot(dados, aes(x = horas_estudo, y = nota_r)) +geom_point(color ="darkred", size =3, alpha =0.8) +geom_smooth(method ="lm", se =FALSE, color ="navy", linewidth =1) +labs(title ="Relação entre horas de estudo e nota em R",x ="Horas de estudo por semana",y ="Nota em R" ) +theme_minimal()```:::::: {.callout-note title="Comentário do professor"}A função `geom_smooth()` adiciona uma curva ou reta de tendência.- `method = "lm"`: ajusta uma regressão linear;- `se = FALSE`: remove a faixa de confiança;- `color`: define a cor da linha;- `linewidth`: controla a espessura da linha.:::#### Ilustração 11.1 – Lógica de construção do `ggplot2````{mermaid}flowchart LRA["Dados"] --> B["ggplot(data, aes(...))"]B --> C["geom_*()"]C --> D["labs()"]D --> E["theme_*()"]```::: {.callout-important title="Ideia central"}No `ggplot2`, um gráfico não é apenas “desenhado”; ele é construído por camadas. Quando o aluno compreende essa lógica, passa a ter muito mais autonomia para montar gráficos novos.:::## 12. Integração entre `dplyr`, `tidyr` e `ggplot2`Uma das grandes forças do tidyverse é a integração entre seus pacotes. Vamos ver um exemplo que combina transformação e visualização.::: {.callout-tip title="Execute este código"}```{r}dados %>%mutate(faixa_estudo =case_when( horas_estudo <8~"baixa", horas_estudo <12~"media",TRUE~"alta" ) ) %>%group_by(faixa_estudo) %>%summarise(media_nota =mean(nota_r),.groups ="drop" ) %>%ggplot(aes(x = faixa_estudo, y = media_nota, fill = faixa_estudo)) +geom_col() +labs(title ="Nota média por faixa de estudo",x ="Faixa de estudo",y ="Média da nota" ) +theme_minimal()```:::::: {.callout-note title="Comentário do professor"}Este exemplo ilustra um fluxo muito comum em Ciência de Dados:- criar variáveis;- resumir por grupos;- e, imediatamente depois, representar os resultados em um gráfico.:::## 13. Erros comuns e boas práticas::: {.callout-warning title="Erros comuns"}- usar `select()` achando que ele filtra linhas;- usar `filter()` achando que ele seleciona colunas;- esquecer de usar `group_by()` antes de `summarise()` quando o objetivo é resumir por grupos;- usar `bind_cols()` em objetos com observações desalinhadas;- usar `pivot_longer()` ou `pivot_wider()` sem compreender a estrutura original da base;- construir gráficos no `ggplot2` sem compreender o papel de `aes()` e das camadas.:::::: {.callout-important title="Boas práticas"}- escreva o código em etapas logicamente encadeadas;- dê nomes claros às variáveis criadas;- confira a estrutura da base após transformações importantes;- use `select()` e `filter()` de forma conceitualmente distinta;- ao construir gráficos, pense separadamente em dados, mapeamentos, geometrias, rótulos e tema.:::## 14. Exercícios propostos### Exercício 1Utilizando `mutate()` e `case_when()`, crie uma variável chamada `perfil_academico` segundo as regras:- `"excelente"` se `nota_r >= 9` e `projetos >= 4`;- `"bom"` se `nota_r >= 7.5` e `frequencia >= 85`;- `"regular"` se `nota_r >= 6`;- `"insuficiente"` caso contrário.Apresente apenas as colunas:- `nome`- `nota_r`- `projetos`- `frequencia`- `perfil_academico`### Exercício 2Selecione apenas os estudantes que satisfazem simultaneamente as condições:- `turma == "A"` ou `linguagem == "R"`;- `horas_estudo >= 10`;- `nota_r >= 7`.Em seguida, apresente somente as colunas:- `nome`- `turma`- `linguagem`- `horas_estudo`- `nota_r`### Exercício 3Usando `group_by()` e `summarise()`, calcule por `turma`:- a média de `nota_r`;- a média de `horas_estudo`;- a soma de `projetos`.### Exercício 4Divida a base segundo a variável `linguagem` com `group_split()` e calcule a média de `nota_r` apenas para o subconjunto dos estudantes que preferem `Python`.### Exercício 5Crie uma nova variável chamada `faixa_estudo` com `mutate()` e `case_when()`, segundo as categorias:- `"baixa"` se `horas_estudo < 8`;- `"media"` se `8 <= horas_estudo < 12`;- `"alta"` se `horas_estudo >= 12`.Apresente apenas as colunas:- `nome`- `horas_estudo`- `faixa_estudo`### Exercício 6Crie uma nova variável chamada `indice_global`, definida por$$\text{indice\_global}_i = 0.6 \times \text{nota\_r}_i + 0.2 \times \text{projetos}_i + 0.02 \times \text{frequencia}_i$$Em seguida, ordene a base em ordem decrescente de `indice_global` e apresente apenas os 5 primeiros casos.### Exercício 7Construa, com `ggplot2`, um gráfico de dispersão entre `horas_estudo` e `nota_r`, com:- título `"Relação entre horas de estudo e nota em R"`;- rótulos adequados nos eixos;- pontos na cor `"darkred"`;- tamanho `size = 3`;- transparência `alpha = 0.8`.Depois, adicione a reta de regressão linear, na cor `"navy"` e com `linewidth = 1`.### Exercício 8Crie uma tabela resumo com a média de `nota_r` por `faixa_estudo` e, em seguida, construa um gráfico de barras com:- `geom_col()`;- título adequado;- categorias no eixo horizontal;- barras coloridas por grupo;- `theme_minimal()`.### Exercício 9Considere a base `avaliacoes` apresentada nesta aula. Reorganize-a com `pivot_longer()` para obter uma versão longa com as colunas:- `id`- `avaliacao`- `nota`### Exercício 10Usando o objeto criado no exercício anterior, reconstrua a estrutura larga com `pivot_wider()`.::: {.callout-note title="Comentário do professor"}Os exercícios desta aula foram pensados para consolidar o uso dos principais verbos do tidyverse, articulando manipulação, reorganização e visualização de dados em um mesmo fluxo analítico.:::