Em 2022, o mundo e o Brasil vivenciaram o cenário “pós-vacina”, onde a COVID-19 continuou circulando, mas com um perfil clínico alterado. O problema endereçado neste relatório é: “Como a COVID-19 se comportou na população do Recife em 2022, considerando que a maioria dos casos passou a ser leve e subnotificada?”. Analisar apenas óbitos conta apenas metade da história; entender os casos leves é crucial para dimensionar o impacto na força de trabalho e na atenção primária.
Para abordar este problema, utilizaremos dados abertos da
Prefeitura do Recife referentes às notificações de
casos leves de síndrome gripal.
A metodologia consiste em uma análise exploratória de dados (EDA)
quantitativa, focada na distribuição temporal, perfil demográfico (idade
e sexo) e análise textual dos sintomas relatados.
A abordagem técnica adotada utiliza a linguagem R e o ecossistema tidyverse para limpar, transformar e visualizar os dados. Diferentemente de relatórios estáticos, esta abordagem permite a reprodutibilidade total da análise. Serão aplicadas técnicas de mineração de texto simples para desmembrar sintomas agrupados e engenharia de recursos para calcular o tempo de resposta entre sintomas e notificação.
Esta análise ajudará gestores públicos e pesquisadores a
identificar:
1. Padrões de sazonalidade que exigem reforço de equipes em postos de
saúde.
2. Sintomas sentinelas que podem diferenciar novas variantes.
3. Grupos demográficos mais expostos, orientando campanhas de
conscientização direcionadas.
Abaixo, carregamos todas as bibliotecas necessárias para a execução deste projeto.
library(tidyverse) # Fundamental para manipulação de dados (dplyr) e visualização (ggplot2)
library(lubridate) # Essencial para manipulação de datas (notificacao e sintomas)
library(knitr) # Para geração de tabelas estáticas no relatório
library(kableExtra) # Para estilização avançada de tabelas HTML
library(stringr) # Para manipulação de strings (limpeza de sintomas)
library(scales) # Para formatação de escalas nos gráficostidyverse: Um “meta-pacote” que inclui readr (leitura de
dados), dplyr (manipulação), tidyr (organização) e ggplot2 (gráficos). É
a espinha dorsal da análise.
lubridate: Facilita a conversão de textos para objetos de data,
permitindo cálculos de intervalos de tempo.
knitr/kableExtra: Transformam dataframes brutos em tabelas
visualmente agradáveis e profissionais para o relatório final.
stringr: Utilizado especificamente para tratar a coluna de
sintomas, que contém múltiplos valores em uma única célula.
Os dados originais foram obtidos no Portal de Dados Abertos da Prefeitura do Recife e fornecem informações referentes aos Casos Leves de Covid-19 (Para este relatório estaremos analisando o ano de 2022). Link para a fonte: Casos Leves - Covid-19 - 2022.
O conjunto de dados contém registros de atendimento de síndromes
gripais. Originalmente, possui colunas mistas com separador ‘;’.
Peculiaridades notáveis incluem:
1 - Datas em formato texto que precisam de conversão;
2 - A coluna sintomas agrupa múltiplas queixas separadas por
vírgula;
3 - Presença de dados de outros municípios (embora a base seja do
Recife, pacientes de fora são atendidos); e
4 - Valores ausentes ou preenchidos como “Ignorado”.
Nesta etapa, importamos o arquivo CSV e aplicamos um pipeline de limpeza. O objetivo é filtrar apenas residentes do Recife notificados em 2022, corrigir os tipos de dados e criar novas variáveis úteis.
# Importação dos dados (assumindo que o arquivo está no diretório de trabalho)
# Utiliza-se read_delim com ";" pois é o padrão brasileiro de CSV
dados_brutos <- read_delim("casoslevescovid2022.csv",
delim = ";",
locale = locale(encoding = "UTF-8"),
show_col_types = FALSE)
# Pipeline de Limpeza
dados_limpos <- dados_brutos %>%
# Renomear colunas para garantir padronização (se necessário, mas usando os nomes fornecidos)
# Filtragem inicial: Apenas Recife
filter(municipio_residencia == "Recife") %>%
# Tratamento de Datas
mutate(
data_notificacao = ymd(data_notificacao), # Converte para formato Data
data_inicio_sintomas = ymd(data_inicio_sintomas),
idade = suppressWarnings(as.numeric(idade))
) %>%
# Filtragem Temporal (Garantir que é 2022)
filter(year(data_notificacao) == 2022) %>%
# Engenharia de Variáveis (Item 6.3 - Criatividade/Técnica)
mutate(
# Calcular tempo entre sintomas e notificação (Delay)
tempo_notificacao = as.numeric(data_notificacao - data_inicio_sintomas),
# Categorizar faixa etária
faixa_etaria = cut(idade,
breaks = c(0, 12, 18, 30, 50, 65, 120),
labels = c("Crianca", "Adolescente", "Jovem Adulto", "Adulto", "Meia Idade", "Idoso")),
# Simplificar Sexo (remover erros de digitação se houver)
sexo = str_to_title(sexo)
) %>%
# Seleção de colunas relevantes para a análise
select(sexo, idade, faixa_etaria, data_notificacao, sintomas, bairro, evolucao_caso, tempo_notificacao) %>%
# Remoção de inconsistências óbvias (ex: datas negativas)
filter(tempo_notificacao >= 0)
# Verificação rápida
n_linhas <- nrow(dados_limpos)
# Exibe a quantidade de linhas válidas para análise
print(n_linhas)## [1] 245938
Abaixo, apresentamos uma amostra condensada dos dados prontos para análise.
dados_limpos %>%
head(20) %>%
kable(caption = "Amostra dos Dados Limpos (Primeiras 20 linhas)") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"))| sexo | idade | faixa_etaria | data_notificacao | sintomas | bairro | evolucao_caso | tempo_notificacao |
|---|---|---|---|---|---|---|---|
| Masculino | 1 | Crianca | 2022-06-21 | Coriza, Tosse, Febre | IBURA | NA | 3 |
| Feminino | 65 | Meia Idade | 2022-02-02 | Febre, Dor de Cabeça | JIQUIA | NA | 0 |
| Feminino | 47 | Adulto | 2022-06-14 | Distúrbios Gustativos, Dor de Cabeça, Dor de Garganta | DOIS IRMAOS | NA | 3 |
| Masculino | 74 | Idoso | 2022-06-21 | Tosse, Coriza | AREIAS | NA | 7 |
| Feminino | 71 | Idoso | 2022-06-21 | Assintomático | TORROES | NA | 0 |
| Masculino | 50 | Adulto | 2022-06-21 | Coriza, Dor de Cabeça | LINHA DO TIRO | NA | 4 |
| Feminino | 42 | Adulto | 2022-06-21 | Dor de Cabeça, Coriza | TAMARINEIRA | NA | 2 |
| Masculino | 58 | Meia Idade | 2022-06-21 | Assintomático | IGNORADO | NA | 0 |
| Masculino | 0 | NA | 2022-06-21 | Tosse, Outros | ESTANCIA | NA | 10 |
| Feminino | 39 | Adulto | 2022-04-20 | Coriza, Dor de Cabeça, Tosse, Febre, Dor de Garganta, Distúrbios Gustativos | BOA VISTA | NA | 4 |
| Feminino | 23 | Jovem Adulto | 2022-06-21 | Assintomático | VARZEA | NA | 0 |
| Feminino | 54 | Meia Idade | 2022-06-21 | Assintomático | ENGENHO DO MEIO | NA | 0 |
| Feminino | 35 | Adulto | 2022-06-18 | Assintomático | ESPINHEIRO | NA | 0 |
| Masculino | 17 | Adolescente | 2022-06-14 | Assintomático | ROSARINHO | NA | 0 |
| Feminino | 31 | Adulto | 2022-06-15 | Coriza, Dor de Cabeça, Tosse, Febre, Dispneia, Dor de Garganta | TAMARINEIRA | NA | 5 |
| Feminino | 41 | Adulto | 2022-06-14 | Dor de Cabeça, Tosse, Dor de Garganta, Distúrbios Gustativos | TORRE | NA | 3 |
| Masculino | 31 | Adulto | 2022-06-14 | Coriza, Tosse, Dor de Garganta | CASA FORTE | NA | 5 |
| Masculino | 58 | Meia Idade | 2022-06-21 | Assintomático | IGNORADO | NA | 0 |
| Feminino | 47 | Adulto | 2022-06-21 | Assintomático | ENCRUZILHADA | NA | 0 |
| Masculino | 43 | Adulto | 2022-06-21 | Coriza, Tosse, Febre, Dor de Garganta | AFLITOS | NA | 4 |
Abaixo, um resumo consolidado das principais variáveis numéricas e categóricas.
# Resumo estatístico da idade e tempo de notificação
dados_limpos %>%
summarise(
Media_Idade = mean(idade, na.rm = TRUE),
Mediana_Idade = median(idade, na.rm = TRUE),
Media_Tempo_Notificacao = mean(tempo_notificacao, na.rm = TRUE),
Total_Casos = n()
) %>%
kable(caption = "Estatísticas Descritivas Gerais", digits = 1) %>%
kable_styling(full_width = FALSE)| Media_Idade | Mediana_Idade | Media_Tempo_Notificacao | Total_Casos |
|---|---|---|---|
| 39.7 | 38 | 5.5 | 245938 |
A análise a seguir busca ir além da contagem simples. Investigaremos a sazonalidade da doença em 2022, o perfil demográfico detalhado e faremos uma mineração nos textos dos sintomas para entender o quadro clínico predominante.
Investigamos como os casos se distribuíram ao longo das semanas epidemiológicas de 2022.
dados_semanais <- dados_limpos %>%
mutate(semana = floor_date(data_notificacao, "week")) %>%
count(semana)
ggplot(dados_semanais, aes(x = semana, y = n)) +
geom_line(color = "#2c3e50", size = 1) +
geom_area(fill = "#3498db", alpha = 0.4) +
scale_x_date(date_labels = "%b", date_breaks = "1 month") +
theme_minimal() +
labs(
title = "Curva Epidêmica de Casos Leves (2022)",
subtitle = "Notificações semanais no Recife",
x = "Mês",
y = "Número de Casos",
caption = "Fonte: Prefeitura do Recife"
)Insight: O gráfico revela claramente os picos de
contágio. Em 2022, é provável observar um grande pico no início do ano
(variante Ômicron) e oscilações menores posteriormente. Isso demonstra a
natureza cíclica da infecção mesmo em cenários vacinados.
OBS: É provável que algum atraso nas notificações durante o mês de
Janeiro/2022 faça parecer que os casos foram mínimos durante este mês,
porém (muito provavelmente) o montante de Janeiro deve estar somado ao
número de notificações de Fevereiro.
Analisamos a distribuição por sexo e faixa etária.
dados_limpos %>%
filter(sexo %in% c("Feminino", "Masculino")) %>%
count(faixa_etaria, sexo) %>%
ggplot(aes(x = faixa_etaria, y = n, fill = sexo)) +
geom_col(position = "dodge") +
scale_fill_manual(values = c("Feminino" = "#e74c3c", "Masculino" = "#2980b9")) +
theme_minimal() +
labs(
title = "Perfil Demográfico dos Casos Leves de COVID-19 [Recife, 2022]",
subtitle = "Comparação por Faixa Etária e Sexo",
x = "Faixa Etária",
y = "Total de Casos",
fill = "Sexo"
) +
theme(legend.position = "top")
Insight: Diferente dos casos graves que afetam
desproporcionalmente idosos, os casos leves tendem a se concentrar na
população economicamente ativa (Jovens Adultos e Adultos) e,
frequentemente, com maior notificação entre mulheres, possivelmente
devido ao comportamento de busca por saúde mais frequente neste
grupo.
Aqui aplicamos uma técnica de separação de texto para contar sintomas individuais, já que a coluna original agrupa vários.
# Separar as linhas onde há múltiplos sintomas
sintomas_freq <- dados_limpos %>%
select(sintomas) %>%
separate_rows(sintomas, sep = ",\\s*") %>% # Separa por vírgula e espaço opcional
mutate(sintomas = str_to_title(str_trim(sintomas))) %>% # Padroniza texto
filter(!sintomas %in% c("Outros", "Ignorado", "")) %>% # Remove ruído
count(sintomas, sort = TRUE) %>%
slice_head(n = 10)
ggplot(sintomas_freq, aes(x = reorder(sintomas, n), y = n)) +
geom_col(fill = "#27ae60") +
coord_flip() + # Inverte eixos para melhor leitura
geom_text(aes(label = n), hjust = -0.001, size = 3) +
theme_minimal() +
labs(
title = "Sintomatologia Predominante em 2022",
x = "Sintoma",
y = "Frequência"
)
Insight: A predominância de sintomas como “Tosse, Dor
de Cabeça. Dor de Garganta e Coriza” confirma o perfil “leve” dos casos
e a mudança característica das variantes circulantes em 2022. Vale
também ressaltar que Casos Assintomáticos apresentam o maior número
nesta avaliação.
Tabela resumida dos locais com maior incidência.
dados_limpos %>%
count(bairro, sort = TRUE) %>%
slice_head(n = 10) %>%
kable(caption = "Top 10 Bairros com Mais Notificações") %>%
kable_styling(full_width = FALSE, position = "left")| bairro | n |
|---|---|
| BOA VIAGEM | 24823 |
| IGNORADO | 13063 |
| VARZEA | 11396 |
| CASA AMARELA | 9770 |
| IPUTINGA | 7908 |
| CORDEIRO | 7632 |
| MADALENA | 7619 |
| GRACAS | 6377 |
| IBURA | 5612 |
| IMBIRIBEIRA | 5606 |
A análise dos dados de 2022 responde à nossa questão inicial: a COVID-19 no Recife persistiu como uma doença de alta circulação, mas com baixa severidade clínica aparente nos dados notificados. Ela se comportou de maneira sazonal, exigindo atenção contínua do sistema de saúde.
A metodologia de limpeza e visualização via tidyverse mostrou-se eficaz para lidar com o volume de dados e a necessidade de desagregação de strings (sintomas). O código produzido é modular e permite fácil atualização se novos dados forem inseridos.
Destacamos três descobertas principais:
1 - Sazonalidade Marcada: A doença não é constante, ela explode em
janelas curtas de tempo.
2 - Perfil Ativo: A doença em 2022 foi uma doença da força de trabalho
(adultos jovens), o que gera impacto econômico por afastamentos
(absenteísmo).
3 - Sintomas “Gripais”: A “perda de olfato”, tão comum em 2020, deu
lugar à “dor de garganta” e “coriza”, confundindo o diagnóstico com
gripes comuns.
Para a Prefeitura do Recife, os dados sugerem que campanhas de vacinação de reforço devem anteceder os meses de pico identificados (início do ano). Além disso, a alta incidência em jovens adultos sugere que campanhas em locais de trabalho podem ser eficazes.
Uma limitação clara desta análise é a subnotificação, pois muitos casos leves em 2022 foram diagnosticados via autoteste e não entraram no sistema.