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

Autor
Afiliação

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

Meu currículo lattes: acesse aqui

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/

Estes slides tem como base o conteúdo da segunda edição

6 Organização de dados

“Todas as famílias felizes são iguais; cada família infeliz é infeliz à sua maneira.”
— Leo Tolstói

“Conjuntos de dados arrumados são todos iguais, mas todo conjunto de dados bagunçado é bagunçado à sua maneira.”
—Hadley Wickham

6.2 Dados arrumados

# A tibble: 6 × 4
  country      year  cases population
  <chr>       <dbl>  <dbl>      <dbl>
1 Afghanistan  1999    745   19987071
2 Afghanistan  2000   2666   20595360
3 Brazil       1999  37737  172006362
4 Brazil       2000  80488  174504898
5 China        1999 212258 1272915272
6 China        2000 213766 1280428583
# A tibble: 12 × 4
   country      year type            count
   <chr>       <dbl> <chr>           <dbl>
 1 Afghanistan  1999 cases             745
 2 Afghanistan  1999 population   19987071
 3 Afghanistan  2000 cases            2666
 4 Afghanistan  2000 population   20595360
 5 Brazil       1999 cases           37737
 6 Brazil       1999 population  172006362
 7 Brazil       2000 cases           80488
 8 Brazil       2000 population  174504898
 9 China        1999 cases          212258
10 China        1999 population 1272915272
11 China        2000 cases          213766
12 China        2000 population 1280428583
# A tibble: 6 × 3
  country      year rate               
  <chr>       <dbl> <chr>              
1 Afghanistan  1999 745 / 19987071     
2 Afghanistan  2000 2666 / 20595360    
3 Brazil       1999 37737 / 172006362  
4 Brazil       2000 80488 / 174504898  
5 China        1999 212258 / 1272915272
6 China        2000 213766 / 1280428583

Regras para um banco de dados arrumado

  1. Cada variável é uma coluna; cada coluna é uma variável.
  2. Cada observação é uma linha; cada linha é uma observação.
  3. Cada valor é uma célula; cada célula é um único valor.

Regras para um banco de dados arrumado

As três regras a seguir tornam um conjunto de dados organizado: variáveis são colunas, observações são linhas e valores são células.

Pacotes

“Pivotar” os dados

6.3 Alongando os dados

  • billboard

    • registra a classificação das músicas da billboard no ano 2000:
billboard
# A tibble: 317 × 79
   artist     track date.entered   wk1   wk2   wk3   wk4   wk5   wk6   wk7   wk8
   <chr>      <chr> <date>       <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1 2 Pac      Baby… 2000-02-26      87    82    72    77    87    94    99    NA
 2 2Ge+her    The … 2000-09-02      91    87    92    NA    NA    NA    NA    NA
 3 3 Doors D… Kryp… 2000-04-08      81    70    68    67    66    57    54    53
 4 3 Doors D… Loser 2000-10-21      76    76    72    69    67    65    55    59
 5 504 Boyz   Wobb… 2000-04-15      57    34    25    17    17    31    36    49
 6 98^0       Give… 2000-08-19      51    39    34    26    26    19     2     2
 7 A*Teens    Danc… 2000-07-08      97    97    96    95   100    NA    NA    NA
 8 Aaliyah    I Do… 2000-01-29      84    62    51    41    38    35    35    38
 9 Aaliyah    Try … 2000-03-18      59    53    38    28    21    18    16    14
10 Adams, Yo… Open… 2000-08-26      76    76    74    69    68    67    61    58
# ℹ 307 more rows
# ℹ 68 more variables: wk9 <dbl>, wk10 <dbl>, wk11 <dbl>, wk12 <dbl>,
#   wk13 <dbl>, wk14 <dbl>, wk15 <dbl>, wk16 <dbl>, wk17 <dbl>, wk18 <dbl>,
#   wk19 <dbl>, wk20 <dbl>, wk21 <dbl>, wk22 <dbl>, wk23 <dbl>, wk24 <dbl>,
#   wk25 <dbl>, wk26 <dbl>, wk27 <dbl>, wk28 <dbl>, wk29 <dbl>, wk30 <dbl>,
#   wk31 <dbl>, wk32 <dbl>, wk33 <dbl>, wk34 <dbl>, wk35 <dbl>, wk36 <dbl>,
#   wk37 <dbl>, wk38 <dbl>, wk39 <dbl>, wk40 <dbl>, wk41 <dbl>, wk42 <dbl>, …

billboard

  • artist, track and date.entered
    • Descrevem a música
  • wk1-wk76
    • Descrevem a posicição da música em cada semana
    • O nome da columa é uma variável (semana - week)
    • Os valores das céluas são outra variável (posição - rank)
  • Para arrumar (“tidy”) estes dados, vamos utilizar pivot_longer()

“Pivotando” o banco de dados billboard

billboard |> 
  pivot_longer(
    cols = starts_with("wk"),
    names_to = "week",
    values_to = "rank"
  )
# A tibble: 24,092 × 5
   artist track                   date.entered week   rank
   <chr>  <chr>                   <date>       <chr> <dbl>
 1 2 Pac  Baby Don't Cry (Keep... 2000-02-26   wk1      87
 2 2 Pac  Baby Don't Cry (Keep... 2000-02-26   wk2      82
 3 2 Pac  Baby Don't Cry (Keep... 2000-02-26   wk3      72
 4 2 Pac  Baby Don't Cry (Keep... 2000-02-26   wk4      77
 5 2 Pac  Baby Don't Cry (Keep... 2000-02-26   wk5      87
 6 2 Pac  Baby Don't Cry (Keep... 2000-02-26   wk6      94
 7 2 Pac  Baby Don't Cry (Keep... 2000-02-26   wk7      99
 8 2 Pac  Baby Don't Cry (Keep... 2000-02-26   wk8      NA
 9 2 Pac  Baby Don't Cry (Keep... 2000-02-26   wk9      NA
10 2 Pac  Baby Don't Cry (Keep... 2000-02-26   wk10     NA
# ℹ 24,082 more rows

“Pivotando” o banco de dados billboard

billboard |> 
  pivot_longer(
    cols = starts_with("wk"),
    names_to = "week",
    values_to = "rank"
  ) |>
  slice(1:10)
  • cols: especifica quais colunas precisam ser “pivotadas”
  • names_to: nomeia a variável armazenada nos nomes da coluna, chamamos essa variável de week
  • values_to: nomeia a variável armazenada nos valores da célula, nomeamos essa variável como rank

“Pivotando” o banco de dados billboard

O que acontece se uma música estiver no top 100 por menos de 76 semanas?

  • NAs que não representam valores ausentes
  • Existem pela nova estrutura do banco de dados
  • Número de linhas = 24092
billboard |> 
  pivot_longer(
    cols = starts_with("wk"),
    names_to = "week",
    values_to = "rank"
  )
# A tibble: 24,092 × 5
   artist track                   date.entered week   rank
   <chr>  <chr>                   <date>       <chr> <dbl>
 1 2 Pac  Baby Don't Cry (Keep... 2000-02-26   wk1      87
 2 2 Pac  Baby Don't Cry (Keep... 2000-02-26   wk2      82
 3 2 Pac  Baby Don't Cry (Keep... 2000-02-26   wk3      72
 4 2 Pac  Baby Don't Cry (Keep... 2000-02-26   wk4      77
 5 2 Pac  Baby Don't Cry (Keep... 2000-02-26   wk5      87
 6 2 Pac  Baby Don't Cry (Keep... 2000-02-26   wk6      94
 7 2 Pac  Baby Don't Cry (Keep... 2000-02-26   wk7      99
 8 2 Pac  Baby Don't Cry (Keep... 2000-02-26   wk8      NA
 9 2 Pac  Baby Don't Cry (Keep... 2000-02-26   wk9      NA
10 2 Pac  Baby Don't Cry (Keep... 2000-02-26   wk10     NA
# ℹ 24,082 more rows

“Pivotando” o banco de dados billboard

  • Número de linhas = 5307
billboard |> 
  pivot_longer(
    cols = starts_with("wk"),
    names_to = "week",
    values_to = "rank",
    values_drop_na = T
  )
# A tibble: 5,307 × 5
   artist  track                   date.entered week   rank
   <chr>   <chr>                   <date>       <chr> <dbl>
 1 2 Pac   Baby Don't Cry (Keep... 2000-02-26   wk1      87
 2 2 Pac   Baby Don't Cry (Keep... 2000-02-26   wk2      82
 3 2 Pac   Baby Don't Cry (Keep... 2000-02-26   wk3      72
 4 2 Pac   Baby Don't Cry (Keep... 2000-02-26   wk4      77
 5 2 Pac   Baby Don't Cry (Keep... 2000-02-26   wk5      87
 6 2 Pac   Baby Don't Cry (Keep... 2000-02-26   wk6      94
 7 2 Pac   Baby Don't Cry (Keep... 2000-02-26   wk7      99
 8 2Ge+her The Hardest Part Of ... 2000-09-02   wk1      91
 9 2Ge+her The Hardest Part Of ... 2000-09-02   wk2      87
10 2Ge+her The Hardest Part Of ... 2000-09-02   wk3      92
# ℹ 5,297 more rows

“Pivotando” o banco de dados billboard

“Pivotando” o banco de dados billboard

billboard_longer <- 
  billboard |> 
  pivot_longer(
    cols = starts_with("wk"),
    names_to = "week",
    values_to = "rank",
    values_drop_na = T
  ) |> 
  mutate(
    week = parse_number(week)
  )

billboard_longer
# A tibble: 5,307 × 5
   artist  track                   date.entered  week  rank
   <chr>   <chr>                   <date>       <dbl> <dbl>
 1 2 Pac   Baby Don't Cry (Keep... 2000-02-26       1    87
 2 2 Pac   Baby Don't Cry (Keep... 2000-02-26       2    82
 3 2 Pac   Baby Don't Cry (Keep... 2000-02-26       3    72
 4 2 Pac   Baby Don't Cry (Keep... 2000-02-26       4    77
 5 2 Pac   Baby Don't Cry (Keep... 2000-02-26       5    87
 6 2 Pac   Baby Don't Cry (Keep... 2000-02-26       6    94
 7 2 Pac   Baby Don't Cry (Keep... 2000-02-26       7    99
 8 2Ge+her The Hardest Part Of ... 2000-09-02       1    91
 9 2Ge+her The Hardest Part Of ... 2000-09-02       2    87
10 2Ge+her The Hardest Part Of ... 2000-09-02       3    92
# ℹ 5,297 more rows

“Pivotando” o banco de dados billboard

billboard_longer |> 
  ggplot(aes(x = week, y = rank, group = track)) + 
  geom_line(alpha = 0.25) + 
  scale_y_reverse()

Como funciona o pivotamento?

  • Suponha que temos três pacientes com ids A, B e C, e fazemos duas medições de pressão arterial (blood pressure) em cada paciente (bp1 e bp2)
  • Queremos que nosso banco de dados tenha três variáveis: id (já existe), measurement (medição) (os nomes das colunas) e value (valor) (os valores das células)
df <- tribble(
  ~id,  ~bp1, ~bp2,
   "A",  100,  120,
   "B",  140,  115,
   "C",  120,  125
)

df
# A tibble: 3 × 3
  id      bp1   bp2
  <chr> <dbl> <dbl>
1 A       100   120
2 B       140   115
3 C       120   125

Como funciona o pivotamento?

df |> 
  pivot_longer(
    cols = bp1:bp2,
    names_to = "measurement",
    values_to = "value"
    )
# A tibble: 6 × 3
  id    measurement value
  <chr> <chr>       <dbl>
1 A     bp1           100
2 A     bp2           120
3 B     bp1           140
4 B     bp2           115
5 C     bp1           120
6 C     bp2           125

Como funciona o pivotamento?

Colunas que já são variáveis precisam ser repetidas, uma vez para cada coluna pivotada

Como funciona o pivotamento?

Os nomes das colunas pivotadas tornam-se valores em uma nova coluna. Os valores precisam ser repetidos uma vez para cada linha do conjunto de dados original.

Como funciona o pivotamento?

O número de valores é preservado (não repetido), mas desenrolado linha por linha.

Exercícios

Use o código a seguir para baixar um banco de dados de vendas_semanais. Em seguida, transforme o banco de dados vendas_semanais, de modo que as colunas que começam com semana se transformem em uma nova variável chamada semana e os seus valores vão para uma variável chamada vendas. Além disso, transforme os valores da variável semana em números. Salve o resultado em um banco de dados chamado df

vendas_semanais <- read_csv("https://tinyurl.com/vendasem")

Resposta

vendas_semanais
# A tibble: 72 × 26
   produto cidade    Semana1 Semana2 Semana3 Semana4 Semana5 Semana6 Semana7
   <chr>   <chr>       <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
 1 Arroz   Fortaleza    204.    186.    185.    159.    136.    146.    106.
 2 Arroz   Fortaleza    204.    186.    185.    159.    136.    146.    106.
 3 Arroz   Fortaleza    204.    186.    185.    159.    136.    146.    106.
 4 Arroz   Fortaleza    204.    186.    185.    159.    136.    146.    106.
 5 Arroz   Fortaleza    204.    186.    185.    159.    136.    146.    106.
 6 Arroz   Fortaleza    204.    186.    185.    159.    136.    146.    106.
 7 Arroz   Fortaleza    204.    186.    185.    159.    136.    146.    106.
 8 Arroz   Fortaleza    204.    186.    185.    159.    136.    146.    106.
 9 Arroz   Fortaleza    204.    186.    185.    159.    136.    146.    106.
10 Arroz   Fortaleza    204.    186.    185.    159.    136.    146.    106.
# ℹ 62 more rows
# ℹ 17 more variables: Semana8 <dbl>, Semana9 <dbl>, Semana10 <dbl>,
#   Semana11 <dbl>, Semana12 <dbl>, Semana13 <dbl>, Semana14 <dbl>,
#   Semana15 <dbl>, Semana16 <dbl>, Semana17 <dbl>, Semana18 <dbl>,
#   Semana19 <dbl>, Semana20 <dbl>, Semana21 <dbl>, Semana22 <dbl>,
#   Semana23 <dbl>, Semana24 <dbl>

Resposta

df <- 
  vendas_semanais |> 
  pivot_longer(
    cols = starts_with("Semana"),
    names_to = "semana",
    values_to = "vendas"
  ) |> 
  mutate(
    semana = parse_number(semana)
  )

df
# A tibble: 1,728 × 4
   produto cidade    semana vendas
   <chr>   <chr>      <dbl>  <dbl>
 1 Arroz   Fortaleza      1  204. 
 2 Arroz   Fortaleza      2  186. 
 3 Arroz   Fortaleza      3  185. 
 4 Arroz   Fortaleza      4  159. 
 5 Arroz   Fortaleza      5  136. 
 6 Arroz   Fortaleza      6  146. 
 7 Arroz   Fortaleza      7  106. 
 8 Arroz   Fortaleza      8  102. 
 9 Arroz   Fortaleza      9  129. 
10 Arroz   Fortaleza     10   82.4
# ℹ 1,718 more rows

Exercícios

A partir do banco de dados df, reproduza o seguinte gráfico:

Você vai precisar das funções group_by(), summarise(), geom_line()

Resposta

df |>
  group_by(semana) |> 
  summarise(
    m = mean(vendas)
    ) |>
  ggplot(aes(x = semana, 
             y = m)) +
  geom_line(color = "blue") +
  labs(
    x = "Semana",
    y = "Média de vendas semanais"
    ) +
  theme_classic()

Exercícios

Ainda com o banco de dados df, reproduza o seguinte gráfico

Resposta

df |> 
  group_by(cidade,semana) |> 
  summarise(
    m = mean(vendas)
    ) |> 
  ggplot(aes(x = semana,
             y = m,
             color = cidade)) +
  geom_line() +
  labs(
    x = "Semana",
    y = "Média de vendas semanais",
    color = "Cidade"
    ) +
  theme_classic()

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