Introdução ao R para análise de dados em Psicologia

Francisco Pablo Huascar Aragão Pinheiro

Quem sou eu

  • Psicólogo (UFC)
  • Mestre em Psicologia (UFC)
  • Doutor em educação (UFC)
  • 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

there is no package called 'tidyverse'

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

Algumas Definições

penguins |>
  slice_head(n = 5) |> 
  gt()

Algumas Definições

Cinco primeiros casos do banco de dados penguins
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex year
Adelie Torgersen 39.1 18.7 181 3750 male 2007
Adelie Torgersen 39.5 17.4 186 3800 female 2007
Adelie Torgersen 40.3 18.0 195 3250 female 2007
Adelie Torgersen NA NA NA NA NA 2007
Adelie Torgersen 36.7 19.3 193 3450 female 2007

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

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…

Resposta

nrow(penguins)
[1] 344
ncol(penguins)
[1] 8

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.

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 do 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 (decrescente)

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

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

ggplot(penguins,
       aes(fct_infreq(species) |> 
             fct_rev())) +
  geom_bar()

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

ggplot(penguins,
       aes(fct_infreq(species),
           y = after_stat(prop), group = 1),
           fill = species)+
  geom_bar() +
  geom_text(aes(label = percent(after_stat(count/sum(count)))),
            stat = "count",
            nudge_y = 0.03) +
  scale_y_continuous(
    name = "Percentual",
    labels = label_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 |> 
  count(island,species) |>
  pivot_wider(
    names_from = species,
    values_from = n
    ) |>
  rowwise() |> 
  mutate(
    total_island = sum(c_across(Adelie:Chinstrap),na.rm = T)
    ) |> 
  ungroup()
# A tibble: 3 × 5
  island    Adelie Gentoo Chinstrap total_island
  <fct>      <int>  <int>     <int>        <int>
1 Biscoe        44    124        NA          168
2 Dream         56     NA        68          124
3 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

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

Series temporais

gapminder |>
  group_by(continent,year) |> 
  summarise(
    lifeExpm = mean(lifeExp)
  ) |> 
  ggplot(aes(year,lifeExpm,
             color = continent)) +
  geom_line() +
  geom_point() + 
  scale_color_colorblind()

Series temporais

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
  • É possível especificar width (largura) e height (altura)
  • ?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/rpsi