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:
- É necessário extrair o nome dos pacotes de uma string do tipo
../packages/zoo/index.html
, ondezoo
é o nome do pacote; - Links de pacotes vêm incompletos:
../packages/zoo/index.html
ao invés dehttps://cran.r-project.org/web/packages/forecast/index.html
; - Muitos links além das urls de pacotes são extraídas;
- 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 último mês
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)")
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.
Quer aprender a programar com linguagem R?
A linguagem em R é um ambiente de programação com bastante destaque na Ciência de Dados. O curso Ciência de Dados com R contará com mais de 10 aulas práticas, ao vivo para interação com os professores e execução das atividades no StudioR.
Inscreva-se agora e confira todos os detalhes!