diff --git a/README.md b/README.md new file mode 100644 index 0000000..25081af --- /dev/null +++ b/README.md @@ -0,0 +1,404 @@ +# Dados arrumados (tidy data) + + +## Conceito + +Tidy data é um princípio de organização de dados que ajuda a simplificar +a análise de dados. A motivação desse conceito é que, no mundo real, +lidamos com dados em diversos formatos e estruturas, o que pode +dificultar a análise. Ao colocar o princípio de dados arrumados em +prática, aceleramos o processo de análise e facilitamos a comunicação +dos resultados. + +O conceito foi proposto por Hadley Wickham em 2014 e é baseado em três +princípios: + +1. Cada **observação** forma uma **linha**. +2. Cada **variável** forma uma **coluna**. +3. Cada **valor** forma uma **célula**. + +A Figura +Figura 1 +ilustra esses princípios. + +
+Código + +``` r +knitr::include_graphics( + "https://d33wubrfki0l68.cloudfront.net/6f1ddb544fc5c69a2478e444ab8112fb0eea23f8/91adc/images/tidy-1.png" +) +``` + +
+![](https://d33wubrfki0l68.cloudfront.net/6f1ddb544fc5c69a2478e444ab8112fb0eea23f8/91adc/images/tidy-1.png) + +Vamos analisar o primeiro princípio: cada observação forma uma linha. +Note que estamos ligando conceitos de duas áreas do conhecimento +distintas: a estatística e a computação. Na estatística, uma unidade +amostral é um elemento da população que está sendo estudada. Por +exemplo, se estamos estudando a altura de alunos de uma escola, cada +aluno é uma unidade amostral. Na computação, uma linha é um registro de +um banco de dados ou uma linha de um arquivo de texto. O primeiro +princípio do tidy data estabelece que cada unidade amostral deve formar +uma linha. Ou seja, se temos, por exemplo, uma tabela no Excel, cada +linha (1, 2, 3, …) dessa tabela deve representar uma unidade amostral. + +Exemplo que segue o primeiro princípio: + +
+Código + +``` r +dados <- tribble( + ~id, ~altura, ~peso, + 1, 1.70, 70, + 2, 1.80, 80, + 3, 1.60, 60 +) +knitr::kable(dados) +``` + +
+ +| id | altura | peso | +|----:|-------:|-----:| +| 1 | 1.7 | 70 | +| 2 | 1.8 | 80 | +| 3 | 1.6 | 60 | + +Exemplo que não segue o primeiro princípio: + +
+Código + +``` r +dados <- tribble( + ~id, ~tipo_medida, ~valor, + 1, "altura", 1.70, + 1, "peso", 70, + 2, "altura", 1.80, + 2, "peso", 80, + 3, "altura", 1.60, + 3, "peso", 60 +) +knitr::kable(dados) +``` + +
+ +| id | tipo_medida | valor | +|----:|:------------|------:| +| 1 | altura | 1.7 | +| 1 | peso | 70.0 | +| 2 | altura | 1.8 | +| 2 | peso | 80.0 | +| 3 | altura | 1.6 | +| 3 | peso | 60.0 | + +No exemplo acima, a tabela não segue o primeiro princípio do tidy data, +pois cada unidade amostral (cada pessoa) não forma uma linha. Em vez +disso, cada unidade amostral é dividida em duas linhas, uma para a +altura e outra para o peso. Para seguir o primeiro princípio do tidy +data, a tabela deveria ser organizada de forma que cada unidade amostral +formasse uma linha. + +A segunda tabela está no formato que chamamos de “longo” (ou “long +format”). Esse formato é comum em bases de dados que não seguem o +primeiro princípio do tidy data, mas existem situações em que esse +formato é útil (veremos mais adiante). + +Para transformar a base de dados que não segue o primeiro princípio do +tidy data em uma base de dados que segue o primeiro princípio do tidy +data, podemos usar a função `pivot_wider()` do pacote `tidyr`. Essa +função transforma a base de dados de longo para largo. Veja o exemplo a +seguir: + +
+Código + +``` r +dados <- tribble( + ~id, ~tipo_medida, ~valor, + 1, "altura", 1.70, + 1, "peso", 70, + 2, "altura", 1.80, + 2, "peso", 80, + 3, "altura", 1.60, + 3, "peso", 60 +) + +dados_largo <- dados |> + pivot_wider(names_from = tipo_medida, values_from = valor) + +knitr::kable(dados_largo) +``` + +
+ +| id | altura | peso | +|----:|-------:|-----:| +| 1 | 1.7 | 70 | +| 2 | 1.8 | 80 | +| 3 | 1.6 | 60 | + +O segundo princípio é que cada variável deve formar uma coluna. Nesse +caso, o conceito estatístico de variável é o de variável aleatória, que +é uma característica da observação que pode ser medida por algum +instrumento. Por exemplo, no exemplo da escola, se estamos estudando a +altura e o peso de alunos, a altura e o peso são variáveis. Já o +conceito computacional é o da coluna, que é uma coluna de uma tabela de +banco de dados ou de um arquivo de texto. O segundo princípio do tidy +data estabelece que cada variável deve formar uma coluna. Ou seja, se +temos, por exemplo, uma tabela no Excel, cada coluna (A, B, C, …) dessa +tabela deve representar uma variável. + +Exemplo que não segue o segundo princípio: + +
+Código + +``` r +dados <- tribble( + ~tipo, ~alice, ~bruno, ~carla, ~daniel, + "altura", 1.70, 1.80, 1.60, 1.75, + "peso", 70, 80, 60, 75 +) +knitr::kable(dados) +``` + +
+ +| tipo | alice | bruno | carla | daniel | +|:-------|------:|------:|------:|-------:| +| altura | 1.7 | 1.8 | 1.6 | 1.75 | +| peso | 70.0 | 80.0 | 60.0 | 75.00 | + +Nesse exemplo, a tabela não segue o segundo princípio do tidy data, pois +cada variável (altura e peso) não formam colunas. Em vez disso, cada +variável é dividida em quatro colunas, uma para cada pessoa. Vamos +arrumar essa tabela para que ela siga o segundo princípio do tidy data. +Primeiro, deixamos essa base no formato longo, usando a função +`pivot_longer()`: + +
+Código + +``` r +dados_longo <- dados |> + pivot_longer(cols = -tipo, names_to = "nome", values_to = "valor") + +knitr::kable(dados_longo) +``` + +
+ +| tipo | nome | valor | +|:-------|:-------|------:| +| altura | alice | 1.70 | +| altura | bruno | 1.80 | +| altura | carla | 1.60 | +| altura | daniel | 1.75 | +| peso | alice | 70.00 | +| peso | bruno | 80.00 | +| peso | carla | 60.00 | +| peso | daniel | 75.00 | + +Essa base, no entanto, ainda não está arrumada, pois está no formato +largo. Para arrumá-la, usamos a função `pivot_wider()`, que vimos +anteriormente: + +
+Código + +``` r +dados_arrumados <- dados_longo |> + pivot_wider(names_from = tipo, values_from = valor) + +knitr::kable(dados_arrumados) +``` + +
+ +| nome | altura | peso | +|:-------|-------:|-----:| +| alice | 1.70 | 70 | +| bruno | 1.80 | 80 | +| carla | 1.60 | 60 | +| daniel | 1.75 | 75 | + +Finalmente, o terceiro princípio é que cada valor deve formar uma +célula. Nesse caso, o conceito estatístico de valor é o de valor da +variável, que é a medida da variável para uma unidade amostral. Por +exemplo, se estamos estudando a altura de alunos de uma escola, o valor +da variável altura para um aluno é a altura desse aluno. Já o conceito +computacional é o da célula, que é uma célula de uma tabela de banco de +dados ou de um arquivo de texto (o cruzamento entre uma linha e uma +coluna). O terceiro princípio do tidy data estabelece que cada valor +deve formar uma célula. Ou seja, se temos, por exemplo, uma tabela no +Excel, cada célula (A1, A2, B1, B2, …) dessa tabela deve representar um +valor. + +Exemplo que não segue o terceiro princípio: + +
+Código + +``` r +dados <- tribble( + ~id, ~altura_peso, + 1, "1.70 / 70", + 2, "1.80 / 80", + 3, "1.60 / 60", + 4, "1.75 / 75" +) + +knitr::kable(dados) +``` + +
+ +| id | altura_peso | +|----:|:------------| +| 1 | 1.70 / 70 | +| 2 | 1.80 / 80 | +| 3 | 1.60 / 60 | +| 4 | 1.75 / 75 | + +Nesse exemplo, a tabela não segue o terceiro princípio do tidy data, +pois cada valor (altura e peso) não formam células. Em vez disso, os +valores são agrupados em uma única célula, que contém a altura e o peso +separados por uma barra. Vamos arrumar essa tabela para que ela siga o +terceiro princípio do tidy data. Para isso, dividimos a coluna +`altura_peso` em duas colunas, `altura` e `peso`, usando a função +`separate()`: + +
+Código + +``` r +dados <- tribble( + ~id, ~altura_peso, + 1, "1.70 / 70", + 2, "1.80 / 80", + 3, "1.60 / 60", + 4, "1.75 / 75" +) + +dados_arrumados <- dados |> + separate(altura_peso, into = c("altura", "peso"), sep = " / ") + +knitr::kable(dados_arrumados) +``` + +
+ +| id | altura | peso | +|----:|:-------|:-----| +| 1 | 1.70 | 70 | +| 2 | 1.80 | 80 | +| 3 | 1.60 | 60 | +| 4 | 1.75 | 75 | + +Até agora, vimos os três princípios do tidy data e como arrumar uma base +de dados que não segue esses princípios. No entanto, é importante +ressaltar que nem sempre é muito claro se uma base de dados segue ou não +os princípios do tidy data. Por exemplo, a base de dados pode estar no +formato longo, mas isso não significa necessariamente que ela não segue +os princípios do tidy data. Por exemplo, se estamos estudando a evolução +da altura e do peso de alunos ao longo do tempo: + +
+Código + +``` r +dados <- tribble( + ~id, ~mes, ~altura, ~peso, + "1", 1, 1.70, 70, + "1", 2, 1.72, 75, + "1", 3, 1.80, 80, + "2", 1, 1.80, 80, + "2", 2, 1.87, 85, + "2", 3, 1.90, 90, + "3", 1, 1.60, 60, + "3", 2, 1.64, 65, + "3", 3, 1.70, 70 +) + +knitr::kable(dados) +``` + +
+ +| id | mes | altura | peso | +|:----|----:|-------:|-----:| +| 1 | 1 | 1.70 | 70 | +| 1 | 2 | 1.72 | 75 | +| 1 | 3 | 1.80 | 80 | +| 2 | 1 | 1.80 | 80 | +| 2 | 2 | 1.87 | 85 | +| 2 | 3 | 1.90 | 90 | +| 3 | 1 | 1.60 | 60 | +| 3 | 2 | 1.64 | 65 | +| 3 | 3 | 1.70 | 70 | + +Nesse caso, é mais fácil organizar esses dados no formato longo, com uma +coluna para a altura e outra para o peso, e uma linha para cada +observação (altura e peso de um aluno em um determinado momento). Nesse +caso, na prática, estamos *definindo* que a observação é a combinação de +aluno e período, ainda que cada unidade amostral seja um aluno. Assim, a +base de dados está arrumada, mesmo estando no formato longo. + +Esse formato, inclusive, é o preferido para fazer visualizações de dados +com o pacote `ggplot2`. Por exemplo: + +
+Código + +``` r +dados |> + ggplot(aes(x = mes, y = altura, color = id)) + + geom_line() + + labs(title = "Evolução da altura dos alunos ao longo do tempo") +``` + +
+ +![Evolução da altura dos alunos ao longo do tempo. Cada linha representa +um aluno.](README_files/figure-commonmark/unnamed-chunk-12-1.png) + +Ou seja, o princípio do tidy data pode ser adaptado dependendo dos +**objetivos de uma análise**. Para cada análise, é importante definir o +que é uma observação, o que é uma variável e o que é um valor, de acordo +com o contexto do problema. Isso é o que torna o tidy data um conceito +tão poderoso e flexível. + +## Aplicações no Direito + +No Direito, tipicamente as bases de dados são organizadas de forma que +cada linha representa um processo judicial e cada coluna representa uma +variável relacionada ao processo. Por exemplo, podemos ter uma base de +dados com as seguintes colunas: `número do processo`, +`data de ajuizamento`, `valor da causa`, `tipo de ação`, +`juiz responsável`, entre outras. Nesse caso, cada linha representa um +processo judicial e cada coluna representa uma variável relacionada ao +processo. + +Também é possível trabalhar com bases cuja observação não é o processo +judicial. Por exemplo, um processo pode ter vários recursos. Nesse caso, +podemos colocar cada recurso em uma linha e cada variável relacionada ao +recurso em uma coluna. Por exemplo, podemos ter uma base de dados com as +seguintes colunas: `número do processo`, `número do recurso`, +`data de interposição`, `resultado`, `relator`, entre outras. Nesse +caso, cada linha representa um recurso e cada coluna representa uma +variável relacionada ao recurso. + +![](cjsg.png) + +Outro exemplo de caso em que a observação não é o processo é quando +trabalhamos com as tabelas de partes ou de movimentações do processo. +Nesse caso, cada linha representa uma parte ou uma movimentação do +processo e cada coluna representa uma variável relacionada à parte ou à +movimentação. + +![](partes.png) diff --git a/README.qmd b/README.qmd index d4c0261..f098037 100644 --- a/README.qmd +++ b/README.qmd @@ -1,6 +1,8 @@ --- title: "Dados arrumados (tidy data)" format: + gfm: + code-fold: true html: code-fold: true pdf: default diff --git a/README_files/figure-commonmark/unnamed-chunk-12-1.png b/README_files/figure-commonmark/unnamed-chunk-12-1.png new file mode 100644 index 0000000..b76599f Binary files /dev/null and b/README_files/figure-commonmark/unnamed-chunk-12-1.png differ