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
.
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:
## [1] 30 73
## name
## 1 15-state-of-the-union
## 2 15-student-papers
## 3 500lines
## 4 adv-r
## 5 amt
## 6 appdirs
## 7 arkdb
## 8 arrow
## 9 assertthat
## 10 babynames
## 11 bark
## 12 bayesplot
## 13 bcdata
## 14 beautiful-data
## 15 bench
## description
## 1 <NA>
## 2 Graphics & computing student paper winners @ JSM 2015
## 3 500 Lines or Less
## 4 Advanced R: a book
## 5 <NA>
## 6 A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir".
## 7 Archive and unarchive databases as flat text files
## 8 Apache Arrow is a cross-language development platform for in-memory data. It specifies a standardized language-independent columnar memory format for flat and hierarchical data, organized for efficient analytic operations on modern hardware. It also provides computational libraries and zero-copy streaming messaging and interprocess communication. Languages currently supported include C, C++, Java, JavaScript, Python, and Ruby.
## 9 User friendly assertions for R
## 10 An R package containing US baby names from the SSA
## 11 Bayesian Additive Regresssion Kernels
## 12 bayesplot R package for plotting Bayesian models
## 13 An R package for searching & retrieving data from the B.C. Data Catalogue
## 14 Book chapter for beautiful data
## 15 Bechmarking tools for R
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 PL 70 1995
## 2 PL 505 1991
## 3 PL 1610 1996
## 4 PLP 60 1999
## 5 PL 4076 2001
## 6 PL 6379 2002
## ementa
## 1 Dispõe sobre intervenções cirúrgicas que visem à alteração de sexo e dá outras providências.
## 2 Revoga a alínea "l" do art. 20 do Decreto-lei nº 73, de 21 de novembro de 1966, extinguindo o Seguro Obrigatório de Veículos Automotores
## 3 Dispõe sobre a exploração e o aproveitamento de recursos minerais em terras indígenas, de que tratam os arts. 176, parágrafo 1º, e 231, parágrafo 3º, da Constituição Federal.
## 4 Dispõe sobre a aposentadoria especial para os trabalhadores que exercem atividades que prejudiquem a saúde ou a integridade física.
## 5 Altera a Lei nº 9.656, de 3 de junho de 1998, que "dispõe sobre os planos e seguros privados de assistência à saúde" incluindo os procedimentos preventivos no rol dos serviços a serem oferecidos pelas empresas do setor.
## 6 Altera o § 2º do art. 1º do Decreto-Lei nº 791 de 27 de agosto de 1969, que dispõe sobre o pedágio em rodovias federais e dá outras providências.
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: