1 Configurações

Algumas configurações para os chunks posteriores e coloração dos gráficos:

knitr::opts_chunk$set(echo = TRUE, 
                      message = FALSE, 
                      warning = FALSE, 
                      fig.width = 8, 
                      fig.height = 6, 
                      fig.align = 'center', 
                      fig.cap = 'Figura: {#label}', 
                      dev = "svg",
                      encoding = 'latin1')

Sys.setlocale(locale = "pt_BR.UTF-8")
## [1] "LC_COLLATE=pt_BR.UTF-8;LC_CTYPE=pt_BR.UTF-8;LC_MONETARY=pt_BR.UTF-8;LC_NUMERIC=C;LC_TIME=pt_BR.UTF-8"
cores <- c('TARCISIO GOMES DE FREITAS' = '#4047ad',
           'FERNANDO HADDAD' = '#802d34',
           'RODRIGO GARCIA' = '#17330e',
           'VOTO BRANCO' = '#242222',
           'VOTO NULO' = '#141414',
           'OUTROS' = '#333030')

2 Contexto

Pedi para o chat GPT me fazer algumas perguntas sobre os dados da eleição para governador de São Paulo, de 2022. Ele formulou as seguintes questões:

1 - Qual foi o número total de eleitores que foram votar em São Paulo nas eleições estaduais para governador de 2022?

2 - Quantos candidatos concorreram ao cargo de governador em São Paulo?

3 - Qual foi a porcentagem de votos válidos recebidos pelo candidato eleito?

4 - Qual foi a porcentagem de abstenção nas eleições estaduais de São Paulo para governador?

5 - Quantos votos nulos e brancos foram registrados em São Paulo na eleição?

6 - Quais foram as principais cidades em São Paulo onde o candidato eleito obteve maior votação?

7 - Qual foi a diferença de votos entre o primeiro e o segundo colocado na eleição para governador em São Paulo?

Para responder as perguntas, pegaremos os dados oficiais do site do TSE e realizaremos as tratativas necessárias para chegar aos números desejados, e para a leitura, manipulação e visualização vamos utilizar alguns pacotes do R:

library("tidyverse")
library("geobr")
library("readxl")
library("abjutils")
library('stringr')

3 Coleta e tratamento

Primeiro baixamos o csv dos dados brutos no site do portal de dados abertos do TSE: dados.

Depois usaremos a função read.csv2 para realizar a leitura dos dados, importante utilizar o argumento fileEncoding devido a acentuação contida no nome dos munícipios e dos candidatos.

E depois realizaremos alguns filtros para selecionar apenas os dados referentes ao primeiro turno e a votação para governador.

## coleta de dados

dados_votacao_sp <- read.csv2("~/Consultas/Outros/eleicao/votacao_secao_2022_SP.csv", 
                              fileEncoding = "latin1")

Agora que estamos com os dados brutos vamos começar a realizar as primeiras tratativas. Assim, primeiro pegaremos apenas os dados referentes ao primeiro turno e apenas para o cargo de governador. O código a seguir filtra os dados da votação com as nossas necessidades e os coloca no objeto data1.

Logo depois, nos objetos votes_x_percent e valid_votes, somamos os votos por candidato e não por municípios para chegarmos as primeiras respostas:

## cria a tabela correta

data1 <- # cria o objeto data1
  dados_votacao_sp %>%
  filter(DS_CARGO == 'GOVERNADOR', #filtra o cargo para governador
         NR_TURNO == "1") %>% #filtra apenas o primeiro turno
  select(NM_VOTAVEL, NM_MUNICIPIO, QT_VOTOS) #seleciona apenas as colunas referentes ao nome, municipio e quantidade de votos

## Somar por candidato

votes_x_percent <-
  data1 %>% 
  select(NM_VOTAVEL, QT_VOTOS) %>% #seleciona apenas o nome e a quantidade de votos
  group_by(NM_VOTAVEL) %>% # cria um grupo por nome de candidato
  summarise(sum(QT_VOTOS)) %>% # cria um sumário com a soma dos votos por candidato
  rename(votos = "sum(QT_VOTOS)") %>%
  rename(candidato = "NM_VOTAVEL") %>%
  mutate(percentual = round(votos/sum(votos)*100, 2)) %>% #cria uma outra coluna com o percentual de votos dos candidatos
  arrange(desc(votos))

## Somar os votos válidos (excluindo votos brancos e nulos)

valid_votes <-
  data1 %>%
  select(NM_VOTAVEL, QT_VOTOS) %>%
  group_by(NM_VOTAVEL) %>%
  summarise(sum(QT_VOTOS)) %>%
  rename(votos = "sum(QT_VOTOS)") %>%
  rename(candidato = "NM_VOTAVEL") %>%
  filter(candidato != "VOTO NULO" &
           candidato != "VOTO BRANCO") %>%
  mutate(percentual = round(votos/sum(votos)*100, 2)) %>%
  arrange(desc(votos))

Apenas para melhorar a visualização futura, vamos unificar todos os candidatos que tiveram um montante inferior a 2% dos votos em uma coluna chamada de “outros”.

## Tabela de unificacao dos outros candidatos

primeiros_candidatos <- head(votes_x_percent, 5) #filtra os 5 primeiros registros

outros_candidatos <- 
  votes_x_percent %>%
  tail(7) %>% #filtra os 7 ultimos registros
  summarise(candidato = 'OUTROS', #cria o nome Outros
            votos = sum(votos), #soma os 7 ultimos registros de votacao
            percentual = sum(percentual)) #soma os percentuais dos 7 ultimos

votos_unificacao1 <-
  rbind(primeiros_candidatos, outros_candidatos) #unifica os 5 primeiros com os 7 ultimos

Agora faremos as mesmas tratativas para os dados do segundo turno:

## segundo turno criamos o objeto data2 para armazenar 

data2 <-
  dados_votacao_sp %>%
  filter(DS_CARGO == 'GOVERNADOR',
         NR_TURNO == "2") %>% #filtro para o numero do turno
  select(NM_VOTAVEL, NM_MUNICIPIO, QT_VOTOS)

## Somar por candidato

votes_x_percent2 <-
  data2 %>%
  select(NM_VOTAVEL, QT_VOTOS) %>%
  group_by(NM_VOTAVEL) %>%
  summarise(sum(QT_VOTOS)) %>%
  rename(votos = "sum(QT_VOTOS)") %>%
  rename(candidato = "NM_VOTAVEL") %>%
  mutate(percentual = round(votos/sum(votos)*100, 2)) %>%
  arrange(desc(votos))

## Somar por candidatos apenas os votos validos

valid_votes2 <-
  data2 %>%
  select(NM_VOTAVEL, QT_VOTOS) %>%
  group_by(NM_VOTAVEL) %>%
  summarise(sum(QT_VOTOS)) %>%
  rename(votos = "sum(QT_VOTOS)") %>%
  rename(candidato = "NM_VOTAVEL") %>%
  filter(candidato != "VOTO NULO" &
           candidato != "VOTO BRANCO") %>%
  mutate(percentual = round(votos/sum(votos)*100, 2)) %>%
  arrange(desc(votos))

Faremos uma separação dos votos válidos para uma das respostas futuras, basicamente usaremos o mesmo código anterior só que com os dados válidos:

## Tabela de unificacao dos outros candidatos

primeiros_candidatos2 <- head(valid_votes, 3) #filtra os 3 primeiros registros

outros_candidatos2 <- 
  valid_votes %>%
  filter(candidato != 'VOTO NULO',
         candidato != 'VOTO BRANCO') %>% #retira os votos de abstencao
  tail(7) %>% #filtra os 7 ultimos registros
  summarise(candidato = 'OUTROS', #cria o nome Outros
            votos = sum(votos), #soma os 7 ultimos registros de votacao
            percentual = sum(percentual)) #soma os percentuais dos 7 ultimos

votos_unificacao2 <-
  rbind(primeiros_candidatos2, outros_candidatos2) #unifica os 5 primeiros com os 7 ultimos

Vamos criar uma visualização de dados em colunas, utilizando o ggplot2:

## graficos de comparacao

## grafico de quantidade absoluta de votos por candidato no primeiro turno

g1 <- 
  votos_unificacao1 %>%
  ggplot()+
  aes(x = reorder(candidato, -votos), y = votos, fill = candidato)+ #seleciona os eixos do grafico
  geom_bar(stat = 'identity')+
  geom_text(aes(label=votos, #cria os labels nas barras
                vjust=1.5),
            color='white',
            fontface='bold')+
  scale_fill_manual(values = cores)+ #seleciona as cores das barras
  labs(x='',
       y='',
       title='Quantidade de votos por candidato (Primeiro Turno)')+
  theme_bw()+
  theme(axis.text.y = element_blank(),
        legend.position = 'none',
        plot.title = element_text(face='bold', 
                                  size=11),
        axis.text.x = element_text(face = 'bold',
                                   size = 8,
                                   color='black'))

## grafico de quantidade percentual de votos por candidato no primeiro turno

g2 <- votos_unificacao1 %>%
  ggplot()+
  aes(x = reorder(candidato, -percentual), y = percentual, fill= candidato)+
  geom_bar(stat = 'identity')+
  geom_text(aes(label=percentual, 
                vjust=1.5),
            color='white',
            fontface='bold')+
  scale_fill_manual(values = cores)+
  labs(x='',
       y='',
       title = 'Percentual de votos por candidato (Primeiro Turno)')+
  theme_bw()+
  theme(axis.text.y = element_blank(),
        legend.position = 'none',
        plot.title = element_text(face='bold', 
                                  size=11),
        axis.text.x = element_text(face = 'bold',
                                   size = 8,
                                   color='black'))

## grafico de quantidade absoluta de votos por candidato no segundo turno

g3 <- 
  votes_x_percent2 %>%
  ggplot()+
  aes(x = reorder(candidato, -votos), y = votos, fill = candidato)+
  geom_bar(stat = 'identity')+
  geom_text(aes(label=votos, 
                vjust=1.5),
            color='white',
            fontface='bold')+
  scale_fill_manual(values = cores)+
  labs(x='',
       y='',
       title = 'Quantidade de votos por candidato (Segundo Turno)')+
  theme_bw()+
  theme(axis.text.y = element_blank(),
        legend.position = 'none',
        plot.title = element_text(face='bold', 
                                  size=11),
        axis.text.x = element_text(face = 'bold',
                                   size = 8,
                                   color='black'))

## grafico de quantidade percentual de votos por candidato no segundo turno

g4 <- 
  votes_x_percent2 %>%
  ggplot()+
  aes(x = reorder(candidato, -percentual), y = percentual, fill = candidato)+
  geom_bar(stat = 'identity')+
  geom_text(aes(label=percentual, 
                vjust=1.5),
            color='white',
            fontface='bold')+
  scale_fill_manual(values = cores)+
  labs(x='',
       y='', 
       title='Percentual de votos por candidato (Segundo Turno)')+
  theme_bw()+
  theme(axis.text.y = element_blank(),
        legend.position = 'none',
        plot.title = element_text(face='bold', 
                                  size=11),
        axis.text.x = element_text(face = 'bold',
                                   size = 8,
                                   color='black'))

Agora podemos criar a visualização conjunta dos votos absolutos do primeiro turno com a função grid arrange:

gridExtra::grid.arrange(g1,g3)
Figura: {#label}

Figura: {#label}

E também a visualização conjunta dos votos percentuais por candidato:

gridExtra::grid.arrange(g2,g4)
Figura: {#label}

Figura: {#label}

Agora com todas as manipulações e visualizações feitas, podemos responder as perguntas:

1 - Qual foi o número total de eleitores que foram votar em São Paulo nas eleições estaduais para governador de 2022?

Para isso, basta somar todas as seções de votação de votação do primeiro turno:

print(sum(votes_x_percent$votos))
## [1] 27147847
print(sum(votes_x_percent2$votos))
## [1] 27341816

Assim, o número total de eleitores que foram as urnas no primeiro turno foi de 27147847 e no segundo turno de 27341816

2 - Quantos candidatos concorreram ao cargo de governador em São Paulo?

Nesse caso, apenas devemos somar a quantidade de nomes únicos na coluna de candidatos do primeiro turno, porém usaremos o objeto com votos válidos, que já desconsidera votos brancos e nulos

print(length(unique(valid_votes$candidato)))
## [1] 10

Assim, chegamos a reposta da segunda questão, onde tinhamos 10 candidatos concorrente para o cargo de governador de São Paulo.

3 - Qual foi a porcentagem de votos válidos recebidos pelo candidato eleito?

Para isso, podemos utilizar os objetos criados anteriormente para votos válidos e apenas criar a visualização de porcentagem:

g5 <- votos_unificacao2 %>%
  ggplot()+
  aes(x = reorder(candidato, -percentual), y = percentual, fill= candidato)+
  geom_bar(stat = 'identity')+
  geom_text(aes(label=percentual, 
                vjust=1.5),
            color='white',
            fontface='bold')+
  scale_fill_manual(values = cores)+
  labs(x='',
       y='',
       title = 'Percentual de votos validos por candidato (Primeiro Turno)')+
  theme_bw()+
  theme(axis.text.y = element_blank(),
        legend.position = 'none',
        plot.title = element_text(face='bold', 
                                  size=11),
        axis.text.x = element_text(face = 'bold',
                                   size = 8,
                                   color='black'))

g6 <-
  valid_votes2 %>%
  ggplot()+
  aes(x = reorder(candidato, -percentual), y = percentual, fill = candidato)+
  geom_bar(stat = 'identity')+
  geom_text(aes(label=percentual, 
                vjust=1.5),
            color='white',
            fontface='bold')+
  scale_fill_manual(values = cores)+
  labs(x='',
       y='', 
       title='Percentual de votos validos por candidato (Segundo Turno)')+
  theme_bw()+
  theme(axis.text.y = element_blank(),
        legend.position = 'none',
        plot.title = element_text(face='bold', 
                                  size=11),
        axis.text.x = element_text(face = 'bold',
                                   size = 8,
                                   color='black'))

E plotar a visualização:

gridExtra::grid.arrange(g5,g6)
Figura: {#label}

Figura: {#label}

Assim, podemos ver que no primeiro turno, o candidato eleito Tarcísio Gomes, teve 42.32% dos votos válidos e no segundo turno 55.27% dos votos válidos. Como podemos ver no gráfico.

4 - Qual foi a porcentagem de abstenção nas eleições estaduais de São Paulo para governador?

Segundo os dados do TSE, São Paulo tem 34667793 eleitores aptos, considerando esse número, teríamos:

print(round(abs(((34667793-27147847)/34667793)*100), 2))
## [1] 21.69
print(round(abs(((34667793-27341816)/34667793)*100), 2))
## [1] 21.13

Assim, a porcentagem de abstenção, pessoas que não compareceram as urnas para votação foi de 21.69% no primeiro turno e levemente menor no segundo, 21.13%.

5 - Quantos votos nulos e brancos foram registrados em São Paulo na eleição?

Quando falamos dos eleitores que compareceram mas que votaram nulo ou branco, podemos observar nos gráficos feitos anteriormente para visualização inicial, sendo:

gridExtra::grid.arrange(g1,g3)
Figura: {#label}

Figura: {#label}

No primeiro turno, 2149776 votos nulos e 1645522 brancos. Já no segundo turno 1849298 nulos e 1102504 brancos.

6 - Quais foram as principais cidades em São Paulo onde o candidato eleito obteve maior votação?

Quando falamos de maior votação, obviamente, os municípios que tem os maiores colégios eleitorais serão aqueles com maior representatividade na votação. Assim, a Região metropolitana de São Paulo mostrará números mais significativos.

Desse modo, vamos criar uma visualização gráfica que compare os municípios em que Tarcisio teve mais votação do que Haddad. Pintaremos esses lugares de azul, e os que ele recebeu menos votos de vermelho. Para criar isso vamos utilizar o pacote geobr:

### grafico de mapas

## puxar estado do geobr

state <- read_municipality(code_muni = 'SP', 
                           year = 2020) %>%
  mutate(muni = toupper(name_muni))
## 
Downloading: 780 B     
Downloading: 780 B     
Downloading: 1.9 kB     
Downloading: 1.9 kB     
Downloading: 2.2 kB     
Downloading: 2.2 kB     
Downloading: 3.2 kB     
Downloading: 3.2 kB     
Downloading: 3.2 kB     
Downloading: 3.2 kB     
Downloading: 3.2 kB     
Downloading: 3.2 kB     
Downloading: 11 kB     
Downloading: 11 kB     
Downloading: 19 kB     
Downloading: 19 kB     
Downloading: 19 kB     
Downloading: 19 kB     
Downloading: 27 kB     
Downloading: 27 kB     
Downloading: 36 kB     
Downloading: 36 kB     
Downloading: 36 kB     
Downloading: 36 kB     
Downloading: 36 kB     
Downloading: 36 kB     
Downloading: 44 kB     
Downloading: 44 kB     
Downloading: 52 kB     
Downloading: 52 kB     
Downloading: 52 kB     
Downloading: 52 kB     
Downloading: 60 kB     
Downloading: 60 kB     
Downloading: 60 kB     
Downloading: 60 kB     
Downloading: 68 kB     
Downloading: 68 kB     
Downloading: 68 kB     
Downloading: 68 kB     
Downloading: 68 kB     
Downloading: 68 kB     
Downloading: 76 kB     
Downloading: 76 kB     
Downloading: 92 kB     
Downloading: 92 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 120 kB     
Downloading: 120 kB     
Downloading: 140 kB     
Downloading: 140 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 170 kB     
Downloading: 170 kB     
Downloading: 190 kB     
Downloading: 190 kB     
Downloading: 210 kB     
Downloading: 210 kB     
Downloading: 210 kB     
Downloading: 210 kB     
Downloading: 210 kB     
Downloading: 210 kB     
Downloading: 210 kB     
Downloading: 210 kB     
Downloading: 220 kB     
Downloading: 220 kB     
Downloading: 230 kB     
Downloading: 230 kB     
Downloading: 230 kB     
Downloading: 230 kB     
Downloading: 240 kB     
Downloading: 240 kB     
Downloading: 250 kB     
Downloading: 250 kB     
Downloading: 250 kB     
Downloading: 250 kB     
Downloading: 250 kB     
Downloading: 250 kB     
Downloading: 250 kB     
Downloading: 250 kB     
Downloading: 260 kB     
Downloading: 260 kB     
Downloading: 270 kB     
Downloading: 270 kB     
Downloading: 270 kB     
Downloading: 270 kB     
Downloading: 280 kB     
Downloading: 280 kB     
Downloading: 290 kB     
Downloading: 290 kB     
Downloading: 290 kB     
Downloading: 290 kB     
Downloading: 290 kB     
Downloading: 290 kB     
Downloading: 290 kB     
Downloading: 290 kB     
Downloading: 300 kB     
Downloading: 300 kB     
Downloading: 310 kB     
Downloading: 310 kB     
Downloading: 310 kB     
Downloading: 310 kB     
Downloading: 320 kB     
Downloading: 320 kB     
Downloading: 330 kB     
Downloading: 330 kB     
Downloading: 330 kB     
Downloading: 330 kB     
Downloading: 330 kB     
Downloading: 330 kB     
Downloading: 340 kB     
Downloading: 340 kB     
Downloading: 340 kB     
Downloading: 340 kB     
Downloading: 350 kB     
Downloading: 350 kB     
Downloading: 350 kB     
Downloading: 350 kB     
Downloading: 360 kB     
Downloading: 360 kB     
Downloading: 370 kB     
Downloading: 370 kB     
Downloading: 370 kB     
Downloading: 370 kB     
Downloading: 380 kB     
Downloading: 380 kB     
Downloading: 380 kB     
Downloading: 380 kB     
Downloading: 380 kB     
Downloading: 380 kB     
Downloading: 390 kB     
Downloading: 390 kB     
Downloading: 390 kB     
Downloading: 390 kB     
Downloading: 400 kB     
Downloading: 400 kB     
Downloading: 400 kB     
Downloading: 400 kB     
Downloading: 410 kB     
Downloading: 410 kB     
Downloading: 420 kB     
Downloading: 420 kB     
Downloading: 420 kB     
Downloading: 420 kB     
Downloading: 420 kB     
Downloading: 420 kB     
Downloading: 430 kB     
Downloading: 430 kB     
Downloading: 430 kB     
Downloading: 430 kB     
Downloading: 440 kB     
Downloading: 440 kB     
Downloading: 450 kB     
Downloading: 450 kB     
Downloading: 450 kB     
Downloading: 450 kB     
Downloading: 460 kB     
Downloading: 460 kB     
Downloading: 460 kB     
Downloading: 460 kB     
Downloading: 470 kB     
Downloading: 470 kB     
Downloading: 480 kB     
Downloading: 480 kB     
Downloading: 480 kB     
Downloading: 480 kB     
Downloading: 490 kB     
Downloading: 490 kB     
Downloading: 500 kB     
Downloading: 500 kB     
Downloading: 500 kB     
Downloading: 500 kB     
Downloading: 510 kB     
Downloading: 510 kB     
Downloading: 510 kB     
Downloading: 510 kB     
Downloading: 510 kB     
Downloading: 510 kB     
Downloading: 520 kB     
Downloading: 520 kB     
Downloading: 520 kB     
Downloading: 520 kB     
Downloading: 530 kB     
Downloading: 530 kB     
Downloading: 540 kB     
Downloading: 540 kB     
Downloading: 540 kB     
Downloading: 540 kB     
Downloading: 550 kB     
Downloading: 550 kB     
Downloading: 550 kB     
Downloading: 550 kB     
Downloading: 550 kB     
Downloading: 550 kB     
Downloading: 560 kB     
Downloading: 560 kB     
Downloading: 560 kB     
Downloading: 560 kB     
Downloading: 570 kB     
Downloading: 570 kB     
Downloading: 580 kB     
Downloading: 580 kB     
Downloading: 580 kB     
Downloading: 580 kB     
Downloading: 590 kB     
Downloading: 590 kB     
Downloading: 590 kB     
Downloading: 590 kB     
Downloading: 590 kB     
Downloading: 590 kB     
Downloading: 600 kB     
Downloading: 600 kB     
Downloading: 610 kB     
Downloading: 610 kB     
Downloading: 610 kB     
Downloading: 610 kB     
Downloading: 620 kB     
Downloading: 620 kB     
Downloading: 620 kB     
Downloading: 620 kB     
Downloading: 630 kB     
Downloading: 630 kB     
Downloading: 630 kB     
Downloading: 630 kB     
Downloading: 630 kB     
Downloading: 630 kB     
Downloading: 630 kB     
Downloading: 630 kB     
Downloading: 640 kB     
Downloading: 640 kB     
Downloading: 650 kB     
Downloading: 650 kB     
Downloading: 650 kB     
Downloading: 650 kB     
Downloading: 660 kB     
Downloading: 660 kB     
Downloading: 670 kB     
Downloading: 670 kB     
Downloading: 670 kB     
Downloading: 670 kB     
Downloading: 670 kB     
Downloading: 670 kB     
Downloading: 680 kB     
Downloading: 680 kB     
Downloading: 680 kB     
Downloading: 680 kB     
Downloading: 680 kB     
Downloading: 680 kB     
Downloading: 690 kB     
Downloading: 690 kB     
Downloading: 690 kB     
Downloading: 690 kB     
Downloading: 700 kB     
Downloading: 700 kB     
Downloading: 710 kB     
Downloading: 710 kB     
Downloading: 710 kB     
Downloading: 710 kB     
Downloading: 720 kB     
Downloading: 720 kB     
Downloading: 720 kB     
Downloading: 720 kB     
Downloading: 730 kB     
Downloading: 730 kB     
Downloading: 730 kB     
Downloading: 730 kB     
Downloading: 740 kB     
Downloading: 740 kB     
Downloading: 740 kB     
Downloading: 740 kB     
Downloading: 740 kB     
Downloading: 740 kB     
Downloading: 750 kB     
Downloading: 750 kB     
Downloading: 760 kB     
Downloading: 760 kB     
Downloading: 760 kB     
Downloading: 760 kB     
Downloading: 760 kB     
Downloading: 760 kB     
Downloading: 770 kB     
Downloading: 770 kB     
Downloading: 770 kB     
Downloading: 770 kB     
Downloading: 770 kB     
Downloading: 770 kB     
Downloading: 780 kB     
Downloading: 780 kB     
Downloading: 790 kB     
Downloading: 790 kB     
Downloading: 790 kB     
Downloading: 790 kB     
Downloading: 800 kB     
Downloading: 800 kB     
Downloading: 800 kB     
Downloading: 800 kB     
Downloading: 800 kB     
Downloading: 800 kB     
Downloading: 810 kB     
Downloading: 810 kB     
Downloading: 820 kB     
Downloading: 820 kB     
Downloading: 820 kB     
Downloading: 820 kB     
Downloading: 830 kB     
Downloading: 830 kB     
Downloading: 840 kB     
Downloading: 840 kB     
Downloading: 850 kB     
Downloading: 850 kB     
Downloading: 850 kB     
Downloading: 850 kB     
Downloading: 850 kB     
Downloading: 850 kB     
Downloading: 860 kB     
Downloading: 860 kB     
Downloading: 870 kB     
Downloading: 870 kB     
Downloading: 870 kB     
Downloading: 870 kB     
Downloading: 880 kB     
Downloading: 880 kB     
Downloading: 890 kB     
Downloading: 890 kB     
Downloading: 890 kB     
Downloading: 890 kB     
Downloading: 890 kB     
Downloading: 890 kB     
Downloading: 900 kB     
Downloading: 900 kB     
Downloading: 910 kB     
Downloading: 910 kB     
Downloading: 910 kB     
Downloading: 910 kB     
Downloading: 920 kB     
Downloading: 920 kB     
Downloading: 920 kB     
Downloading: 920 kB     
Downloading: 930 kB     
Downloading: 930 kB     
Downloading: 930 kB     
Downloading: 930 kB     
Downloading: 930 kB     
Downloading: 930 kB     
Downloading: 940 kB     
Downloading: 940 kB     
Downloading: 950 kB     
Downloading: 950 kB     
Downloading: 950 kB     
Downloading: 950 kB     
Downloading: 960 kB     
Downloading: 960 kB     
Downloading: 970 kB     
Downloading: 970 kB     
Downloading: 970 kB     
Downloading: 970 kB     
Downloading: 970 kB     
Downloading: 970 kB     
Downloading: 980 kB     
Downloading: 980 kB     
Downloading: 990 kB     
Downloading: 990 kB     
Downloading: 1,000 kB     
Downloading: 1,000 kB     
Downloading: 1 MB     
Downloading: 1 MB     
Downloading: 1 MB     
Downloading: 1 MB     
Downloading: 1 MB     
Downloading: 1 MB     
Downloading: 1 MB     
Downloading: 1 MB     
Downloading: 1 MB     
Downloading: 1 MB     
Downloading: 1 MB     
Downloading: 1 MB     
Downloading: 1 MB     
Downloading: 1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB
## arrumar dados para o mapa 1 turno

tarcisio1 <- #filtra apenas os dados de votacao do tarcisio
  data1 %>%
  filter(NM_VOTAVEL == "TARCISIO GOMES DE FREITAS") %>%
  group_by(NM_MUNICIPIO) %>%
  summarise(sum(QT_VOTOS)) %>%
  rename(votos = "sum(QT_VOTOS)") %>%
  rename(municipio = "NM_MUNICIPIO")


##haddad

haddad1 <- #filtra apenas os dados de votacao do haddad
  data1 %>%
  filter(NM_VOTAVEL == "FERNANDO HADDAD") %>%
  group_by(NM_MUNICIPIO) %>%
  summarise(sum(QT_VOTOS)) %>%
  rename(votos = "sum(QT_VOTOS)") %>%
  rename(municipio = "NM_MUNICIPIO")


#tarcisio, haddad, rodrigo e others

comparation1 <- #junta as duas tabelas
  full_join(tarcisio1, haddad1, by="municipio") %>%
  rename(TARCISIO = "votos.x",
         HADDAD = "votos.y") %>%
  mutate(vencedor = ifelse(`TARCISIO` > `HADDAD`, "TARCISIO", "HADDAD")) %>% #cria tabela com o candidato que teve mais votos em cada municipio
  arrange(desc(TARCISIO))

### problema encontrado, alguns municipios tem nomes incorretos no pacote do geobr
## descobrir os nomes errados 

setdiff(comparation1$municipio, state$muni)
## [1] "SANTA BÁRBARA D OESTE"  "ESTRELA D OESTE"        "PALMEIRA D OESTE"      
## [4] "SÃO LUÍS DO PARAITINGA" "APARECIDA D OESTE"      "SANTA CLARA D OESTE"   
## [7] "SANTA RITA D OESTE"     "SÃO JOÃO DO PAU D ALHO" "GUARANI D OESTE"
## 9 nomes errados

comparation1$municipio <- gsub("SÃO LUÍS DO PARAITINGA", "SÃO LUIZ DO PARAITINGA", comparation1$municipio)
comparation1$municipio <- gsub("SÃO JOÃO DO PAU D ALHO", "SÃO JOÃO DO PAU D'ALHO", comparation1$municipio)
comparation1$municipio <- gsub("SANTA CLARA D OESTE", "SANTA CLARA D'OESTE", comparation1$municipio)
comparation1$municipio <- gsub("GUARANI D OESTE", "GUARANI D'OESTE", comparation1$municipio)
comparation1$municipio <- gsub("SANTA RITA D OESTE", "SANTA RITA D'OESTE",comparation1$municipio)
comparation1$municipio <- gsub("PALMEIRA D OESTE", "PALMEIRA D'OESTE", comparation1$municipio)
comparation1$municipio <- gsub("SANTA BÁRBARA D OESTE", "SANTA BÁRBARA D'OESTE", comparation1$municipio)
comparation1$municipio <- gsub("ESTRELA D OESTE", "ESTRELA D'OESTE", comparation1$municipio)
comparation1$municipio <- gsub("APARECIDA D OESTE", "APARECIDA D'OESTE", comparation1$municipio)

## depois da correcao realizar a juncao

full_maps1 <- #unir tabela de municipios com a tabelas com a votacao
  left_join(state, comparation1, by=c('muni' = 'municipio'))

## mapa primeiro turno

m1 <- 
  ggplot() +
  geom_sf(data = full_maps1, 
          aes(fill = vencedor), 
          color = "black") +
  scale_fill_manual(values = c(`TARCISIO` = "#4047ad", 
                               `HADDAD` = "#802d34"))+
  theme_bw()+
  labs(title = 'Maior quantidade de votos por município de São Paulo',
       subtitle = 'TARCISIO VS HADDAD (1º Turno)')+
  theme(axis.text.x = element_blank(),
        axis.text.y = element_blank(),
        plot.title = element_text(size = 11,
                                  face='bold'),
        plot.subtitle = element_text(size=9,
                                     face='italic'))


## arrumar dados para o mapa 2 turno

## tarcisio

tarcisio2 <-
  data2 %>%
  filter(NM_VOTAVEL == "TARCISIO GOMES DE FREITAS") %>%
  group_by(NM_MUNICIPIO) %>%
  summarise(sum(QT_VOTOS)) %>%
  rename(votos = "sum(QT_VOTOS)") %>%
  rename(municipio = "NM_MUNICIPIO")


##tarcisio e haddad

haddad2 <-
  data2 %>%
  filter(NM_VOTAVEL == "FERNANDO HADDAD") %>%
  group_by(NM_MUNICIPIO) %>%
  summarise(sum(QT_VOTOS)) %>%
  rename(votos = "sum(QT_VOTOS)") %>%
  rename(municipio = "NM_MUNICIPIO")


comparation2 <-
  full_join(tarcisio2, haddad2, by="municipio") %>%
  rename(TARCISIO = "votos.x",
         HADDAD = "votos.y") %>% 
  arrange(desc(TARCISIO)) %>%
  mutate(vencedor = ifelse(`TARCISIO` > `HADDAD`, "TARCISIO", "HADDAD"))


### problema encontrado, alguns municipios tem nomes incorretos no pacote do geobr
## descobrir os nomes errados


setdiff(comparation2$municipio, state$muni)
## [1] "SANTA BÁRBARA D OESTE"  "SÃO LUÍS DO PARAITINGA" "ESTRELA D OESTE"       
## [4] "PALMEIRA D OESTE"       "APARECIDA D OESTE"      "SANTA RITA D OESTE"    
## [7] "SANTA CLARA D OESTE"    "SÃO JOÃO DO PAU D ALHO" "GUARANI D OESTE"
## 9 nomes errados


comparation2$municipio <- gsub("SÃO LUÍS DO PARAITINGA", "SÃO LUIZ DO PARAITINGA", comparation2$municipio)
comparation2$municipio <- gsub("SÃO JOÃO DO PAU D ALHO", "SÃO JOÃO DO PAU D'ALHO", comparation2$municipio)
comparation2$municipio <- gsub("SANTA CLARA D OESTE", "SANTA CLARA D'OESTE", comparation2$municipio)
comparation2$municipio <- gsub("GUARANI D OESTE", "GUARANI D'OESTE", comparation2$municipio)
comparation2$municipio <- gsub("SANTA RITA D OESTE", "SANTA RITA D'OESTE",comparation2$municipio)
comparation2$municipio <- gsub("PALMEIRA D OESTE", "PALMEIRA D'OESTE", comparation2$municipio)
comparation2$municipio <- gsub("SANTA BÁRBARA D OESTE", "SANTA BÁRBARA D'OESTE", comparation2$municipio)
comparation2$municipio <- gsub("ESTRELA D OESTE", "ESTRELA D'OESTE", comparation2$municipio)
comparation2$municipio <- gsub("APARECIDA D OESTE", "APARECIDA D'OESTE", comparation2$municipio)

## depois da correcao realizar a juncao

full_maps2 <- 
  left_join(state, comparation2, by=c('muni' = 'municipio'))

## grafico de visualizacao

m2 <- 
  ggplot() +
  geom_sf(data = full_maps2, 
          aes(fill = vencedor), 
          color = "black") +
  scale_fill_manual(values = c(`TARCISIO` = "#4047ad", 
                               `HADDAD` = "#802d34"))+
  theme_bw()+
  labs(title = 'Maior quantidade de votos por município de São Paulo',
       subtitle = 'TARCISIO VS HADDAD (2º Turno)')+
  theme(axis.text.x = element_blank(),
        axis.text.y = element_blank(),
        plot.title = element_text(size = 11,
                                  face='bold'),
        plot.subtitle = element_text(size=9,
                                     face='italic'))

Com os gráficos criados, vamos apenas criar a contagem de municipios por candidatos e visualizar os dois:

print(sum(str_count(full_maps1$vencedor, 'TARCISIO')))
## [1] 539
print(sum(str_count(full_maps2$vencedor, 'TARCISIO')))
## [1] 566
print(sum(str_count(full_maps1$vencedor, 'HADDAD')))
## [1] 106
print(sum(str_count(full_maps2$vencedor, 'HADDAD')))
## [1] 79
gridExtra::grid.arrange(m1, m2)
Figura: {#label}

Figura: {#label}

Assim, no primeiro turno Tarcisio foi vitorioso em 539 municípios, enquanto Haddad foi para 106. Já no segundo turno, o número de Tarcisio sobe para 566, já Haddad os municípios em que Haddad foi o vencedor diminuíram para 79. Que mostra a maior migração dos eleitores de Rodrigo Garcia e dos outros candidatos foram para Tarcisio.

Curiosamente, Tarcisio teve menos votos na maioria dos municípios correspondentes às proximidades da capital, Fernando Haddad vendeu em quase todos, durante o primeiro turno. Além desses locais, Tarcisio apenas teve desvantagem na totalidade de votos, em alguns municípios de Presidente Prudente, Sorocaba, Araraquara e Taubaté. Vencendo em todos os outros.

7 - Qual foi a diferença de votos entre o primeiro e o segundo colocado na eleição para governador em São Paulo?

Como vimos nos gráficos, Tarcisio recebeu 9881995 votos e Haddad 8337139. Já no segundo turno Tarcisio teve 13480643 e Haddad 10909371.

print(round(((9881995-8337139)/9881995)*100, 2))
## [1] 15.63
print(round(((13480643-10909371)/13480643)*100, 2))
## [1] 19.07

No primeiro turno, a diferença foi de 15.63% que passou para 19.07% no segundo turno.

Conclusão

O objetivo dessa análise foi meramente exploratório, tentando usar técnicas de ETL para responder as perguntas feitas pelo ChatGPT, as visualizações também, visaram apenas de maneiras simples dar uma visualização diferente das que encontramos como opção no site do TSE.