import pandas as pd
import numpy as np
import sqlite3
import matplotlib.pyplot as plt
import seaborn as sns
import statsmodels.api as sm
import folium
from folium.plugins import HeatMap
import geopandas as gpd
import geobr
'display.max_rows', None) pd.set_option(
Votação em Teresina
Análise da eleição em Teresina em 2024 com o objetivo de indentificar onde ocorreu a transição de votos permitindo Silvio Mendes vencer no primeiro turno.
A eleição de 2024 em Teresina vai ser lembrada como aquela que os institutos de pesquisa não souberam captar a realidade de votos, certamente terão que reavaliar as metodologias usadas.
Por outro lado, quando saiu o resultado, o senso comum foi surpreendido também com a vitória de Silvio Mendes. Algumas pesquisas até chegaram a apontar que o candidato do União Brasil poderia vencer, mas, levando em conta a força e o número de aliados da coligação do PT, por isso, pode-se questionar de onde vieram votos de Silvio permitindo a vitória no 1º turno.
Para obter uma resposta, utilizaremos uma comparação, vamos usar a ideia de “voto casado”, que é quando o eleitor escolhe candidatos da mesma coligação tanto para prefeito quanto para outros cargos. Claro que isso não acontece 100% das vezes, já que o eleitor pode diversificar o voto de forma atípica, levando em conta diferentes ideologias. No entanto, o mais comum é que ele mantenha uma certa coerência dentro do mesmo espectro político ao escolher seus candidatos.
Assim, vamos comparar o número de votos que os partidos receberam tanto para vereador quanto para prefeito, com o objetivo de identificar se houve alguma transferência de votos, mudança de escolha ou adesão ao chamado “voto útil”.
Os resultados indicam que:
A coligação liderada pelo PT perdeu votos para prefeito em todas as zonas eleitorais, o que prejudicou o voto casado.
A mesma coligação também perdeu votos na maioria das seções eleitorais.
Há indícios de que votos da coligação de Dr. Pessoa foram transferidos para Silvio Mendes, com eleitores optando pelo voto útil.
Aproximadamente 3.292 pessoas votaram 45 para prefeito.
obs.: Para este trabalho, utilizamos linguagem python.
Antes de realizar as comparações, apresentamos alguns números,
# Step 1: Connect to the SQLite database
= sqlite3.connect('election.db') # Replace with your database name
conn
try:
# Step 2: Read data from the 'users' table into a DataFrame
= "SELECT * FROM users" # You can modify this SQL query as needed
query = pd.read_sql_query(query, conn)
df
except Exception as e:
print(f"An error occurred: {e}")
finally:
# Step 4: Close the connection
conn.close()
# Load DataFrame and filter out unwanted 'tipo' values
= df[~df['tipo'].isin(['nulo', 'branco'])]
df
# Convert 'numero' to numeric, fill NaN with 0, and cast to int
'numero'] = pd.to_numeric(df['numero'], errors='coerce').fillna(0).astype(int)
df[
# Assign 'cargo' based on conditions
'cargo'] = np.where((df['tipo'] == 'legenda') | (df['numero'] > 100), 'Vereador', 'Prefeito')
df[
# Calculate 'n_partido' based on 'cargo' and 'tipo'
'n_partido'] = np.where((df['cargo'] != 'Vereador') | (df['tipo'] == 'legenda'), df['numero'], df['numero'] // 1000)
df[
# Load and clean 'partidos' DataFrame
= pd.read_excel('partidos.xlsx')
partidos = partidos.iloc[:, [1, 5, 6]].rename(columns={partidos.columns[5]: 'n_partido'}).dropna()
partidos
# Convert 'n_partido' in 'partidos' to int and then to str
'n_partido'] = partidos['n_partido'].astype(int).astype(str)
partidos[
# Convert 'n_partido' in 'df' to str
'n_partido'] = df['n_partido'].astype(str)
df[
# Merge DataFrames
= df.merge(partidos, on='n_partido', how='left') merged_df
Prefeito
Os números absolutos para prefeito apresentam uma diferença mínima em relação aos resultados oficiais divulgados, mas essa variação não compromete a análise realizada.
count | percentagem | |
---|---|---|
numero | ||
44 | 233582 | 52.25 |
13 | 192990 | 43.17 |
25 | 9820 | 2.20 |
30 | 6033 | 1.35 |
50 | 2309 | 0.52 |
80 | 838 | 0.19 |
16 | 631 | 0.14 |
29 | 522 | 0.12 |
33 | 211 | 0.05 |
0 | 93 | 0.02 |
Vereador
Os número mais votados para vereador acima de 6 mil votos.
count | percentagem | |
---|---|---|
numero | ||
55000 | 8909 | 1.96 |
12123 | 7752 | 1.70 |
25123 | 7709 | 1.69 |
15110 | 7663 | 1.68 |
25111 | 7362 | 1.62 |
10000 | 6534 | 1.44 |
25888 | 6529 | 1.43 |
13223 | 6436 | 1.41 |
77888 | 6341 | 1.39 |
13222 | 6259 | 1.37 |
13555 | 6171 | 1.36 |
Votos para Partidos no cargo de Vereador
- O percentual de votos para vereador, considerando apenas os votos na legenda, mostra que o PT foi o partido mais votado, com 17,67% dos votos.
count | percentagem | |
---|---|---|
SIGLA | ||
PT | 79367 | 17.67 |
PRD | 56945 | 12.68 |
PDT | 44747 | 9.96 |
MDB | 42140 | 9.38 |
PP | 38375 | 8.55 |
PSB | 26148 | 5.82 |
PSD | 26065 | 5.80 |
UNIÃO | 21992 | 4.90 |
AVANTE | 20545 | 4.57 |
PODE | 19713 | 4.39 |
SOLIDARIEDADE | 19564 | 4.36 |
PL | 17676 | 3.94 |
REPUBLICANOS | 13488 | 3.00 |
PV | 10154 | 2.26 |
AGIR | 3617 | 0.81 |
PSOL | 2617 | 0.58 |
NOVO | 1728 | 0.38 |
PCdoB | 1308 | 0.29 |
CIDADANIA | 972 | 0.22 |
DC | 794 | 0.18 |
PSDB | 575 | 0.13 |
PSTU | 284 | 0.06 |
UP | 275 | 0.06 |
Coligações no Cargo de Vereador
Nos votos considerando as coligações para o cargo de vereador há um ponto interessante: a coligação comandada pelo PT ganhou com ampla vantagem, com 61,27% votos, enquanto a chapa que teve êxito na marjotitária teve um resultado bem distante com 16,45% dos votos.
count | percentagem | |
---|---|---|
Coligação | ||
Juntos por Teresina | 275164 | 61.27 |
Fazemos Mais com o Povo | 95166 | 21.19 |
Teresina no Caminho Certo | 73855 | 16.45 |
Não coligado | 4904 | 1.09 |
Diferença Percentual entre de Votos da Coligação para Prefeito por Zona
A votação é secreta, o que impede a análise do voto conjunto de cada eleitor. Portanto, utilizaremos a totalidade de votos por legenda tanto vereador quanto para prefeito a fim de comparar os resultados e identificar possíveis mudanças, impossibilitando o voto casado.
Os resultados mostram que as coligações Fazemos Mais com o Povo, do Dr. Pessoa, e Juntos por Teresina perderam votos para prefeito em todas as zonas da cidade em relação ao voto para vereador, com uma queda entre 3% e 4%. Por outro lado, a coligação Teresina no Caminho Certo ganhou na média 7%, indicando uma transferência de votos e a não realização do voto casado.
Por exemplo, a coligação Juntos por Teresina perdeu quase 20 mil votos na zona 001, enquanto na zona 0063, a coligação Teresina no Caminho Certo obteve um ganho de 33 mil votos.
Coligação | zona | counts_x | percentage vereador | counts_y | percentage prefeito | Diferença Percentual | |
---|---|---|---|---|---|---|---|
0 | Fazemos Mais com o Povo | 0001 | 19151 | 4.264 | 2223 | 0.497 | -3.767 |
1 | Fazemos Mais com o Povo | 0002 | 20570 | 4.580 | 2238 | 0.501 | -4.079 |
2 | Fazemos Mais com o Povo | 0063 | 19892 | 4.429 | 2000 | 0.447 | -3.982 |
3 | Fazemos Mais com o Povo | 0097 | 17111 | 3.810 | 1720 | 0.385 | -3.425 |
4 | Fazemos Mais com o Povo | 0098 | 18442 | 4.107 | 1639 | 0.367 | -3.740 |
5 | Juntos por Teresina | 0001 | 59026 | 13.143 | 40722 | 9.111 | -4.032 |
6 | Juntos por Teresina | 0002 | 51993 | 11.577 | 36305 | 8.123 | -3.454 |
7 | Juntos por Teresina | 0063 | 54392 | 12.112 | 37124 | 8.306 | -3.806 |
8 | Juntos por Teresina | 0097 | 48020 | 10.693 | 34557 | 7.732 | -2.961 |
9 | Juntos por Teresina | 0098 | 61733 | 13.746 | 44282 | 9.908 | -3.838 |
10 | Não coligado | 0001 | 729 | 0.162 | 1751 | 0.392 | 0.230 |
11 | Não coligado | 0002 | 1169 | 0.260 | 2327 | 0.521 | 0.261 |
12 | Não coligado | 0063 | 708 | 0.158 | 1968 | 0.440 | 0.282 |
13 | Não coligado | 0097 | 943 | 0.210 | 1978 | 0.443 | 0.233 |
14 | Não coligado | 0098 | 1355 | 0.302 | 2520 | 0.564 | 0.262 |
15 | Teresina no Caminho Certo | 0001 | 13738 | 3.059 | 46998 | 10.516 | 7.457 |
16 | Teresina no Caminho Certo | 0002 | 15371 | 3.423 | 47854 | 10.707 | 7.284 |
17 | Teresina no Caminho Certo | 0063 | 12140 | 2.703 | 45588 | 10.200 | 7.497 |
18 | Teresina no Caminho Certo | 0097 | 15094 | 3.361 | 42811 | 9.579 | 6.218 |
19 | Teresina no Caminho Certo | 0098 | 17512 | 3.899 | 50331 | 11.261 | 7.362 |
Diferença de Votos da Coligação para Prefeito por Seção
Diferença da Coligação Juntos por Teresina
Pelos votos por seção, a coligação liderada pelo PT teve uma perda média de 50 votos, com 75% das seções apresentando uma perde de 40 votos. Esses números são bastante significativos e, certamente, influenciaram o resultado da eleição majoritária.
= df_combined[df_combined['Coligação'] =='Juntos por Teresina']
df_juntos 'Diferença votos'].describe().round(3) df_juntos[
count 1657.000
mean -49.592
std 18.781
min -106.000
25% -62.000
50% -51.000
75% -40.000
max 29.000
Name: Diferença votos, dtype: float64
# Create the histogram
=(10, 6))
plt.figure(figsize'Diferença votos'], bins=30, color='red', edgecolor='black', alpha=0.7)
plt.hist(df_juntos[
# Add titles and labels
'Histograma of Diferença votos')
plt.title('Diferença votos')
plt.xlabel('Frequencia')
plt.ylabel(
# Show grid for better readability
True)
plt.grid(
# Display the plot
plt.show()
Diferença da Coligação Teresina no Caminho Certo
A coligação Teresina no Caminho Certo conseguiu aumentar o número de votos em todas as seções, com um mínimo de 5 votos e um acréscimo máximo de 189 votos em uma seção. A média de aumento foi de 96 votos, e 25% das seções já registraram uma diferença positiva de 83 votos.
= df_combined[df_combined['Coligação'] =='Teresina no Caminho Certo']
df_certo 'Diferença votos'].describe().round(3) df_certo[
count 1657.000
mean 96.395
std 21.391
min 5.000
25% 83.000
50% 97.000
75% 111.000
max 189.000
Name: Diferença votos, dtype: float64
# Create the histogram
=(10, 6))
plt.figure(figsize'Diferença votos'], bins=30, color='blue', edgecolor='black', alpha=0.7)
plt.hist(df_certo[
# Add titles and labels
'Histograma of Diferença votos')
plt.title('Diferença votos')
plt.xlabel('Frequencia')
plt.ylabel(
# Show grid for better readability
True)
plt.grid(
# Display the plot
plt.show()
Votos Partido por Zona
Por último, o PT conseguiu ser o mais votado em todas as zonas de Teresina, mas foi “vítima” da falta de fidelidade à coligação. Os partidos da base do atual prefeito, especialmente o PRD, e os partidos da chapa do PT não conseguiram fidelizar a quantidade de votos necessária para tornar a eleição mais competitiva. Com a transferência de votos, a chapa de Silvio Mendes obteve 2% a mais do que o necessário para vencer a eleição no primeiro turno.
= merged_df[merged_df['cargo'] == 'Vereador'].groupby(['zona', 'SIGLA']).size().reset_index(name='counts').sort_values(by='counts', ascending=False)
df_partido 'counts']> 5000] df_partido[df_partido[
zona | SIGLA | counts | |
---|---|---|---|
109 | 0098 | PT | 17729 |
86 | 0097 | PT | 15781 |
40 | 0002 | PT | 15701 |
17 | 0001 | PT | 15238 |
63 | 0063 | PT | 14918 |
34 | 0002 | PRD | 12775 |
7 | 0001 | PDT | 12294 |
57 | 0063 | PRD | 12233 |
11 | 0001 | PRD | 11814 |
80 | 0097 | PRD | 10418 |
96 | 0098 | MDB | 10356 |
102 | 0098 | PP | 9845 |
103 | 0098 | PRD | 9705 |
4 | 0001 | MDB | 9434 |
30 | 0002 | PDT | 9140 |
50 | 0063 | MDB | 8806 |
99 | 0098 | PDT | 8662 |
105 | 0098 | PSD | 8142 |
10 | 0001 | PP | 8075 |
33 | 0002 | PP | 7573 |
53 | 0063 | PDT | 7473 |
27 | 0002 | MDB | 7213 |
76 | 0097 | PDT | 7178 |
58 | 0063 | PSB | 6747 |
56 | 0063 | PP | 6466 |
79 | 0097 | PP | 6416 |
73 | 0097 | MDB | 6331 |
90 | 0097 | UNIÃO | 5934 |
13 | 0001 | PSD | 5870 |
12 | 0001 | PSB | 5594 |
66 | 0063 | SOLIDARIEDADE | 5388 |
35 | 0002 | PSB | 5295 |
101 | 0098 | PODE | 5089 |
Correlação
Uma forma de medir a relação entre os votos de vereador e prefeito considerando as coligações consiste na correlação linear que é uma medida estatística que indica o grau de relacionamento entre duas variáveis. Quando se diz que duas variáveis têm uma correlação linear, significa que existe uma relação direta entre elas, onde uma varia de maneira proporcional à outra. Esse relacionamento é representado por um coeficiente de correlação, que varia de -1 a 1. Um valor de 1 indica uma correlação positiva perfeita, onde o aumento de uma variável está associado ao aumento da outra. Um valor de -1 indica uma correlação negativa perfeita, onde o aumento de uma variável está associado à diminuição da outra. Já um valor de 0 sugere que não há nenhuma relação linear entre as variáveis.
A correlação realizada entre os votos de prefeito e vereador nas três coligações revelou algumas tendências. Observou-se uma boa correlação nas chapas “Juntos por Teresina” e “Teresina no Caminho Certo”, o que indica que os eleitores dessas coligações tendem, aparatemente, a votar de forma consistente tanto para prefeito quanto para vereador, mostrando uma maior fidelidade entre os candidatos das mesmas chapas.
Por outro lado, um problema identificado na análise foi a incapacidade de captar a perda de votos da chapa de Fábio Novo. Embora a correlação alta sugira uma relação forte entre os votos para vereador e para prefeito, a diminuição nos votos de Fábio Novo não foi refletida adequadamente. Isso significa que a análise não conseguiu evidenciar a perda de votos que ocorreu. Essa situação destaca a importância de considerar não apenas a correlação, mas também a dinâmica de perda e ganho de votos, para obter uma compreensão mais completa do comportamento eleitoral e da fidelidade dos eleitores em relação às diferentes chapas.
A coligação “Teresina no Caminho Certo” apresentou valores negativos de correlação com as outras coligações, o que sugere uma lealdade e aponta para eleitores que dificilmente migraram para outras opções. Por outro lado, a chapa “Fazemos Mais com o Povo” mostrou uma divisão dos votos, sugerindo que seus eleitores distribuíram seus votos de forma menos alinhada entre prefeito e vereador, o que pode indicar uma menor coesão entre os candidatos dessa coligação.
# Calculate correlations between groups and positions, stored in a dictionary
= {
correlations 'Juntos por Teresina - Vereador': {
'Juntos Prefeito': value_correlation(df_junto_secao_vereador, df_junto_secao_prefeito),
'Certo Prefeito': value_correlation(df_junto_secao_vereador, df_certo_secao_prefeito),
'Povo Prefeito': value_correlation(df_junto_secao_vereador, df_povo_secao_prefeito)
},'Teresina no Caminho Certo - Vereador': {
'Juntos Prefeito': value_correlation(df_certo_secao_vereador, df_junto_secao_prefeito),
'Certo Prefeito': value_correlation(df_certo_secao_vereador, df_certo_secao_prefeito),
'Povo Prefeito': value_correlation(df_certo_secao_vereador, df_povo_secao_prefeito)
},'Fazemos Mais com o Povo - Vereador': {
'Juntos Prefeito': value_correlation(df_povo_secao_vereador, df_junto_secao_prefeito),
'Certo Prefeito': value_correlation(df_povo_secao_vereador, df_certo_secao_prefeito),
'Povo Prefeito': value_correlation(df_povo_secao_vereador, df_povo_secao_prefeito)
}
}
# Convert the correlation results into a 3x3 DataFrame
= pd.DataFrame(correlations)
df_correlation_matrix = df_correlation_matrix.T # Transpose to fit the 3x3 format
df_correlation_matrix
# Display the DataFrame
df_correlation_matrix
Juntos Prefeito | Certo Prefeito | Povo Prefeito | |
---|---|---|---|
Juntos por Teresina - Vereador | 0.826 | 0.342 | 0.124 |
Teresina no Caminho Certo - Vereador | -0.140 | 0.720 | -0.083 |
Fazemos Mais com o Povo - Vereador | 0.399 | 0.330 | 0.471 |
Análise por Regressão Poisson
A regressão de Poisson é uma técnica estatística utilizada para modelar dados de contagem, isto é, situações em que o valor da variável dependente representa o número de vezes que um evento ocorre dentro de um determinado período, espaço ou condição. Diferente da regressão linear, em que os valores preditos podem ser qualquer número real, a regressão de Poisson se concentra em variáveis dependentes que assumem valores inteiros não negativos (0, 1, 2, …), refletindo contagens como, por exemplo, número de votos numa eleição.
A fórmula base da regressão de Poisson assume que o logaritmo natural da média da contagem (\(\lambda\)) é uma função linear dos parâmetros do modelo. Isso significa que, para cada unidade de incremento nas variáveis independentes, a taxa de ocorrência do evento muda exponencialmente, permitindo interpretações multiplicativas. O modelo também faz algumas suposições: (1) as contagens devem ser independentes, (2) a média deve ser aproximadamente igual à variância (equidispersão) e (3) as variáveis independentes devem ter uma relação linear com o logaritmo da taxa de contagem.
= merged_df[merged_df['cargo'] == 'Vereador'].groupby(['zona','secao', 'Coligação']).size().reset_index(name='n')
df_vot_vereador_secao = df_vot_vereador_secao.pivot_table(index=['zona', 'secao'], columns='Coligação', values='n', fill_value=0).reset_index()
df_vot_vereador_secao
= merged_df[merged_df['cargo'] == 'Prefeito'].groupby(['zona','secao', 'Coligação']).size().reset_index(name='n')
df_vot_prefeito_secao = df_vot_prefeito_secao.pivot_table(index=['zona', 'secao'], columns='Coligação', values='n', fill_value=0).reset_index()
df_vot_prefeito_secao = pd.merge(df_vot_vereador_secao, df_vot_prefeito_secao, on=['zona', 'secao'], suffixes=('_vereador', '_prefeito')) df_pivot_prefeito_vereador
A interpretação dos coeficientes na regressão de Poisson é um ponto essencial para entender como as variáveis independentes influenciam a variável dependente em um modelo de contagem. cada coeficiente \(\beta\) reflete o efeito multiplicativo que uma unidade de aumento na variável independente correspondente terá na taxa de contagem da variável dependente.
Coeficiente positivo (\(\beta_{i} > 0\)): Um coeficiente positivo para uma variável \(x_{i}\) sugere que, conforme essa variável aumenta, a taxa de eventos também aumenta.
Coeficiente negativo (\(\beta_{i} < 0\): Um coeficiente negativo indica uma relação inversa entre XiX_iXi e a taxa de eventos. Isso significa que, à medida que XiX_iXi aumenta, a taxa de eventos diminui.
Coeficiente nulo (\(\beta_{i} = 0\)): Se um coeficiente é igual a zero, isso significa que a variável independente correspondente não influencia a taxa de eventos.
Assim, a regressão de Poisson pode ser uma ferramenta eficaz para entender a relação entre o número de votos recebidos pelas coligações para o cargo de prefeito e o número de votos para vereadores.
# Define the independent variables (features)
= df_pivot_prefeito_vereador[['Fazemos Mais com o Povo_vereador',
X 'Juntos por Teresina_vereador',
'Não coligado_vereador',
'Teresina no Caminho Certo_vereador']]
# Add a constant for the intercept term
= sm.add_constant(X)
X
# Define the dependent variables (targets)
= {
targets 'Fazemos Mais com o Povo_prefeito': df_pivot_prefeito_vereador['Fazemos Mais com o Povo_prefeito'],
'Juntos por Teresina_prefeito': df_pivot_prefeito_vereador['Juntos por Teresina_prefeito'],
'Teresina no Caminho Certo_prefeito': df_pivot_prefeito_vereador['Teresina no Caminho Certo_prefeito']
}
# Create an empty DataFrame to store coefficients
= pd.DataFrame(columns=['Target', 'Variable', 'Coefficient', 'Exp(Coefficient)'])
coef_table
# Loop through targets
for target_name, y in targets.items():
# Define and fit the Poisson regression model
= sm.GLM(y, X, family=sm.families.Poisson())
model = model.fit()
result
# Calculate the exponentiated coefficients
= np.exp(result.params)
exp_coefs
print(f"Resumo da Regressão da Coligação: {target_name}")
print(result.summary())
# Prepare rows for the DataFrame
= [{
rows 'Target': target_name,
'Variable': var_name,
'Coefficient': coef,
'Exp(Coefficient)': exp_coef
for var_name, coef, exp_coef in zip(result.params.index, result.params, exp_coefs)]
}
# Use pd.concat to add rows to the coef_table
= pd.concat([coef_table, pd.DataFrame(rows)], ignore_index=True)
coef_table
print("\nExponentiated Coefficients (Incidence Rate Ratios):")
print(exp_coefs)
print("\n" + "\n")
Resumo da Regressão da Coligação: Fazemos Mais com o Povo_prefeito
Generalized Linear Model Regression Results
============================================================================================
Dep. Variable: Fazemos Mais com o Povo_prefeito No. Observations: 1657
Model: GLM Df Residuals: 1652
Model Family: Poisson Df Model: 4
Link Function: Log Scale: 1.0000
Method: IRLS Log-Likelihood: -4084.9
Date: Tue, 29 Oct 2024 Deviance: 2413.9
Time: 10:45:59 Pearson chi2: 2.41e+03
No. Iterations: 4 Pseudo R-squ. (CS): 0.3352
Covariance Type: nonrobust
======================================================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------------------------------
const 0.8876 0.067 13.270 0.000 0.757 1.019
Fazemos Mais com o Povo_vereador 0.0154 0.001 25.678 0.000 0.014 0.017
Juntos por Teresina_vereador 0.0003 0.000 0.919 0.358 -0.000 0.001
Não coligado_vereador -0.0031 0.004 -0.697 0.486 -0.012 0.006
Teresina no Caminho Certo_vereador -0.0014 0.001 -2.016 0.044 -0.003 -3.89e-05
======================================================================================================
Exponentiated Coefficients (Incidence Rate Ratios):
const 2.429350
Fazemos Mais com o Povo_vereador 1.015496
Juntos por Teresina_vereador 1.000293
Não coligado_vereador 0.996874
Teresina no Caminho Certo_vereador 0.998604
dtype: float64
Resumo da Regressão da Coligação: Juntos por Teresina_prefeito
Generalized Linear Model Regression Results
========================================================================================
Dep. Variable: Juntos por Teresina_prefeito No. Observations: 1657
Model: GLM Df Residuals: 1652
Model Family: Poisson Df Model: 4
Link Function: Log Scale: 1.0000
Method: IRLS Log-Likelihood: -7009.0
Date: Tue, 29 Oct 2024 Deviance: 3142.4
Time: 10:45:59 Pearson chi2: 3.16e+03
No. Iterations: 4 Pseudo R-squ. (CS): 0.9958
Covariance Type: nonrobust
======================================================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------------------------------
const 3.6555 0.015 237.564 0.000 3.625 3.686
Fazemos Mais com o Povo_vereador 0.0032 0.000 21.421 0.000 0.003 0.003
Juntos por Teresina_vereador 0.0058 7.1e-05 81.361 0.000 0.006 0.006
Não coligado_vereador -0.0133 0.001 -13.100 0.000 -0.015 -0.011
Teresina no Caminho Certo_vereador -0.0006 0.000 -3.609 0.000 -0.001 -0.000
======================================================================================================
Exponentiated Coefficients (Incidence Rate Ratios):
const 38.688339
Fazemos Mais com o Povo_vereador 1.003211
Juntos por Teresina_vereador 1.005793
Não coligado_vereador 0.986771
Teresina no Caminho Certo_vereador 0.999427
dtype: float64
Resumo da Regressão da Coligação: Teresina no Caminho Certo_prefeito
Generalized Linear Model Regression Results
==============================================================================================
Dep. Variable: Teresina no Caminho Certo_prefeito No. Observations: 1657
Model: GLM Df Residuals: 1652
Model Family: Poisson Df Model: 4
Link Function: Log Scale: 1.0000
Method: IRLS Log-Likelihood: -7162.5
Date: Tue, 29 Oct 2024 Deviance: 3119.9
Time: 10:45:59 Pearson chi2: 3.00e+03
No. Iterations: 4 Pseudo R-squ. (CS): 0.9907
Covariance Type: nonrobust
======================================================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------------------------------
const 3.9602 0.014 285.350 0.000 3.933 3.987
Fazemos Mais com o Povo_vereador 0.0038 0.000 27.030 0.000 0.004 0.004
Juntos por Teresina_vereador 0.0022 6.67e-05 32.852 0.000 0.002 0.002
Não coligado_vereador 0.0147 0.001 17.484 0.000 0.013 0.016
Teresina no Caminho Certo_vereador 0.0077 0.000 58.508 0.000 0.007 0.008
======================================================================================================
Exponentiated Coefficients (Incidence Rate Ratios):
const 52.468176
Fazemos Mais com o Povo_vereador 1.003835
Juntos por Teresina_vereador 1.002194
Não coligado_vereador 1.014849
Teresina no Caminho Certo_vereador 1.007760
dtype: float64
Dos modelos criados, a chapa do atual prefeito apresentou problemas de significância no valor da constante ou intercepto, ela representa o valor da variável dependente quando todas as variáveis independentes (ou preditoras) são iguais a zero, (parece que nem o modelo acreditou nos poucos votos que o candidato teve). Entretanto, comentaremos diferença entre os modelos da chapa de Novo e Silvio.
Os resultados dos coeficientes apresentam pouca variação entre os concorrentes, resultando em valores baixos e percentagens próximas a 1%. Isso significa que cada voto na chapa de vereador contribui para um aumento de aproximadamente 1% nos votos da chapa para prefeito. O diferencial se encontra no valor da constante: enquanto a chapa de Novo apresenta um valor mínimo de 38,68, Silvio alcança 52,46 votos. Esse resultado indica uma base de apoio muito mais robusta para a chapa vencedora, o que foi fundamental para o sucesso no pleito.
Análise espacial
A análise geográfica dos votos é fundamental para compreender melhor os padrões eleitorais e as dinâmicas políticas de um país ou região. Ao mapear a distribuição dos votos, é possível identificar tendências locais, preferências políticas específicas e as influências culturais, socioeconômicas ou demográficas que afetam o comportamento dos eleitores.
Localicação - PT
Ao analisar os dados de votação de Silvio Mendes e Fábio Novo, observa-se um padrão semelhante de concentração de votos. No entanto, o mapa referente à coligação “Teresina no Caminho Certo” revela uma maior diversificação espacial em comparação com a coligação “Juntos por Teresina”. Essa diversificação é evidenciada pela presença de áreas vermelhas nas zonas norte e leste da cidade. No outro lado, há uma concentração mais marcada de votos nas zonas sul e sudeste, refletindo um comportamento eleitoral mais concentrado nessas regiões.
= folium.Map(location=[-5.0811, -42.743], zoom_start=12)
hmap
# Read the municipality data
= geobr.read_municipality(code_muni=2211001)
municipality = 'epsg:4674'
municipality.crs
# Ensure latitude and longitude columns are of float type
= vot_secao.astype({'LATITUDE': 'float', 'LONGITUDE': 'float'})
vot_secao
# Prepare the heat map data by aggregating frequency
= (
heat_data 'LATITUDE', 'LONGITUDE'])['voto_pt']
vot_secao.groupby([sum()
.
.reset_index()
)
# Convert to list of tuples for heat map
= list(zip(heat_data.LATITUDE, heat_data.LONGITUDE, heat_data.voto_pt))
heat_data
# Create the heat map with specified parameters
= HeatMap(
heat_map
heat_data,=0.05,
min_opacity=20,
radius=10,
blur=2
max_zoom
)
# Add the municipality GeoJson layer to the map
#folium.GeoJson(municipality).add_to(hmap)
# Add the heat map layer to the map
# hmap.add_child(heat_map)
Localização - UNIÃO
= folium.Map(location=[-5.0811, -42.743], zoom_start=12)
hmap
# Read the municipality data
= geobr.read_municipality(code_muni=2211001)
municipality = 'epsg:4674'
municipality.crs
# Ensure latitude and longitude columns are of float type
= vot_secao.astype({'LATITUDE': 'float', 'LONGITUDE': 'float'})
vot_secao
# Convert to list of tuples for heat map
= list(zip(vot_secao.LATITUDE, vot_secao.LONGITUDE, vot_secao.voto_uniao))
heat_data
# Create the heat map with specified parameters
= HeatMap(
heat_map
heat_data,=0.05,
min_opacity=20,
radius=10,
blur=2
max_zoom
)
#Add the municipality GeoJson layer to the map
#folium.GeoJson(municipality).add_to(hmap)
#Add the heat map layer to the map
#hmap.add_child(heat_map)
Localização - Diferença
Uma maneira eficaz de comparar os resultados eleitorais é subtrair os votos de seção entre Silvio Mendes e Fábio Novo, o que revela as áreas onde houve maior vantagem para a coligação “Teresina no Caminho Certo”. Os resultados indicam que a zona leste foi o local onde Silvio Mendes obteve sua maior vantagem, com uma leve superioridade também nas zonas norte e central.
= folium.Map(location=[-5.0811, -42.743], zoom_start=12)
hmap
# Read the municipality data
= geobr.read_municipality(code_muni=2211001)
municipality = 'epsg:4674'
municipality.crs
# Ensure latitude and longitude columns are of float type
= vot_secao.astype({'LATITUDE': 'float', 'LONGITUDE': 'float'})
vot_secao
# Convert to list of tuples for heat map
= list(zip(vot_secao.LATITUDE, vot_secao.LONGITUDE, vot_secao.Diferença))
heat_data
# Create the heat map with specified parameters
= HeatMap(
heat_map
heat_data,=0.05,
min_opacity=20,
radius=10,
blur=2
max_zoom
)
# Add the municipality GeoJson layer to the map
#folium.GeoJson(municipality).add_to(hmap)
# Add the heat map layer to the map
#hmap.add_child(heat_map)