Prognóstico de Risco e Sistemas de Aviso Precoce

Author

RMACS

Published

January 15, 2026

Modelagem Preditiva

A modelagem preditiva utiliza dados históricos para identificar padrões e estimar eventos futuros, apoiando a tomada de decisão. Na saúde pública, contribui para antecipar riscos, fortalecer sistemas de alerta precoce e orientar ações preventivas.

A previsão no sector da saúde é fundamental para antecipar riscos, reduzir impactos de surtos e melhorar a resposta dos serviços de saúde. Ao permitir a identificação precoce de períodos e áreas de maior risco, a previsão apoia o planeamento estratégico, a alocação eficiente de recursos e a implementação oportuna de medidas preventivas. Dessa forma, contribui para a proteção da população, o fortalecimento da vigilância epidemiológica e a tomada de decisão baseada em evidências.

Ciclo de um Algoritmo preditivo

Aprendizado de Maquina ou Machine Learning

Machine Learning é um ramo da inteligência artificial que se baseia no desenvolvimento de algoritmos capazes de aprender padrões automaticamente a partir dos dados, sem necessidade de programação explícita para cada situação. Esses métodos identificam relações complexas e não lineares entre variáveis, tornando-se especialmente úteis quando os fenómenos analisados são influenciados por múltiplos fatores interligados.

Etapas do Desenvolvimento

Preparação dos Dados

  • Reunir todas as fontes de informação em uma única base de dados limpa e organizada. Tratar valores ausentes, duplicados e inconsistências.

Definição dos Rótulos (Labels)

  • Determinar a variável alvo que o modelo deverá prever ou classificar. Exemplo: ocorrência de surto, nível de risco, número de casos.

Treinamento dos Modelos

  • Desenvolver vários algoritmos de Machine Learning utilizando os dados históricos. Durante essa etapa, os modelos “aprendem” padrões e relações presentes nos dados.

Validação dos Modelos

  • Avaliar o desempenho dos modelos em dados não utilizados no treinamento. Métricas comuns: acurácia, sensibilidade, especificidade, erro médio.

Seleção do Modelo Preditivo

  • Comparar os modelos treinados e escolher o que apresenta melhor desempenho. Este modelo selecionado será utilizado para fazer previsões em novos dados.

Previsão

  • Aplicar o modelo preditivo em dados futuros ou desconhecidos para antecipar eventos ou classificar riscos.

Tipos de Aprendizado

Existem 3 tipos de aprendizado de maquina principais:

Aprendizado Supervisionado

O Aprendizado Supervisionado é uma técnica de Machine Learning em que o modelo aprende a partir de dados rotulados, ou seja, conjuntos de dados em que a variável alvo já é conhecida. O objetivo é treinar o modelo para prever ou classificar novos casos com base em padrões aprendidos.

  1. Características principais:
  • Os dados de entrada incluem variáveis explicativas (features) e rótulos (labels).

  • O modelo ajusta seus parâmetros para minimizar a diferença entre as previsões e os valores reais.

Amplamente utilizado em problemas de:

  • Classificação: prever categorias, como risco baixo/médio/alto ou ocorrência de surto.

  • Regressão: prever valores contínuos, como número esperado de casos ou incidência de doenças.

  1. Exemplbos em saúde pública:
  • Prever a probabilidade de um surto de malária em determinado distrito.
  • Estimar a quantidade de casos semanais de dengue com base em variáveis climáticas.
  • Classificar regiões quanto ao nível de vulnerabilidade a doenças sensíveis ao clima.

O aprendizado supervisionado é uma das abordagens mais utilizadas em saúde, pois permite gerar previsões confiáveis quando há dados históricos rotulados disponíveis.

Aprendizado Não Supervisionado

O Aprendizado Não Supervisionado é uma técnica de Machine Learning em que o modelo trabalha com dados não rotulados, ou seja, não existe uma variável alvo conhecida. O objetivo é identificar padrões, estruturas ou agrupamentos presentes nos dados sem orientação externa.

  1. Características principais:
  • O modelo procura semelhanças e diferenças entre as observações para formar grupos ou detectar anomalias.

  • Não há “resposta correta” conhecida, portanto não há treinamento supervisionado.

  • Útil para exploração de dados, segmentação e descoberta de padrões ocultos.

  1. Exemplos em saúde pública:
  • Agrupamento (Clustering): identificar grupos de distritos com padrões semelhantes de incidência de doenças.

  • Detecção de anomalias (Outlier Detection): identificar semanas ou regiões com número de casos muito diferente do esperado.

  • Redução de dimensionalidade (PCA, t-SNE): simplificar dados complexos, combinando variáveis climáticas e epidemiológicas para análise visual ou modelagem posterior.

O aprendizado não supervisionado é especialmente útil quando os dados são abundantes, mas os resultados não estão previamente classificados, permitindo descobrir relações e padrões que podem orientar decisões e estratégias em saúde pública.

Aprendizado por Reforço

O Aprendizado por Reforço (Reinforcement Learning – RL) é uma abordagem de Machine Learning em que um agente aprende a tomar decisões em um ambiente para maximizar uma recompensa cumulativa. Diferentemente do aprendizado supervisionado, o modelo não recebe rótulos ou respostas corretas, mas sim feedback baseado nas ações tomadas.

  1. Características principais:
  • O agente interage com o ambiente, tomando ações e recebendo recompensas ou penalidades.

  • O objetivo é aprender uma política ótima, ou seja, a melhor sequência de decisões para alcançar um resultado desejado.

  • Muito utilizado em problemas de otimização e planejamento dinâmico, onde decisões sequenciais impactam o resultado final.

  1. Exemplos em saúde pública:
  • Otimização da distribuição de recursos médicos, como vacinas ou medicamentos, para minimizar surtos.

  • Planejamento de estratégias de intervenção em epidemias, ajustando ações ao longo do tempo com base no impacto observado.

  • Modelagem de fluxos hospitalares para reduzir tempo de espera e melhorar atendimento.

O aprendizado por reforço é particularmente útil quando os problemas envolvem decisões sequenciais complexas, com múltiplos fatores interagindo ao longo do tempo, permitindo que sistemas inteligentes aprendam estratégias eficazes a partir de experiência simulada ou real.

Prática

Análise de Regressão

# Bibliotecas
library(readxl)
library(dplyr)
Warning: pacote 'dplyr' foi compilado no R versão 4.4.3

Anexando pacote: 'dplyr'
Os seguintes objetos são mascarados por 'package:stats':

    filter, lag
Os seguintes objetos são mascarados por 'package:base':

    intersect, setdiff, setequal, union
library(ggplot2)
Warning: pacote 'ggplot2' foi compilado no R versão 4.4.3
library(broom)
Warning: pacote 'broom' foi compilado no R versão 4.4.3
# 1. Carregar dados
malaria <- read_excel("base_treino_malaria.xlsx")

# Visualizar primeiras linhas
head(malaria)
# A tibble: 6 × 8
  provincia semana   ano  tmin  tmax    rh    tp casos_malaria
  <chr>      <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>         <dbl>
1 Sul            1  2021  19    30.9  54.5  24.9            72
2 Sul            2  2021  20.9  30.6  61.9  20.5            68
3 Sul            3  2021  18.4  29    65.4  30.4            78
4 Sul            4  2021  16    27.4  58.8  29.8            88
5 Sul            5  2021  20.6  31.4  55.3  27.7            90
6 Sul            6  2021  19.9  29.3  60.9  29.4            70
# 2. Análise Exploratória

# Resumo estatístico e estrutura dos dados
summary(malaria)
  provincia             semana            ano            tmin      
 Length:468         Min.   :  1.00   Min.   :2021   Min.   :13.30  
 Class :character   1st Qu.: 39.75   1st Qu.:2021   1st Qu.:18.20  
 Mode  :character   Median : 78.50   Median :2022   Median :19.90  
                    Mean   : 78.50   Mean   :2022   Mean   :19.96  
                    3rd Qu.:117.25   3rd Qu.:2023   3rd Qu.:21.82  
                    Max.   :156.00   Max.   :2023   Max.   :26.90  
      tmax             rh              tp        casos_malaria   
 Min.   :23.90   Min.   :40.00   Min.   : 0.00   Min.   : 17.00  
 1st Qu.:29.77   1st Qu.:56.50   1st Qu.:13.28   1st Qu.: 70.75  
 Median :32.00   Median :65.00   Median :30.10   Median : 99.00  
 Mean   :31.98   Mean   :64.85   Mean   :30.89   Mean   :100.44  
 3rd Qu.:34.30   3rd Qu.:72.92   3rd Qu.:46.15   3rd Qu.:128.00  
 Max.   :40.80   Max.   :90.30   Max.   :80.10   Max.   :193.00  
glimpse(malaria)
Rows: 468
Columns: 8
$ provincia     <chr> "Sul", "Sul", "Sul", "Sul", "Sul", "Sul", "Sul", "Sul", …
$ semana        <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1…
$ ano           <dbl> 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 20…
$ tmin          <dbl> 19.0, 20.9, 18.4, 16.0, 20.6, 19.9, 18.8, 16.7, 18.9, 19…
$ tmax          <dbl> 30.9, 30.6, 29.0, 27.4, 31.4, 29.3, 33.8, 31.2, 33.8, 35…
$ rh            <dbl> 54.5, 61.9, 65.4, 58.8, 55.3, 60.9, 64.6, 60.9, 62.8, 61…
$ tp            <dbl> 24.9, 20.5, 30.4, 29.8, 27.7, 29.4, 36.0, 27.0, 38.2, 40…
$ casos_malaria <dbl> 72, 68, 78, 88, 90, 70, 89, 75, 71, 93, 88, 93, 80, 101,…
# Estatísticas resumidas por província
tabela_resumo <- malaria %>%
  group_by(provincia) %>%
  summarise(
    Minimo = min(casos_malaria, na.rm = TRUE),
    Mediana = median(casos_malaria, na.rm = TRUE),
    Maximo = max(casos_malaria, na.rm = TRUE),
    Media = mean(casos_malaria, na.rm = TRUE),
    SD = sd(casos_malaria, na.rm = TRUE)
  )
tabela_resumo
# A tibble: 3 × 6
  provincia Minimo Mediana Maximo Media    SD
  <chr>      <dbl>   <dbl>  <dbl> <dbl> <dbl>
1 Centro        40    96      156  97.1  23.4
2 Norte         99   142      193 142.   23.5
3 Sul           17    61.5    105  62.1  21.1
# 2a. Boxplot dos casos por província
ggplot(malaria, aes(x = factor(provincia), y = casos_malaria)) +
  geom_boxplot(fill = "lightblue", alpha = 0.7) +
  stat_summary(fun = mean, geom = "point", color = "red", size = 3) +
  labs(
    x = "Província",
    y = "Casos de Malária",
    title = "Distribuição dos Casos de Malária por Província"
  ) +
  theme_minimal()

# 2b. Dispersão: Casos de Malária vs Temperatura Máxima

ggplot(malaria, aes(x = tmax, y = casos_malaria)) +
  geom_point(color = "blue", alpha = 0.6, size = 2) +
  geom_smooth(method = "lm", color = "red", se = TRUE) +
  labs(
    x = "Temperatura Máxima (°C)",
    y = "Casos de Malária",
    title = "Dispersão entre Temperatura Máxima e Casos de Malária"
  ) +
  theme_minimal()
`geom_smooth()` using formula = 'y ~ x'

# 2c. Dispersão com Facetas por Província

ggplot(malaria, aes(x = tmax, y = casos_malaria)) +
  geom_point(color = "blue", alpha = 0.6, size = 2) +
  geom_smooth(method = "lm", color = "red", se = TRUE) +
  labs(
    x = "Temperatura Máxima (°C)",
    y = "Casos de Malária",
    title = "Dispersão entre Temperatura Máxima e Casos de Malária por Província"
  ) +
  theme_bw() +
  facet_wrap(~provincia)
`geom_smooth()` using formula = 'y ~ x'

# 2d. Correlações
cor(malaria$casos_malaria, malaria$tmax, method = "pearson")
[1] 0.7921213
cor(malaria$casos_malaria, malaria$tp, method = "pearson")
[1] 0.8742158
cor(malaria$casos_malaria, malaria$tmin, method = "pearson")
[1] 0.8342519
# 3. Modelo de Regressão Linear Simples
modelo_1 <- lm(casos_malaria ~ tp, data = malaria)
summary(modelo_1)

Call:
lm(formula = casos_malaria ~ tp, data = malaria)

Residuals:
   Min     1Q Median     3Q    Max 
-54.47 -13.95  -2.19  14.38  58.03 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 48.49038    1.60846   30.15   <2e-16 ***
tp           1.68154    0.04326   38.87   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 19.36 on 466 degrees of freedom
Multiple R-squared:  0.7643,    Adjusted R-squared:  0.7637 
F-statistic:  1511 on 1 and 466 DF,  p-value: < 2.2e-16
# 4. Modelo de Regressão Linear Múltipla
modelo_2 <- lm(casos_malaria ~ tp + tmax, data = malaria)
summary(modelo_2)

Call:
lm(formula = casos_malaria ~ tp + tmax, data = malaria)

Residuals:
   Min     1Q Median     3Q    Max 
-54.91 -13.18  -1.12  14.39  58.21 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -8.11084   15.85705  -0.511 0.609246    
tp           1.42380    0.08358  17.034  < 2e-16 ***
tmax         2.01869    0.56270   3.588 0.000369 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 19.12 on 465 degrees of freedom
Multiple R-squared:  0.7706,    Adjusted R-squared:  0.7696 
F-statistic:   781 on 2 and 465 DF,  p-value: < 2.2e-16
# Comparação entre modelos
anova(modelo_1, modelo_2)
Analysis of Variance Table

Model 1: casos_malaria ~ tp
Model 2: casos_malaria ~ tp + tmax
  Res.Df    RSS Df Sum of Sq     F    Pr(>F)    
1    466 174621                                 
2    465 169918  1      4703 12.87 0.0003692 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Machine Learning

# Bibliotecas
library(dplyr)
library(caret)     
Warning: pacote 'caret' foi compilado no R versão 4.4.3
Carregando pacotes exigidos: lattice
Warning: pacote 'lattice' foi compilado no R versão 4.4.3
# Para reprodutibilidade
set.seed(123)      

# 1. Dividir a base em treino e teste 80% treino, 20% teste
indices <- createDataPartition(malaria$casos_malaria, p = 0.8, list = FALSE)
treino <- malaria[indices, ]
teste  <- malaria[-indices, ]

# 2. Treinar modelo de regressão linear
modelo_ml <- train(
casos_malaria ~ tmax + tp,  # Variáveis explicativas
data = treino,
method = "lm"
)

# Resumo do modelo
summary(modelo_ml$finalModel)

Call:
lm(formula = .outcome ~ ., data = dat)

Residuals:
    Min      1Q  Median      3Q     Max 
-54.526 -12.468  -1.153  12.931  50.797 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -11.44737   17.50789  -0.654 0.513617    
tmax          2.11254    0.62252   3.394 0.000764 ***
tp            1.41865    0.09308  15.242  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 18.93 on 373 degrees of freedom
Multiple R-squared:  0.7754,    Adjusted R-squared:  0.7742 
F-statistic: 643.8 on 2 and 373 DF,  p-value: < 2.2e-16
# 3. Previsão nos dados de teste
predicoes <- predict(modelo_ml, teste)

# Calcular R²
R2 <- cor(predicoes, teste$casos_malaria)^2
cat("R² no conjunto de teste:", round(R2, 3), "\n")
R² no conjunto de teste: 0.754 
# Correlação entre previsto e observado
correlacao <- cor(predicoes, teste$casos_malaria)
cat("Correlação entre previsto e observado:", round(correlacao, 3), "\n")
Correlação entre previsto e observado: 0.869 
# 4. Previsão simulada
novo_dado <- data.frame(tp = 200, tmax = 30)
prev_simulada <- predict(modelo_ml, novo_dado)
cat("Previsão simulada para tp = 200 e tmax = 30:", round(prev_simulada, 2))
Previsão simulada para tp = 200 e tmax = 30: 335.66

Referencias

James, G., Witten, D., Hastie, T., & Tibshirani, R. (2021). An Introduction to Statistical Learning: with Applications in R (2nd ed.). Springer.

Fox, J., & Weisberg, S. (2019). An R Companion to Applied Regression (3rd ed.). Sage.

Kuhn, M., & Johnson, K. (2019). Feature Engineering and Selection: A Practical Approach for Predictive Models. CRC Press.

Kuhn, M., & Johnson, K. (2013). Applied Predictive Modeling. Springer.

Crawley, M. J. (2012). The R Book (2nd ed.). Wiley.

Hastie, T., Tibshirani, R., & Friedman, J. (2009). The Elements of Statistical Learning (2nd ed.). Springer.