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.