Instruções

  • Coloque o arquivo de dados em data-raw/pesquisaSet25.xlsx ou altere o caminho no chunk de importação.
  • Renderize este documento (RStudio: Knit -> Knit to HTML) para gerar o relatório completo com gráficos e tabelas.

1. Importação e limpeza dos dados

library(readxl); library(dplyr); library(janitor); library(stringr)
# Importar
dados <- read_excel("data-raw/pesquisaSet25.xlsx", sheet = "form01") %>%
  clean_names() %>%
  mutate(across(everything(), ~str_trim(as.character(.))))

# Seleção de variáveis-chave (ajuste aqui se necessário)
dados <- dados %>%
  select(
    bairro = em_qual_bairro_voce_mora,
    escolaridade = qual_seu_nivel_de_escolaridade,
    idade = qual_sua_idade,
    sexo = qual_seu_sexo,
    problema = qual_o_principal_problema_do_seu_bairro_que_voce_gostaria_que_fosse_resolvido,
    dep_estadual = se_a_eleicao_fosse_hoje_qual_destes_candidatos_voce_escolheria_para_lhe_representar_como_deputado_estadual,
    dep_federal = se_a_eleicao_fosse_hoje_qual_destes_candidatos_voce_escolheria_para_lhe_representar_como_deputado_federal,
    senador = se_a_eleicao_fosse_hoje_qual_destes_candidatos_voce_escolheria_para_lhe_representar_como_senador,
    rede_social = qual_a_rede_social_que_voce_mais_utiliza
  )

# Conversões básicas
dados$idade <- as.numeric(dados$idade)

# Padronização escolaridade e agrupamento semântico de problemas
library(stringr)
dados <- dados %>%
  mutate(
    faixa_idade = cut(idade, breaks = c(16,25,35,45,60,120), labels = c("16-25","26-35","36-45","46-60","60+"), right = FALSE),
    escolaridade = case_when(
      str_detect(tolower(escolaridade), "fund") ~ "Fundamental",
      str_detect(tolower(escolaridade), "médio|medio") ~ "Médio",
      str_detect(tolower(escolaridade), "superior") ~ "Superior",
      str_detect(tolower(escolaridade), "pós|pos") ~ "Pós-Graduação",
      TRUE ~ str_to_title(escolaridade)
    ),
    problema_agrupado = case_when(
      str_detect(tolower(problema), "buraco|asfalto|rua|estrada|pavimenta") ~ "Infraestrutura Viária",
      str_detect(tolower(problema), "segurança|seguranca") ~ "Segurança Pública",
      str_detect(tolower(problema), "saneamento|esgoto|água|agua|coleta") ~ "Saneamento Básico",
      str_detect(tolower(problema), "lazer|esporte|praça|praca|parque|recrea") ~ "Áreas de Lazer",
      str_detect(tolower(problema), "ubs|saúde|saude|hospital|posto") ~ "Saúde",
      str_detect(tolower(problema), "escola|educa|ensino") ~ "Educação",
      str_detect(tolower(problema), "ilumina|luz") ~ "Iluminação Pública",
      str_detect(tolower(problema), "todas|todos|nenhum|nenhuma|tudo") ~ "Múltiplos/Nenhum",
      TRUE ~ "Outros"
    )
  )

# Visual check — primeiras linhas
head(dados, 6)

2. Preparação para tabelas e gráficos

library(forcats); library(kableExtra)

agrupar_categorias <- function(variavel, limite = 10, nome_outros = "Outros") {
  contagem <- table(variavel)
  categorias_manter <- names(contagem[contagem >= limite])
  fct_other(as.factor(variavel), keep = categorias_manter, other_level = nome_outros)
}

# Aplicar agrupamentos (ajuste limites conforme tamanho da amostra)
dados <- dados %>%
  mutate(
    dep_estadual_agrupado = agrupar_categorias(dep_estadual, 10),
    dep_federal_agrupado = agrupar_categorias(dep_federal, 10),
    senador_agrupado = agrupar_categorias(senador, 10),
    bairro_agrupado = agrupar_categorias(bairro, 8),
    rede_social_agrupada = agrupar_categorias(rede_social, 5)
  )

criar_tabela_perfil <- function(variavel, titulo) {
  dados %>%
    tabyl({{variavel}}) %>%
    adorn_totals("row") %>%
    adorn_percentages("col") %>%
    adorn_pct_formatting(digits = 1) %>%
    adorn_ns() %>%
    kbl(caption = titulo, booktabs = TRUE, align = c("l","r","r")) %>%
    kable_styling(full_width = FALSE, position = "left", font_size = 12)
}

3. Perfil da amostra

# Tabelas
criar_tabela_perfil(sexo, "Distribuição por Sexo")
Distribuição por Sexo
sexo n percent
Feminino 0.5 (186) 47.7% (0.4769231)
Masculino 0.5 (204) 52.3% (0.5230769)
Total 1.0 (390) 100.0% (1.0000000)
criar_tabela_perfil(faixa_idade, "Distribuição por Faixa Etária")
Distribuição por Faixa Etária
faixa_idade n percent
16-25 0.2 (82) 21.0% (0.21025641)
26-35 0.3 (129) 33.1% (0.33076923)
36-45 0.2 (76) 19.5% (0.19487179)
46-60 0.2 (68) 17.4% (0.17435897)
60+ 0.1 (35) 9.0% (0.08974359)
Total 1.0 (390) 100.0% (1.00000000)
criar_tabela_perfil(escolaridade, "Distribuição por Escolaridade")
Distribuição por Escolaridade
escolaridade n percent
Fundamental 0.1 (56) 14.4% (0.143589744)
Médio 0.7 (278) 71.3% (0.712820513)
Pós-Graduação 0.0 (2) 0.5% (0.005128205)
Superior 0.1 (54) 13.8% (0.138461538)
Total 1.0 (390) 100.0% (1.000000000)
# Gráficos combinados
library(ggplot2); library(patchwork)

p1 <- dados %>% ggplot(aes(x = faixa_idade, fill = sexo)) + geom_bar(position = "dodge") + labs(title = "Distribuição por Faixa Etária e Sexo", x = "Faixa Etária", y = "Frequência") + theme_minimal()

p2 <- dados %>% ggplot(aes(x = escolaridade, fill = sexo)) + geom_bar(position = "dodge") + labs(title = "Distribuição por Escolaridade e Sexo", x = "Escolaridade", y = "Frequência") + theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1))

p1 + p2 + plot_layout(ncol = 2)

4. Principais problemas apontados

library(scales)
problemas_plot <- dados %>%
  count(problema_agrupado, sort = TRUE) %>%
  mutate(prop = n/sum(n), percentual = percent(prop, accuracy = 0.1)) %>%
  ggplot(aes(x = fct_reorder(problema_agrupado, n), y = n, fill = problema_agrupado)) +
  geom_col(show.legend = FALSE) +
  geom_text(aes(label = paste0(n, " (", percentual, ")")), hjust = -0.1, size = 3.5) +
  coord_flip() +
  labs(title = "Principais Problemas Apontados nos Bairros", subtitle = "Agrupados por categorias semânticas", x = NULL, y = "Frequência") +
  theme_minimal() +
  scale_y_continuous(expand = expansion(mult = c(0, 0.1))) +
  scale_fill_brewer(palette = "Set3")

print(problemas_plot)

5. Problemas por bairro (heatmap)

dados %>%
  count(bairro_agrupado, problema_agrupado) %>%
  group_by(bairro_agrupado) %>%
  mutate(prop = n/sum(n)) %>%
  ggplot(aes(x = bairro_agrupado, y = problema_agrupado, fill = prop)) +
  geom_tile() +
  geom_text(aes(label = paste0(n, "\n(", percent(prop, accuracy = 0.1), ")")), size = 2.8, color = "black") +
  scale_fill_gradient(low = "white", high = "steelblue", labels = percent) +
  labs(title = "Problemas por Bairro - Mapa de Calor", x = "Bairro", y = "Problema", fill = "Proporção") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

6. Intenção de voto

plotar_intencao_voto <- function(variavel, titulo, cor = NULL) {
  library(ggplot2); library(scales); library(forcats)
  if(is.null(cor)) cor <- "steelblue"
  dados %>%
    count({{variavel}}, sort = TRUE) %>%
    mutate(prop = n/sum(n), percentual = percent(prop, accuracy = 0.1)) %>%
    ggplot(aes(x = fct_reorder({{variavel}}, n), y = n)) +
    geom_col(fill = cor, alpha = 0.8) +
    geom_text(aes(label = paste0(n, "\n(", percentual, ")")), hjust = -0.1, size = 3, lineheight = 0.8) +
    coord_flip() +
    labs(title = titulo, x = NULL, y = "Número de Votos") +
    theme_minimal() +
    scale_y_continuous(expand = expansion(mult = c(0, 0.15))) +
    theme(plot.title = element_text(face = "bold"))
}

plotar_intencao_voto(dep_estadual_agrupado, "Intenção de Voto - Deputado Estadual", "steelblue")

plotar_intencao_voto(dep_federal_agrupado, "Intenção de Voto - Deputado Federal", "darkgreen")

plotar_intencao_voto(senador_agrupado, "Intenção de Voto - Senador", "purple")

7. Análises cruzadas e avanços

criar_tabela_cruzada <- function(var1, var2, titulo) {
  dados %>% tabyl({{var1}}, {{var2}}) %>%
    adorn_totals(c("row","col")) %>%
    adorn_percentages("row") %>%
    adorn_pct_formatting(digits = 1) %>%
    adorn_ns() %>%
    kbl(caption = titulo, booktabs = TRUE) %>%
    kable_styling(full_width = FALSE, position = "left", font_size = 10)
}

criar_tabela_cruzada(sexo, dep_estadual_agrupado, "Sexo × Deputado Estadual")
Sexo × Deputado Estadual
sexo Capitão Carpê Delegado Péricles Felipe Souza João Luiz Jorge Oliveira/Joca Total
Feminino 22.0% (41) 20.4% (38) 11.8% (22) 29.6% (55) 16.1% (30) 100.0% (186)
Masculino 18.1% (37) 28.4% (58) 9.3% (19) 24.5% (50) 19.6% (40) 100.0% (204)
Total 20.0% (78) 24.6% (96) 10.5% (41) 26.9% (105) 17.9% (70) 100.0% (390)
criar_tabela_cruzada(faixa_idade, senador_agrupado, "Faixa Etária × Senador")
Faixa Etária × Senador
faixa_idade Cap. Alberto Neto Eduardo Braga Plínio Valério Sargento Salazar Wilson Lima Total
16-25 17.1% (14) 18.3% (15) 11.0% (9) 26.8% (22) 26.8% (22) 100.0% (82)
26-35 27.1% (35) 13.2% (17) 10.9% (14) 24.8% (32) 24.0% (31) 100.0% (129)
36-45 22.4% (17) 15.8% (12) 7.9% (6) 23.7% (18) 30.3% (23) 100.0% (76)
46-60 20.6% (14) 22.1% (15) 20.6% (14) 20.6% (14) 16.2% (11) 100.0% (68)
60+ 22.9% (8) 31.4% (11) 8.6% (3) 11.4% (4) 25.7% (9) 100.0% (35)
Total 22.6% (88) 17.9% (70) 11.8% (46) 23.1% (90) 24.6% (96) 100.0% (390)
criar_tabela_cruzada(escolaridade, dep_federal_agrupado, "Escolaridade × Deputado Federal")
Escolaridade × Deputado Federal
escolaridade Adail Filho Jorge Oliveira/Joca Roberto Cidade Sidney Leite Silas Câmara Total
Fundamental 10.7% (6) 17.9% (10) 42.9% (24) 12.5% (7) 16.1% (9) 100.0% (56)
Médio 5.0% (14) 12.2% (34) 35.3% (98) 11.2% (31) 36.3% (101) 100.0% (278)
Pós-Graduação 0.0% (0) 0.0% (0) 100.0% (2) 0.0% (0) 0.0% (0) 100.0% (2)
Superior 11.1% (6) 9.3% (5) 40.7% (22) 14.8% (8) 24.1% (13) 100.0% (54)
Total 6.7% (26) 12.6% (49) 37.4% (146) 11.8% (46) 31.5% (123) 100.0% (390)
# Idade por candidato (boxplot)
idade_por_candidato <- dados %>%
  filter(dep_estadual_agrupado != "Outros") %>%
  ggplot(aes(x = dep_estadual_agrupado, y = idade)) +
  geom_boxplot(fill = "lightblue", alpha = 0.7) +
  geom_point(aes(color = sexo), position = position_jitterdodge(), alpha = 0.6) +
  stat_summary(fun = mean, geom = "point", shape = 18, size = 3, color = "red") +
  coord_flip() +
  labs(title = "Distribuição de Idade por Candidato a Deputado Estadual", subtitle = "Ponto vermelho indica média") +
  theme_minimal()

print(idade_por_candidato)

8. Estatísticas descritivas

idade_summary <- dados %>% summarise(Observacoes = n(), Media = round(mean(idade, na.rm = TRUE),1), Mediana = round(median(idade, na.rm = TRUE),1), Desvio_Padrao = round(sd(idade, na.rm = TRUE),1), Minimo = min(idade, na.rm = TRUE), Maximo = max(idade, na.rm = TRUE))

kbl(idade_summary, booktabs = TRUE) %>% kable_styling(full_width = FALSE)
Observacoes Media Mediana Desvio_Padrao Minimo Maximo
390 36.3 33 14.5 16 87
# Histogram e densidade
p_idade1 <- ggplot(dados, aes(x = idade)) + geom_histogram(binwidth = 5, alpha = 0.8, color = "white") + labs(title = "Distribuição de Idades", x = "Idade", y = "Frequência") + theme_minimal()

p_idade2 <- ggplot(dados, aes(x = idade, fill = sexo)) + geom_density(alpha = 0.6) + labs(title = "Densidade de Idade por Sexo", x = "Idade", y = "Densidade") + theme_minimal()

p_idade1 + p_idade2

9. Correlações políticas (insights)

# Top 3 candidatos — identificar prioridades de problemas entre seus eleitores
library(scales)

top_candidatos <- dados %>% count(dep_estadual_agrupado, sort = TRUE) %>% slice(1:3) %>% pull(dep_estadual_agrupado)

if(length(top_candidatos) > 0) {
  dados %>%
    filter(dep_estadual_agrupado %in% top_candidatos) %>%
    count(dep_estadual_agrupado, problema_agrupado) %>%
    group_by(dep_estadual_agrupado) %>%
    mutate(prop = n/sum(n)) %>%
    ggplot(aes(x = problema_agrupado, y = prop, fill = dep_estadual_agrupado)) +
    geom_col(position = "dodge") +
    geom_text(aes(label = percent(prop, accuracy = 0.1)), position = position_dodge(width = 0.9), vjust = -0.5, size = 3) +
    scale_y_continuous(labels = percent) +
    labs(title = "Problemas Priorizados por Eleitores dos Principais Candidatos", x = "Problema", y = "Proporção", fill = "Candidato") +
    theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1))
}

10. Resumo Executivo (dinâmico)

cat("=== RESUMO EXECUTIVO ===\n")
## === RESUMO EXECUTIVO ===
cat("• Total de entrevistados:", nrow(dados), "\n")
## • Total de entrevistados: 390
cat("• Idade média:", round(mean(dados$idade, na.rm = TRUE), 1), "anos\n")
## • Idade média: 36.3 anos
# Principais problemas (top 3)
principais_problemas <- dados %>% count(problema_agrupado, sort = TRUE) %>% slice(1:3)
cat("• Principais problemas:", paste(principais_problemas$problema_agrupado, collapse = ", "), "\n")
## • Principais problemas: Infraestrutura Viária, Segurança Pública, Saneamento Básico
# Rede social mais usada
rede_top <- names(sort(table(dados$rede_social), decreasing = TRUE))[1]
cat("• Rede social mais utilizada:", ifelse(is.na(rede_top), "(não informado)", rede_top), "\n")
## • Rede social mais utilizada: Status do Whatsapp
# Candidatos mais votados
c_est <- names(sort(table(dados$dep_estadual), decreasing = TRUE))[1]
c_fed <- names(sort(table(dados$dep_federal), decreasing = TRUE))[1]
c_sen <- names(sort(table(dados$senador), decreasing = TRUE))[1]
cat("• Candidato mais votado (Estadual):", ifelse(is.na(c_est), "(não informado)", c_est), "\n")
## • Candidato mais votado (Estadual): João Luiz
cat("• Candidato mais votado (Federal):", ifelse(is.na(c_fed), "(não informado)", c_fed), "\n")
## • Candidato mais votado (Federal): Roberto Cidade
cat("• Candidato mais votado (Senador):", ifelse(is.na(c_sen), "(não informado)", c_sen), "\n")
## • Candidato mais votado (Senador): Wilson Lima
# Observações e recomendações rápidas
cat("\nObservações e recomendações:\n")
## 
## Observações e recomendações:
cat("1) Infraestrutura Viária, Segurança Pública e Saneamento aparecem entre os problemas mais citados — recomenda-se priorizar diagnósticos rápidos por região.\n")
## 1) Infraestrutura Viária, Segurança Pública e Saneamento aparecem entre os problemas mais citados — recomenda-se priorizar diagnósticos rápidos por região.
cat("2) Verificar representatividade por bairro: se a amostra estiver concentrada em poucos bairros, interpretar resultados com cautela.\n")
## 2) Verificar representatividade por bairro: se a amostra estiver concentrada em poucos bairros, interpretar resultados com cautela.
cat("3) Cruzamentos sexo/idade × intenção de voto indicam potenciais segmentos eleitorais — explorar modelos (logit/multinomial) se houver necessidade de previsão.\n")
## 3) Cruzamentos sexo/idade × intenção de voto indicam potenciais segmentos eleitorais — explorar modelos (logit/multinomial) se houver necessidade de previsão.

11. Metadados e sessão

sessionInfo()
## R version 4.5.1 (2025-06-13 ucrt)
## Platform: x86_64-w64-mingw32/x64
## Running under: Windows 11 x64 (build 26220)
## 
## Matrix products: default
##   LAPACK version 3.12.1
## 
## locale:
## [1] LC_COLLATE=Portuguese_Brazil.utf8  LC_CTYPE=Portuguese_Brazil.utf8   
## [3] LC_MONETARY=Portuguese_Brazil.utf8 LC_NUMERIC=C                      
## [5] LC_TIME=Portuguese_Brazil.utf8    
## 
## time zone: America/Manaus
## tzcode source: internal
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] scales_1.4.0     patchwork_1.3.2  ggplot2_4.0.0    kableExtra_1.4.0
## [5] forcats_1.0.1    stringr_1.5.2    janitor_2.2.1    dplyr_1.1.4     
## [9] readxl_1.4.5    
## 
## loaded via a namespace (and not attached):
##  [1] sass_0.4.10        generics_0.1.4     tidyr_1.3.1        xml2_1.4.0        
##  [5] stringi_1.8.7      digest_0.6.37      magrittr_2.0.4     evaluate_1.0.5    
##  [9] grid_4.5.1         timechange_0.3.0   RColorBrewer_1.1-3 fastmap_1.2.0     
## [13] cellranger_1.1.0   jsonlite_2.0.0     purrr_1.1.0        viridisLite_0.4.2 
## [17] textshaping_1.0.3  jquerylib_0.1.4    cli_3.6.5          rlang_1.1.6       
## [21] withr_3.0.2        cachem_1.1.0       yaml_2.3.10        tools_4.5.1       
## [25] vctrs_0.6.5        R6_2.6.1           lifecycle_1.0.4    lubridate_1.9.4   
## [29] snakecase_0.11.1   pkgconfig_2.0.3    pillar_1.11.1      bslib_0.9.0       
## [33] gtable_0.3.6       glue_1.8.0         systemfonts_1.3.0  xfun_0.53         
## [37] tibble_3.3.0       tidyselect_1.2.1   rstudioapi_0.17.1  knitr_1.50        
## [41] farver_2.1.2       htmltools_0.5.8.1  labeling_0.4.3     rmarkdown_2.30    
## [45] svglite_2.2.1      compiler_4.5.1     S7_0.2.0