R para análise de dados em Psicologia

Uma Introdução - Encontro 2

Francisco Pablo Huascar Aragão Pinheiro

Quem sou eu

  • Psicólogo
  • Doutor em educação
  • Professor do campus Sobral da UFC
  • Recentemente, um entusiasta do R

Gráficos

R for Data Science

Livro base para o mini curso

Capa do livro R for Data Science. Uma coruja se destaca na ilustração

R for Data Science

  • Neste link você pode acessar a primeira edição do livro:

https://r4ds.had.co.nz/

  • E aqui você pode acessar a segunda edição que ainda está sendo finalizada:

https://r4ds.hadley.nz/

ggplot2: Elegant Graphics for Data Analysis

Para apronfundar o conhecimento sobre gráficos

ggplot2: Elegant Graphics for Data Analysis

  • Neste link você pode acessar a terceira edição do livro que ainda está sendo finalizada:

https://ggplot2-book.org/index.html

2 Visualização de Dados

2.1 Introdução

  • ggplot2: grammar of graphics (gramática dos gráficos)
    • Sistema coerente para descrever e construir gráficos

Pacotes

library(tidyverse)

there is no package called 'tidyverse'

install.packages("tidyverse")
library(tidyverse)
install.packages("palmerpenguins")
library(palmerpenguins)
install.packages("ggthemes")
library(ggthemes)

2.2 Primeiros Passos

  • Os pinguins com nadadeiras mais longas pesam mais ou menos que os pinguins com nadadeiras mais curtas?
  • Como é a relação entre o comprimento da nadadeira e a massa corporal? É positivo? Negativo? Linear? Não linear?
  • A relação varia de acordo com a espécie do pinguim?
  • O que nos diz a ilha onde mora o pinguim?
  • Vamos criar visualizações que podemos usar para responder a essas perguntas.

O banco de Dados dos penguins

  • Banco de dados: uma coleção retangular de variáveis (nas colunas) e observações (nas linhas)
  • penguins: 344 casos/observações
  • Os dados foram coletados e disponibilizados pela Dra. Kristen Gorman e a Estação Palmer, Antártica LTER

Algumas Definições

  • Variável: uma quantidade, qualidade ou propriedade que você pode medir
  • Valor: o estado de uma variável quando você a mede
    • O valor de uma variável pode mudar de medição para medição

Algumas Definições

  • Observação/caso: conjunto de medições feitas em condições semelhantes
    • Todas as medições em uma observação são feitas ao mesmo tempo e no mesmo objeto
  • Uma observação/caso conterá vários valores, cada um associado a uma variável diferente.
  • penguins
    • Variável: atributo de todos os pinguins
    • Observação: todos os atributos de um único pinguim

Dados Tabulares

  • Conjunto de valores, cada um associado a uma variável e a uma observação.
  • Os dados tabulares são organizados (“tidy”) se cada valor for colocado em sua própria “célula”, cada variável em sua própria coluna e cada observação em sua própria linha

Tidy data

tibble

penguins
# A tibble: 344 × 8
   species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
   <fct>   <fct>              <dbl>         <dbl>             <int>       <int>
 1 Adelie  Torgersen           39.1          18.7               181        3750
 2 Adelie  Torgersen           39.5          17.4               186        3800
 3 Adelie  Torgersen           40.3          18                 195        3250
 4 Adelie  Torgersen           NA            NA                  NA          NA
 5 Adelie  Torgersen           36.7          19.3               193        3450
 6 Adelie  Torgersen           39.3          20.6               190        3650
 7 Adelie  Torgersen           38.9          17.8               181        3625
 8 Adelie  Torgersen           39.2          19.6               195        4675
 9 Adelie  Torgersen           34.1          18.1               193        3475
10 Adelie  Torgersen           42            20.2               190        4250
# ℹ 334 more rows
# ℹ 2 more variables: sex <fct>, year <int>
  • Oito colunas (variáveis)

Variáveis

glimpse(penguins)
Rows: 344
Columns: 8
$ species           <fct> Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adel…
$ island            <fct> Torgersen, Torgersen, Torgersen, Torgersen, Torgerse…
$ bill_length_mm    <dbl> 39.1, 39.5, 40.3, NA, 36.7, 39.3, 38.9, 39.2, 34.1, …
$ bill_depth_mm     <dbl> 18.7, 17.4, 18.0, NA, 19.3, 20.6, 17.8, 19.6, 18.1, …
$ flipper_length_mm <int> 181, 186, 195, NA, 193, 190, 181, 195, 193, 190, 186…
$ body_mass_g       <int> 3750, 3800, 3250, NA, 3450, 3650, 3625, 4675, 3475, …
$ sex               <fct> male, female, female, NA, female, male, female, male…
$ year              <int> 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007…

Variáveis

view(penguins)

Variáveis no banco de dados dos penguins

  1. species: uma espécie de pinguim (Adelie, Chinstrap ou Gentoo)
  2. flipper_length_mm:comprimento da nadadeira de um pinguim, em milímetros
  3. body_mass_g:massa corporal de um pinguim, em gramas

Para saber mais sobre o banco de dados:

?penguins

Objetivo final

Criando um ggplot camada por camada

Banco de dados

data

ggplot(data = penguins)

Representação visual das informações

mapping e aes(aesthetics - estética)

ggplot(data = penguins,
       mapping = aes(x = flipper_length_mm, y = body_mass_g))

Como representar as informações?

  • geom: o objeto geométrico que um gráfico usa para representar dados
  • Funções que sempre começam com geom_
  • Gráficos de barras: geom_bar()
  • Gráficos de linhas: geom_line()
  • Gráficos de caixa de bigodes: geom_boxplot()
  • Gráficos de dispersão: geom_point()

geom_point()

ggplot(data = penguins,
  mapping = aes(x = flipper_length_mm, y = body_mass_g)) +
  geom_point()

Mensagem de aviso (Warning message):

Removed 2 rows containing missing values (geom_point()).

Adicionando uma estética (aesthetics)

color

ggplot(data = penguins,
  mapping = aes(x = flipper_length_mm, 
                y = body_mass_g, 
                color = species)) +
  geom_point()

Adicionando uma estética (aesthetics)

Adicionando uma estética (aesthetics)

shape

ggplot(data = penguins,
  mapping = aes(x = flipper_length_mm, 
                y = body_mass_g, 
                color = species,
                shape = species)) +
  geom_point()

Adicionando uma estética (aesthetics)

Adicionando uma camada (layer)

geom_smooth()

ggplot(data = penguins,
  mapping = aes(x = flipper_length_mm, 
                y = body_mass_g, 
                color = species,
                shape = species)) +
  geom_point()+
  geom_smooth(method = "lm")

Adicionando uma camada (layer)

Adicionando uma camada (layer)

geom_smooth()

ggplot(data = penguins,
  mapping = aes(x = flipper_length_mm, 
                y = body_mass_g)) +
  geom_point(aes(color = species,
                 shape = species)) +
  geom_smooth(method = "lm")

Adicionando uma camada (layer)

Adicionando rótulos (labels)

labs()

ggplot(data = penguins,
  mapping = aes(x = flipper_length_mm, 
                y = body_mass_g)) +
  geom_point(aes(color = species,
                 shape = species)) +
  geom_smooth(method = "lm") +
  labs(title = "Massa corporal e comprimento da nadadeira",
       subtitle = "Dimensões para Adelie, Chinstrap e Gentoo",
       x = "Comprimento da nadadeira (mm)",
       y = "Massa corporal (g)",
       color = "Espécie",
       shape = "Espécie")

Adicionando rótulos (labels)

Cores para daltônicos

ggthemes

ggplot(data = penguins,
  mapping = aes(x = flipper_length_mm, 
                y = body_mass_g)) +
  geom_point(aes(color = species,
                 shape = species)) +
  geom_smooth(method = "lm") +
  labs(title = "Massa corporal e comprimento da nadadeira",
       subtitle = "Dimensões para Adelie, Chinstrap e Gentoo",
    x = "Comprimento da nadadeira (mm)",
       y = "Massa corporal (g)",
       color = "Espécie",
    shape = "Espécie") +
  scale_color_colorblind()

Cores para daltônicos

ggthemes

Exercícios

Qual o número de linhas no banco de dados dos penguins? Quantas colunas?

Resposta

library(tidyverse)
library(palmerpenguins)

glimpse(penguins)
Rows: 344
Columns: 8
$ species           <fct> Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adel…
$ island            <fct> Torgersen, Torgersen, Torgersen, Torgersen, Torgerse…
$ bill_length_mm    <dbl> 39.1, 39.5, 40.3, NA, 36.7, 39.3, 38.9, 39.2, 34.1, …
$ bill_depth_mm     <dbl> 18.7, 17.4, 18.0, NA, 19.3, 20.6, 17.8, 19.6, 18.1, …
$ flipper_length_mm <int> 181, 186, 195, NA, 193, 190, 181, 195, 193, 190, 186…
$ body_mass_g       <int> 3750, 3800, 3250, NA, 3450, 3650, 3625, 4675, 3475, …
$ sex               <fct> male, female, female, NA, female, male, female, male…
$ year              <int> 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007…

Exercícios

Faça um gráfico de dispersão de bill_depth_mm vs. bill_length_mm. Ou seja, faça um gráfico de dispersão com bill_depth_mm no eixo y e bill_length_mm no eixo x. Descreva a relação entre essas duas variáveis.

bill = bico

Resposta

ggplot(data = penguins,
       aes(x = bill_length_mm,
           y = bill_depth_mm)) +
  geom_point() +
  geom_smooth()

Exercícios

O que acontece se você fizer um gráfico de dispersão de species versus bill_depth_mm? O que poderia ser uma melhor escolha de geom?

Resposta

ggplot(data = penguins,
       aes(x = species,
           y = bill_depth_mm)) +
  geom_point()

Resposta

ggplot(data = penguins,
       aes(x = species,
           y = bill_depth_mm)) +
  geom_boxplot()

Exercícios

Recrie a seguinte visualização. Para qual estética o bill_depth_mm deve ser mapeado? E deve ser mapeado no nível global ou no nível geom?

Resposta

ggplot(data = penguins,
       aes(x = flipper_length_mm,
           y = body_mass_g)) +
  geom_point(aes(color = bill_depth_mm)) +
  geom_smooth()

Resposta

2.3 Chamadas do ggplot2

  • data
  • mapping(aes(x = ... , y = ...)
ggplot(data = penguins,
  mapping = aes(x = flipper_length_mm, 
                y = body_mass_g)) +
  geom_point()
ggplot(penguins,
       aes(flipper_length_mm,
           body_mass_g)) +
  geom_point()
penguins |> 
  ggplot(aes(flipper_length_mm,
             body_mass_g)) +
  geom_point()

2.3 Chamadas do ggplot2

2.4 Visualizando distribuições

  • A visualização vai depender do tipo de variável
    • Categórica
    • Numérica

Variável categórica

  • Os números são usados para classificar objetos
  • 1 ≠ 2 ≠ 3
  • Grupo: frutas
    • categorias
      • 1 = laranja
      • 2 = maçã
      • 3 = uva
    • laranja ≠ maçã ≠ uva

Variável categórica: Gráfico de Barras (geom_bar())

Altura das barras: número de observações em cada valor de x

ggplot(penguins,
       aes(species)) +
  geom_bar()

Gráfico de Barras (geom_bar()): variáveis ordendas pela frequência

ggplot(penguins,
       aes(fct_infreq(species))) +
  geom_bar()

Gráfico de Barras (geom_bar()): proporções

ggplot(penguins,
       aes(fct_infreq(species),
           y = after_stat(count/sum(count)))) +
  geom_bar() +
  geom_text(aes(label = percent(after_stat(count/sum(count)))),
            stat = "count",
            nudge_y = 0.03) +
  scale_y_continuous(labels = percent)

Variável numérica

  • 1 > 2 > 3
    • 2 - 1= 1
    • 3 - 2 = 1
    • 3 - 1 = 2
  • Discreta
    • pessoas: 1, 2, 3, ou 4
      • 1/2 (0,5) pessoa?
  • Contínua
    • comprimento: 1,23 cm, 1,234 cm, 1,2347 cm …
    • valores infintos entre 2 números

Histograma (geom_histogram())

  • Divide o eixo x em caixas igualmente espaçadas
  • Usa a altura de uma barra para exibir o número de observações em cada caixa

Histograma (geom_histogram())

ggplot(penguins, aes(x = body_mass_g)) +
  geom_histogram(binwidth = 200)

Histograma (geom_histogram()): binwidth()

  • Define a largura dos intervalos

Exercícios

Faça um gráfico de barras das espécies (species) de pinguins, onde você atribui espécies (species) ao eixo y. Como esse gráfico é diferente?

Resposta

ggplot(penguins,
       aes(y = species)) +
  geom_bar()

Exercícios

Em que os dois gráficos a seguir são diferentes? Qual estética, cor ou preenchimento, é mais útil para mudar a cor das barras?

ggplot(penguins, aes(species)) +
  geom_bar(color = "red")

ggplot(penguins, aes(species)) +
  geom_bar(fill = "red")

Resposta

ggplot(penguins, aes(species)) +
  geom_bar(fill = "red")

Exercícios

Faça um histograma da variável quilate (carat) no conjunto de dados de diamonds (diamantes) que está disponível quando você carrega o pacote tidyverse. Experimente diferentes larguras de caixa (bin). Qual largura de bin revela os padrões mais interessantes?

Resposta

ggplot(diamonds,
       aes(carat)) +
  geom_histogram()

hist(diamonds$carat)

2.5 Visualizando relacionamentos

  • 2 variáveis
    • categórica x numérica
    • categórica x categórica
    • numérica x numérica
  • 3 ou mais variáveis

Variáveis numéricas e categóricas

  • Diagrama de caixa (geom_boxplot())
    • Atalho visual para medidas de posição (percentis) que descrevem uma distribuição
    • Útil para identificar possíveis outliers

Entendendo um diagrama de caixa (geom_boxplot())

Entendendo um diagrama de caixa (geom_boxplot())

Duas variáveis categóricas

  • Relacionamento entre ilha (island) e espécie (species)
    • Distribuição das espécies dentro de cada ilha

Tabela de Frequência

penguins |> 
  group_by(island, species) |> 
  summarise(n = n()) |>
  pivot_wider(names_from = species,
              values_from = n) |>
  rowwise() |> 
  mutate(total_island = sum(c_across(Adelie:Chinstrap),na.rm = T)) |> 
  ungroup() |> 
  kable() |> 
  kable_minimal()
island Adelie Gentoo Chinstrap total_island
Biscoe 44 124 NA 168
Dream 56 NA 68 124
Torgersen 52 NA NA 52

Gráfico de barras emplilhados (stacked bar plots)

ggplot(penguins,
       aes(island,
           fill = species)) +
  geom_bar()

Gráfico de barras emplilhados (stacked bar plots)

Gráfico de frequência relativa (relative frequency plot)

  • position = "fill"
  • útil para comparar a distribuição de espécies nas ilhas
    • não é afetado pelo número desigual de pinguins nas ilhas
ggplot(penguins,
       aes(island,
           fill = species))+
  geom_bar(position = "fill")

Gráfico de frequência relativa (relative frequency plot)

Grafico de barras

  • position = "dodge"
ggplot(penguins,
       aes(island,
           fill = species)) +
  geom_bar(position = "dodge")

Grafico de barras

Duas variáveis numéricas

  • geom_point()
  • geom_smooth()
ggplot(penguins,
       aes(flipper_length_mm, 
           body_mass_g)) +
  geom_point() +
  geom_smooth(method = "lm")

Duas variáveis numéricas

Três ou mais variáveis

  • Podem ser mapeadas para diferntes estéticas (aesthetics)
  • color = espécies (species)
  • shape = ilhas (island)
ggplot(penguins,
       aes(flipper_length_mm,
           body_mass_g)) +
  geom_point(aes(color = species,
                 shape = island))

Três ou mais variáveis

facets

  • Muitas variáveis nas estéticas pode deixar o gráfico confuso
  • facet_
ggplot(penguins,
       aes(flipper_length_mm,
           body_mass_g)) +
  geom_point(aes(color = species,
                 shape = species)) +
  facet_wrap(~ island)

facets

Exercícios

O banco de dados mpg que acompanha o pacote ggplot2 contém 234 observações coletadas pela Agência de Proteção Ambiental dos EUA em 38 modelos de carros. Quais variáveis em mpg são categóricas? Quais variáveis são numéricas? (Dica: digite ?mpg para ler a documentação do banco de dados.) Como você pode ver essas informações ao executar mpg?

Reposta

glimpse(mpg)
Rows: 234
Columns: 11
$ manufacturer <chr> "audi", "audi", "audi", "audi", "audi", "audi", "audi", "…
$ model        <chr> "a4", "a4", "a4", "a4", "a4", "a4", "a4", "a4 quattro", "…
$ displ        <dbl> 1.8, 1.8, 2.0, 2.0, 2.8, 2.8, 3.1, 1.8, 1.8, 2.0, 2.0, 2.…
$ year         <int> 1999, 1999, 2008, 2008, 1999, 1999, 2008, 1999, 1999, 200…
$ cyl          <int> 4, 4, 4, 4, 6, 6, 6, 4, 4, 4, 4, 6, 6, 6, 6, 6, 6, 8, 8, …
$ trans        <chr> "auto(l5)", "manual(m5)", "manual(m6)", "auto(av)", "auto…
$ drv          <chr> "f", "f", "f", "f", "f", "f", "f", "4", "4", "4", "4", "4…
$ cty          <int> 18, 21, 20, 21, 16, 18, 18, 18, 16, 20, 19, 15, 17, 17, 1…
$ hwy          <int> 29, 29, 31, 30, 26, 26, 27, 26, 25, 28, 27, 25, 25, 25, 2…
$ fl           <chr> "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p…
$ class        <chr> "compact", "compact", "compact", "compact", "compact", "c…

Exercícios

Faça um gráfico de dispersão de hwy vs. displ usando o banco de dados mpg Em seguida, mapeie uma terceira variável numérica para color, depois para size, então para color e size ao mesmo tempo, então para shape. Como essas estéticas se comportam de maneira diferente para variáveis categóricas e numéricas?

Resposta

p <- 
  ggplot(mpg,
            aes(hwy,
                displ)) +
  geom_point() +
  geom_smooth(method = "lm",
              se = F)

p

Resposta

Resposta

p + geom_point(aes(color = cty))

Resposta

Resposta

p + geom_point(aes(size = cty))

Resposta

Resposta

p + geom_point(aes(color = cty,
                   size = cty))

Resposta

Resposta

p + geom_point(aes(shape = cty))

Error in geom_point(): ! Problem while computing aesthetics. ℹ Error occurred in the 2nd layer. Caused by error in scale_f(): ! A continuous variable cannot be mapped to the shape aesthetic ℹ choose a different aesthetic or use scale_shape_binned() Run rlang::last_error() to see where the error occurred.

Resposta

p + 
  geom_point(aes(color = cty,
                 size = cty,
                 shape = drv))

Resposta

Exercícios

O que acontece se você mapear a mesma variável para várias estéticas?

Resposta

ggplot(penguins,
       aes(flipper_length_mm,
           body_mass_g))+
  geom_point(aes(color = sex,
                 shape = sex))

Resposta

Exercícios

Faça um gráfico de dispersão de bill_depth_mm vs. bill_length_mm. Você deve colorir os pontos por espécies. O que a adição de coloração por espécie revela sobre a relação entre essas duas variáveis? Que tal facetar por espécie?

Resposta

ggplot(penguins,
       aes(bill_depth_mm,
           bill_length_mm)) +
  geom_point(aes(color = species)) +
  geom_smooth(method = "lm",
              se = F)

Resposta

Resposta

ggplot(penguins,
       aes(bill_depth_mm,
           bill_length_mm)) +
  geom_point() +
  geom_smooth(method = "lm",
              se = F) +
  facet_wrap(~ species)

Resposta

2.5 Salvando seus gráficos

  • ggsave()
  • Gráficos ficam salvos no diretório de trabalho
    • getwd()
  • É possível especificar width (largura) e height
  • ?ggsave()

Código

histograma <- 
  ggplot(penguins,
         aes(body_mass_g)) +
  geom_histogram(color = "gray",
                 fill = "white")+
  theme_classic()

ggsave(filename = "histograma.png",dpi = 600)

Resultado

Gráfico como imagem

Compartilhar conhecimento sempre!

O código e as imagens utilizados para a construção desse slide estão disponíveis no link a seguir:

https://github.com/pablo-huascar/curso_r