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