# Defina o diretório onde o arquivo da atividade foi salvo
setwd("C:/Users/marci/Projetos/learningR/EADPG119/ativ1Covid/")
# 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)
# 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)
# Para usar xlsx (não funcionou adequadamente)
library(readxl)
# Leia o arquivo xls, selecionando as colunas 1 a 4
df <- read_excel("atividade1_EADPG119.xlsx", col_names = TRUE)[, c(1:4)]
# "asczando" os nomes de colunas
colnames(df)[2:ncol(df)] <- c("Mes",
"CasosConfirmados",
"ObitosConfirmados")
# 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 [30 × 4] (S3: tbl_df/tbl/data.frame)
## $ Ano : num [1:30] 2020 2020 2020 2020 2020 2020 2020 2020 2020 2020 ...
## $ Mes : chr [1:30] "Fevereiro" "Março" "Abril" "Maio" ...
## $ CasosConfirmados : num [1:30] 21 520 2044 9225 21787 ...
## $ ObitosConfirmados: num [1:30] 0 436 1740 9318 19540 ...
# 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.
Utilizando os recursos do R construa um gráfico de dispersão da covid-19 para os casos confirmados (x) e para os Óbitos confirmados (y)
Abaixo o código e em seguida o gráfico gerado. Falta o separador de milhar ou outra solução para melhorar a visualização.
# AF (resolvido): exibir no gráfico valores com ponto como separador de milhar para
# melhorar a visualização
# AF: corrigir bug no uso de caracteres não-ascii no gráfico: exibe
# corretamente no documento mas não no console
# corrido: esta dica resolveu
# https://discourse.curso-r.com/t/configuracao-r-studio-utf-8/639
ggplot(df, aes(x = `CasosConfirmados`, y = `ObitosConfirmados`)) +
geom_point() +
labs(x = "Casos", y = "Óbitos", title = "Casos X Óbitos (confirmados)") +
scale_x_continuous(labels = format_pt) +
scale_y_continuous(labels = format_pt)
Calcule a média e o desvio padrão de casos confirmados e óbitos confirmados por ano (2020, 2021 e 2022)
O código a seguir usar loop for. Assim é possível gerar
um código aplicável a qualquer conjunto finito de anos.
# Criar vetores para armazenar resultados
# Obtém os anos únicos presentes no dataframe
anos <- unique(df$Ano)
# Cria vetores para armazenar as 4 variáveis que serão calculadas abaixo
# o cumprimento do vetor é igual à quantidade de Anos únicos
media_casos <- numeric(length(anos))
desvio_padrao_casos <- numeric(length(anos))
media_obitos <- numeric(length(anos))
desvio_padrao_obitos <- numeric(length(anos))
# Loop para calcular média e desvio padrão para cada ano
for (i in seq_along(anos)) {
# Filtra os dados para o ano a ser iterado isto é, anos[i]
dados_ano <- subset(df, Ano == anos[i])
# Calcula a média de casos confirmados para os dados filtrados para o
# ano sendo iterado; em seguida, calcula desvio padrão e o mesmo
# para ObitosConfirmados
media_casos[i] <- mean(dados_ano$CasosConfirmados)
desvio_padrao_casos[i] <- sd(dados_ano$CasosConfirmados)
media_obitos[i] <- mean(dados_ano$ObitosConfirmados)
desvio_padrao_obitos[i] <- sd(dados_ano$ObitosConfirmados)
}
# Criar tabela de resultados
resultados <- data.frame(
Ano = anos,
`Média Casos Confirmados` = media_casos,
`Desvio Padrão Casos Confirmados` = desvio_padrao_casos,
`Média Óbitos Confirmados` = media_obitos,
`Desvio Padrão Óbitos Confirmados` = desvio_padrao_obitos
)
print(resultados)
## Ano Média.Casos.Confirmados Desvio.Padrão.Casos.Confirmados
## 1 2020 45878.55 45378.81
## 2 2021 84045.00 67879.61
## 3 2022 154573.86 179036.08
## Média.Óbitos.Confirmados Desvio.Padrão.Óbitos.Confirmados
## 1 45267.27 45353.61
## 2 84382.08 67771.46
## 3 154953.71 171924.46
seq_along()?A função seq_along() não é estritamente necessária, mas
é uma boa prática usá-la ao iterar sobre vetores ou listas em R. Vou
explicar o motivo:
Iteração Direta: Você pode iterar diretamente sobre o vetor
anos usando um loop for da seguinte maneira:
for (ano in anos) {
# Seu código aqui
}
No entanto, isso não é tão comum em R. A razão é que, ao iterar
diretamente sobre o vetor, você não tem acesso ao índice atual (ou seja,
a posição do elemento no vetor). A função seq_along() cria
uma sequência de números inteiros de 1 até o comprimento do vetor. Isso
permite que você acesse tanto o elemento quanto o índice atual durante a
iteração:
for (i in seq_along(anos)) {
ano <- anos[i] # Acessa o elemento atual
# Seu código aqui
}
Usar seq_along() é uma prática recomendada porque torna
o código mais legível e evita erros relacionados ao índice.
Em resumo, você pode usar qualquer abordagem (iteração direta ou
seq_along()), mas o uso da função seq_along()
é preferível para garantir que você tenha acesso aos índices corretos
durante a iteração.
Elabore um Rotina em R que determine o semestre com maior número de casos confirmados e o maior número de Óbitos (1º semestre = JAN a JUN; 2º semestre = JUL a DEZ)
# Converter o mês para um formato numérico
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)
Nesta seção calcula-se o semestre com maior número de casos e o maior número de óbitos confirmados desconsiderando o ano.
# Calcular o total de casos confirmados e óbitos por semestre como novo
# dataframe
total_por_semestre <- aggregate(cbind(CasosConfirmados, ObitosConfirmados) ~
Semestre, data = df, sum)
#str(total_por_semestre)
#View(total_por_semestre)
# Identificar o semestre com maior número de casos confirmados
semestre_max_casos <-
total_por_semestre$Semestre[which.max(total_por_semestre$CasosConfirmados)]
casos_max <- max(total_por_semestre$CasosConfirmados)
# Identificar o semestre com maior número de óbitos
semestre_max_obitos <-
total_por_semestre$Semestre[which.max(total_por_semestre$ObitosConfirmados)]
obitos_max <- max(total_por_semestre$ObitosConfirmados)
# Exibir os resultados para casos confirmados
cat("Semestre com maior número de casos confirmados:", semestre_max_casos,
"com", casos_max, "casos confirmados.\n")
## Semestre com maior número de casos confirmados: 1 com 1933525 casos confirmados.
# Exibir os resultados para número de óbitos
cat("Semestre com maior número de óbitos confirmados:", semestre_max_obitos,
"com", obitos_max, "óbitos confirmados.\n")
## Semestre com maior número de óbitos confirmados: 1 com 1930002 óbitos confirmados.
Tem-se, assim, o semestre com maior número de casos e o maior número de óbitos confirmados desconsiderando o ano. Entende-se que não é exatamente isto que a atividade está pedindo. Na seção seguinte é apresentado o cálculo supostamente mais aderente ao que foi solicitado.
Nesta seção calcula-se o semestre com maior número de casos confirmados e o maior número de óbitos confirmados considerando o ano.
# Calcular o total de casos confirmados e óbitos por Ano-Semestre num novo
# dataframe
total_por_ano_semestre <- aggregate(cbind(CasosConfirmados, ObitosConfirmados)
~ 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 confirmados
ano_semestre_max_casos <-
total_por_ano_semestre$Ano_Semestre[
which.max(total_por_ano_semestre$CasosConfirmados)]
casos_max <- max(total_por_ano_semestre$CasosConfirmados)
# Identificar o Ano-Semestre com maior número de óbitos confirmados
ano_semestre_max_obitos <-
total_por_ano_semestre$Ano_Semestre[
which.max(total_por_ano_semestre$ObitosConfirmados)]
obitos_max <- max(total_por_ano_semestre$ObitosConfirmados)
# Exibir os resultados para número de casos confirmados
cat("Ano-Semestre com maior número de casos confirmados:",
ano_semestre_max_casos, "com", casos_max, "casos confirmados.\n")
## Ano-Semestre com maior número de casos confirmados: 2022-1 com 1067080 casos confirmados.
# Exibir os resultados para número de óbitos
cat("Ano-Semestre com maior número de óbitos confirmados:",
ano_semestre_max_obitos, "com", obitos_max, "óbitos confirmados.\n")
## Ano-Semestre com maior número de óbitos confirmados: 2022-1 com 1064092 óbitos confirmados.
Utilizando o R calcule o Risco relativo e a Razão de Chance mensal e anual da Covid-19 (Módulo 4)
O Risco Relativo (ou Razão de Risco) é uma medida estatística utilizada para comparar a probabilidade de um evento ocorrer em dois grupos distintos.
A Razão de Chance (ou Odds Ratio) é uma medida estatística que compara as chances de um evento ocorrer em dois grupos diferentes.
Combinando:
O{S|N}E{S|N}
Para efeitos da tarefa:
A soma de não-casos confirmados não é dada no exercício e impossível de inferir (calcular). Assim, C e D são arbitrariamente determinados:
Contudo, não seria necessário, a fim de manter consistente o exercício, que valor anual = valor mensal * 12 ? De qualquer forma, usando os valores definidos.
# Definição de funções para calcular RR e OR
calcular_RR <- function(A, B, C, D) {
RR <- (A / (A + B)) / (C / (C + D))
return(RR)
}
calcular_OR <- function(A, B, C, D) {
OR <- (A * D) / (B * C)
return(OR)
}
# Cálculo de RR e OR Mensal com os meses ordenados
#
# Operador %>% (Pipe):
# O operador %>% é usado para encadear operações em data frames no pacote
# dplyr.Ele permite que você aplique várias funções sequencialmente a um data
# frame, passando o resultado de uma função como entrada para a próxima.
# Isso torna o código mais legível e facilita a criação de pipelines de
# transformação de dados.Por exemplo, em
# df %>% arrange(Ano, Mes) %>% group_by(Ano, Mes) %>% summarise(...),
# o data frame df é primeiro organizado por ano e mês, depois agrupado
# por ano e mês e, finalmente, resumido usando a função summarise.
dados_mensais <- df %>%
arrange(Ano, Mes) %>%
group_by(Ano, Mes) %>%
summarise(
A = sum(`ObitosConfirmados`, na.rm = TRUE),
B = sum(`CasosConfirmados`, na.rm = TRUE) - A,
C = 100000, # número de pessoas sem casos confirmados e sem óbitos,
D = 5000 # número de óbitos na população não exposta (sem casos confirmados)
) %>%
# A função mutate é usada para criar novas colunas ou modificar colunas
# existentes em um data frame.
# Ela aceita uma série de expressões que especificam as transformações a
# serem aplicadas às colunas.
# No código, usamos mutate para calcular as colunas RR e OR.
# Exemplo: mutate(RR = calcular_RR(A, B, C, D), OR = calcular_OR(A, B, C, D))
# adiciona duas novas colunas chamadas RR e OR ao data frame, calculando seus
# valores com base nas colunas existentes A, B, C e D.
mutate(
RR = calcular_RR(A, B, C, D),
OR = calcular_OR(A, B, C, D)
)
## `summarise()` has grouped output by 'Ano'. You can override using the `.groups`
## argument.
# Cálculo de RR e OR Anual
dados_anuais <- df %>%
group_by(Ano) %>%
summarise(
A = sum(`ObitosConfirmados`, na.rm = TRUE),
B = sum(`CasosConfirmados`, na.rm = TRUE) - A,
C = 1000000,
D = 50000
) %>%
mutate(
RR = calcular_RR(A, B, C, D),
OR = calcular_OR(A, B, C, D)
)
#View(dados_mensais)
#View(dados_anuais)
print(dados_mensais)
## # A tibble: 30 × 8
## # Groups: Ano [3]
## Ano Mes A B C D RR OR
## <dbl> <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2020 Fevereiro 0 21 100000 5000 0 0
## 2 2020 Março 436 84 100000 5000 0.880 0.260
## 3 2020 Abril 1740 304 100000 5000 0.894 0.286
## 4 2020 Maio 9318 -93 100000 5000 1.06 -5.01
## 5 2020 Junho 19540 2247 100000 5000 0.942 0.435
## 6 2020 Julho 51282 2455 100000 5000 1.00 1.04
## 7 2020 Agosto 65776 -1298 100000 5000 1.07 -2.53
## 8 2020 Setembro 51919 225 100000 5000 1.05 11.5
## 9 2020 Outubro 56563 -644 100000 5000 1.06 -4.39
## 10 2020 Novembro 102545 7013 100000 5000 0.983 0.731
## # ℹ 20 more rows
print(dados_anuais)
## # A tibble: 3 × 7
## Ano A B C D RR OR
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2020 497940 6724 1000000 50000 1.04 3.70
## 2 2021 1012585 -4045 1000000 50000 1.05 -12.5
## 3 2022 1084676 -2659 1000000 50000 1.05 -20.4