Esta nota técnica apresenta um procedimento para leitura, diretamente pelo programa R, dos dados que são atualizados periodicamente pelo movimento Vem Pra Rua (site), sobre a posição dos deputados e senadores com respeito ao impeachment de Dilma Roussef.
Em exercício interessante envolvendo a análise e previsão usando esses dados, Regis A. Ely (site) usou um script em Python 2.7, para gerar um arquivo que foi posteriormente processado pelo R.
No procedimento proposto nesta nota técnica, a leitura dos dados remotos é realizada totalmente pelo R, com apoio dos packages RCurl e XML, que devem estar previamente instalados no seu computador. O resultado final é um data frame com informações organizadas para posterior análise.
São capturadas as informações relativas a nome, status (deputado ou senador), sexo, estado, partido e situação atual com relação a voto (favorável, contra ou indeciso)
Obs: Os procedimentos funcionam com a situção atual (10 de abril de 2016) do site Vem pra Rua. Caso sua estrutura seja modificada, podem ser necessárias adequações no presente código.
Verifique antes se esses packages já estão instalados, instalando-os caso contrário.
library("RCurl")
library("XML")
murl<-"http://mapa.vemprarua.net/br/"
webpage<-getURL(murl)
webpage <- readLines(tc <- textConnection(webpage)); close(tc)
pagetree <- htmlTreeParse(webpage, error=function(...){})
body <- pagetree$children$html$children$body
O conteúdo final, já organizado, estará na variável body. A seguir transformaremos o conteúdo em uma grande lista, para posterior processamento.
body2 <- xmlToList(body)
Sub-listas com informações relativas aos deputados e senadores estão nas posições:
Os dados relativos a cada deputado ou senador em cada grupo estarão nas posições 2 a n-2, de cada grupo (n é o comprimento). Como exemplo, as informações relativas ao indivíduo 5 da primeira lista pode ser recuperada por:
body2[6]$div$div[[19]][[5]]
## a
## b "Ana Amélia"
## span "- PP"
## .attrs "/rs/senadora-ana-amelia.html"
Para evitar dificuldades com relação a codificação usaremos a informação das posições 2 e 3, que possibilitam a recuperação do nome, status (senador ou deputado), estado, partido político e sexo, como no exemplo a seguir:
body2[6]$div$div[[19]][[5]][2]
## [[1]]
## [1] "- PP"
body2[6]$div$div[[19]][[5]][3]
## [[1]]
## href
## "/rs/senadora-ana-amelia.html"
Para facilitar a extração, foram definidas as seguintes funções:
extract.estado<-function(x){
z<-unlist(x[3])
estado<-substr(z,2,3)
names(estado)<-NULL
estado
}
extract.sexo<-function(x){
z<-unlist(x[3])
if(substr(z,12,12)=="a") sexo<-"m" else sexo<-"h"
sexo
}
extract.status<-function(x){
z<-unlist(x[3])
status<-substr(z,5,7)
names(status)<-NULL
status
}
extract.nome<-function(x){
z<-unlist(x[3])
status<-extract.status(x)
sexo<-extract.sexo(x)
if(status=="dep") pos<-15 else pos<-14
if(sexo=="m" & status=="sen") pos<-15
pos2<-regexpr("[.]",x[3])[1]
nome<-substr(z,pos-1,pos2-1)
names(nome)<-NULL
nome
}
extract.partido<-function(x){
z<-unlist(x[2])
partido<-substr(z,3,nchar(z))
partido
}
Função que retorna um data frame com as informações extraídas já incluindo uma variável para indicar o tipo de voto.
retorna.dataframe<-function(nomearq,vototipo){
len<-length(nomearq)
nome<-NULL
partido<-NULL
estado<-NULL
status<-NULL
sexo<-NULL
voto<-NULL
for(i in 1:(len)){
categoria<-nomearq
if(!is.na(categoria[[i]][3]))
if(substr(categoria[[i]][3],1,1)=="/"){
nome<-c(nome,extract.nome(categoria[[i]]))
estado<-c(estado,extract.estado(categoria[[i]]))
status<-c(status,extract.status(categoria[[i]]))
sexo<-c(sexo,extract.sexo(categoria[[i]]))
partido<-c(partido,extract.partido(categoria[[i]]))
voto<-c(voto,vototipo)
}
}
return(data.frame(nome,estado,status,sexo,partido,voto))
}
Criação dos data frames parciais com cada tipo de voto:
tabfavor<-retorna.dataframe(body2[6]$div$div[[19]],"f")
tabcontra<-retorna.dataframe(body2[6]$div$div[[12]],"c")
tabindec<-retorna.dataframe(body2[6]$div$div[[5]],"i")
Consolidação dos 3 data frames parciais num único, na ordem favoráveis (f), contra (c) e indecisos (i):
tabgeral<-rbind(tabfavor,tabcontra,tabindec)
Primeiras linhas desse data frame criado:
head(tabgeral)
## nome estado status sexo partido voto
## 1 aecio-neves mg sen h PSDB f
## 2 aloysio-nunes-ferreira sp sen h PSDB f
## 3 alvaro-dias pr sen h PV f
## 4 ana-amelia rs sen m PP f
## 5 antonio-anastasia mg sen h PSDB f
## 6 antonio-carlos-valadares se sen h PSB f
Ultimas linhas desse data frame criado:
tail(tabgeral)
## nome estado status sexo partido voto
## 589 waldir-maranhao ma dep h PP i
## 590 washington-reis rj dep h PMDB i
## 591 wellington-roberto pb dep h PR i
## 592 wilson-beserra rj dep h PMDB i
## 593 ze-augusto-nalin rj dep h PMDB i
## 594 zeca-cavalcanti pe dep h PTB i
Para aprovação do impeachment há necessidade de se passar por 2 processos (Fonte: Regis Ely) :
Para facilitar a análise criaremos 2 data frames auxiliares com os dados dos deputados e dos senadores:
tabgeraldep<-tabgeral[tabgeral$status=="dep",]
tabgeralsen<-tabgeral[tabgeral$status=="sen",]
Deputados
with(tabgeraldep,table(voto)) # Freq. Absoluta
## voto
## f c i
## 294 128 91
with(tabgeraldep,prop.table(table(voto))) # Freq. Relativa
## voto
## f c i
## 0.5730994 0.2495127 0.1773879
Senadores
with(tabgeralsen,table(voto)) # Freq. Absoluta
## voto
## f c i
## 42 25 14
with(tabgeralsen,prop.table(table(voto))) # Freq. Relativa
## voto
## f c i
## 0.5185185 0.3086420 0.1728395
Deputados
with(tabgeraldep,table(partido,voto)) # Freq. Absoluta
## voto
## partido f c i
## DEM 28 0 0
## PDT 3 8 9
## PEN 1 1 0
## PHS 5 1 1
## PMB 1 0 0
## PMDB 33 11 23
## PP 24 10 13
## PPS 9 0 0
## PR 19 6 15
## PRB 17 0 5
## PROS 3 3 0
## PSB 26 0 5
## PSC 9 0 0
## PSD 21 5 10
## PSDB 51 0 0
## PSL 2 0 0
## PTB 12 3 4
## PTdoB 1 1 1
## PTN 6 3 4
## PV 7 0 0
## REDE 2 2 0
## SD 14 0 0
## Sem partido 0 0 1
## PCdoB 0 11 0
## PSOL 0 6 0
## PT 0 57 0
## PTC 0 0 0
with(tabgeraldep,prop.table(table(partido,voto),1)) # Freq. Relativa
## voto
## partido f c i
## DEM 1.0000000 0.0000000 0.0000000
## PDT 0.1500000 0.4000000 0.4500000
## PEN 0.5000000 0.5000000 0.0000000
## PHS 0.7142857 0.1428571 0.1428571
## PMB 1.0000000 0.0000000 0.0000000
## PMDB 0.4925373 0.1641791 0.3432836
## PP 0.5106383 0.2127660 0.2765957
## PPS 1.0000000 0.0000000 0.0000000
## PR 0.4750000 0.1500000 0.3750000
## PRB 0.7727273 0.0000000 0.2272727
## PROS 0.5000000 0.5000000 0.0000000
## PSB 0.8387097 0.0000000 0.1612903
## PSC 1.0000000 0.0000000 0.0000000
## PSD 0.5833333 0.1388889 0.2777778
## PSDB 1.0000000 0.0000000 0.0000000
## PSL 1.0000000 0.0000000 0.0000000
## PTB 0.6315789 0.1578947 0.2105263
## PTdoB 0.3333333 0.3333333 0.3333333
## PTN 0.4615385 0.2307692 0.3076923
## PV 1.0000000 0.0000000 0.0000000
## REDE 0.5000000 0.5000000 0.0000000
## SD 1.0000000 0.0000000 0.0000000
## Sem partido 0.0000000 0.0000000 1.0000000
## PCdoB 0.0000000 1.0000000 0.0000000
## PSOL 0.0000000 1.0000000 0.0000000
## PT 0.0000000 1.0000000 0.0000000
## PTC
Senadores
with(tabgeralsen,table(partido,voto)) # Freq. Absoluta
## voto
## partido f c i
## DEM 4 0 0
## PDT 1 1 1
## PEN 0 0 0
## PHS 0 0 0
## PMB 0 0 0
## PMDB 9 4 5
## PP 4 2 0
## PPS 1 0 0
## PR 2 2 0
## PRB 0 1 0
## PROS 0 0 0
## PSB 3 2 2
## PSC 1 0 0
## PSD 3 1 0
## PSDB 11 0 0
## PSL 0 0 0
## PTB 1 0 2
## PTdoB 0 0 0
## PTN 0 0 0
## PV 1 0 0
## REDE 0 0 1
## SD 0 0 0
## Sem partido 1 0 2
## PCdoB 0 1 0
## PSOL 0 0 0
## PT 0 11 0
## PTC 0 0 1
with(tabgeralsen,prop.table(table(partido,voto),1)) # Freq. Relativa
## voto
## partido f c i
## DEM 1.0000000 0.0000000 0.0000000
## PDT 0.3333333 0.3333333 0.3333333
## PEN
## PHS
## PMB
## PMDB 0.5000000 0.2222222 0.2777778
## PP 0.6666667 0.3333333 0.0000000
## PPS 1.0000000 0.0000000 0.0000000
## PR 0.5000000 0.5000000 0.0000000
## PRB 0.0000000 1.0000000 0.0000000
## PROS
## PSB 0.4285714 0.2857143 0.2857143
## PSC 1.0000000 0.0000000 0.0000000
## PSD 0.7500000 0.2500000 0.0000000
## PSDB 1.0000000 0.0000000 0.0000000
## PSL
## PTB 0.3333333 0.0000000 0.6666667
## PTdoB
## PTN
## PV 1.0000000 0.0000000 0.0000000
## REDE 0.0000000 0.0000000 1.0000000
## SD
## Sem partido 0.3333333 0.0000000 0.6666667
## PCdoB 0.0000000 1.0000000 0.0000000
## PSOL
## PT 0.0000000 1.0000000 0.0000000
## PTC 0.0000000 0.0000000 1.0000000