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)
## Skim summary statistics
##  n obs: 150 
##  n variables: 5 
## 
## Variable type: factor 
##       var missing complete   n n_unique                       top_counts
## 1 Species       0      150 150        3 set: 50, ver: 50, vir: 50, NA: 0
##   ordered
## 1   FALSE
## 
## Variable type: numeric 
##            var missing complete   n mean   sd min p25 median p75 max
## 1 Petal.Length       0      150 150 3.76 1.77 1   1.6   4.35 5.1 6.9
## 2  Petal.Width       0      150 150 1.2  0.76 0.1 0.3   1.3  1.8 2.5
## 3 Sepal.Length       0      150 150 5.84 0.83 4.3 5.1   5.8  6.4 7.9
## 4  Sepal.Width       0      150 150 3.06 0.44 2   2.8   3    3.3 4.4
##       hist
## 1 ▇▁▁▂▅▅▃▁
## 2 ▇▁▁▅▃▃▂▂
## 3 ▂▇▅▇▆▅▂▂
## 4 ▁▂▅▇▃▂▁▁

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 formatted
Sepal.Length numeric hist .all NA ▂▇▅▇▆▅▂▂
Sepal.Width numeric hist .all NA ▁▂▅▇▃▂▁▁
Petal.Length numeric hist .all NA ▇▁▁▂▅▅▃▁
Petal.Width numeric hist .all NA ▇▁▁▅▃▃▂▂

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, n_unique, top_counts, ordered
integer missing, complete, n, mean, sd, min, p25, median, p75, max, hist
list missing, complete, n, n_unique, min_length, median_length, max_length
logical missing, complete, n, mean, count
numeric missing, complete, n, mean, sd, min, p25, median, p75, 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 formatted
Sepal.Length numeric hist .all NA ▂▇▅▇▆▅▂▂
Sepal.Length numeric cv .all 0.1417113 0.14
Sepal.Width numeric hist .all NA ▁▂▅▇▃▂▁▁
Sepal.Width numeric cv .all 0.1425642 0.14
Petal.Length numeric hist .all NA ▇▁▁▂▅▅▃▁
Petal.Length numeric cv .all 0.4697441 0.47
Petal.Width numeric hist .all NA ▇▁▁▅▃▃▂▂
Petal.Width numeric cv .all 0.6355511 0.64

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