import basedosdados as bd
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
Taxa de votos brancos e nulos para presidente no Brasil, de 1994 a 2022, usando Python
elections
python
Importando as bibliotecas
Download da tabela com dados das eleições brasileiras para presidente, de 1994 a 2022
= bd.read_sql(
votos '''
SELECT sigla_uf, ano, turno, tipo_eleicao, cargo,
SUM(abstencoes) AS abstencoes,
SUM(votos_nominais) AS votos_nominais,
SUM(votos_brancos) AS votos_brancos,
SUM(votos_nulos) AS votos_nulos,
SUM(votos_coligacao) AS votos_coligacao
FROM `basedosdados.br_tse_eleicoes.detalhes_votacao_secao`
WHERE ano IN (1994, 1998, 2002, 2006, 2010, 2014, 2018, 2022)
AND cargo IN ('presidente')
AND sigla_uf NOT IN ('VT', 'ZZ')
GROUP BY sigla_uf, ano, turno, tipo_eleicao, cargo
''',
= 'eieicoes'
billing_project_id )
Modelando os dados
# Transforma a variável ano de numérica para categórica
'ano'] = votos.ano.astype(str)
votos[= ['1994', '1998', '2002', '2006', '2010', '2014', '2018', '2022']
factors
'ano'] = pd.Categorical(
votos['ano'],
votos[= True,
ordered = factors
categories
)
# Transforma a variável 'sigla_uf' de str para categórica
'sigla_uf'] = pd.Categorical(
votos['sigla_uf'],
votos[= True,
ordered = votos['sigla_uf'].unique()
categories
)
# Cria a variável 'votos_válidos' a partir da soma das variáveis 'votos_nominais' e 'votos_coligacao'.
vars = ['votos_nominais', 'votos_coligacao']
'votos_validos'] = votos[vars].sum(axis = 1)
votos[
# Cria a variável 'votos_total' a partir da soma das variáveis 'votos_validos', 'votos_brancos' e 'votos_nulos'.
vars = ['votos_brancos', 'votos_nulos', 'votos_validos']
'votos_total'] = votos[vars].sum(axis = 1)
votos[
# Cria as variáveis 'prop_votos_brancos', 'prop_votos_nulos' e 'prop_votos_validos'
for i, var, in enumerate(vars):
f'prop_{var}'] = votos[var]/votos['votos_total'] *100
votos[vars[i] = f'prop_{var}'
# Seleciona as variáveis de interesse para a visualização de dados
= ['sigla_uf', 'ano', 'cargo', 'turno']
id_vars = id_vars + vars
vars_
# Reconstrói a tabela a partir das variáveis de interesse
= votos[vars_].melt(
votos = id_vars,
id_vars= 'tx'
value_name
)
# Recodifica a variável 'variable'
= ['Votos brancos', 'Votos nulos', 'Votos válidos']
replace_values 'variable'] = votos['variable'].replace(vars, replace_values) votos[
Visualizando os dados
# Configurações gerais dos gráficos
sns.set_theme(= 'deep',
palette = 'ticks'
style )
Votos brancos e nulos para presidente, por estado, 1994-2022
Primeiro turno
# Filtra os dados
= votos[
data == 1) &
(votos.turno != 'Votos válidos')
(votos.variable
]
= ['Votos brancos', 'Votos nulos']
factors
'variable'] = pd.Categorical(
data['variable'],
data[= True,
ordered = factors
categories )
# Gráfico
= sns.relplot(
plot = 'ano',
x = 'tx',
y = 'variable',
hue = 'sigla_uf',
col = 3,
col_wrap='line',
kind = True,
legend = 1.2,
aspect= 3,
height= data,
data = ['o','o'],
markers = False,
dashes = 'variable'
style
)
# Redefine os títulos dos eixos
set(
plot.= '',
xlabel = '% de votos'
ylabel
)
# Define labels para os eixos de todos os plots
for ax in plot.axes:
ax.tick_params(=True,
labelbottom=True
labelleft
)
# Define as características da legenda
sns.move_legend(
plot, = "upper center",
loc = 'Legenda',
title = 3,
ncol
)
# Ajustes
plt.subplots_adjust(=0.4,
hspace=0.2,
wspace= .97
top
)
# Estilo dos eixos
sns.despine(=10,
offset=True
trim
)
# Títulos dos plots
plot.set_titles(= '{col_name}',
col_template ='bold'
fontweight
)
<seaborn.axisgrid.FacetGrid at 0x7f6b3823fcd0>
Segundo turno
# Filtra os dados
= votos[
data == 2) &
(votos.turno != 'Votos válidos')
(votos.variable
]
= ['Votos brancos', 'Votos nulos']
factors
'variable'] = pd.Categorical(
data['variable'],
data[= True,
ordered = factors
categories )
# Gráfico
= sns.relplot(
plot = 'ano',
x = 'tx',
y = 'variable',
hue = 'sigla_uf',
col = 3,
col_wrap='line',
kind = True,
legend = 1.2,
aspect= 3,
height= data,
data = ['o','o'],
markers = False,
dashes = 'variable'
style
)
# Redefine os títulos dos eixos
set(
plot.= '',
xlabel = '% de votos'
ylabel
)
# Define labels para os eixos de todos os plots
for ax in plot.axes:
ax.tick_params(=True,
labelbottom=True
labelleft
)
# Define as características da legenda
sns.move_legend(
plot, = "upper center",
loc = 'Legenda',
title = 3,
ncol
)
# Ajustes
plt.subplots_adjust(=0.4,
hspace=0.2,
wspace= .97
top
)
# Estilo dos eixos
sns.despine(=10,
offset=True
trim
)
# Títulos dos plots
plot.set_titles(= '{col_name}',
col_template ='bold'
fontweight
)
<seaborn.axisgrid.FacetGrid at 0x7f6add8d54c0>