1 Introdução

Este projeto investiga como os registros de atendimento da Defesa Civil do Recife se distribuem entre regiões, meses e tipos de ação em 2024. A análise pretende caracterizar a atuação registrada e produzir informações que possam apoiar discussões sobre o planejamento dos serviços.

Os dados foram obtidos no Portal de Dados Abertos do Recife. O arquivo utilizado é o CSV de atendimentos de 2024, preservado em sua versão original. O arquivo foi baixado em 05/11/2026. O conteúdo combina solicitações, ocorrências e ações.

2 Pacotes utilizados

O pacote readr importa arquivos CSV; dplyr permite manipular e resumir os dados; stringr padroniza textos; e ggplot2 constrói os gráficos. Instale-os uma vez no Console antes de compilar o relatório.

# install.packages(c("readr", "dplyr", "stringr", "ggplot2"))

library(readr)
library(dplyr)
library(stringr)
library(ggplot2)

3 Importação

Coloque atendimentos_2024.csv e este documento na mesma pasta. O CSV usa ponto e vírgula como separador. A leitura inicial utiliza texto para permitir conversões explícitas. A prévia limita a impressão a seis linhas.

arquivo <- "atendimentos_2024.csv"

if (!file.exists(arquivo)) {
  stop("CSV nao encontrado. Coloque-o na pasta do projeto ou ajuste 'arquivo'.")
}

# Ler como texto permite inspecionar os valores. Os numeros e as datas serao
# convertidos explicitamente, depois da inspecao.
dados_originais <- read_delim(
  arquivo,
  delim = ";",
  col_types = cols(.default = col_character()),
  locale = locale(encoding = "UTF-8"),
  na = c("", "NA"),
  trim_ws = FALSE,
  show_col_types = FALSE
)

dimensoes <- data.frame(
  registros = nrow(dados_originais),
  variaveis = ncol(dados_originais)
)
print(dimensoes)
##   registros variaveis
## 1     80173        16
print(head(dados_originais, 6))
## # A tibble: 6 × 16
##   Regional Ano   Mês   Data    Ocorrencia Solicitacao Endereco Bairro Localidade
##   <chr>    <chr> <chr> <chr>   <chr>      <chr>       <chr>    <chr>  <chr>     
## 1 Oeste    2024  Abril 2024-0… <NA>       <NA>        Rua Cap… Varzea Barreiras 
## 2 Nordeste 2024  Abril 2024-0… <NA>       Vistoria    Rua Cru… Guabi… Alto da G…
## 3 Nordeste 2024  Abril 2024-0… <NA>       Colocação … Subida … Nova … Alto da B…
## 4 Nordeste 2024  Abril 2024-0… <NA>       Colocação … Subida … Nova … Alto da B…
## 5 Nordeste 2024  Abril 2024-0… <NA>       Monitorame… Rua Alt… Nova … Alto da B…
## 6 Nordeste 2024  Abril 2024-0… <NA>       Monitorame… Rua Alt… Nova … Alto da B…
## # ℹ 7 more variables: Grau_de_Risco <chr>, Data_da_Acao <chr>,
## #   Tipo_da_Acao <chr>, Quantidade <chr>, Altura <chr>, Largura <chr>,
## #   Area_m <chr>

4 Diagnóstico inicial

A tabela abaixo informa os campos ausentes da base original, antes dos tratamentos. A marcação de repetições compara as colunas originais e preserva os registros para investigação.

diagnostico_ausencias <- data.frame(
  variavel = names(dados_originais),
  ausentes = colSums(is.na(dados_originais))
) %>%
  mutate(percentual = round(100 * ausentes / nrow(dados_originais), 2)) %>%
  arrange(desc(ausentes))
print(diagnostico_ausencias)
##                    variavel ausentes percentual
## Ocorrencia       Ocorrencia    77811      97.05
## Largura             Largura    70491      87.92
## Altura               Altura    70469      87.90
## Quantidade       Quantidade    68778      85.79
## Grau_de_Risco Grau_de_Risco    48812      60.88
## Solicitacao     Solicitacao    27536      34.35
## Tipo_da_Acao   Tipo_da_Acao    18918      23.60
## Bairro               Bairro       57       0.07
## Data_da_Acao   Data_da_Acao        8       0.01
## Data                   Data        1       0.00
## Regional           Regional        0       0.00
## Ano                     Ano        0       0.00
## Mês                     Mês        0       0.00
## Endereco           Endereco        0       0.00
## Localidade       Localidade        0       0.00
## Area_m               Area_m        0       0.00
# Identificar repeticoes exatas nas colunas originais.
# TRUE indica uma repeticao posterior a uma primeira linha igual.
# Nenhuma linha sera excluida apenas por apresentar essa marcacao.
repeticao_original <- duplicated(dados_originais)
print(data.frame(repeticoes_a_investigar = sum(repeticao_original)))
##   repeticoes_a_investigar
## 1                    5931

5 Padronização dos nomes e textos

A cópia de trabalho recebe nomes de colunas padronizados. O identificador id é criado com o número da linha e serve para localizar registros no arquivo, sem identificar solicitações únicas. Espaços extras e variações de maiúsculas são normalizados. Valores originais permanecem em dados_originais. As categorias de serviços com significados diferentes continuam separadas. Os rótulos de bairros não identificados são convertidos para NA.

# Trabalhar em uma copia mantem os valores originais disponiveis.
dados <- dados_originais %>%
  rename(
    regional = Regional, ano_informado = Ano,
    mes_informado = `Mês`, data_registro = Data,
    ocorrencia = Ocorrencia, solicitacao = Solicitacao,
    endereco = Endereco, bairro = Bairro, localidade = Localidade,
    grau_risco = Grau_de_Risco, data_acao = Data_da_Acao,
    tipo_acao = Tipo_da_Acao, quantidade = Quantidade,
    altura = Altura, largura = Largura, area_m = Area_m
  ) %>%
  mutate(
    # Identificador criado para localizar cada linha do arquivo.
    id = row_number(),
    across(where(is.character), ~ na_if(str_squish(.x), "")),
    across(c(regional, bairro, localidade),
           ~ str_to_title(.x, locale = "pt")),
    across(c(ocorrencia, solicitacao, tipo_acao, mes_informado),
           ~ str_to_lower(.x, locale = "pt")),
    grau_risco = str_to_upper(grau_risco, locale = "pt"),
    possivel_repeticao_original = repeticao_original
  )

# Estes rotulos representam ausencia de identificacao do bairro.
# O texto original continua disponivel em dados_originais.
rotulos_sem_bairro <- c(
  "Nao Informado", "Não Informado", "Bairro Nao Cadastrado",
  "Bairro Não Cadastrado"
)
dados <- dados %>%
  mutate(bairro = if_else(bairro %in% rotulos_sem_bairro, NA_character_, bairro))

6 Conversão dos tipos e verificação das datas

Datas e números recebem os tipos adequados. Datas ausentes, inválidas, fora do período e ações anteriores à outra data são sinalizadas. Os anos não são alterados automaticamente.

dados <- dados %>%
  mutate(
    across(c(ano_informado, quantidade, altura, largura, area_m),
           ~ parse_double(.x, locale = locale(decimal_mark = "."))),
    data_registro_original = data_registro,
    data_acao_original = data_acao,
    data_registro = as.Date(substr(data_registro_original, 1, 10),
                            format = "%Y-%m-%d"),
    data_acao = as.Date(substr(data_acao_original, 1, 10),
                        format = "%Y-%m-%d"),
    data_registro_invalida = !is.na(data_registro_original) & is.na(data_registro),
    data_acao_invalida = !is.na(data_acao_original) & is.na(data_acao),
    data_registro_fora_2024 = !is.na(data_registro) &
      format(data_registro, "%Y") != "2024",
    data_acao_fora_2024 = !is.na(data_acao) &
      format(data_acao, "%Y") != "2024",
    acao_antes_registro = !is.na(data_registro) & !is.na(data_acao) &
      data_acao < data_registro,
    risco_informado = !is.na(grau_risco)
  )

# Nao corrigir os anos automaticamente nem interpretar a diferenca entre
# as datas como tempo de resposta sem confirmar suas definicoes na fonte.
diagnostico_datas <- dados %>%
  summarise(
    registro_sem_data = sum(is.na(data_registro)),
    acao_sem_data = sum(is.na(data_acao)),
    registro_invalido = sum(data_registro_invalida),
    acao_invalida = sum(data_acao_invalida),
    registro_fora_2024 = sum(data_registro_fora_2024),
    acao_fora_2024 = sum(data_acao_fora_2024),
    acao_anterior_ao_registro = sum(acao_antes_registro)
  )
print(diagnostico_datas)
## # A tibble: 1 × 7
##   registro_sem_data acao_sem_data registro_invalido acao_invalida
##               <int>         <int>             <int>         <int>
## 1                 1             8                 0             0
## # ℹ 3 more variables: registro_fora_2024 <int>, acao_fora_2024 <int>,
## #   acao_anterior_ao_registro <int>

7 Criação de variáveis e recorte temporal

Para a análise temporal, adota-se a data da ação como referência. Criam-se mês, trimestre, dia da semana e indicador de fim de semana. O subconjunto temporal inclui somente ações com data em 2024, enquanto a base preparada preserva todas as linhas. A tabela explicita o tamanho de cada conjunto.

meses <- c("Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho",
           "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro")
dias <- c("Domingo", "Segunda-feira", "Terça-feira", "Quarta-feira",
          "Quinta-feira", "Sexta-feira", "Sábado")

dados <- dados %>%
  mutate(
    mes_numero = as.integer(format(data_acao, "%m")),
    mes_acao = factor(meses[mes_numero], levels = meses, ordered = TRUE),
    trimestre = (mes_numero - 1L) %/% 3L + 1L,
    dia_numero = as.integer(format(data_acao, "%w")),
    dia_semana = factor(dias[dia_numero + 1L], levels = dias, ordered = TRUE),
    fim_de_semana = if_else(is.na(dia_numero), NA,
                            dia_numero %in% c(0L, 6L))
  )

# Filtrar somente para as analises que usam a data da acao em 2024.
# A base 'dados' continua contendo todas as linhas, inclusive as sinalizadas.
dados_2024 <- dados %>%
  filter(!is.na(data_acao), format(data_acao, "%Y") == "2024")

print(data.frame(
  registros_originais = nrow(dados_originais),
  registros_preparados = nrow(dados),
  registros_com_acao_em_2024 = nrow(dados_2024),
  fora_do_recorte_temporal = nrow(dados) - nrow(dados_2024)
))
##   registros_originais registros_preparados registros_com_acao_em_2024
## 1               80173                80173                      80163
##   fora_do_recorte_temporal
## 1                       10

8 Resumos descritivos

As contagens usam o mesmo recorte temporal. A ausência do tipo de ação aparece como uma categoria própria, sem eliminar o registro. As contagens incluem os registros sinalizados como possíveis repetições.

resumo_mensal <- dados_2024 %>%
  count(mes_acao, name = "registros", .drop = FALSE)

resumo_regional <- dados_2024 %>%
  mutate(regional = coalesce(regional, "Não informada")) %>%
  count(regional, name = "registros", sort = TRUE) %>%
  mutate(percentual = round(100 * registros / sum(registros), 2))

resumo_acoes <- dados_2024 %>%
  mutate(tipo_acao = coalesce(tipo_acao, "não informado")) %>%
  count(tipo_acao, name = "registros", sort = TRUE)

print(resumo_mensal)
## # A tibble: 12 × 2
##    mes_acao  registros
##    <ord>         <int>
##  1 Janeiro        7313
##  2 Fevereiro      6463
##  3 Março         10559
##  4 Abril         12070
##  5 Maio           8790
##  6 Junho          7555
##  7 Julho          7628
##  8 Agosto         5764
##  9 Setembro       4116
## 10 Outubro        3873
## 11 Novembro       3072
## 12 Dezembro       2960
print(resumo_regional)
## # A tibble: 6 × 3
##   regional registros percentual
##   <chr>        <int>      <dbl>
## 1 Norte        20537       25.6
## 2 Noroeste     16075       20.0
## 3 Sul          14280       17.8
## 4 Oeste        12950       16.2
## 5 Nordeste      9110       11.4
## 6 Planície      7211        9
print(head(resumo_acoes, 10))
## # A tibble: 10 × 2
##    tipo_acao                      registros
##    <chr>                              <int>
##  1 atendimento social                 30080
##  2 não informado                      18918
##  3 acoes de porta-porta               15383
##  4 analise visual estrutural           7698
##  5 mapeamento de area de risco         2487
##  6 rocagem                             1954
##  7 encaminhamentos aos parceiros        848
##  8 distribuicao de cestas basicas       543
##  9 acoes educativas                     322
## 10 corte de arvores                     295

9 Visualização dos registros

Os gráficos mostram o volume mensal e a distribuição por regional das ações datadas em 2024. Eles devem ser interpretados como contagens de registros. Concentração de registros não equivale, por si só, a maior risco, maior população atendida ou maior eficiência do serviço.

grafico_mensal <- ggplot(resumo_mensal, aes(x = mes_acao, y = registros)) +
  geom_col(fill = "#28668A", width = 0.75) +
  labs(
    title = "Registros por mês da ação em 2024",
    x = "Mês", y = "Número de registros",
    caption = "Fonte: Defesa Civil do Recife. Possíveis repetições mantidas."
  ) +
  theme_minimal(base_size = 12) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

grafico_regional <- ggplot(
  resumo_regional, aes(x = reorder(regional, registros), y = registros)
) +
  geom_col(fill = "#287A62", width = 0.75) +
  coord_flip() +
  labs(
    title = "Registros por regional: ações datadas em 2024",
    x = "Regional", y = "Número de registros",
    caption = "Fonte: Defesa Civil do Recife. Possíveis repetições mantidas."
  ) +
  theme_minimal(base_size = 12)

print(grafico_mensal)

print(grafico_regional)