Tutorial 8: Bancos de Dados Tidy

Introdução.

Na semana passada, fizemos nossa primeira imersão no uso de tidyverse para manipulação de banco de dados. Hoje daremos um novo passo. Aprenderemos o conceito de banco de dados tidy, e como colocar nosso banco de dados neste formato.

Para aprender e praticar sobre bancos de dados tidy, usaremos o pacote tidyr.

Tidy Data.

O nome tidyverse vem do conceito de tidy data. Todos os pacotes que discutimos até aqui, e os outros, sobretudo o ggplot para visualização, são construídos em torno do conceito de dados em formato tidy.

As três propriedades mais importantes que definem um banco de dados tidy são:

  • Cada coluna é uma variável.

  • Cada linha é uma observação.

  • Cada valor em uma linha.

Vamos ver estas regras visualmente:

Estas duas simples definições trazem diversas vantagens:

  • Uma forma consistente para organizar nossos bancos de dados.

  • Salvar uma variável por coluna facilita operações de manipulação (R trabalha melhor com vetores em coluna).

  • Integra com outros pacotes do tidyverse

Dados Tidy: Gapminder

library(gapminder)
library(tidyverse)
gapminder 
## # A tibble: 1,704 x 6
##    country     continent  year lifeExp      pop gdpPercap
##    <fct>       <fct>     <int>   <dbl>    <int>     <dbl>
##  1 Afghanistan Asia       1952    28.8  8425333      779.
##  2 Afghanistan Asia       1957    30.3  9240934      821.
##  3 Afghanistan Asia       1962    32.0 10267083      853.
##  4 Afghanistan Asia       1967    34.0 11537966      836.
##  5 Afghanistan Asia       1972    36.1 13079460      740.
##  6 Afghanistan Asia       1977    38.4 14880372      786.
##  7 Afghanistan Asia       1982    39.9 12881816      978.
##  8 Afghanistan Asia       1987    40.8 13867957      852.
##  9 Afghanistan Asia       1992    41.7 16317921      649.
## 10 Afghanistan Asia       1997    41.8 22227415      635.
## # … with 1,694 more rows

Tidy vs Untidy

Untidy: Dados Abertos.

Dados untidy são em geral chamados de banco de dados abertos (wide em inglês). Na maior parte das vezes, estes dados possuem uma única variável espalhada por diversas colunas.

Vejamos um exemplo:

wide <- tibble(pais=c("Brasil", "Uruguai", "Chile"), 
               pres_ano_2010= c("Lula", "Mujica", "Pinera"), 
               pres_ano_2014=c("Dilma", "Tabare", "Bachelet"), 
               pres_ano_2018=c("Temer", "Lacalle", "Pinera"))
wide
## # A tibble: 3 x 4
##   pais    pres_ano_2010 pres_ano_2014 pres_ano_2018
##   <chr>   <chr>         <chr>         <chr>        
## 1 Brasil  Lula          Dilma         Temer        
## 2 Uruguai Mujica        Tabare        Lacalle      
## 3 Chile   Pinera        Bachelet      Pinera

Desafio

Tidy ou Untidy

tab <- tibble(pais=c("Brasil", "Uruguai", "Argentina"),
       i_2010 = c(5, 1, 2), 
       i_2014 = c(10, 9, 9),
       i_2018 = c(0, 1, 2))
tab 
## # A tibble: 3 x 4
##   pais      i_2010 i_2014 i_2018
##   <chr>      <dbl>  <dbl>  <dbl>
## 1 Brasil         5     10      0
## 2 Uruguai        1      9      1
## 3 Argentina      2      9      2

Tidy ou Untidy

tab1 <- tibble(pais=c("Brasil", "Argentina"),
       ano = c(2020, 2020),
       presidente_vice = c("Bolsonaro-Mourão", "Fernandez-Kirchner"))

tab1 
## # A tibble: 2 x 3
##   pais        ano presidente_vice   
##   <chr>     <dbl> <chr>             
## 1 Brasil     2020 Bolsonaro-Mourão  
## 2 Argentina  2020 Fernandez-Kirchner

Tidy ou Untidy

tab2 <- tibble(pais=c("Brasil", "Brasil",  "Argentina", "Argentina"),
       ano = c(2020, 2020, 2020, 2020), 
       covid = c("Casos", "Vacinas", "Casos", "Vacinas"), 
       numero= c(10500000, 6535363, 2100000, 1800000))

tidyr

Vamos usar tidyr para tranformar nossos dados de um formato untidy->tidy, e vice-versa.

pivot_longer (Várias Colunas -> Uma Longa Coluna)

A função pivot_longer possui três inputs principais:

  • cols: as variáveis que você pretende empilhar.
  • names_to: nome da colunas para a nova variável.
  • values_to: nome da coluna para os valores da nova variável.
# Antes = Wide - Aberto. Variáveis Espalhadas nas Colunas.
wide
## # A tibble: 3 x 4
##   pais    pres_ano_2010 pres_ano_2014 pres_ano_2018
##   <chr>   <chr>         <chr>         <chr>        
## 1 Brasil  Lula          Dilma         Temer        
## 2 Uruguai Mujica        Tabare        Lacalle      
## 3 Chile   Pinera        Bachelet      Pinera
# Rodando

wide %>%
  pivot_longer(cols=c(pres_ano_2010, pres_ano_2014, 
                      pres_ano_2018), 
               names_to="presidente_ano", 
               values_to="presidente")
## # A tibble: 9 x 3
##   pais    presidente_ano presidente
##   <chr>   <chr>          <chr>     
## 1 Brasil  pres_ano_2010  Lula      
## 2 Brasil  pres_ano_2014  Dilma     
## 3 Brasil  pres_ano_2018  Temer     
## 4 Uruguai pres_ano_2010  Mujica    
## 5 Uruguai pres_ano_2014  Tabare    
## 6 Uruguai pres_ano_2018  Lacalle   
## 7 Chile   pres_ano_2010  Pinera    
## 8 Chile   pres_ano_2014  Bachelet  
## 9 Chile   pres_ano_2018  Pinera

Mais um exemplo:

tab %>%
  pivot_longer(cols = c(starts_with("i")), 
               names_to="t", 
               values_to="values")
## # A tibble: 9 x 3
##   pais      t      values
##   <chr>     <chr>   <dbl>
## 1 Brasil    i_2010      5
## 2 Brasil    i_2014     10
## 3 Brasil    i_2018      0
## 4 Uruguai   i_2010      1
## 5 Uruguai   i_2014      9
## 6 Uruguai   i_2018      1
## 7 Argentina i_2010      2
## 8 Argentina i_2014      9
## 9 Argentina i_2018      2

pivot_wider (Abrindo Uma Colunas -> Várias)

Uso Básico:

A função pivot_wider possui dois inputs principais:

  • names_from: nome da coluna com variáveis que será aberta.
  • values_from: nome da coluna com valores que será aberta.
# Veja os dados
tab2
## # A tibble: 4 x 4
##   pais        ano covid     numero
##   <chr>     <dbl> <chr>      <dbl>
## 1 Brasil     2020 Casos   10500000
## 2 Brasil     2020 Vacinas  6535363
## 3 Argentina  2020 Casos    2100000
## 4 Argentina  2020 Vacinas  1800000
# tidying
tab2 %>%
  pivot_wider(names_from=covid, 
              values_from=numero)
## # A tibble: 2 x 4
##   pais        ano    Casos Vacinas
##   <chr>     <dbl>    <dbl>   <dbl>
## 1 Brasil     2020 10500000 6535363
## 2 Argentina  2020  2100000 1800000

Ambas as funções pivot possuem diversos outros argumentos que são interessantes de explorar. Não cobrireremos estes argumentos em detalhes. Porém, sugiro ao alunos ler a documentação e praticar com exemplos on-line.

Separate e Unite

Para concluir, vamos aprender a usar as funções separate() e unite(). Ambas servem para separar ou agrupar colunas de forma bastante intuitiva. Por exemplo:

tab1
## # A tibble: 2 x 3
##   pais        ano presidente_vice   
##   <chr>     <dbl> <chr>             
## 1 Brasil     2020 Bolsonaro-Mourão  
## 2 Argentina  2020 Fernandez-Kirchner
tab1 %>%
  separate(presidente_vice, into=c("presidente", "vice"), 
                            sep="-")
## # A tibble: 2 x 4
##   pais        ano presidente vice    
##   <chr>     <dbl> <chr>      <chr>   
## 1 Brasil     2020 Bolsonaro  Mourão  
## 2 Argentina  2020 Fernandez  Kirchner

Porque devo aprender isso tudo?

Como disse anteriormente, os pacotes do tidyverse usam dados organizados de forma tidy. O que significa que diversas da funções e vantagens dos pacotes tidyverse funcionarão de forma mais eficiente quando organizamos nossos dados neste formato. Outros formatos não estão errados, no entanto, ter um formato consistente para realizar análise de dados reduz consideravelmente o tempo gasto em manipulação, visualização e modelagem de dados.

Na próxima aula, entraremos em visualização de dados usando ggplot. Com ggplot ficará bastante evidente as vantagens de manter seus dados no formato tidy.

Até!