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
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
logical missing, complete, n, count, mean
numeric missing, complete, n, mean, sd, min, median, quantile, max, hist
ordered missing, complete, n, count, n_unique
POSIXct missing, complete, n, min, max, median, n_unique
ts missing, complete, n, start, end, frequency, deltat, mean, sd, min, max, median

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