Aula

Importação, organização e visualização de dados no R

Este material apresenta um fluxo básico e comentado para:

  • importar dados de diferentes fontes;
  • reorganizar tabelas do formato largo para o formato longo;
  • selecionar e filtrar dados;
  • resumir estatisticamente os valores;
  • construir gráficos exploratórios e comparativos.

A ideia é que cada etapa da análise fique clara, tanto do ponto de vista conceitual quanto do ponto de vista do código.

1. Importar arquivos locais

Nesta primeira etapa, carregamos dados armazenados em diferentes formatos. Em análise de dados, é comum trabalhar com arquivos locais em Excel ou CSV, além de planilhas online.

1.1 Ler uma planilha Excel

Arquivos do Excel geralmente possuem uma ou mais abas. A função read_excel() permite indicar tanto o arquivo quanto a aba a ser importada.

# Carrega o pacote readxl, usado para ler arquivos .xls e .xlsx
library(readxl)
Warning: pacote 'readxl' foi compilado no R versão 4.4.3
# Importa a aba "coffee rust" do arquivo Excel local
meudado <- read_excel(
  "dados_diversos.xlsx",
  sheet = "coffee rust"
)

# Exibe o objeto importado
meudado
# A tibble: 405 × 13
    farm region zone       district      lon   lat altitude cultivar shade    
   <dbl> <chr>  <chr>      <chr>       <dbl> <dbl>    <dbl> <chr>    <chr>    
 1     1 SNNPR  Bench Maji Debub Bench  35.4  6.90     1100 Local    Sun      
 2     2 SNNPR  Bench Maji Debub Bench  35.4  6.90     1342 Mixture  Mid shade
 3     3 SNNPR  Bench Maji Debub Bench  35.4  6.90     1434 Mixture  Mid shade
 4     4 SNNPR  Bench Maji Debub Bench  35.4  6.90     1100 Local    Sun      
 5     5 SNNPR  Bench Maji Debub Bench  35.4  6.90     1400 Local    Sun      
 6     6 SNNPR  Bench Maji Debub Bench  35.4  6.90     1342 Mixture  Mid shade
 7     7 SNNPR  Bench Maji Debub Bench  35.4  6.90     1432 Mixture  Mid shade
 8     8 SNNPR  Bench Maji Debub Bench  35.4  6.90     1100 Local    Sun      
 9     9 SNNPR  Bench Maji Debub Bench  35.4  6.89     1400 Local    Sun      
10    10 SNNPR  Bench Maji Debub Bench  35.4  6.88     1342 Mixture  Mid shade
# ℹ 395 more rows
# ℹ 4 more variables: cropping_system <chr>, farm_management <chr>, inc <dbl>,
#   sev2 <dbl>

1.2 Ler um arquivo CSV

Arquivos CSV são muito comuns por serem leves, simples e compatíveis com diferentes programas.

# Carrega o tidyverse, que inclui readr, dplyr, ggplot2, tidyr etc.
library(tidyverse)
Warning: pacote 'tidyverse' foi compilado no R versão 4.4.3
Warning: pacote 'ggplot2' foi compilado no R versão 4.4.3
Warning: pacote 'tibble' foi compilado no R versão 4.4.3
Warning: pacote 'tidyr' foi compilado no R versão 4.4.3
Warning: pacote 'readr' foi compilado no R versão 4.4.3
Warning: pacote 'purrr' foi compilado no R versão 4.4.3
Warning: pacote 'dplyr' foi compilado no R versão 4.4.3
Warning: pacote 'stringr' foi compilado no R versão 4.4.3
Warning: pacote 'forcats' foi compilado no R versão 4.4.3
Warning: pacote 'lubridate' foi compilado no R versão 4.4.3
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.2.0     ✔ readr     2.2.0
✔ forcats   1.0.1     ✔ stringr   1.6.0
✔ ggplot2   4.0.2     ✔ tibble    3.3.1
✔ lubridate 1.9.5     ✔ tidyr     1.3.2
✔ purrr     1.2.1     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# Importa um arquivo CSV local
meucsv <- read_csv("experimento.csv")
Rows: 192 Columns: 7
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (3): location, cultivar, treatment
dbl (4): year, block, severity, yield_kg_ha

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Exibe os dados importados
meucsv
# A tibble: 192 × 7
    year location cultivar block treatment severity yield_kg_ha
   <dbl> <chr>    <chr>    <dbl> <chr>        <dbl>       <dbl>
 1  2021 Vicosa   A            1 Control       41.1        3450
 2  2021 Vicosa   A            1 Fungicide     20.4        3739
 3  2021 Vicosa   A            2 Control       45.7        3607
 4  2021 Vicosa   A            2 Fungicide     16.2        4099
 5  2021 Vicosa   A            3 Control       40.2        3528
 6  2021 Vicosa   A            3 Fungicide     15.5        3909
 7  2021 Vicosa   A            4 Control       32.1        3652
 8  2021 Vicosa   A            4 Fungicide     15.1        3937
 9  2021 Vicosa   B            1 Control       29          3689
10  2021 Vicosa   B            1 Fungicide     12.8        4067
# ℹ 182 more rows

1.3 Ler dados de uma planilha Google

Quando os dados estão na nuvem, podemos importar diretamente a partir de uma URL pública. Aqui foi usado o pacote gsheet.

# Carrega o pacote gsheet para importar planilhas públicas do Google Sheets
library(gsheet)
Warning: pacote 'gsheet' foi compilado no R versão 4.4.3
# Importa uma aba de uma planilha Google
meudadonuvem <- gsheet2tbl(
  "https://docs.google.com/spreadsheets/d/1bq2N19DcZdtax2fQW9OHSGMR0X2__Z9T/edit?gid=1110310360#gid=1110310360"
)

# Visualiza a tabela importada
meudadonuvem
# A tibble: 30 × 3
   trat            t   sev
   <chr>       <dbl> <dbl>
 1 Gotejamento     0   1.1
 2 Gotejamento     7   3.7
 3 Gotejamento    14  10.7
 4 Gotejamento    21  11.6
 5 Gotejamento    28  15.3
 6 Gotejamento    35  18.1
 7 Gotejamento    42  32.4
 8 Gotejamento    49  35.4
 9 Gotejamento    56  41.9
10 Gotejamento    63  43.4
# ℹ 20 more rows
# Importa outra aba da mesma planilha, contendo dados de curvas
curve <- gsheet2tbl(
  "https://docs.google.com/spreadsheets/d/1bq2N19DcZdtax2fQW9OHSGMR0X2__Z9T/edit?gid=1807247585#gid=1807247585"
)

# Importa outra aba, com dados relacionados a magnésio
magnesio <- gsheet2tbl(
  "https://docs.google.com/spreadsheets/d/1bq2N19DcZdtax2fQW9OHSGMR0X2__Z9T/edit?gid=983033137#gid=983033137"
)

# Exibe os dados importados
magnesio
# A tibble: 20 × 3
   trat      rep  comp
   <chr>   <dbl> <dbl>
 1 Mg2         1   9  
 2 Mg2         2  12.5
 3 Mg2         3  10  
 4 Mg2         4   8  
 5 Mg2         5  13.2
 6 Mg2         6  11  
 7 Mg2         7  10.8
 8 Mg2         8   9.5
 9 Mg2         9  10.8
10 Mg2        10  10.4
11 control     1  13.7
12 control     2  15.9
13 control     3  15.7
14 control     4  14.2
15 control     5  15.9
16 control     6  16.5
17 control     7  18  
18 control     8  14.4
19 control     9  16.4
20 control    10  16  

2. Dados já disponíveis em pacotes ou na web

Nem sempre precisamos começar de arquivos locais. Muitos pacotes já trazem bases internas úteis para ensino, teste e demonstração. Também podemos ler diretamente arquivos hospedados na web.

# Carrega o pacote epifitter
library(epifitter)
Warning: pacote 'epifitter' foi compilado no R versão 4.4.3
# Acessa um conjunto de dados interno do pacote
dadopacote <- epifitter::PowderyMildew

# Examina a estrutura do objeto para entender tipos de variáveis e dimensões
str(dadopacote)
'data.frame':   240 obs. of  5 variables:
 $ irrigation_type: Factor w/ 5 levels "Drip","Furrow",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ moisture       : Factor w/ 2 levels "High moisture",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ block          : int  1 2 3 1 2 3 1 2 3 1 ...
 $ time           : int  0 0 0 7 7 7 14 14 14 21 ...
 $ sev            : num  0.011 0.011 0.011 0.034 0.04 0.036 0.114 0.109 0.097 0.126 ...
# Lê um arquivo CSV diretamente de um repositório online
# Esse procedimento é útil quando os dados estão no GitHub ou em outro servidor público
# O arquivo é importado diretamente pela URL
 dadogh <- read_csv(
  "https://raw.githubusercontent.com/emdelponte/paper-coffee-rust-Ethiopia/refs/heads/master/data/survey_clean.csv"
)
Rows: 405 Columns: 13
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): region, zone, district, cultivar, shade, cropping_system, farm_mana...
dbl (6): farm, lon, lat, altitude, inc, sev2

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Visualiza as primeiras linhas
head(dadogh)
# A tibble: 6 × 13
   farm region zone       district      lon   lat altitude cultivar shade    
  <dbl> <chr>  <chr>      <chr>       <dbl> <dbl>    <dbl> <chr>    <chr>    
1     1 SNNPR  Bench Maji Debub Bench  35.4  6.90     1100 Local    Sun      
2     2 SNNPR  Bench Maji Debub Bench  35.4  6.90     1342 Mixture  Mid shade
3     3 SNNPR  Bench Maji Debub Bench  35.4  6.90     1434 Mixture  Mid shade
4     4 SNNPR  Bench Maji Debub Bench  35.4  6.90     1100 Local    Sun      
5     5 SNNPR  Bench Maji Debub Bench  35.4  6.90     1400 Local    Sun      
6     6 SNNPR  Bench Maji Debub Bench  35.4  6.90     1342 Mixture  Mid shade
# ℹ 4 more variables: cropping_system <chr>, farm_management <chr>, inc <dbl>,
#   sev2 <dbl>

3. Transformar dados do formato largo para o formato longo

Muitas análises e gráficos no ggplot2 funcionam melhor quando os dados estão no chamado formato longo.

No formato largo, cada método ou variável medida pode estar em uma coluna diferente. No formato longo, essas colunas são empilhadas em duas colunas principais:

  • uma coluna que identifica o grupo, método ou categoria;
  • outra coluna que contém os valores observados.

3.1 Importar e inspecionar os dados

# Importa a planilha com dados de softwares de avaliação
software <- gsheet2tbl(
  "https://docs.google.com/spreadsheets/d/1bq2N19DcZdtax2fQW9OHSGMR0X2__Z9T/edit?gid=373270992#gid=373270992"
)

# Mostra a estrutura geral dos dados
# glimpse() é útil para ver nomes de colunas, tipos e alguns valores
 glimpse(software)
Rows: 70
Columns: 5
$ crop       <chr> "Rosa", "Rosa", "Rosa", "Rosa", "Rosa", "Rosa", "Rosa", "Ro…
$ rep        <dbl> 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,…
$ Assess     <dbl> 19.95, 4.77, 72.11, 81.37, 25.78, 80.45, 81.69, 7.02, 11.23…
$ LeafDoctor <dbl> 31.55, 13.53, 77.59, 90.83, 24.54, 73.84, 86.78, 14.04, 16.…
$ ImageJ     <dbl> 26.04, 5.16, 69.46, 82.68, 13.13, 69.90, 88.66, 6.40, 10.82…
# Cria um objeto com nome mais genérico para facilitar a escrita posterior
 dados <- software

3.2 Converter para formato longo

Neste exemplo, as colunas Assess, LeafDoctor e ImageJ representam medidas obtidas por diferentes softwares. Vamos empilhá-las em uma única coluna de valores.

# Converte os dados do formato largo para o formato longo
# cols: colunas que serão empilhadas
# names_to: nome da nova coluna que guardará o nome do software
# values_to: nome da nova coluna que guardará os valores de severidade
 dados_longo <- dados |>
  pivot_longer(
    cols = c(Assess, LeafDoctor, ImageJ),
    names_to = "software",
    values_to = "severidade"
  )

# Exibe o resultado
 dados_longo
# A tibble: 210 × 4
   crop    rep software   severidade
   <chr> <dbl> <chr>           <dbl>
 1 Rosa     21 Assess          20.0 
 2 Rosa     21 LeafDoctor      31.6 
 3 Rosa     21 ImageJ          26.0 
 4 Rosa     22 Assess           4.77
 5 Rosa     22 LeafDoctor      13.5 
 6 Rosa     22 ImageJ           5.16
 7 Rosa     23 Assess          72.1 
 8 Rosa     23 LeafDoctor      77.6 
 9 Rosa     23 ImageJ          69.5 
10 Rosa     24 Assess          81.4 
# ℹ 200 more rows

3.3 Visualizar a distribuição dos dados no formato longo

Uma vez no formato longo, fica muito mais simples comparar grupos usando ggplot2.

 dados_longo |>
  ggplot(aes(x = software, y = severidade, color = software)) +
  geom_boxplot(outlier.colour = NA) +
  geom_jitter(
    width = 0.1,
    alpha = 0.3
  ) +
  theme_minimal() +
  theme(legend.position = "none") +
  facet_wrap(~ crop)

Neste gráfico:

  • geom_boxplot() resume a distribuição dos dados;
  • geom_jitter() mostra os pontos individuais, evitando sobreposição excessiva;
  • facet_wrap(~ crop) separa os gráficos por cultura.

4. Verbos do dplyr: selecionar e filtrar

Agora vamos praticar dois verbos muito importantes do dplyr:

  • select(): escolhe colunas;
  • filter(): escolhe linhas com base em uma condição.
# Seleciona apenas três colunas do objeto original
Assess <- software |>
  select(crop, rep, Assess)
Assess
# A tibble: 70 × 3
   crop    rep Assess
   <chr> <dbl>  <dbl>
 1 Rosa     21  20.0 
 2 Rosa     22   4.77
 3 Rosa     23  72.1 
 4 Rosa     24  81.4 
 5 Rosa     25  25.8 
 6 Rosa     26  80.4 
 7 Rosa     27  81.7 
 8 Rosa     28   7.02
 9 Rosa     29  11.2 
10 Rosa     30  79.1 
# ℹ 60 more rows
# Filtra no objeto longo apenas as observações do software Assess
Assess2 <- dados_longo |>
  filter(software == "Assess")
Assess2
# A tibble: 70 × 4
   crop    rep software severidade
   <chr> <dbl> <chr>         <dbl>
 1 Rosa     21 Assess        20.0 
 2 Rosa     22 Assess         4.77
 3 Rosa     23 Assess        72.1 
 4 Rosa     24 Assess        81.4 
 5 Rosa     25 Assess        25.8 
 6 Rosa     26 Assess        80.4 
 7 Rosa     27 Assess        81.7 
 8 Rosa     28 Assess         7.02
 9 Rosa     29 Assess        11.2 
10 Rosa     30 Assess        79.1 
# ℹ 60 more rows
# Filtra apenas observações do ImageJ
ImageJ <- dados_longo |>
  filter(software == "ImageJ")
ImageJ
# A tibble: 70 × 4
   crop    rep software severidade
   <chr> <dbl> <chr>         <dbl>
 1 Rosa     21 ImageJ        26.0 
 2 Rosa     22 ImageJ         5.16
 3 Rosa     23 ImageJ        69.5 
 4 Rosa     24 ImageJ        82.7 
 5 Rosa     25 ImageJ        13.1 
 6 Rosa     26 ImageJ        69.9 
 7 Rosa     27 ImageJ        88.7 
 8 Rosa     28 ImageJ         6.4 
 9 Rosa     29 ImageJ        10.8 
10 Rosa     30 ImageJ        78.2 
# ℹ 60 more rows
# Filtra apenas observações do LeafDoctor
LeafDoctor <- dados_longo |>
  filter(software == "LeafDoctor")
LeafDoctor
# A tibble: 70 × 4
   crop    rep software   severidade
   <chr> <dbl> <chr>           <dbl>
 1 Rosa     21 LeafDoctor       31.6
 2 Rosa     22 LeafDoctor       13.5
 3 Rosa     23 LeafDoctor       77.6
 4 Rosa     24 LeafDoctor       90.8
 5 Rosa     25 LeafDoctor       24.5
 6 Rosa     26 LeafDoctor       73.8
 7 Rosa     27 LeafDoctor       86.8
 8 Rosa     28 LeafDoctor       14.0
 9 Rosa     29 LeafDoctor       16.0
10 Rosa     30 LeafDoctor       77.0
# ℹ 60 more rows

5. Gráficos comparativos por software

Após filtrar os dados por software, podemos construir gráficos separados e depois combiná-los em um painel.

# Gráfico para Assess
p_A <- Assess2 |>
  ggplot(aes(x = crop, y = severidade, color = crop)) +
  geom_jitter(width = 0.1) +
  labs(title = "Assess")

# Gráfico para LeafDoctor
p_ld <- LeafDoctor |>
  ggplot(aes(x = crop, y = severidade, color = crop)) +
  geom_jitter(width = 0.1) +
  labs(title = "LeafDoctor")

p_ld

# Gráfico para ImageJ
p_ij <- ImageJ |>
  ggplot(aes(x = crop, y = severidade, color = crop)) +
  geom_jitter(width = 0.1) +
  labs(title = "ImageJ")

p_ij

# Carrega o patchwork para combinar múltiplos gráficos
library(patchwork)
Warning: pacote 'patchwork' foi compilado no R versão 4.4.3
# Combina os gráficos em um arranjo de painel
((p_ld | p_ij) / p_A) +
  plot_annotation(tag_levels = "A") +
  plot_layout(guides = "collect") &
  theme(legend.position = "bottom")

# Salva o gráfico em arquivo PNG
# bg = "white" evita fundo transparente em alguns casos
 ggsave("plot1.png", width = 5, height = 5, bg = "white")

6. Resumir e agrupar dados

Além de visualizar dados brutos, é importante calcular estatísticas-resumo, como média e desvio-padrão.

6.1 Estatísticas gerais

# Média geral da severidade
mean(dados_longo$severidade)
[1] 19.6189
# Desvio-padrão geral da severidade
sd(dados_longo$severidade)
[1] 23.84137

6.2 Resumo por grupo seguido de gráfico

Aqui agrupamos os dados por crop e software, calculamos média e desvio-padrão, e depois filtramos apenas o software Assess.

plot2 <- dados_longo |>
  group_by(crop, software) |>
  summarise(
    media_severidade = mean(severidade),
    dp_severidade = sd(severidade)
  ) |>
  filter(software == "Assess") |>
  ggplot(aes(x = crop, y = media_severidade, fill = crop)) +
  geom_col() +
  geom_point() +
  geom_errorbar(
    aes(
      ymin = media_severidade - dp_severidade,
      ymax = media_severidade + dp_severidade
    ),
    width = 0.1
  ) +
  theme_classic() +
  theme(legend.position = "none")
`summarise()` has regrouped the output.
ℹ Summaries were computed grouped by crop and software.
ℹ Output is grouped by crop.
ℹ Use `summarise(.groups = "drop_last")` to silence this message.
ℹ Use `summarise(.by = c(crop, software))` for per-operation grouping
  (`?dplyr::dplyr_by`) instead.
plot2

6.3 Versão mais robusta e clara da mesma análise

Nesta segunda versão, o filtro é aplicado antes do agrupamento, o que deixa o fluxo mais direto. Além disso, foi incluído na.rm = TRUE para ignorar valores ausentes.

plot2 <- dados_longo |>
  # Filtra primeiro apenas o software de interesse
  filter(software == "Assess") |>
  
  # Agrupa por cultura
  group_by(crop) |>
  
  # Calcula estatísticas-resumo
  summarise(
    media_severidade = mean(severidade, na.rm = TRUE),
    dp_severidade = sd(severidade, na.rm = TRUE)
  ) |>
  
  # Constrói o gráfico com colunas e barras de erro
  ggplot(aes(x = crop, y = media_severidade, fill = crop)) +
  geom_col(alpha = 0.8) +
  geom_errorbar(
    aes(
      ymin = media_severidade - dp_severidade,
      ymax = media_severidade + dp_severidade
    ),
    width = 0.1
  ) +
  theme_minimal() +
  theme(legend.position = "none") +
  labs(
    x = "Cultura",
    y = "Severidade média (%)",
    title = "Severidade por cultura - software Assess"
  )

plot2

7. Gráficos de relação entre variáveis

Agora vamos comparar diretamente os valores produzidos por diferentes softwares. Esse tipo de gráfico é útil para avaliar concordância, associação linear e possíveis desvios entre métodos.

7.1 Versão básica dos gráficos de dispersão

# LeafDoctor versus Assess
ld_as <- software |>
  ggplot(aes(x = LeafDoctor, y = Assess)) +
  geom_point(size = 2, color = "darkorange") +
  ylim(0, 100) +
  xlim(0, 100) +
  geom_abline(intercept = 0, slope = 1, linetype = 2) +
  geom_smooth(method = "lm", se = FALSE, color = "black")

# ImageJ versus Assess
ij_as <- software |>
  ggplot(aes(x = ImageJ, y = Assess)) +
  geom_point(size = 2, color = "darkorange") +
  ylim(0, 100) +
  xlim(0, 100) +
  geom_abline(intercept = 0, slope = 1, linetype = 2) +
  geom_smooth(method = "lm", se = FALSE, color = "black")

# LeafDoctor versus ImageJ
ij_ld <- software |>
  ggplot(aes(x = LeafDoctor, y = ImageJ)) +
  geom_point(size = 2, color = "darkorange") +
  ylim(0, 100) +
  xlim(0, 100) +
  geom_abline(intercept = 0, slope = 1, linetype = 2) +
  geom_smooth(method = "lm", se = FALSE, color = "black")

# Exibe os três gráficos lado a lado
ld_as + ij_as + ij_ld
`geom_smooth()` using formula = 'y ~ x'
`geom_smooth()` using formula = 'y ~ x'
`geom_smooth()` using formula = 'y ~ x'
Warning: Removed 1 row containing missing values or values outside the scale range
(`geom_smooth()`).

Nesses gráficos:

  • cada ponto representa uma observação;
  • a linha tracejada de inclinação 1 indica concordância perfeita entre os métodos;
  • a linha ajustada (geom_smooth(method = "lm")) mostra a tendência linear observada.

7.2 Versão enriquecida com coeficiente de correlação

Agora adicionamos o coeficiente de correlação de Pearson ao gráfico, usando stat_cor() do pacote ggpubr.

# Carrega pacotes usados nesta etapa
library(ggplot2)
library(ggpubr)
Warning: pacote 'ggpubr' foi compilado no R versão 4.4.3
# Gráfico LeafDoctor vs Assess com correlação
ld_as <- software |>
  ggplot(aes(x = LeafDoctor, y = Assess)) +
  geom_point(size = 2, color = "darkorange") +
  geom_smooth(method = "lm", se = FALSE, color = "black") +
  geom_abline(intercept = 0, slope = 1, linetype = 2) +
  stat_cor(method = "pearson", label.x = 5, label.y = 95) +
  ylim(0, 100) +
  xlim(0, 100) +
  theme_minimal()

# Gráfico ImageJ vs Assess com correlação
ij_as <- software |>
  ggplot(aes(x = ImageJ, y = Assess)) +
  geom_point(size = 2, color = "darkorange") +
  geom_smooth(method = "lm", se = FALSE, color = "black") +
  geom_abline(intercept = 0, slope = 1, linetype = 2) +
  stat_cor(method = "pearson", label.x = 5, label.y = 95) +
  ylim(0, 100) +
  xlim(0, 100) +
  theme_minimal()

# Gráfico LeafDoctor vs ImageJ com correlação
ij_ld <- software |>
  ggplot(aes(x = LeafDoctor, y = ImageJ)) +
  geom_point(size = 2, color = "darkorange") +
  geom_smooth(method = "lm", se = FALSE, color = "black") +
  geom_abline(intercept = 0, slope = 1, linetype = 2) +
  stat_cor(method = "pearson", label.x = 5, label.y = 95) +
  ylim(0, 100) +
  xlim(0, 100) +
  theme_minimal()

# Exibe os gráficos em painel
ld_as + ij_as + ij_ld
`geom_smooth()` using formula = 'y ~ x'
`geom_smooth()` using formula = 'y ~ x'
`geom_smooth()` using formula = 'y ~ x'
Warning: Removed 1 row containing missing values or values outside the scale range
(`geom_smooth()`).

8. Observações finais sobre o fluxo de análise

Este código ilustra um fluxo bastante comum em análise de dados:

  1. importar dados de diferentes fontes;
  2. inspecionar a estrutura dos objetos;
  3. reorganizar a base para facilitar análise e visualização;
  4. filtrar e selecionar subconjuntos de interesse;
  5. resumir estatisticamente os dados;
  6. construir gráficos exploratórios e comparativos.

Em uma análise real, seria recomendável também:

  • verificar valores ausentes;
  • checar nomes e classes das variáveis;
  • padronizar escalas e unidades;
  • salvar objetos processados quando necessário;
  • comentar o código de forma que ele possa ser entendido futuramente.