Camaraws: Análise de Partidos na Câmara dos Deputados

A disponibilização pela Câmara dos Deputados de dados abertos na internet sobre as votações das proposições que ali tramitam inspirou Leonardo Leite a vasculhar e analisar estes dados, criando o projeto camaraws no início deste ano. Cinco meses depois, apresento neste terceiro post (veja o primeiro e o segundo) os últimos desenvolvimentos deste projeto, que ganhou uma certa popularidade, e está se transformando em uma ferramenta cada vez mais poderosa de análise.

Mapa Dinâmico de Semelhança de Partidos

O mapa dinâmico que havia aqui não está mais disponível pois a ferramenta online utilizada foi descontinuada, mas você pode conferir a versão própria que desenvolvemos no site do projeto.

Neste gráfico animado de bolhas, os eixos x e y são as combinações lineares ortogonais das votações na câmara que melhor explicam a variância entre as votações dos partidos. A versão mais curta desta explicação é que os eixos são tais que partidos que votam de maneira semelhante ficam mais próximos entre si, e partidos que votam de forma mais diferente ficam mais distentes. Para a explicação mais longa, continue lendo!

O gráfico mostra no "eixo" temporal a evolução ano a ano (para ver, aperte play), e na escala de cores a porcentagem média de deputados do partido presentes nas votações, por ano. Estão inclusos apenas partidos que tinham no mínimo 4 parlamentares em 2011. Para ver o nome de um partido, clique sobre a bolha correspondente.

Como o Mapa Foi Feito?

O gráfico animado acima é semelhante ao gráfico estático apresentado no último post do projeto e, como aquele, resulta de uma análise de componentes principais, além de um pouco de álgebra suplementar. Aqui está o que fizemos:

Vetores Votação

O primeiro passo é representar as votações de cada partido matematicamente. Para isso, em cada período desejado (no caso, períodos de 1 ano desde 2002), cada partido é representado por um vetor, chamado vetor de votações. Cada votação é uma dimensão do vetor, em que o valor fica entre -1 ("não") e 1 ("sim").

Por exemplo, se em dado período houve 3 votações o vetor de um partido PX poderia ser PX = (-1,0; 0,8; 0,0), se de seus 10 deputados todos votaram "não" na primeira votação, na segunda houve 9 "sim" e 1 "não", e na última 5 "sim" e 5 "não". De maneira geral, a coordenada é calculada por (Nsim - Nnão)/Ntotal, onde Ntotal=Nsim+Nnão+Nabs+Nobs, ou seja, são consideradas neutras as abstenções e as obstruções.

Componentes Principais

Cada partido assim representado poderia ser visualizado como um ponto (ou bolha) no espaço a D dimensões, cada dimensão sendo uma votação... mas em um ano há dezenas de votações nominais; Como visualizar tantas dimensões? Para visualização em um plano (2D) poderíamos olhar apenas para duas votações selecionadas, que tenham causado maior divergência, ou que sejam consideradas de maior importância -- mas no primeiro caso acabaríamos deixando questões importantes de fora, e como somos engenheiros e não cientístas políticos, no segundo caso não saberíamos que critério usar para considerar alguma votação mais importante que as demais!

Entra a análise de componentes principais (PCA, na sigla em inglês).

Esta técnica de álgebra linear muito usada em análise de dados nos permite (entre outras coisas) encontrar a projeção em 2 dimensões de dados em um espaço de D>2 dimensões tal que a soma dos quadrados das distâncias entre os pontos dois a dois seja máxima. Geometricamente, trata-se de uma certa "visão perspectiva" de um espaço de muitas votações, que é a perspectiva que melhor realça as diferenças entre os partidos.

Até nosso último post havíamos feito tal análise para o período de 2011, mas agora o camaraws permite analisar um período qualquer à escolha do usuário, e mostra o gráfico de bolhas (estático) correspondente. Gráficos estáticos de 2008 e 2009 estão apresentados mais abaixo.

Análise Temporal

Já sabemos como dispor os partidos em um plano 2D para um período dado usando a PCA, mas ainda há um truque para avaliar análises de anos consecutivos. Tomemos como exemplo as votações de 2008 e as de 2009, cada ano dando origem a um gráfico 2D diferente. Os eixos x e y do gráfico de 2008 são criados como combinações lineares das votações daquele ano, que são diferentes das do ano seguinte, ou seja, os eixos de 2008 e 2009 não têm qualquer relação entre si!


PCA 2008

 


PCA 2009


Mesmo assim, espera-se que os resultados sejam similares de um ano para o outro, ao menos se os partidos tiverem convicções firmes. De fato, veja que os agrupamentos mais ou menos se mantém entre os dois anos. Podemos rotacionar e/ou espelhar os eixos de um dos gráficos sem que isso altere as distâncias relativas entre os partidos (que é o que nos interessa), de tal forma que os dois gráficos fiquem mais "parecidos" -- neste exemplo basta multiplicar o eixo y de um deles por -1. Fazendo o mesmo procedimento ano a ano obtemos o gráfico animado já apresentado.

O critério matemático usado para definir automaticamente a rotação+espelhamento que torna um gráfico mais parecido com o anterior foi escolher aquela que resulta na menor "quantidade de movimento" entre dois anos, definida como a soma dos produtos do tamanho de cada partido pela distância que ele percorre no plano entre os dois anos.

Banco de Dados Local

Além das análises mostradas, aqueles que quiserem realizar suas próprias análises dos dados da câmara podem fazer isso facilmente usando outras ferramentas do projeto camaraws que desenvolvemos nos últimos meses. Em particular, baixamos todas as proposições e votações do webservice para um banco de dados local em formato SQLite, disponível no repositório do projeto (em resultados/camara.db), juntamente com os módulos em python que permitem acessá-lo para fazer análises como a que já mostramos.

SQLite

Se você tem noções de SQL (Structured Query Language), não fique restrito às análises que nós fizemos, pois há muitas outras possíveis! Basta baixar o arquivo camara.db anexo a este post (ou no próprio repositório do projeto, no github), e fazer queries nele indo até o diretório e abrindo o shell do sqlite; no linux:

$ sqlite3 camara.db

O banco de dados tem 4 tabelas: PARTIDOS, DEPUTADOS, PROPOSICOES e VOTACOES, detalhadas no próximo título.

Aí é só se divertir com o SQL. Por exemplo:

sqlite>.mode tabs      // para saída mais bonita
sqlite>SELECT partido,count(*) FROM DEPUTADOS WHERE uf='SP' GROUP BY partido;
DEM    13
PCdoB   3
PDT    11
PFL    17
PL      7
PMDB   19
PP     13
PPB     6
PPS     9
PR      7
PRB     2
PRONA   6
PSB    14
PSC     3
PSD     9
PSDB   39
PSDC    1
PSL     1
PSOL    2
PT     41
PTB    14
PTC     2
PTN     1
PV     12
S.Part. 4

Esse SELECT retornou uma tabela com o número de deputados de São Paulo por partido que estavam em pelo menos uma das votações inseridas no bd.

Detalhes sobre as tabelas

As tabelas do banco de dados SQLite têm as seguintes especificações:

DEPUTADOS(idDep, deputado, partido, uf); - O primeiro é um inteiro que identifica o deputado, o resto é auto-explicativo. - idDep é da forma PPPEENNN, onde PPP é o idPart, EE é o número do estado e NNN é pra diferenciar pelos nomes.

PARTIDOS(idPart, partido); - idPart identifica o partido, e a segunda coluna é a sigla.

PROPOSICOES(idProp, tipo, num, ano, ementa, explicacao, situacao, num_votacoes); - idProp é o número que o ws usa para identificar a proposição. - A última coluna é o número de votações que a proposição teve. Propostas com zero votações não são incluídas no bd.

VOTACOES(idProp, idVot, resumo, data, hora, sim, nao, abstencao, obstrucao); - idVot é o número da votação, o par (idProp,idVot) identifica univocamente uma votação. - A data permite saber quando foi votado, pode ser diferente do ano que foi feita a proposição. - As últimos quatro colunas são listas de idDep's, identificando quem votou daquela forma na votação em questão. Por exemplo se houve apenas dois "não" de dois deputados do PT-SP, a coluna "nao" seria algo como "[1325002,1325003]" (13 é o PT e 25 é São Paulo, e para saber os nomes dos deputados teria que olhar na tabela DEPUTADOS).

Módulo Análise

Através do código python estas informações do banco de dados podem ser facilmente tratadas, analisadas e mostradas. Já desenvolvemos algumas ferramentas, como as que criam as figuras deste post. Outras ainda estão mais "cruas", como as que agregam os votos por estados e não por partidos, ou a análise de presença dos deputados nas votações. Vamos terminar com uma olhada rápida nas presenças registradas em 2011...

Presença dos Partidos em 2011

A tabela abaixo apresenta a porcentagem média de deputados de cada partido presentes nas votações ocorridas em 2011. Estão mostrados apenas partidos com 4 ou mais deputados.

Taxa de presença dos partidos nas votações de 2011 da câmara.
Partido Presença Tamanho
PSOL 62% 4
PRB 52% 15
PT 51% 131
PCdoB 50% 21
PSC 50% 23
PP 48% 58
PDT 46% 42
PTB 44% 33
PSB 44% 50
PR 44% 61
PMDB 43% 134
PTdoB 42% 5
PV 39% 23
PHS 36% 4
PSDB 32% 93
PPS 31% 23
DEM 29% 76
PMN 25% 9
PSD 20% 52

Só há uma conclusão possível: se fossem aulas da poli, a maioria dos partidos reprovaria por faltas!

Repecursão e Outros Projetos

Além da citação no blog drunkeynesian e da matéria no jornal Gazeta do Povo, mais recentemente o jornal Estadão criou uma ótima ferramenta online, o Basômetro, que foi inspirada no camaraws.

Este mês foi lançada a 1a Hackathon - Maratona Hacker da Câmara Municipal de São Paulo, e já temos uma equipe inscrita para criar um projeto similar ao camaraws, dedicado à câmara municipal. O Senado também está em processo de disponibilização de dados de suas votações, e uma ferramenta para o Senado deve surgir no futuro. Além disso, novas análises e ferramentas de visualização devem surgir no próprio projeto camaraws, que estamos desenvolvendo em nossas horas vagas.

Esperamos que o camaraws continue a inspirar outros projetos interessantes, além de incentivar a divulgação de dados abertos pelo setor público.

Português, Brasil

4 comments

16
mai

O mais legal no começo da animação é ver a movimentação do PMDB =P

16
mai

Pra quem pira em gráficos como eu, e gosta da política, esse aí é maravilhoso.
Com criatividade e capacidade técnica vocês conseguiram usar todo esse ferramental matemático e computacional para traduzir um calhamaço de informações difíceis de se assimilar (milhares de números e textos) em uma forma simples que explora nossos aparatos cognitivos visuais que são instintivos: formas, movimento, conjuntos, tamanhos...
Parabéns!

16
mai

Parabéns pelos gráficos! Achei muito interessante!
Só não entendi uma coisa: os dados das votações são usados para gerar uma imagem por ano? O que acontece entre um ano e outro na animação é um movimento de uma imagem para outra?

17
mai

Sim, os dados geram uma imagem por ano, e os movimentos são apenas uma animação entre duas "fotos" de anos consecutivos.

O slider com as datas não ficou muito bom, mas para ser preciso a imagem que o gráfico apresenta como sendo do dia 31 de dezembro do ano YY (mostrada como 12/31/YY) corresponde à análise feita considerando votações do ano que passou. A imagem inicial por exemplo, de "12/31/02", corresponde às votações que ocorreram durante 2002, e a imagem final corresponde a 2011.

Comentar