Introdução

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.

Carregando os Packages

Verifique antes se esses packages já estão instalados, instalando-os caso contrário.

library("RCurl")
library("XML")

Leitura do conteúdo completo do site Vem pra Rua

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:

Funções auxiliares para extração dos dados

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
}

Criando o data.frame para posterior análise

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

Análise descritiva da situação atual

Para aprovação do impeachment há necessidade de se passar por 2 processos (Fonte: Regis Ely) :

  1. admissibilidade do processo de impeachment
  1. julgamento final

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",]

Frequências absolutas e relativas - agregado

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

Frequências absolutas e relativas - por partido

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