Dados Tidy

Ícaro Vidal Freire

Parte III

O que são Dados Organizados?

Certamente a organização dos dados é algo essencial e uma das partes que mais demanda tempodo pesquisador, ou analista. Dados reais, recolhidos por formulários, ou retirados de planilhas voltadas para apresentação (e não processamento) podem vir com vícios de quem os gerou; erros de codificação (muitas vezes devido à acentuação); formatos proprietários que não permitem, muitas vezes, a correta leitura em outros softwares.

Nesse curso, por ser introdutório, não serão apresentatados dados sem um mínimo de organização. Vocês manipularão dados já “bonitinhos”, como mpg, iris, etc. No máximo usaremos a função clear_names() do pacote1 janitor para padrnização dos nomes das variáveis: sempre em minúsculas e separadas por underline ("_").

Todavia, realmente precisamos entender o que significa um dado orgaizado para processamento…

Você há de concordar comigo de que a forma como um humano “ler” um dataset é diferente da forma como um computador “ler” (processa) o mesmo dataset. A filosofia do tidyverse possui como um dos pilares isso: escrever códigos para que humanos entendam e que o computador processe adequadamente.

Por exemplo, considere o conjunto de dados denominado notas_disciplina.csv. É um conjunto de dados hipotéticos que representam médias de alunos de Matemática (“Mat”) e Química (“Qui”) durante os anos de 2010 até 2020. São 20 alunos hipotéticos, sendo 10 de cada curso, escolhidos aleatoriamente, ano a ano. A visualização desses dados é mostrada a seguir:

Curso 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020
Qui 2.9 6.8 6.2 4.1 5.6 4.0 6.0 7.4 6.0 4.1 8.1
Qui 2.4 5.1 5.1 7.2 5.1 2.1 5.3 7.9 5.1 5.2 9.5
Mat 0.4 4.2 3.7 6.7 6.2 4.5 7.6 8.3 3.6 5.1 7.4
Mat 8.7 4.5 5.6 4.3 5.5 1.8 6.2 7.4 4.9 4.3 9.1
Qui 0.5 5.6 4.5 6.0 6.6 3.8 6.9 8.3 6.1 5.0 6.3
Qui 7.4 4.3 4.4 5.8 5.0 3.1 6.0 7.7 5.9 4.2 6.9
Mat 6.0 4.2 6.2 5.0 4.3 4.3 7.1 7.1 6.6 5.0 8.8
Qui 1.8 7.1 4.8 4.5 5.1 5.3 8.1 7.9 4.2 4.2 5.6
Mat 5.2 5.7 5.9 6.1 5.4 3.5 8.6 7.8 5.9 4.7 9.7
Mat 1.2 4.2 5.9 4.6 5.8 3.8 6.0 8.4 4.6 5.6 7.2
Mat 5.0 6.8 4.4 4.7 3.4 2.9 5.8 7.6 4.7 5.4 5.9
Qui 5.6 3.9 5.5 5.7 4.3 3.9 6.3 8.4 3.9 6.2 8.5
Mat 1.3 5.1 4.9 4.6 5.3 4.0 6.0 7.8 5.4 3.8 7.4
Qui 7.7 3.5 4.0 6.1 5.3 5.0 7.0 8.1 4.6 5.8 5.3
Mat 6.2 4.1 5.4 4.5 5.8 3.7 6.7 7.7 4.4 6.2 6.5
Qui 6.9 6.1 7.2 4.0 3.4 5.6 6.2 8.4 4.7 5.3 6.3
Mat 4.5 3.8 4.7 3.4 3.8 3.5 6.1 8.2 2.4 5.8 8.5
Qui 7.9 6.4 3.6 7.3 4.7 2.3 7.9 8.3 4.6 4.2 9.6
Qui 4.8 5.4 5.1 5.9 6.5 3.2 7.9 8.1 6.3 4.9 8.4
Mat 6.1 6.4 5.3 3.6 3.5 4.4 5.8 8.3 5.1 4.1 7.4

Parece “organizado”, não? Bom, tudo bem que a palavra “Curso” está em maiúscula, mas podemos resolver isso tranquilamente com a junção clear_names(), então isso não parece ser um problema.

A questão é que a forma como esses dados estão apresentados é de fácil entendimento para que um humano leia. Ou seja, para uma apresentação, está ideal. Mas, está organizado para que o computador leia? Por exemplo, suponha que você queira fazer um gráfico boxplot, em que o eixo-\(x\) seja representado pelos anos e o eixo-\(y\) pelas média. Não seria melhor se tivéssemos duas colula, em que uma seria a variável ano e a outra média? Em outras palavras, se pudéssemos organizar os dados da tibble de maneira tal, que as colunas representassem as variáveis, as coisas já facilitariam, não?

Essa é uma das ideias subjacentes do que a filosofia do tidyverse entende por “dados organizados”, que são chamados de “dados tidy”2. Basicamente, um conjunto de dados está organizado na forma tidy, se:

  1. Cada coluna é uma variável;
  2. Cada linha é uma observação;
  3. Em cada célula está uma única observação.

Veja a figura abaixo para compreender essas três características:

Na tabela que expomos mais acima, \(20 \times 12\), percebemos que, na realidade, são três variáveis envolvidas: curso, ano e média. Mas, essas dúas últimas variáveis estão espalhadas pela tabela e não em duas colunas que as representam. Ou seja, era para termos, apenas, três colunas (e não 12)! Logo, não está no formato tidy.

Obviamente, rearrumarmos essa configuração, afetará a quantidade de linhas da tabela, visto que escreveríamos num formato mais longo (verticalmente falando).

Ficaria assim:

Curso ano media
Qui 2010 2.9
Qui 2011 6.8
Qui 2012 6.2
Qui 2013 4.1
Qui 2014 5.6
Qui 2015 4.0
Qui 2016 6.0
Qui 2017 7.4
Qui 2018 6.0
Qui 2019 4.1
Qui 2020 8.1
Qui 2010 2.4
Qui 2011 5.1
Qui 2012 5.1
Qui 2013 7.2
Qui 2014 5.1
Qui 2015 2.1
Qui 2016 5.3
Qui 2017 7.9
Qui 2018 5.1

Essa última tabela, na realidade, possui 220 linhas e 3 colunas!!

Para apresentação não é boa, mas é ideal para que o computador leia os dados e possa agrupá-los de maneira mais produtiva.

No início não é tão simples enxergar a forma tidy dos dados, mas com o tempo e exercícios, é possível.

E como fazemos essa pivotagem?

A função que usaremos, a saber, pivot_longer(), pertence ao pacote tidyr. Por isso esse último deve ser carregado (ou, como já alertamos, é ideal carregar o pacote tidyverse).

A estrutura da função pivot_longer() é dada por:

  pivot_longer(
    dt,
    arg-1,
    names_to = "...",
    values_to = "..."
  )

onde,

  1. dt é a tibble que representa o conjunto de dados;
  2. `arg-1`` é a variável que representa a coluna (ou colunas) que não mudaremos (ou aquelas que queremos mudar).
  3. names_to é um argumento para colocarmos um nome apropriado para a nova variável;
  4. values_to é um argumento para colocarmos um nome apropriado para os valores associados à variável.

Aplicando no Exemplo das notas_disciplina.csv

No nosso exemplo, já identificamos que as novas variáveis são: ano e media. Assim, a variável Curso não será mudada. Perceba, também, que a variável media está associada à variável ano; portanto, é natural fazermos names_to = "ano" e values_to = "media".

Logicamentente, podemos usar o pipe e colocarmos o dataset fora da estrutura da função pivot_longer().

Bom, mas como não mudar a variável Curso nessa pivotagem? Simples, podemos substituir o argumento arg-1 pela negação: !"Curso.

Ficaria assim o código:

notas %>%                # `notas` é o nosso dataset
  pivot_longer(
    !Curso,              # excluíndo da pivotagem a variável `Curso`
    names_to = "ano",    # colocando o nome da variável independente
    values_to = "media"  # nome da variável dependente
  )

Uma outra forma de fazermos a mesma representação é selecionarmos explicitamente as colunas. Veja que no dataset original temos 12 colunas, mas queremos selecionar da 2º até a 12º, pois a 1º coluna é da variável Curso. Fazemos essa seleção assim: 2:12.

Logo, o código ficaria:

notas %>%                
  pivot_longer(
    2:12,                # selecionando as colunas de 2 a 12
    names_to = "ano",    
    values_to = "media" 
  )

Ainda precisaríamos mudar o nome Curso para curso, apenas por convensão, mas isso será abordado, dentre muitas outras coisas, quando falarmos sobre o pacote de manipulação de dados, o dplyr.


                                    _   _     _            
                                   | | (_)   | |           
                                   | |_ _  __| |_   _ _ __ 
                                   | __| |/ _` | | | | '__|
                                   | |_| | (_| | |_| | |   
                                    \__|_|\__,_|\__, |_|   
                                                 __/ |     
                                                |___/      

  1. você deve instalar, caso não tenha instalado ainda, esse pacote! Digite no console o comando: install.packages("janitor")↩︎

  2. você pode ler mais sobre isso, de maneira mais acadêmica, fazendo o download do artigo de Hadley Wickham intitulado Data Tidy↩︎