Qual a tarefa?

É preciso fazer:

  1. A junção da base de dados;
  2. Algumas análises de consistência pra saber se está tudo indo bem com os questionários.

Algumas questões para perguntar pro grupo

Pacotes e Diretório

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) 

O arquivo que sai do Kobo

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`

Quando?

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

O georreferenciamento é bom?

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:

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")

Outliers nas variáveis e outras verificações

#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.