Skimr: estatísticas básicas com ❤️

Por Julio 17/06/2017

Entre os dias 25 e 27 de maio aconteceu a ROpenSci Unconf 2017. O encontro reuniu vários pop stars da comunidade R como Hadley Wickham, Joe Cheng (criador do shiny), Jeroen Ooms (criador do OpenCPU e autor de vários pacotes bacanas), Jenny Bryan (autora de vários pacotes bacanas como googlesheets), várias pessoas do #R-Ladies e muito mais.

Uma coisa muito legal dessa conferência é que ela funcionou como uma hackathon. Foi criada uma nova organização no github chamada ROpenSci Labs, e os presentes simplesmente começaram a subir pacotes fantásticos lá dentro. Recomendo muito dar uma olhada.

Dentre os pacotes que olhei, o que mais me chamou atenção foi o skimr e por isso estou fazendo esse post! O propósito do skimr é simples: fazer algumas estatísticas básicas univariadas de uma base de dados.

O skimr ainda não está no CRAN, então para instalar recomendamos utilizar o devtools para instalar direto do GitHub, conforme código abaixo. Note que também será necessário instalar o pacote colformat do Hadley.

devtools::install_github("hadley/colformat")
devtools::install_github("ropenscilabs/skimr")

A função skim() calcula estatísticas básicas das variáveis e imprime no seu console. Note que a função separa estatísticas para variáveis numéricas ou fatores.

library(tidyverse)
library(skimr)
skim(iris)
## Numeric Variables
## # A tibble: 4 x 13
##            var    type missing complete     n     mean        sd   min
##          <chr>   <chr>   <dbl>    <dbl> <dbl>    <dbl>     <dbl> <dbl>
## 1 Petal.Length numeric       0      150   150 3.758000 1.7652982   1.0
## 2  Petal.Width numeric       0      150   150 1.199333 0.7622377   0.1
## 3 Sepal.Length numeric       0      150   150 5.843333 0.8280661   4.3
## 4  Sepal.Width numeric       0      150   150 3.057333 0.4358663   2.0
## # ... with 5 more variables: `25% quantile` <dbl>, median <dbl>, `75%
## #   quantile` <dbl>, max <dbl>, hist <chr>
## 
## Factor Variables
## # A tibble: 1 x 7
##       var   type complete missing     n n_unique
##     <chr>  <chr>    <dbl>   <dbl> <dbl>    <dbl>
## 1 Species factor      150       0   150        3
## # ... with 1 more variables: stat <chr>

E tem mais! O mais legal do skimr é que ele usa a função colformat::spark_bar() para desenhar histogramas direto no seu console!

skim(iris) %>% 
  filter(stat == 'hist') %>% 
  knitr::kable(caption = 'HISTOGRAMA NA TABELA PORQUE SIM!')
Table 1: HISTOGRAMA NA TABELA PORQUE SIM!
var type stat level value
Sepal.Length numeric hist ▂▇▅▇▆▆▅▂▂▂ 0
Sepal.Width numeric hist ▁▁▃▃▇▃▂▂▁▁ 0
Petal.Length numeric hist ▇▃▁▁▂▆▆▃▂▁ 0
Petal.Width numeric hist ▇▂▁▂▅▃▁▅▂▃ 0

O skimr também possui padrões de estatísticas básicas para cada tipo de variável. Você pode checar esses tipos com show_skimmers():

show_skimmers() %>% 
  map_df(enframe, .id = 'tipo') %>% 
  group_by(tipo) %>% 
  summarise(stats = glue::collapse(value, sep = ', ')) %>% 
  knitr::kable(caption = 'Estatísticas básicas para cada tipo de variável.')
Table 2: Estatísticas básicas para cada tipo de variável.
tipo stats
AsIs missing, complete, n, n_unique, min_length, max_length
character missing, complete, n, min, max, empty, n_unique
complex missing, complete, n
date missing, complete, n, min, max, median, n_unique
Date missing, complete, n, min, max, median, n_unique
factor missing, complete, n, count, n_unique
integer missing, complete, n, mean, sd, min, median, quantile, max, hist
list missing, complete, n, n_unique, min_length, median_length, max_length
logical missing, complete, n, count, mean
numeric missing, complete, n, mean, sd, min, median, quantile, max, hist
POSIXct missing, complete, n, min, max, median, n_unique
ts missing, complete, n, start, end, frequency, deltat, mean, sd, min, max, median, line_graph

Criando suas próprias funções

Você também pode usar funções próprias com o skimr. Por exemplo, digamos que você queira calcular o coeficiente de variação. Primeiro, adicione sua função dentro de uma lista:

funs <- list(cv = function(x) sd(x, na.rm = TRUE) / mean(x, na.rm = TRUE))

e depois aplique a função skim_with():

# append adiciona as suas funcoes nas existentes
skim_with(numeric = funs, append = TRUE)

E pronto! Agora você pode rodar skim() novamente:

skim(iris) %>% 
  filter(stat %in% c('hist', 'cv')) %>% 
  knitr::kable(caption = 'Histograma e coeficiente de variação.')
Table 3: Histograma e coeficiente de variação.
var type stat level value
Sepal.Length numeric hist ▂▇▅▇▆▆▅▂▂▂ 0.0000000
Sepal.Length numeric cv .all 0.1417113
Sepal.Width numeric hist ▁▁▃▃▇▃▂▂▁▁ 0.0000000
Sepal.Width numeric cv .all 0.1425642
Petal.Length numeric hist ▇▃▁▁▂▆▆▃▂▁ 0.0000000
Petal.Length numeric cv .all 0.4697441
Petal.Width numeric hist ▇▂▁▂▅▃▁▅▂▃ 0.0000000
Petal.Width numeric cv .all 0.6355511

Para retornar ao skim() padrão, rode skim_with_defaults().

Wrap up

  • Instale usando devtools::install_github()
  • Rode a função skim(). Use dplyr::filter() para filtrar as estatísticas de interesse.
  • Você pode adicionar suas próprias estatísticas com skim_with().
  • Acompanhe a evolução do skimr nesta página.

O pacote ainda vai evoluir muito e não duvido nada que seja um bom candidado a entrar no tidyverse. O que vocês acham? Escrevam nos comentários!

É isso. Happy coding ;)

comments powered by Disqus