class: center, middle, inverse, title-slide # Introdução a Métodos Computacionais para Ciência Sociais ## Intro ao Tidyverse: Dados Tidy ### Tiago Ventura ### CPDOC-FGV --- class: middle, center, inverse # 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**. Para aprender e praticar sobre bancos de dados tidy, usaremos o pacote `tidyr`. <br><br> -- ### Referência: #### [Wickham, H. (2014). Tidy data. Journal of statistical software, 59(10), 1-23.](https://vita.had.co.nz/papers/tidy-data.pdf) -- --- # Tidy Data. O nome `tidyverse` vem do conceito de `tidy` data. Todos os pacotes do tidyverse foram pensados para funcionar com dados organizados de forma 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. --- # Visualmente ![](./figs/tidy-1.png) --- # Vantagens Estas três 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 ```r library(gapminder) 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 <img src="figs/untidy.png" width="30%" /> --- ## Untidy: Dados Abertos. Dados untidy são em geral chamados de banco de dados abertos (*wide* em inglês). Vejamos um exemplo: ```r 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 ```r 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 ```r 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 ```r 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)) 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 ``` --- # tidyr Vamos usar `tidyr` para tranformar nossos dados de um formato untidy->tidy, e vice-versa. Quatro funções principais - `pivot_longer()` - `pivot_wider()` - `separate()` - `unite()` --- ## pivot_longer (Várias Colunas -> Uma Longa Coluna) ![](./figs/gather.png) 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. --- ## Exemplo ```r # 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 ``` ```r # 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: ```r 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) <img src="./figs/spread.png" width="80%" /> ### 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. --- ## Exemplo ```r # 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 ``` ```r # 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 ``` --- ## Exemplo II: Preenchendo NAs ```r # Veja os dados tab2 <- tab2 %>% add_row(pais="Uruguai", ano=2020, covid="Casos", numero=8919) ``` -- .pull-left[ ### Com Missings. ```r # tidying Com Missings tab2 %>% pivot_wider(names_from=covid, values_from=numero) ``` ``` ## # A tibble: 3 x 4 ## pais ano Casos Vacinas ## <chr> <dbl> <dbl> <dbl> ## 1 Brasil 2020 10500000 6535363 ## 2 Argentina 2020 2100000 1800000 ## 3 Uruguai 2020 8919 NA ``` ] -- .pull-right[ ### Preenchendo Missings. ```r # tidying Com Missings tab2 %>% pivot_wider(names_from=covid, values_from=numero, * values_fill=0) ``` ``` ## # A tibble: 3 x 4 ## pais ano Casos Vacinas ## <chr> <dbl> <dbl> <dbl> ## 1 Brasil 2020 10500000 6535363 ## 2 Argentina 2020 2100000 1800000 ## 3 Uruguai 2020 8919 0 ``` ] -- --- ## 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: ```r tab1 ``` ``` ## # A tibble: 2 x 3 ## pais ano presidente_vice ## <chr> <dbl> <chr> ## 1 Brasil 2020 Bolsonaro-Mourão ## 2 Argentina 2020 Fernandez-Kirchner ``` ```r 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 ``` --- class:middle, inverse, center ## Porque devo aprender isso tudo? --- class:middle, inverse, center ## [Survey](https://docs.google.com/forms/d/e/1FAIpQLSdg1OMfbqnpYk7whM_UqjZ_tJJKGbNgCuxQqcpt0wVwZ4hpLw/viewform?usp=sf_link)