Skip to content

Instantly share code, notes, and snippets.

@lgelape
Created October 29, 2020 00:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lgelape/0a2d39d95d011a65911211ce691c8c7d to your computer and use it in GitHub Desktop.
Save lgelape/0a2d39d95d011a65911211ce691c8c7d to your computer and use it in GitHub Desktop.
Código para análises da notícia
##################################################
##################################################
##################################################
#####
##### REELEICAO EM DESERTOS DE NOTICIA
#####
#####
# Lucas Gelape
# lucas@voltdata.info
# Pacotes
library(cepespR)
library(newsatlasbr)
library(dplyr)
library(readxl)
library(stringr)
library(tidyr)
library(ggplot2)
library(forcats)
library(stringi)
# Registrar no Atlas
atlas_signin("exemplo@exemplo.com", "senha")
# Funcoes
percentual_arredondar <- function(x){round(x*100, digits = 2)}
tema_base <- function(banco){
banco %>%
ggplot() +
theme_minimal() +
theme(legend.position = "bottom",
legend.direction = "horizontal",
plot.title = element_text(hjust = 0.5, size = 10),
axis.text.x = element_text(size = 8),
axis.text.y = element_text(size = 8),
plot.caption = element_text(hjust = 0.5))
}
###################################################################################################
##### ABRE BANCOS QUE SERAO UTILIZADOS
### CANDIDATURAS:
# Candidaturas de 2012, 2016 e 2020;
# Corrigindo inconsistencias em siglas e CPFs;
# Retirando candidaturas não-deferidas ou sob recurso na Justica Eleitoral.
## 2012
prefeitos2012 <- cepespR::get_candidates(2012, "Prefeito") %>%
filter(COD_SIT_TOT_TURNO != "5")
## 2016
prefeitos2016 <- cepespR::get_candidates(2016, "Prefeito") %>%
filter(COD_SIT_TOT_TURNO != "5")
vereadores2016 <- cepespR::get_candidates(2016, "Vereador")
## 2020
candidatos2020 <- read.csv2("consulta_cand_2020_BRASIL.csv",
stringsAsFactors = F, fileEncoding = "latin1") %>%
mutate(SG_UE = str_pad(SG_UE, 5, side = "left", pad = "0"),
NR_CPF_CANDIDATO = str_pad(NR_CPF_CANDIDATO, 11, side = "left", pad = "0"),
NM_CANDIDATO = tolower(stri_trans_general(NM_CANDIDATO, "Latin-ASCII"))) %>%
# Identifiquei um prefeito eleito em 2016 que estava com o CPF errado em 2020
mutate(NR_CPF_CANDIDATO = ifelse(NM_CANDIDATO == "adriano rodrigues de moraes", "85003581149", NR_CPF_CANDIDATO))
prefeitos2020 <- candidatos2020 %>%
filter(DS_DETALHE_SITUACAO_CAND != "RENÚNCIA" | DS_DETALHE_SITUACAO_CAND != "CANCELADO" |
DS_DETALHE_SITUACAO_CAND != "CASSADO" | DS_DETALHE_SITUACAO_CAND != "FALECIDO" |
DS_DETALHE_SITUACAO_CAND != "INDEFERIDO" | DS_DETALHE_SITUACAO_CAND != "PEDIDO NÃO CONHECIDO",
CD_CARGO == 11)
vereadores2020 <- candidatos2020 %>%
filter(DS_DETALHE_SITUACAO_CAND != "RENÚNCIA" | DS_DETALHE_SITUACAO_CAND != "CANCELADO" |
DS_DETALHE_SITUACAO_CAND != "CASSADO" | DS_DETALHE_SITUACAO_CAND != "FALECIDO" |
DS_DETALHE_SITUACAO_CAND != "INDEFERIDO" | DS_DETALHE_SITUACAO_CAND != "PEDIDO NÃO CONHECIDO",
CD_CARGO == 13)
### CODIGOS IBGE E TSE
# Para unir os bancos do Atlas e TSE
ibge_tse <- read_excel("/Users/lucasgelape/Google Drive (USP)/Bancos/Munic2016_IBGE_TSE.xlsx") %>%
select(`COD MUNIC 7_IBGE`, TSECod_5) %>%
rename(codmun_ibge = `COD MUNIC 7_IBGE`, codmun_tse = TSECod_5)
### ATLAS DA NOTICIA
## N. de veiculos de imprensa por municipio
# Categoriza os municipios em deserto, quase deserto e nao deserto;
# Categoriza por porte populacional
municipios_atlas <- newsatlasbr::get_municipalities() %>%
mutate(categorias = case_when(qtd_veiculos == 0 ~ "deserto",
qtd_veiculos > 0 & qtd_veiculos < 3 ~ "quase deserto",
qtd_veiculos > 2 ~ "nao deserto")) %>%
left_join(ibge_tse, by = c("codmun" = "codmun_ibge")) %>%
mutate(tamanho_mun = case_when(populacao < 10000 ~ "ate 10k",
populacao > 10000 & populacao <= 20000 ~ "10-20k",
populacao > 20000 & populacao <= 50000 ~ "20-50k",
populacao > 50000 & populacao <= 100000 ~ "50-100k",
populacao > 100000 & populacao <= 200000 ~ "100-200k",
populacao > 200000 & populacao <= 500000 ~ "200-500k",
populacao > 500000 & populacao <= 1000000 ~ "500-1000k",
populacao > 1000000 ~ "1mi+"),
tamanho_mun = factor(tamanho_mun,
levels = c("ate 10k", "10-20k", "20-50k","50-100k",
"100-200k", "200-500k", "500-1000k", "1mi+"),
labels = c("Até 10 mil", "Entre 10\ne 20 mil", "Entre 20\ne 50 mil",
"Entre 50\ne 100 mil", "Entre 100\ne 200 mil",
"Entre 200\ne 500 mil", "Entre\n500 mil e 1mi",
"Mais de 1mi")),
categorias = factor(categorias,
levels = c("deserto", "quase deserto", "nao deserto"),
labels = c("Deserto", "Quase deserto", "Não deserto")))
###################################################################################################
###################################################################################################
###################################################################################################
##### CANDIDATOS A REELEICAO - VEREADORES
#### PREPARANDO OS BANCOS
### CICLO ELEITORAL 2016-2020
# Puxa os vereadores eleitos em 2016
vereadores_eleitos_2016 <- vereadores2016 %>%
filter(DESC_SIT_TOT_TURNO == "ELEITO POR MEDIA" | DESC_SIT_TOT_TURNO == "ELEITO POR QP",
DESCRICAO_ELEICAO == "Eleições Municipais 2016") %>%
select(ANO_ELEICAO, CPF_CANDIDATO, SIGLA_UE, CODIGO_CARGO, SIGLA_PARTIDO) %>%
distinct()
# Puxa o n. de cadeiras de 2016
cadeiras2016 <- electionsBR::seats_local(2016) %>%
filter(CODIGO_CARGO == 13) %>%
select(SIGLA_UE, QTDE_VAGAS)
# Abre os candidatos a prefeito 2020 (deferidos)
vereadores_candidatos_2020 <- vereadores2020 %>%
select(NR_CPF_CANDIDATO, SG_UE, CD_CARGO, SG_PARTIDO) %>%
mutate(NR_CPF_CANDIDATO = as.character(NR_CPF_CANDIDATO),
SG_UE = as.character(SG_UE))
names(vereadores_candidatos_2020) <- c("CPF_CANDIDATO", "SIGLA_UE", "CODIGO_CARGO", "SIGLA_PARTIDO")
names(vereadores_candidatos_2020) <- paste0(names(vereadores_candidatos_2020), "_2020")
# Junta os bancos pelo CPF dos candidatos e codigo do IBGE
vereadores_eleitos_2016 <- left_join(vereadores_eleitos_2016, vereadores_candidatos_2020,
by = c("CPF_CANDIDATO" = "CPF_CANDIDATO_2020",
"SIGLA_UE" = "SIGLA_UE_2020")) %>%
distinct() %>%
mutate(duplicado = duplicated(CPF_CANDIDATO)) %>%
left_join(ibge_tse, by = c("SIGLA_UE" = "codmun_tse")) %>%
left_join(municipios_atlas, by = c("codmun_ibge" = "codmun")) %>%
mutate(reeleicao = ifelse(is.na(CODIGO_CARGO_2020), "nao", "sim")) %>%
left_join(cadeiras2016, by = "SIGLA_UE")
# Calcula o numero e o percentual de vereadores que disputam a reeleicao em cada municipio
reeleicao_vereadores_2016 <- vereadores_eleitos_2016 %>%
group_by(SIGLA_UE) %>%
mutate(eleitos = n(),
reeleicao_n = sum(reeleicao == "sim"),
reeleicao_p = percentual_arredondar(reeleicao_n/QTDE_VAGAS)) %>%
ungroup() %>%
select(ANO_ELEICAO, SIGLA_UE, codmun_ibge, municipio,
populacao, tamanho_mun, categorias, IDHM,
QTDE_VAGAS, eleitos, reeleicao_n, reeleicao_p) %>%
group_by(tamanho_mun, categorias) %>%
mutate(media_reeleicao = mean(reeleicao_p)) %>%
ungroup() %>%
distinct()
###################################################################################################
#### GERANDO OS RESULTADOS DE VEREADORES
# Percentual de candidatos a reeleicao por municipio em cada faixa populacional e categoria do Atlas
# (restrito a municipios com menos de 100k/hab)
reeleicao_2016 <- reeleicao_vereadores_2016 %>%
filter(populacao < 100000) %>%
group_by(tamanho_mun, categorias) %>%
summarise(media_reeleicao = round(mean(reeleicao_p), digits = 1),
numero_cidades = n()) %>%
ungroup()
# Grafico do % de candidatos a reeleicao por municipio, faixa populacional e categoria
reeleicao_vereadores_2016 %>%
filter(populacao < 50000) %>%
group_by(tamanho_mun, categorias) %>%
summarise(media_reeleicao = mean(reeleicao_p)) %>%
ungroup() %>%
mutate(categorias = fct_rev(categorias)) %>%
mutate(tamanho_mun = fct_rev(tamanho_mun)) %>%
tema_base() +
geom_col(aes(x = tamanho_mun, y = media_reeleicao, fill = categorias), position = "dodge") +
labs(x = "", y = "Candidatos a reeleição (em %)") +
scale_fill_grey(start = 0.8, end = 0.2) +
guides(fill = guide_legend(title = "Reeleição")) +
coord_flip()
# Municipios em que todos os vereadores disputam a reeleicao
municipios_100 <- filter(reeleicao_vereadores_2016, reeleicao_p == 100)
prop.table(table(municipios_100$categorias))*100
###################################################################################################
###################################################################################################
###################################################################################################
##### CANDIDATOS A REELEICAO PREFEITOS
### CICLO ELEITORAL 2016-2020
## Primeiro, precisamos identificar os prefeitos eleitos em 2016 que nao sao reelegiveis.
# Assim, temos que buscar quais deles foram eleitos em 2012 (ou em eleicoes suplementares
# antes de 2016).
# Puxa os prefeitos eleitos em 2012 (base)
prefeitos_eleitos_em2012 <- prefeitos2012 %>%
filter(DESC_SIT_TOT_TURNO == "ELEITO",
DESCRICAO_ELEICAO == "ELEIÇÃO MUNICIPAL 2012") %>%
select(ANO_ELEICAO, SIGLA_UE, CODIGO_CARGO, CPF_CANDIDATO, SIGLA_PARTIDO) %>%
distinct() %>%
mutate(momento = "eleicao")
# Eleicoes suplementares
prefeitos_eleitos_2012_suplementares <- prefeitos2012 %>%
filter(DESC_SIT_TOT_TURNO == "ELEITO",
DESCRICAO_ELEICAO != "ELEIÇÃO MUNICIPAL 2012") %>%
select(ANO_ELEICAO, SIGLA_UE, CODIGO_CARGO, CPF_CANDIDATO, SIGLA_PARTIDO) %>%
distinct() %>%
mutate(momento = "eleicao suplementar",
momento = ifelse(CPF_CANDIDATO == "42305730225", "eleicao suplementar 2", momento))
# Empilha e remove as duplicacoes (municipios que tiveram eleicoes suplementares)
prefeitos_eleitos_2012 <- bind_rows(prefeitos_eleitos_em2012, prefeitos_eleitos_2012_suplementares) %>%
arrange(desc(momento)) %>%
mutate(duplicado = duplicated(SIGLA_UE)) %>%
filter(duplicado == F) %>%
select(-c(duplicado, momento))
# Puxa os candidatos a prefeito em 2016
prefeitos_candidatos_2016 <- prefeitos2016 %>%
filter(DESCRICAO_ELEICAO == "Eleições Municipais 2016") %>%
select(CPF_CANDIDATO, SIGLA_UE, CODIGO_CARGO, SIGLA_PARTIDO, DESC_SIT_TOT_TURNO) %>%
distinct()
names(prefeitos_candidatos_2016) <- paste0(names(prefeitos_candidatos_2016), "_2016")
# Junta os dois bancos pelo CPF dos candidatos
prefeitos_eleitos_2012 <- left_join(prefeitos_eleitos_2012, prefeitos_candidatos_2016,
by = c("CPF_CANDIDATO" = "CPF_CANDIDATO_2016")) %>%
left_join(ibge_tse, by = c("SIGLA_UE" = "codmun_tse")) %>%
left_join(municipios_atlas, by = c("codmun_ibge" = "codmun")) %>%
group_by(SIGLA_UE) %>%
mutate(soma = n()) %>%
ungroup()
# Seleciona o CPF dos prefeitos de 2012 nao reelegiveis em 2016
# para retira-los da conta da reeleicao de 2016-2020
nao_reelegiveis <- prefeitos_eleitos_2012 %>%
filter(DESC_SIT_TOT_TURNO_2016 == "ELEITO") %>%
.$CPF_CANDIDATO
# Elimina objetos que nao serao mais usados
rm(list = c("prefeitos_eleitos_em2012", "prefeitos_eleitos_2012_suplementares", "prefeitos_candidatos_2016"))
# Puxa os prefeitos eleitos em 2016 (base)
prefeitos_eleitos_em2016 <- prefeitos2016 %>%
filter(DESCRICAO_ELEICAO == "Eleições Municipais 2016",
DESC_SIT_TOT_TURNO == "ELEITO") %>%
select(CPF_CANDIDATO, SIGLA_UE, CODIGO_CARGO, SIGLA_PARTIDO) %>%
distinct() %>%
mutate(momento = "eleicao") %>%
mutate(reelegivel = ifelse(CPF_CANDIDATO %in% nao_reelegiveis, "nao", "sim"))
# Eleicoes suplementares 2016
prefeitos_eleitos_2016_suplementares <- prefeitos2016 %>%
filter(DESC_SIT_TOT_TURNO == "ELEITO",
DESCRICAO_ELEICAO != "Eleições Municipais 2016") %>%
select(ANO_ELEICAO, SIGLA_UE, CODIGO_CARGO, CPF_CANDIDATO, SIGLA_PARTIDO) %>%
distinct() %>%
mutate(momento = "eleicao suplementar")
# Identifica os "atuais" mandatarios
prefeitos_eleitos_2016 <- bind_rows(prefeitos_eleitos_em2016, prefeitos_eleitos_2016_suplementares) %>%
arrange(desc(momento)) %>%
mutate(duplicado = duplicated(SIGLA_UE)) %>%
filter(duplicado == F) %>%
select(-c(duplicado, momento)) %>%
mutate(reelegivel = ifelse(is.na(reelegivel), "sim", reelegivel))
# Abre os candidatos a prefeito 2020 (deferidos)
prefeitos_candidatos_2020 <- prefeitos2020 %>%
select(NR_CPF_CANDIDATO, SG_UE, CD_CARGO, SG_PARTIDO) %>%
mutate(NR_CPF_CANDIDATO = as.character(NR_CPF_CANDIDATO),
SG_UE = as.character(SG_UE))
names(prefeitos_candidatos_2020) <- c("CPF_CANDIDATO", "SIGLA_UE", "CODIGO_CARGO", "SIGLA_PARTIDO")
names(prefeitos_candidatos_2020) <- paste0(names(prefeitos_candidatos_2020), "_2020")
# Junta os bancos pelo CPF dos candidatos e codigo do IBGE
prefeitos_eleitos_2016 <- left_join(prefeitos_eleitos_2016, prefeitos_candidatos_2020,
by = c("CPF_CANDIDATO" = "CPF_CANDIDATO_2020",
"SIGLA_UE" = "SIGLA_UE_2020")) %>%
distinct() %>%
mutate(duplicado = duplicated(CPF_CANDIDATO)) %>%
left_join(ibge_tse, by = c("SIGLA_UE" = "codmun_tse")) %>%
left_join(municipios_atlas, by = c("codmun_ibge" = "codmun")) %>%
mutate(reeleicao = ifelse(is.na(CODIGO_CARGO_2020), "nao", "sim"))
###################################################################################################
#### GERA OS RESULTADOS - REELEICAO DE PREFEITOS
# Faz o calculo do n. de prefeitos candidatos a reeleicao, por categoria e possibilidade de reeleicao
reeleicao_prefeitos <- prefeitos_eleitos_2016 %>%
group_by(reelegivel, reeleicao, categorias) %>%
summarise(numero = n()) %>%
ungroup() %>%
group_by(reelegivel, categorias) %>%
mutate(percentual = percentual_arredondar(numero/sum(numero))) %>%
ungroup()
# Grafico: categorias de municipio x concorreu a reeleicao
prefeitos_eleitos_2016 %>%
filter(reelegivel == "sim",
!is.na(categorias)) %>%
mutate(categorias = fct_rev(categorias)) %>%
group_by(reeleicao, categorias) %>%
summarise(numero = n()) %>%
ungroup() %>%
group_by(categorias) %>%
mutate(total_categoria = sum(numero)) %>%
ungroup() %>%
mutate(percentual = percentual_arredondar(numero/total_categoria)) %>%
arrange(categorias) %>%
tema_base() +
geom_col(aes(x = categorias, y = percentual, fill = reeleicao), position = "dodge") +
labs(x = "", y = "Candidatos a reeleição (em %)") +
scale_y_continuous(limits = c(0,100), breaks = seq(0,100,25)) +
scale_fill_grey(start = 0.8, end = 0.2) +
guides(fill = guide_legend(title = "Reeleição"))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment