Baixamos a prestação de contas dos candidatos em 2016 e seguimos com a seguinte pergunta: quanto os partidos políticos doaram para seus candidatos? É possível identificar uma diferença entre os valores doados para homens e para mulheres? Quais são os partidos que mais se destacam e porquê? Quais foram os candidados que mais se destacaram e o porquê? Essas são algumas das perguntas que a nossa análise procurou responder.
A base de prestação de contas dos candidatos não possui a coluna "Sexo". Ou seja, apenas com essa base não é possível fazer as análises. Contudo, a base possui o nome e o número sequencial dos candidatos, algo que usaremos para importar os dados de sexo da base de candidaturas.
Escolhemos o Pandas para fazer essa análise. Trata-se de um dos melhores módulos Python para análise de dados. O Pandas permite manipular os arquivos do Tribunal Superior Eleitoral com facilidade. Como são muitos arquivos e muito grandes, não é possível abri-los em ferramentas mais convencionais, como o Libre Office Calc.
Vamos começar, então, importando o Pandas para o nosso script. Se você não tem o Pandas instalado, basta digitar "pip install Pandas" no seu terminal.
In [1]:
# -*- coding: utf-8
import pandas as pd
Agora vamos usar a função "read_csv" do Pandas para abrir o arquivo "receitas_candidatos_2016_brasil.txt". Esse arquivo possui o consolidado da prestação de contas de todos os candidatos nas eleições de 2016. É um arquivo de quase 1Gb. Temos alguns parâmetros:
In [2]:
base = pd.read_csv(
'data/receitas_candidatos_2016_brasil.txt',
delimiter=";",
decimal=",",
encoding="latin1",
low_memory=False)
Guardamos o arquivo na variável base e agora vamos exibir as 30 primeiras e 30 últimas linhas.
In [3]:
base
Out[3]:
Essa tabela tem muitas colunas que não precisamos usar na nossa análise. Vamos recuperar os nomes das colunas e depois vamos fazer um recorte para gerar uma base apenas com as colunas que queremos. Para recuperar as colunas de uma base, digite:
In [4]:
base.columns
Out[4]:
Agora, vamos criar uma nova variável chamada "base_cortada" e vamos criar um novo DataFrame - o nome que o Pandas dá para as bases de dados que você manipula por meio do módulo - com as seguintes colunas:
In [5]:
base_cortada = pd.DataFrame(base, columns=[
u"Sequencial Candidato",
u"Nome Candidato",
u"UF",
u"Nome da UE",
u"Sigla Partido",
u"Cargo",
u"Nome do doador",
u"Número partido doador",
u"Número candidato doador",
u"Valor receita",
u"Tipo receita",
u"Fonte receita",
u"Especie recurso"
])
Vamos ver como ficou a nossa nova base cortada:
In [6]:
base_cortada
Out[6]:
Agora vamos salvar a base para um arquivo CSV usando a função "to_csv" do Pandas:
In [7]:
base_cortada.to_csv("receitas_GN.csv", encoding="utf-8")
Agora que temos a base que precisamos para fazer as análises, precisamos buscar o sexo de todos os candidatos.
Vamos usar a coluna "Sequencial Candidato" na base que acabamos de criar e vamos compará-la com uma coluna de mesmo nome na base "consulta_cand_2016_brasil.txt".
Essa base foi criada unindo todos os arquivos TXT do TSE com um simples comando no terminal:
cat *.txt > consulta_cand_2016_brasil.csv
Você pode renomear depois para .txt (como abaixo) ou deixar .csv mesmo. Agora basta criarmos um novo DataFrame com a base que acabamos de definir:
In [8]:
candidatos = pd.read_csv(
'data/consulta_cand_2016_brasil.txt',
delimiter=";",
decimal=",",
encoding="latin1",
header=None,
low_memory=False)
In [9]:
candidatos.columns
Out[9]:
Como percebemos acima, o arquivo de candidaturas não possui cabeçalho. Foi por isso que um dos parâmetros na hora de importar o arquivo foi "header=None
".
Com isso, o Pandas nomeou em sequência as colunas do 0 até o 45, totalizando 46 colunas.
Para a consulta de sexo dos candidados vamos renomear as colunas 10, 11 e 30. Assim, criaremos uma nova base apenas com os nomes, o número sequencial e o sexo dos candidatos. Vamos usar essa base para acrescentar a informação de sexo na nossa tabela de doações:
In [10]:
candidatos.rename(columns={10: "Nome Candidato", 11:"Sequencial Candidato", 30:"Sexo"}, inplace=True)
In [11]:
candidatos_sexo = pd.DataFrame(candidatos, columns=["Sequencial Candidato", "Nome Candidato", "Sexo"])
In [12]:
candidatos_sexo
Out[12]:
Vamos salvar uma cópia desse arquivo no formato CSV. Assim você pode importar para o seu processador de planilhas favorito.
In [13]:
candidatos_sexo.to_csv("consulta_cand_2016_sexo.csv", encoding="utf-8")
Vamos unir as duas tabelas usando a coluna que elas possuem em comum: Sequencial Candidato
. À esquerda, vamos usar a nossa base cortada, à direita a base de candidatos com o sexo. O ponto de união das duas bases será a coluna Sequencial Candidato
.
O Pandas já faz o trabalho pra gente: onde o número sequencial na tabela com os sexos for X, por exemplo, ele vai acrescentar o valor do sexo automaticamente. Funciona como um VLOOKUP/PROCV ou index/match:
In [14]:
left = base_cortada
right = candidatos_sexo
merge = pd.merge(left,right, on="Sequencial Candidato")
In [15]:
merge_filtrado = merge[merge['Tipo receita'] == u"Recursos de partido político"]
prefeitos = merge_filtrado[merge_filtrado['Cargo'] == u"Prefeito"]
vereadores = merge_filtrado[merge_filtrado['Cargo'] == u"Vereador"]
In [16]:
tabela_final_prefeitos = prefeitos.pivot_table(index=[u'Número partido doador',
u'UF',
u'Nome da UE'],
columns=[u'Sexo'],
values=['Valor receita', "Sequencial Candidato"],
aggfunc=[sum, pd.Series.nunique])
tabela_final_vereadores = vereadores.pivot_table(index=[u'Número partido doador',
u'UF',
u'Nome da UE'],
columns=[u'Sexo'],
values=['Valor receita', "Sequencial Candidato"],
aggfunc=[sum, pd.Series.nunique])
In [17]:
tabela_final_prefeitos
Out[17]:
In [18]:
tabela_final_prefeitos.to_csv("tabela_final_prefeitos.csv", encoding="utf-8")
tabela_final_vereadores.to_csv("tabela_final_vereadores.csv", encoding="utf-8")
In [19]:
maximos_prefeitos = prefeitos.pivot_table(index=[u'Número partido doador'],
values=['Valor receita'],
columns=["Sexo"],
aggfunc=max)
maximos_vereadores = vereadores.pivot_table(index=[u'Número partido doador'],
values=['Valor receita'],
columns=["Sexo"],
aggfunc=max)
In [20]:
maximos_prefeitos.to_csv("maximos_prefeitos.csv", encoding = "utf-8")
maximos_vereadores.to_csv("maximos_vereadores.csv", encoding = "utf-8")
In [21]:
maximos_vereadores
Out[21]:
Ainda é possível fazer muitas análises com essa base! Estamos só começando.
Se você gostaria de fazer algum comentário ou sugestão, entre em contato com a gente no contato@generonumero.media