# 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.
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)
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)
Elabore uma rotina que determine o semestre com maior número de casos confirmados (1º semestre = JAN a JUN; 2º semestre = JUL a DEZ)
# 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.
Faça uma projeção do número de casos para o mês de Março (Use Regressão Linear)
# 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."
A equação geral de um modelo de regressão linear simples é:
\[ y = \beta_0 + \beta_1 \cdot x + \epsilon \]
Onde:
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"