Código preparatório para a atividade

# Defina o diretório onde o arquivo da atividade foi salvo
setwd("C:/Users/marci/Projetos/learningR/EADPG119/ativ2Dengue/")

# Always include this line at the top of your script, 
# if you don’t want to see the scientific notations in your numbers and 
# charts. Estava atrapalhando no gráfico
options(scipen = 999)

# Carregue o pacote ggplot2
library(ggplot2)
library(scales)  # Para usar a função comma()
# Carregue os pacotes necessários para pipe
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(magrittr)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ lubridate 1.9.3     ✔ tibble    3.2.1
## ✔ purrr     1.0.2     ✔ tidyr     1.3.1
## ✔ readr     2.1.5
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ readr::col_factor() masks scales::col_factor()
## ✖ purrr::discard()    masks scales::discard()
## ✖ tidyr::extract()    masks magrittr::extract()
## ✖ dplyr::filter()     masks stats::filter()
## ✖ dplyr::lag()        masks stats::lag()
## ✖ purrr::set_names()  masks magrittr::set_names()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# Para usar xlsx (não funcionou adequadamente)
library(readxl)
# Leia o arquivo xls, selecionando as colunas 1 a 4
#df <- read_excel("Atividade2-R.xlsx",  skip = 1, col_names = TRUE)
df <- read_excel("Atividade2-R.xlsx",  skip = 2)

# nomeando as colunas
colnames(df)[1:ncol(df)] <- c("Ano", 
                              "Mes", 
                              "Casos")

# Função para formatar os rótulos do eixo y com separador de milhar ponto
format_pt <- function(x) format(x, big.mark = ".", decimal.mark = ",", scientific = FALSE)


# Exiba a estrutura do df
str(df)
## tibble [13 × 3] (S3: tbl_df/tbl/data.frame)
##  $ Ano  : num [1:13] 2023 2023 2023 2023 2023 ...
##  $ Mes  : chr [1:13] "Fevereiro" "Março" "Abril" "Maio" ...
##  $ Casos: num [1:13] 468 3362 11903 13056 6451 ...
# Exiba as primeiras linhas do df
#head(df)

# Exiba o df como tabela
#View(df)

Foram alterados os nomes das colunas a fim de evitar caracteres não-ASCII e espaços em branco.

Tarefa 1

Construa um gráfico de dispersão (linhas) da Dengue para os meses (x) e numero de casos (y) (podendo substituir os meses por 1 a 14)

Resultado da Tarefa 1

Abaixo o código e em seguida o gráfico gerado.

# AF (feito): exibir no gráfico valores com ponto como separador de milhar para 
# melhorar a visualização
# AF (feito): corrigir bug no uso de caracteres não-ascii no gráfico: exibe 
# corretamente no documento mas não no console
# corrigido: esta dica resolveu
# https://discourse.curso-r.com/t/configuracao-r-studio-utf-8/639  

df <- df %>%
  mutate(Ano_Mes = paste(Ano, Mes),
         Ano_Mes = factor(Ano_Mes, levels = unique(Ano_Mes)))

# Ordenando o dataframe pelo Ano-Mes
df <- df[order(df$Ano_Mes), ]


# Criando o gráfico de dispersão com linhas
ggplot(df, aes(x = Ano_Mes, y = Casos, group = 1)) +
  geom_line(color = "blue") +
  geom_point(color = "red") +
  labs(x = "Ano-Mês", y = "Número de Casos", title = "Casos de Dengue por Ano-Mês") +
   theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
   scale_y_continuous(labels = format_pt)

Tarefa 2

Elabore uma rotina que determine o semestre com maior número de casos confirmados (1º semestre = JAN a JUN; 2º semestre = JUL a DEZ)

Resultado da Tarefa 2

# Gerando os fatores com níveis correspondentes
# Permite tratar Mes como variável categórica ordinal (no sentido do tempo)
# e não pela ordem alfabética do nome. Assim, a ordem abaixo é fundamental
# a regressão linear, mais abaixo, depende disto
df$Mes <- factor(df$Mes, levels = c("Janeiro", "Fevereiro", "Março", "Abril",
                                    "Maio", "Junho", "Julho", "Agosto",
                                    "Setembro", "Outubro", "Novembro", 
                                    "Dezembro"))

# Calcular nova coluna para exibir os valores numéricos - fatores - 
# correspondentes criados antes
#df$Mes_numerico <- as.integer(df$Mes)

# Criar uma variável para representar o semestre
df$Semestre <- ifelse(df$Mes %in% c("Janeiro", "Fevereiro", "Março", "Abril",
                                    "Maio", "Junho"), 1, 2)

# Daria para segregar pelos fatores:
# meses com fatores até 6, semestre 1; demais, 2
df$Semestre <- ifelse(as.numeric(df$Mes) <= 6, 1, 2)

# Calcular o total de casos por semestre como novo dataframe
total_por_semestre <- aggregate(cbind(Casos) ~ 
                                  Semestre, data = df, sum)

# Calcular o total de casos por Ano-Semestre num novo dataframe
total_por_ano_semestre <- aggregate(cbind(Casos)
                                    ~ Ano + Semestre, data = df, sum)
#str(total_por_ano_semestre)
#View(total_por_ano_semestre)

# Calcule a variável combinada Ano_Semestre concatenando Ano e Semestre
total_por_ano_semestre$Ano_Semestre = 
  paste(total_por_ano_semestre$Ano, total_por_semestre$Semestre, sep = "-")

# Identificar o Ano-Semestre com maior número de casos
ano_semestre_max_casos <- 
  total_por_ano_semestre$Ano_Semestre[
    which.max(total_por_ano_semestre$Casos)]
casos_max <- max(total_por_ano_semestre$Casos)

# Exibir os resultados para número de casos
cat("Ano-Semestre com maior número de casos:", 
    ano_semestre_max_casos, "com", casos_max, "casos.\n")
## Ano-Semestre com maior número de casos: 2023-1 com 35240 casos.

Tarefa 3

Faça uma projeção do número de casos para o mês de Março (Use Regressão Linear)

Resultados da Tarefa 3

# garantindo que os dados fiquem ordenados temporalmente
# para usar Ano + Mes sem problemas
df <- df[order(df$Ano, df$Mes), ]

# Ajustar o modelo de regressão linear
# Esta linha ajusta um modelo de regressão linear aos dados. A fórmula
# Casos ~ Ano + Mes indica que estamos interessados em prever os 
# casos (variável dependente) com base no ano e mês (variaveis
# independentes).
modelo <- lm(Casos ~ Ano + Mes, data = df)

#print(modelo)
#View(modelo)

# cria, como um dataframe, parte da nova linha do dataframe, contendo as
# variáveis independentes (Ano e Mes) como colunas
# Os valores determinados destas colunas determinarão, na linha a seguir,
# o que deve ser predito
prediga_para_Ano = 2024
prediga_para_Mes = "Março"
prediga_para <- tibble(Ano = prediga_para_Ano, Mes = prediga_para_Mes)

# fazer a predição considerando os valores escolhidos para as variáveis
# independentes (Ano e Mes) e o modelo ajustado
# uma parte da linha é preenchida por prediga_para
# esta parte preencida é usada por predict para, combinada com modelo
# gerar o valor predito para a variável Casos, preenchendo a linha
predicao <- predict(modelo, newdata = prediga_para)

# arredondar e separador decimal ponto
predicao_ajustada <- 
  format(round(predicao), big.mark = ".", decimal.mark = ",")

# Exibir a previsão
paste0("A partir dos dados, projeta-se a ocorrência de ", predicao_ajustada, " casos de dengue para o mês de ", prediga_para_Mes, " de ", prediga_para_Ano, ".")
## [1] "A partir dos dados, projeta-se a ocorrência de 16.780 casos de dengue para o mês de Março de 2024."

Exibindo como equação

A equação geral de um modelo de regressão linear simples é:

\[ y = \beta_0 + \beta_1 \cdot x + \epsilon \]

Onde:

  • \(y\) é a variável dependente (neste caso, “Casos”),
  • \(x\) é a variável independente (neste caso, “Ano”),
  • \(\beta_0\) é o intercepto (ou constante) do modelo,
  • \(\beta_1\) é o coeficiente de regressão (o quanto \(y\) muda em resposta a uma mudança em \(x\)),
  • \(\epsilon\) é o erro aleatório.

O objetivo do ajuste do modelo é encontrar os valores de \(\beta_0\) e \(\beta_1\) que melhor explicam a relação entre as variáveis. Isso é feito minimizando a soma dos quadrados dos resíduos, ou seja, a diferença entre os valores reais e os valores previstos pelo modelo.

# Obter um resumo do modelo
summary_modelo <- summary(modelo)

# Extrair os coeficientes do modelo
coeficientes <- summary_modelo$coefficients

# Obter os coeficientes
intercepto <- coeficientes[1, 1]
coef_ano <- coeficientes[2, 1]

# Formatar o modelo como uma equação
modelo_equacao <- paste("Casos =", round(intercepto, 2), "+", round(coef_ano, 2), "* Ano")

# Imprimir a equação do modelo na forma y = a + bx
#print(paste("Casos =", round(intercepto, 2), "+", round(coef_ano, 2), "* Ano"))

# Imprimir a equação do modelo na forma y = a + bx
print(paste(
  "O modelo, na forma da equação y = a + bx é: Casos =", 
  round(intercepto, 2), 
  "+", 
  round(coef_ano, 2), 
  "* Ano,",
  "onde: y = Casos, ",
  "a =",
  round(intercepto, 2),
  "b =",
  round(coef_ano, 2),
  "e y = Ano"
  ))
## [1] "O modelo, na forma da equação y = a + bx é: Casos = -27155490 + 13418 * Ano, onde: y = Casos,  a = -27155490 b = 13418 e y = Ano"