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:

obs.: Para este trabalho, utilizamos linguagem python.

Antes de realizar as comparações, apresentamos alguns números,

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
pd.set_option('display.max_rows', None)
# Step 1: Connect to the SQLite database
conn = sqlite3.connect('election.db')  # Replace with your database name

try:
    # Step 2: Read data from the 'users' table into a DataFrame
    query = "SELECT * FROM users"  # You can modify this SQL query as needed
    df = pd.read_sql_query(query, conn)

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[~df['tipo'].isin(['nulo', 'branco'])]

# Convert 'numero' to numeric, fill NaN with 0, and cast to int
df['numero'] = pd.to_numeric(df['numero'], errors='coerce').fillna(0).astype(int)

# Assign 'cargo' based on conditions
df['cargo'] = np.where((df['tipo'] == 'legenda') | (df['numero'] > 100), 'Vereador', 'Prefeito')

# Calculate 'n_partido' based on 'cargo' and 'tipo'
df['n_partido'] = np.where((df['cargo'] != 'Vereador') | (df['tipo'] == 'legenda'), df['numero'], df['numero'] // 1000)

# Load and clean 'partidos' DataFrame
partidos = pd.read_excel('partidos.xlsx')
partidos = partidos.iloc[:, [1, 5, 6]].rename(columns={partidos.columns[5]: 'n_partido'}).dropna()

# Convert 'n_partido' in 'partidos' to int and then to str
partidos['n_partido'] = partidos['n_partido'].astype(int).astype(str)

# Convert 'n_partido' in 'df' to str
df['n_partido'] = df['n_partido'].astype(str)

# Merge DataFrames
merged_df = df.merge(partidos, on='n_partido', how='left')

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_juntos = df_combined[df_combined['Coligação'] =='Juntos por Teresina']
df_juntos['Diferença votos'].describe().round(3)
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
plt.figure(figsize=(10, 6))
plt.hist(df_juntos['Diferença votos'], bins=30, color='red', edgecolor='black', alpha=0.7)

# Add titles and labels
plt.title('Histograma of Diferença votos')
plt.xlabel('Diferença votos')
plt.ylabel('Frequencia')

# Show grid for better readability
plt.grid(True)

# 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_certo = df_combined[df_combined['Coligação'] =='Teresina no Caminho Certo']
df_certo['Diferença votos'].describe().round(3)
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
plt.figure(figsize=(10, 6))
plt.hist(df_certo['Diferença votos'], bins=30, color='blue', edgecolor='black', alpha=0.7)

# Add titles and labels
plt.title('Histograma of Diferença votos')
plt.xlabel('Diferença votos')
plt.ylabel('Frequencia')

# Show grid for better readability
plt.grid(True)

# 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.

df_partido = merged_df[merged_df['cargo'] == 'Vereador'].groupby(['zona', 'SIGLA']).size().reset_index(name='counts').sort_values(by='counts', ascending=False)
df_partido[df_partido['counts']> 5000]
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
df_correlation_matrix = pd.DataFrame(correlations)
df_correlation_matrix = df_correlation_matrix.T  # Transpose to fit the 3x3 format

# 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.

df_vot_vereador_secao = 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_prefeito_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_pivot_prefeito_vereador = pd.merge(df_vot_vereador_secao, df_vot_prefeito_secao, on=['zona', 'secao'], suffixes=('_vereador', '_prefeito'))

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)
X = df_pivot_prefeito_vereador[['Fazemos Mais com o Povo_vereador', 
                                  'Juntos por Teresina_vereador', 
                                  'Não coligado_vereador', 
                                  'Teresina no Caminho Certo_vereador']]

# Add a constant for the intercept term
X = sm.add_constant(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
coef_table = pd.DataFrame(columns=['Target', 'Variable', 'Coefficient', 'Exp(Coefficient)'])

# Loop through targets
for target_name, y in targets.items():
    # Define and fit the Poisson regression model
    model = sm.GLM(y, X, family=sm.families.Poisson())
    result = model.fit()
    
    # Calculate the exponentiated coefficients
    exp_coefs = np.exp(result.params)
    
    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
    coef_table = pd.concat([coef_table, pd.DataFrame(rows)], ignore_index=True)
    
    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.

hmap = folium.Map(location=[-5.0811, -42.743], zoom_start=12)

# Read the municipality data
municipality = geobr.read_municipality(code_muni=2211001)
municipality.crs = 'epsg:4674'

# Ensure latitude and longitude columns are of float type
vot_secao = vot_secao.astype({'LATITUDE': 'float', 'LONGITUDE': 'float'})

# Prepare the heat map data by aggregating frequency
heat_data = (
    vot_secao.groupby(['LATITUDE', 'LONGITUDE'])['voto_pt']
    .sum()
    .reset_index()
)

# Convert to list of tuples for heat map
heat_data = list(zip(heat_data.LATITUDE, heat_data.LONGITUDE, heat_data.voto_pt))

# Create the heat map with specified parameters
heat_map = HeatMap(
    heat_data,
    min_opacity=0.05,
    radius=20,
    blur=10,
    max_zoom=2
)

# 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)

Votos Fábio Novo

Localização - UNIÃO

hmap = folium.Map(location=[-5.0811, -42.743], zoom_start=12)

# Read the municipality data
municipality = geobr.read_municipality(code_muni=2211001)
municipality.crs = 'epsg:4674'

# Ensure latitude and longitude columns are of float type
vot_secao = vot_secao.astype({'LATITUDE': 'float', 'LONGITUDE': 'float'})

# Convert to list of tuples for heat map
heat_data = list(zip(vot_secao.LATITUDE, vot_secao.LONGITUDE, vot_secao.voto_uniao))

# Create the heat map with specified parameters
heat_map = HeatMap(
    heat_data,
    min_opacity=0.05,
    radius=20,
    blur=10,
    max_zoom=2
)

#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)

Votos Silvio Mendes

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.

hmap = folium.Map(location=[-5.0811, -42.743], zoom_start=12)

# Read the municipality data
municipality = geobr.read_municipality(code_muni=2211001)
municipality.crs = 'epsg:4674'

# Ensure latitude and longitude columns are of float type
vot_secao = vot_secao.astype({'LATITUDE': 'float', 'LONGITUDE': 'float'})


# Convert to list of tuples for heat map
heat_data = list(zip(vot_secao.LATITUDE, vot_secao.LONGITUDE, vot_secao.Diferença))

# Create the heat map with specified parameters
heat_map = HeatMap(
    heat_data,
    min_opacity=0.05,
    radius=20,
    blur=10,
    max_zoom=2
)

# 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)

Diferenças de votos