10 Obtendo dados

A base da ciência de dados é, obviamente, o DADO. Portanto, é fundamental sempre ter boas fontes de dados. Se você der sorte, conseguirá dados estruturados para iniciar sua análise. Porém, eventualmente precisará recorrer a fontes de dados não estruturados ou semiestruturados.

Muito provavelmente você algum dia precisará recorrer a uma Application Programming Interface (API) de dados, ou até mesmo precisará utilizar técnicas de Web Scrapping para obter dados diretamente em um próprio site.

10.1 API

API é uma forma de comunicação de dados mais apropriada para as trocas de informações entre softwares. Normalmente APIs trocam dados em formato hierárquico. Os dois formatos hierárquicos mais comuns são Javascript Object Notation (JSON) e eXtensible Markup Language (XML).

Para obter-se e utilizar-se dados de API em R recomendamos a utilização do pacote jsonlite.

library(jsonlite)

A seguir apresentaremos alguns exemplos de APIs e seu uso. Existem diversas APIs e formas de consumi-las, portanto não iremos exaurir nesse texto todas as possibilidades de uso de APIs. O principal aqui é entender-se APIs como uma fonte rica de dados que pode ser explorada em suas análises.

No exemplo a seguir utilizamos a API do github (portal para repositórios) e veremos quais os repositórios do Hadley Wickham:

hadley.rep <- jsonlite::fromJSON("https://api.github.com/users/hadley/repos")

dim(hadley.rep)
## [1] 30 74
head(hadley.rep[,c('name', 'description')], 15)
##                     name                                                                     description
## 1  15-state-of-the-union                                                                            <NA>
## 2      15-student-papers                           Graphics & computing student paper winners @ JSM 2015
## 3                  adv-r                                                              Advanced R: a book
## 4             advisories                                                                            <NA>
## 5             assertthat                                                  User friendly assertions for R
## 6              AzureStor                                           R interface to Azure storage accounts
## 7              babynames                              An R package containing US baby names from the SSA
## 8         beautiful-data                                                 Book chapter for beautiful data
## 9                  bench                                                         Bechmarking tools for R
## 10                bigvis      Exploratory data analysis for large datasets (10-100 million observations)
## 11        bigvis-infovis     Paper describing the bigvis package and framework submitted to Infovis 2013
## 12               bizarro                                                                   Bizarro world
## 13        boxplots-paper                                                                            <NA>
## 14      building-permits                             Code & data accompanying "whole-game" youtube video
## 15             classifly An R package to visualise high-dimensional classification boundaries with GGobi

Outro exemplo de API muito interessante é o portal de dados abertos da Câmara dos Deputados. Eles possuem diversas APIs para consultar os dados do processo legislativo. Veja o exemplo a seguir, que resgata as proposições utilizando API:

proposicoes <- jsonlite::fromJSON("https://dadosabertos.camara.leg.br/api/v2/proposicoes")

head(proposicoes$dados %>% select(siglaTipo, numero, ano, ementa))
##   siglaTipo numero  ano
## 1       PEC    290 2000
## 2        PL    407 1999
## 3        PL    593 1999
## 4        PL    606 1999
## 5        PL    704 1995
## 6        PL   1816 1999
##                                                                                                                                                                                                                                                                                    ementa
## 1 Dá nova redação aos art. 49, 50 e 58 da Constituição Federal, regulando a convocação de Ministros de Estado, titular de órgão vinculado à Presidência da República, dirigentes da administração direta, indireta, de entidade reguladora ou de serviço público pelo Congresso Nacional.
## 2                                                                                             Dá nova redação ao art. 7º e ao art. 12 da Lei nº 8.935, de 18 de novembro de 1994, ampliando a competência dos oficiais de registro civil das pessoas naturais e de interdições e tutelas.
## 3                                                                                                                            Dá nova redação ao art. 4º da Lei nº 1.521, de 26 de dezembro de 1951, que altera dispositivos da legislação vigente sobre crimes contra a economia popular.
## 4                                                                                                         Dispõe sobre a suspensão do pagamento das prestações habitacionais do Sistema Financeiro da Habitação pelos mutuários desempregados das Regiões Norte, Nordeste e Centro-Oeste.
## 5                                                                                                                                                                                       Assegura aos que cumpram penas privativas da liberdade o direito de exercer atividade laborativa.
## 6                                                                                                                                                                                                                             Insitui o "Dia Nacional dos Agentes Comunitários de Saúde".

Hoje em dia, todas as redes sociais possuem APIs para consumir os dados dos usuários e postagens. Normalmente essas APIs pedem um cadastro anterior (apesar de gratuitas, em sua maior parte). O R possui diversos pacotes para consumir APIs interessantes:

  • Quandl: pacote que fornece diversos dados econômicos de diversos países;
  • Rfacebook: pacote que facilita o uso da API do facebook (requer cadastro prévio);
  • twitterR: pacote que facilita o uso da API do twitter (requer cadastro prévio);
  • ggmap: pacote que facilita o uso da API do google maps.

Sempre procure por APIs para obter dados que possam enriquecer suas análises.

10.2 Web Scrapping

Eventualmente você não terá dados estruturados de forma fácil e nem terá uma API com os dados que procura. Nesses casos pode ser que um próprio site da internet seja sua fonte de dados. Para isso utiliza-se técnicas chamadas de Web Scrapping.

Sites da internet são construídos utilizando-se uma linguagem que é interpretada pelos browsers: HyperText Markup Language (HTML). Esta é uma linguagem que trabalha com tags de forma hierárquica. Nesse site você pode aprender um pouco mais sobre o que é HTML: http://www.w3schools.com/html/tryit.asp?filename=tryhtml_basic_document

Existe um pacote em R que facilita muito o cosumo de dados em HTML: rvest, criado também por Hadley Wickham. O rvest mapeia os elementos HTML (tags) de uma página web e facilita a “navegação” do R por esses nós da árvore do HTML.

O pacote funciona da seguinte forma: Um string que contem o link é usado como input da função read_html(). A partir daí as funções do pacote rvest podem ser usadas para extrair dados da página. html_table(), por exemplo, extrai dados tabulares da página.

Algo que torna o Web Scraping muito complexo é que essa tarefa é muito dependente do código-fonte da página. Caso ela sofra mudanças, o código provavelmente não irá mais funcionar. Um exemplo é o que se vê neste post sobre Web Scraping do OLX, que não funciona mais.

Devido a isso, este material opta por não entrar a fundo no assunto além de mostrar um exemplo superficial abaixo de scraping de uma tabela da Wikipedia:

library(rvest)

url <- "https://pt.wikipedia.org/wiki/Campeonato_Brasileiro_de_Futebol_de_2018_-_Série_A" %>%
  read_html()


tb <- html_table(url, fill = TRUE)
tb <- tb[[6]]
tb %>% 
  as_tibble() %>% 
  mutate(SG = ifelse(str_detect(SG,"\\+"),
                    readr::parse_number(SG),
                    -1 * readr::parse_number(SG)))