É preciso fazer:
Pernambuco realmente só tem 12 observações até agora (06 de agosto)?
library(tidyverse)
library(readxl)
library(writexl)
library(loadinstall)
packages <- c("ggplot2", "dplyr", "ggthemes", "data.table", "thematic", "readr", "stringr", "tidyr", "readxl", "ggthemes", "stringdist", "fuzzyjoin", "stringi")
invisible(lapply(packages, dynamic_require))
library(dplyr)
Vou chamar a tabela principal de “principal”.
#arquivo de 06 de agosto - no nome do arquivo tem a data e a hora que ele foi atualizado
principal <- read_excel("Questionário_PRS_Caatinga_-_Avaliação_de_Impacto_-_all_versions_-_Portuguese_pt_-_2025-08-06-13-59-12.xlsx", sheet = "Questionário PRS Caatinga - ...")
principal$date<-date(principal$`Data e horário de início da entrevista`)
principal <- principal %>% filter(date > as.Date("2025-07-21"))
p2 <- principal %>% filter(!`_validation_status` %in% c("Not Approved", "On Hold"))
p2$index<-p2$`_index`
quantos <- p2 %>% count(date) %>% rename(observacoes = n)
plot1 <- ggplot(quantos, aes(x = date, y = observacoes)) +
geom_line(color = "black", linewidth = 1) +
geom_point(color = "darkorange", size = 2) +
geom_text(
aes(label = observacoes),
vjust = -1,
color = "black",
size = 4
) +
labs(
title = "Quando os questionários foram respondidos?",
x = "",
y = "Número de Lares"
) +
theme_minimal() +
expand_limits(y = max(quantos$observacoes) * 1.1) +
scale_x_date(
date_breaks = "1 day",
date_labels = "%d-%m"
) +
theme(axis.text.x = element_text(angle = 0, hjust = 0.5))
ggsave(filename = "quando.png",plot = plot1, width = 10,height = 6,dpi = 300, bg = "white" )
plot1
Onde caem os pontos do georreferenciamento?
O que diz o questionário?
table(p2$`Unidade da Federação (Estado)`)
##
## Bahia (BA) Pernambuco (PE) Piauí (PI)
## 122 12 334
Por agora, dia 06 de agosto, a gente tem 122 na Bahia, 12 de Pernambuco e 334 no Piuaí. Ou seja, são 468 questionários válidos. 43 deles (43 + 468 = 511) tem status ‘not approved’ ou ‘on hold’, e um deles tem data de aplicação anterior a 21 de julho.
library(ggplot2)
# Criar tabela de frequência
dados_estados <- as.data.frame(table(p2$`Unidade da Federação (Estado)`))
names(dados_estados) <- c("Estado", "Observacoes")
# Ordenar os estados por número de observações (opcional)
dados_estados <- dados_estados[order(-dados_estados$Observacoes), ]
plot2 <- ggplot(dados_estados, aes(x = reorder(Estado, -Observacoes), y = Observacoes)) +
geom_bar(stat = "identity", fill = "lightblue") +
geom_text(aes(label = Observacoes), vjust = -0.5, size = 5) + # Números acima das barras
labs(
title = "Lares entrevistados até 06 de agosto",
x = "",
y = ""
) +
theme_minimal() +
theme(
axis.text.x = element_text(
angle = 0, # Sem rotação
hjust = 0.5, # Centralizado
size = 14
),
plot.title = element_text(size = 16, hjust = 0.5) # Título centralizado e maior
) +
ylim(0, max(dados_estados$Observacoes) * 1.1)
ggsave(filename = "estados.png",plot = plot2, width = 10,height = 6,dpi = 300, bg = "white" )
plot2
Aí vamos ver se o gerreferenciamento bate com esses dados.
# Carregar bibliotecas necessárias
library(dplyr)
library(leaflet)
library(htmlwidgets)
# Preparar os dados - filtrar coordenadas válidas
dados_mapa <- p2 %>%
filter(!is.na(`_Geolocalização_latitude`) &
!is.na(`_Geolocalização_longitude`)) %>%
mutate(
lat = as.numeric(`_Geolocalização_latitude`),
lng = as.numeric(`_Geolocalização_longitude`),
estado = `Unidade da Federação (Estado)`,
index = index
)
# Verificar se há dados após o filtro
if(nrow(dados_mapa) == 0) {
stop("Não há coordenadas válidas na base de dados")
}
# Criar paleta de cores para os estados
# Usando uma paleta qualitativa do RColorBrewer
estados_unicos <- unique(dados_mapa$estado)
cores_estados <- colorFactor(
palette = "Set1", # Paleta com cores distintas
domain = estados_unicos
)
# Criar o mapa
mapa_estados <- leaflet(dados_mapa) %>%
addTiles() %>% # Adiciona o mapa base
addCircleMarkers(
lng = ~lng,
lat = ~lat,
color = ~cores_estados(estado), # Cor por estado
popup = ~paste("<b>Index:</b>", index),
radius = 6,
stroke = FALSE,
fillOpacity = 0.8
) %>%
addLegend(
pal = cores_estados, # Usa a paleta de cores
values = ~estado, # Valores para a legenda
title = "", # Título da legenda
position = "bottomright" # Posição da legenda
) %>%
addScaleBar() %>% # Adiciona barra de escala
addControl("", position = "topright") # Título do mapa
# Salvar o mapa como HTML
saveWidget(mapa_estados, "mapa_por_estado.html")
# Visualizar o mapa (opcional)
mapa_estados
Até aqui, parece tudo OK.
Vamos ver se a cidade dada pela coordenada bate certinho com a cidade indicada no formulário.
library(geobr)
library(sf)
library(dplyr)
library(purrr)
library(stringi)
library(stringr)
# Função para padronizar nomes
padronizar_nomes <- function(x) {
x %>%
toupper() %>%
stri_trans_general("Latin-ASCII") %>%
str_squish()
}
# 1. Preparar os dados
dados_verificar <- p2 %>%
select(
index,
municipio_al = `Município (AL)`,
municipio_ba = `Município (BA)`,
municipio_pe = `Município (PE)`,
municipio_pi = `Município (PI)`,
municipio_se = `Município (SE)`,
lat = `_Geolocalização_latitude`,
lon = `_Geolocalização_longitude`
) %>%
filter(!is.na(lat) & !is.na(lon)) %>%
st_as_sf(coords = c("lon", "lat"), crs = 4326) %>%
st_transform(crs = 4674)
# 2. Baixar shapes dos municípios
shapes_municipios <- map_dfr(c("AL", "BA", "PE", "PI", "SE"), ~{
read_municipality(code_muni = .x, year = 2020) %>%
mutate(uf = .x) %>%
select(code_muni, name_muni, uf) %>%
mutate(name_muni_pad = padronizar_nomes(name_muni))
})
# 3. Verificar município de cada ponto
resultados <- st_join(
dados_verificar,
shapes_municipios %>% st_transform(crs = st_crs(dados_verificar)),
join = st_within
)
# 4. Identificar discrepâncias (versão corrigida)
discrepancias <- resultados %>%
# Extrair coordenadas antes de remover a geometria
mutate(
lon_original = st_coordinates(.)[,1],
lat_original = st_coordinates(.)[,2]
) %>%
st_drop_geometry() %>%
mutate(
municipio_declarado = case_when(
uf == "AL" ~ padronizar_nomes(municipio_al),
uf == "BA" ~ padronizar_nomes(municipio_ba),
uf == "PE" ~ padronizar_nomes(municipio_pe),
uf == "PI" ~ padronizar_nomes(municipio_pi),
uf == "SE" ~ padronizar_nomes(municipio_se)
),
discrepante = municipio_declarado != name_muni_pad
) %>%
filter(discrepante | is.na(uf)) %>%
select(
index,
uf,
municipio_declarado,
municipio_georref = name_muni,
code_muni,
lon_original,
lat_original
)
discrepancias2<-discrepancias %>% filter(municipio_declarado != "CURRAL NOVO")
print(discrepancias2)
## # A tibble: 8 × 7
## index uf municipio_declarado municipio_georref code_muni lon_original
## <dbl> <chr> <chr> <chr> <dbl> <dbl>
## 1 114 PI SOCORRO DO PIAUI Paes Landim 2207306 -42.2
## 2 123 PI SOCORRO DO PIAUI Santo Inácio Do Piauí 2209500 -41.9
## 3 124 PI CAMPINAS DO PIAUI Floresta Do Piauí 2203859 -41.7
## 4 160 BA CANSANCAO Queimadas 2925808 -39.6
## 5 313 PI BELA VISTA DO PIAUI Nova Santa Rita 2207959 -41.9
## 6 426 PI BELA VISTA DO PIAUI Nova Santa Rita 2207959 -41.9
## 7 427 PI BELA VISTA DO PIAUI Conceição Do Canindé 2202802 -41.5
## 8 447 PI BELA VISTA DO PIAUI Conceição Do Canindé 2202802 -41.5
## # ℹ 1 more variable: lat_original <dbl>
Das 8 discrepâncias em relação à geolocalização:
Socorro do Piauí e Paes Landim são vizinhos;
Socorro do Piuaí e Santo Inácio do Piauí não são vizinhos não. Na verdade, são 150km distantes um do outro (index = 123).
Campinas do Piauí e Floresta do Piauí são vizinhos.
Cansanção e Queimadas são vizinhos.
Bela Vista do Piauí e Nova Santa Rita são vizinhos.
Bela Vista do Piauí e Conceição do Canindé são vizinhos.
Vocês podem achar que vale a pena falar com todos os 8 questionários. Eu acho que o mais importante é verificar o que ocorreu com o index=123.
Vou olhar essas discrepâncias e juntar com a informação de quem fez o questionário.
discrepancias2<- discrepancias2 %>% left_join( p2 %>% select(index, `_submitted_by`), by = "index" )
discrepancias3 <- discrepancias2 %>% select(`_submitted_by`, everything())
print(discrepancias3)
## # A tibble: 8 × 8
## `_submitted_by` index uf municipio_declarado municipio_georref code_muni
## <chr> <dbl> <chr> <chr> <chr> <dbl>
## 1 leudiane_mariano 114 PI SOCORRO DO PIAUI Paes Landim 2207306
## 2 lucaslima88 123 PI SOCORRO DO PIAUI Santo Inácio Do Pi… 2209500
## 3 lucaslima88 124 PI CAMPINAS DO PIAUI Floresta Do Piauí 2203859
## 4 martim_affonso 160 BA CANSANCAO Queimadas 2925808
## 5 isadoraribeiro96 313 PI BELA VISTA DO PIAUI Nova Santa Rita 2207959
## 6 anderson_brito 426 PI BELA VISTA DO PIAUI Nova Santa Rita 2207959
## 7 anderson_brito 427 PI BELA VISTA DO PIAUI Conceição Do Canin… 2202802
## 8 anderson_brito 447 PI BELA VISTA DO PIAUI Conceição Do Canin… 2202802
## # ℹ 2 more variables: lon_original <dbl>, lat_original <dbl>
Colocando essas informações no Word.
library(officer)
##
## Attaching package: 'officer'
## The following object is masked from 'package:readxl':
##
## read_xlsx
library(dplyr)
# 1. Preparar os dados
tabela_word <- discrepancias3 %>%
select(`_submitted_by`, index, municipio_declarado, municipio_georref) %>%
arrange(`_submitted_by`, index) %>%
rename(
"Responsável" = `_submitted_by`,
"ID" = index,
"Declarado" = municipio_declarado,
"Georreferenciado" = municipio_georref
)
# 2. Criar documento Word
doc <- read_docx() %>%
# Título
body_add_par("RELATÓRIO DE DISCREPÂNCIAS", style = "heading 1") %>%
body_add_par(paste("Gerado em:", format(Sys.Date(), "%d/%m/%Y")), style = "Normal") %>%
body_add_par("\n", style = "Normal") %>%
# Criar tabela manualmente
body_add_table(
value = tabela_word,
style = "Normal Table", # Usa estilo pré-definido do Word
header = TRUE,
alignment = c("l", "c", "l", "l") # Alinhamento: esquerda, centro, esquerda, esquerda
) %>%
# Rodapé
body_add_par("\n", style = "Normal") %>%
body_add_par(paste("Total de registros:", nrow(tabela_word)), style = "Normal")
# 3. Salvar documento
print(doc, target = "discrepancias_simples.docx")
#arquivo de 06 de agosto - no nome do arquivo tem a data e a hora que ele foi atualizado
principal <- read_excel("Questionário_PRS_Caatinga_-_Avaliação_de_Impacto_-_all_versions_-_Portuguese_pt_-_2025-08-06-13-59-12.xlsx", sheet = "Questionário PRS Caatinga - ...")
principal$date<-date(principal$`Data e horário de início da entrevista`)
principal <- principal %>% filter(date > as.Date("2025-07-21"))
p2 <- principal %>% filter(!`_validation_status` %in% c("Not Approved", "On Hold"))
p2$index<-p2$`_index`
library(ggplot2)
library(dplyr)
# Função para salvar gráficos
salvar_grafico <- function(grafico, nome_arquivo) {
ggsave(paste0(nome_arquivo, ".png"),
plot = grafico,
width = 8,
height = 6,
dpi = 300)
}
# a) Grupo amostral
j1 <- ggplot(p2, aes(x = `Grupo amostral`)) +
geom_bar(fill = "steelblue") +
geom_text(stat = 'count', aes(label = after_stat(count)),
vjust = -0.5, size = 3.5) + # Adiciona contagem em cima das barras
labs(title = "Distribuição do Grupo Amostral",
x = "",
y = "Contagem") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 0, hjust = 0.5, size = 10)) # Aumenta tamanho dos ticks
# b) Principal meio de transporte
j2 <- ggplot(p2, aes(x = `Principal meio de transporte utilizado para sair da propriedade`)) +
geom_bar(fill = "darkorange") +
geom_text(stat = 'count', aes(label = after_stat(count)),
vjust = -0.5, size = 3.5) +
labs(title = "Principal Meio de Transporte",
x = "",
y = "Contagem") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 0, hjust = 0.5, size = 10))
# c) Estado das estradas
j3 <- ggplot(p2, aes(x = `Estado das estradas que ligam a propriedade a esses lugares:`)) +
geom_bar(fill = "forestgreen") +
geom_text(stat = 'count', aes(label = after_stat(count)),
vjust = -0.5, size = 3.5) +
labs(title = "Estado das Estradas",
x = "",
y = "Contagem") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 0, hjust = 0.5, size = 10))
# Salvar gráficos
salvar_grafico(j1, "grupo_amostral")
salvar_grafico(j2, "meio_transporte")
salvar_grafico(j3, "estado_estradas")
# Exibir gráficos
print(j1)
print(j2)
print(j3)
# 1. Converter para número (maneira simples)
p2$tempo_centro <- as.numeric(p2$`Tempo de deslocamento médio (minutos) até o CENTRO URBANO mais próximo`)
# 2. Ver os números básicos
cat("--- Resumo do Tempo de Deslocamento ---\n")
## --- Resumo do Tempo de Deslocamento ---
print(summary(p2$tempo_centro))
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.00 12.00 20.00 24.53 30.00 180.00 1
# 3. Identificar valores extremos (simplificado)
media <- mean(p2$tempo_centro, na.rm = TRUE)
desvio <- sd(p2$tempo_centro, na.rm = TRUE)
# Valores muito altos (acima de média + 3 desvios)
extremamente_altos <- p2$tempo_centro > (media + 3*desvio)
cat("\nValores extremamente altos:\n")
##
## Valores extremamente altos:
print(p2[extremamente_altos, c("index", "_submitted_by", "tempo_centro")])
## # A tibble: 9 × 3
## index `_submitted_by` tempo_centro
## <dbl> <chr> <dbl>
## 1 56 renatabenicio 90
## 2 134 renatabenicio 120
## 3 189 ismaellandim 90
## 4 265 anaclaudia1 120
## 5 282 ismaellandim 180
## 6 308 anaclaudia1 120
## 7 328 andrefbrandao 120
## 8 397 anaclaudia1 120
## 9 NA <NA> NA
# 4. Gráfico básico
boxplot(p2$tempo_centro,
main = "Tempo até o Centro Urbano (minutos)",
ylab = "Minutos",
col = "lightblue")
# Versão focada só nos gráficos
vars_tempo <- names(p2)[grep("Tempo de deslocamento", names(p2))]
# Configurar área de plotagem (opcional)
par(mfrow = c(1, 1)) # 1 gráfico por vez
for(var in vars_tempo) {
# Converter para numérico
valores <- as.numeric(p2[[var]])
# Criar boxplot (apenas a figura)
boxplot(valores,
main = var,
ylab = "Minutos",
col = "lightgreen",
outpch = 19) # Formato dos outliers
# Pausa entre gráficos (opcional)
Sys.sleep(2) # 2 segundos entre gráficos
}
Com quem falar?
print(p2[p2$Automóvel == 11, c("index", "_submitted_by")])
## # A tibble: 2 × 2
## index `_submitted_by`
## <dbl> <chr>
## 1 NA <NA>
## 2 463 lucaslima88
print(p2[p2$index == 123, c("index", "_submitted_by")])
## # A tibble: 1 × 2
## index `_submitted_by`
## <dbl> <chr>
## 1 123 lucaslima88
print(p2[p2$`Casa própria` == 4, c("index", "_submitted_by")])
## # A tibble: 4 × 2
## index `_submitted_by`
## <dbl> <chr>
## 1 54 luanaalves799
## 2 212 nicolasdean_
## 3 347 jayane_freires
## 4 NA <NA>
Esses 3 questionários estão indicando que são 4 casas que a pessoa tem. Eu achei muito. Index=54, luanaalves799, index=212, nicolasdean_, index=347, jayane_freires.