Sillas Gonzaga, Cientista de Dados e professor do curso Ciência de Dados com R, elaborou este post com o objetivo de explicar como utilizar códigos para descobrir quais pacotes de séries temporais são mais utilizados na programação R.
Dentre os tópicos abordados, você verá:

  • O que são as “Task views” do CRAN, o repositório oficial de pacotes do R;
  • Um tutorial simples porém útil de Web Scraping, de manuseio de texto e de expressões regulares (regex);
  • Um exemplo de manuseio de dados usando o tidyverse;
  • Os 20 pacotes de séries temporais mais populares (em número de downloads) do R.

Views do CRAN

O R já ultrapassou a marca de 10 mil pacotes disponibilizados no CRAN, o repositório oficial de pacotes do R. Não se tem notícia de nenhum outro programa estatístico que possua tanta diversidade de aplicações, ainda mais de forma gratuita. Mas isso também pode ter um lado ruim: como achar um pacote que você precisa?
Para organizar e categorizar essa infinidade de pacotes, o pessoal do CRAN tem uma página chamada Task Views, onde os pacotes são divididos em 35 páginas: existem grupos para Finanças, Econometria, Machine Learning, Psicometria e, claro, Séries Temporais, além de outros.
O responsável pela Task View de Séries Temporais não é ninguém menos que Rob Hyndman, um dos maiores especialistas do assunto no mundo.
Vamos então nos propor um desafio: contar, automaticamente, a quantidade de pacotes listados na Task View de Séries Temporais por meio de Web Scraping na página. Para isso, precisamos ler o código fonte da página, extrair os links de pacotes e remover as duplicatas.

Web scraping

Para este tutorial, usamos os seguintes pacotes:

library(rvest) # web scraping
library(stringr) # manipulação de text (strings)
library(tidyverse) # suite de pacotes do tidyverse, como dplyr e ggplot2
library(cranlogs) # baixar logs de downloads de pacotes do CRAN
library(magrittr) # ja que eu nao vivo sem em um bom %<>%
library(glue) # para colar textos

Como o web scraping em si não é o objetivo principal do post, não vou entrar em detalhes sobre o código escrito para extrair os links, mas os comentários no código explicam parcialmente o que cada linha faz.

r view <- "https://cran.r-project.org/web/views/TimeSeries.html"
urls <- view %>%
  • readhtml %>% # lê o codigo fonte da pagina
  • htmlnodes(“a”) %>% # filtra todo o texto dentro da tag html < a >
  • html_attr(“href”) # filtra todo o texto cujo atributo é href (usado para se referir a links)

Dando uma olhada no output

urls %>% head(20)
   ##  [1] "https://CRAN.R-project.org/view=TimeSeries"
    ##  [2] "Econometrics.html"
    ##  [3] "Finance.html"
    ##  [4] "../packages/forecast/index.html"
    ##  [5] "../packages/zoo/index.html"
    ##  [6] "../packages/roll/index.html"
    ##  [7] "../packages/forecast/index.html"
    ##  [8] "../packages/SDD/index.html"
    ##  [9] "../packages/dCovTS/index.html"
    ## [10] "../packages/forecast/index.html"
    ## [11] "../packages/Wats/index.html"
    ## [12] "../packages/ggseas/index.html"
    ## [13] "../packages/dygraphs/index.html"
    ## [14] "../packages/ZRA/index.html"
    ## [15] "../packages/forecast/index.html"
    ## [16] "../packages/forecast/index.html"
    ## [17] "../packages/vars/index.html"
    ## [18] "../packages/fanplot/index.html"
    ## [19] "http://CRAN.R-project.org/doc/Rnews/Rnews_2004-1.pdf"
    ## [20] "../packages/zoo/index.html"

Notamos quatro problemas que precisamos consertar:

  1. É necessário extrair o nome dos pacotes de uma string do tipo ../packages/zoo/index.html, onde zoo é o nome do pacote;
  2. Links de pacotes vêm incompletos: ../packages/zoo/index.html ao invés de https://cran.r-project.org/web/packages/forecast/index.html;
  3. Muitos links além das urls de pacotes são extraídas;
  4. Existem duplicatas.

Vamos resolver um problema por vez (não necessariamente na ordem acima). Primeiro, extraímos os strings que possuem o padrão /packages/ e removemos as duplicatas:

# extrair apenas links com "../packages/"
urls % head(20)
    ##  [1] "../packages/forecast/index.html"
    ##  [2] "../packages/zoo/index.html"
    ##  [3] "../packages/roll/index.html"
    ##  [4] "../packages/SDD/index.html"
    ##  [5] "../packages/dCovTS/index.html"
    ##  [6] "../packages/Wats/index.html"
    ##  [7] "../packages/ggseas/index.html"
    ##  [8] "../packages/dygraphs/index.html"
    ##  [9] "../packages/ZRA/index.html"
    ## [10] "../packages/vars/index.html"
    ## [11] "../packages/fanplot/index.html"
    ## [12] "../packages/chron/index.html"
    ## [13] "../packages/lubridate/index.html"
    ## [14] "../packages/timetk/index.html"
    ## [15] "../packages/wktmo/index.html"
    ## [16] "../packages/timeDate/index.html"
    ## [17] "../packages/tis/index.html"
    ## [18] "../packages/mondate/index.html"
    ## [19] "../packages/tempdisagg/index.html"
    ## [20] "../packages/tsdisagg2/index.html"

Para extrair o nome dos pacotes, usamos uma aplicação simples de expressões regulares para remover os caracteres ../packages/ e /index.html.

Extrair nome do pacote apenas do string

pacotes % str_replace_all("[..]+/packages/|index.html|/",  "")

Classificar em ordem alfabética

pacotes %<>% sort

Ver como ficou

pacotes %>% head(20)

    ##  [1] "acp"         "AER"         "ArDec"       "arfima"      "astsa"
    ##  [6] "autovarCore" "BAYSTAR"     "bentcableAR" "BETS"        "bfast"
    ## [11] "BigVAR"      "biwavelet"   "BNPTSclust"  "boot"        "BootPR"
    ## [16] "brainwaver"  "bspec"       "bsts"        "CADFtest"    "carx"

Funcionou perfeitamente. Quantos pacotes temos no total?

pacotes %>% length
  ## [1] 234

São impressionantes 234 pacotes relacionados a séries temporais! Vale a pena ler a página da Task View de Séries Temporais para uma breve descrição de cada um desses pacotes.

Medindo a popularidade dos pacotes

234 não são 10 mil, mas ainda assim é um número grande de pacotes para quem usa ou quer começar a usar o R para análise de Séries Temporais. Uma boa maneira de saber os pacotes mais importantes é medindo sua popularidade em número de downloads nos últimos 30 dias.

Baixar quantidade de downloads desses pacotes no ultimo mes

dls <- cran_downloads(packages = pacotes, when = "last-month")

Dando uma olhada no output

head(dls)

    ##         date count package
    ## 1 2017-06-30     7     acp
    ## 2 2017-07-01    11     acp
    ## 3 2017-07-02    13     acp
    ## 4 2017-07-03    13     acp
    ## 5 2017-07-04    16     acp
    ## 6 2017-07-05    14     acp

A função resulta em um data frame simples de três colunas: data, quantidade de downloads e nome do pacote. Vamos então fazer um gráfico dos 20 pacotes mais baixados:

Agrupar os dados usando o dplyr

df %
  group_by(package) %>%
  summarise(total_dls = sum(count, na.rm = TRUE)) %>%
  top_n(20, total_dls)

Eu costumo usar um tema pessoal meu para deixar os graficos do ggplot2 mais atraentes

devtools::source_gist("https://gist.github.com/sillasgonzaga/ae62d57836c37ebff4a5f7a8dc32eeb7", filename = "meu_tema.R")
azul <- "#01a2d9" # cor da barra
ggplot(df, aes(x = reorder(package, total_dls), y = total_dls)) +
    geom_col(fill = azul) +
    coord_flip() +
    meu_tema() +
    geom_text(aes(label = total_dls), hjust = 1, color = "black", size = 3) +
    labs(x = "Pacote", y = "Downloads nos últimos 30 dias",
         title = "Os 20 pacotes sobre séries temporais do R mais baixados",
         subtitle = "Fonte: Logs de download do CRAN (pacote cranlogs)")
grafico 1

Confesso que, desses 20 pacotes, conheço apenas o zoo, lubridate, forecast, xts, fpp, dygraphs e vars. Vale o exercício de entrar nas páginas desses pacotes para entender o porquê de suas popularidades.