ECDC - COVID-19 no Brasil - Novos Casos e Óbitos

Intervalos de 24 horas e média móvel de 7 dias

COVID-19 no Brasil: Novos Óbitos e Média Móvel de 7 dias
COVID-19 no Brasil: Novos Óbitos e Média Móvel de 7 dias

O gráfico acima mostra os novos casos (períodos de 24 horas) e a média móvel de 7 dias, usando o valor do dia mais os valores dos 6 dias anteriores. A média móvel é utilizada para mostrar a tendência da curva. Quando a curva dos dados está subindo, a curva da média móvel fica abaixo dessa, uma vez que leva em consideração valores anteriores, que são menores do que o valor presente. Quando a curva dos dados está descendo, a curva da média móvel fica acima dessa, uma vez que leva em consideração valores anteriores, que são maiores do que o valor presente. Com isso, quando a curva da média móvel intercepta a curva dos dados, há uma indicação de que a curva dos dados está invertendo sua tendência, como pode ser observado neste gráfico. A média móvel é muito usada no mercado financeiro, para compra e venda de ações, por exemplo. Há diversas outras maneiras de se calcular a média móvel e verificar as intersecções.

COVID-19 no Brasil: Novos Óbitos e Média Móvel de 7 dias
COVID-19 no Brasil: Novos Óbitos e Média Móvel de 7 dias

O gráfico acima mostra os novos óbitos (últimas 24 horas) e a média móvel de 7 dias, usando o valor do dia mais os valores dos 6 dias anteriores. Da mesma maneira que no gráfico anterior, quando a curva da média móvel intercepta a curva dos dados, há uma indicação de que a curva dos dados está invertendo sua tendência, como pode ser observado também neste gráfico.

Dados

Os dados são baixados da página Download today’s data on the geographic distribution of COVID-19 cases worldwide do European Centre for Disease Prevention and Control (ECDC). Nesta página é mostrado como os dados mais atualizados podem ser lidos diretamente pelo código R, mas também é possível baixar o arquivo CSV e ler pelo programa, para evitar múltiplos downloads, no caso de haver vários programas que acessem estes mesmos dados. O ECDC mudou para um cronograma de relatórios semanais da situação do COVID-19 na UE / EEE, Reino Unido e no restante do mundo em 17 de dezembro de 2020. Portanto, todas as atualizações diárias foram interrompidas a partir de 14 de dezembro.

Programa

Abaixo está mostrado o código do programa, escrito em R, que gera os dois gráficos mostrando os novos casos e óbitos (intervalos de 24 horas), juntamente com suas respectivas médias móvel de 7 dias. Antes de ser executado as bibliotecas utilizadas precisam ser instaladas. A opção para ler os dados diretamente na Internet está comentada, enquanto a opção para ler o arquivo CSV baixado está ativa. Pode ser usada qualquer uma das duas opões, obtendo-se os mesmos resultados, desde que o arquivo baixado esteja atualizado.

#
# source('ecdc_moving_average.R')
#
# Programa para gerar gráficos mostrando os novos casos e óbitos
# (intervalos de 24 horas) por COVID-19 até a presente data para
# o país especificado, neste caso o Brasil, com suas respectivas médias
# móvel, que fornece uma imagem mais precisa das tendências e suaviza
# os dados, removendo os picos e vales artificiais.
# Os dados são obtidos do:
# European Centre for Disease Prevention and Control (ECDC)
# Download today’s data on the geographic distribution of COVID-19 cases worldwide
# https://www.ecdc.europa.eu/en/publications-data/download-todays-data-geographic-distribution-covid-19-cases-worldwide
#
# Bibliotecas
library(utils)
library(lubridate)
library(dplyr)
library(scales)
library(ggplot2)
library(ggrepel)
library(pracma)

# Ler os dados do ECDC no formato CSV
# ecdc <- read.csv("https://opendata.ecdc.europa.eu/covid19/casedistribution/csv", na.strings = "", fileEncoding = "UTF-8-BOM")
ecdc <- read.csv("~/R/dados/ecdc.csv", na.strings = "", fileEncoding = "UTF-8-BOM")

# Criar um quadro de dados com os dados da ECDC convertendo a data
df <- data.frame(data = dmy(ecdc$dateRep),
                 country = ecdc$countriesAndTerritories,
                 continent = ecdc$continentExp,
                 cases = ecdc$cases,
                 deaths = ecdc$deaths)

pais <- "Brazil"

# Data dos dados
dataDados = toString(max(df$data))

# Somente os dados do país escolhido
br <- df[df$country == pais, ]

# Ordenar pela data
br <- arrange(br, data)

# Incorporar a média móvel nos dados
br$media_movel_casos <- movavg(br$cases, 6, type="s")
br$media_movel_obitos <- movavg(br$deaths, 6, type="s")

# Dados a partir de 15 de março de 2020
br <- br[br$data >= "2020-03-15", ]

# Preparar os dados para o gráfico de novos óbitos
deaths <- select(br, x = data, y = deaths)
deaths$label <- 'Novos Óbitos'
movavg <- select(br, x = data, y = media_movel_obitos)
movavg$label <- 'Média móvel de 7 dias'
dados <- rbind(deaths, movavg)

# Gerar o gráfico de novos óbitos (últimas 24 horas)
plot_deaths <- ggplot(dados, aes(x, y, col = label)) +
    labs(
        title = "COVID-19 no Brasil: Novos Óbitos e Média Móvel de 7 dias",
        subtitle = "Fonte: European Centre for Disease Prevention and Control (ECDC)",
        caption = paste("Dados baixados do ECDC (https://www.ecdc.europa.eu/en) em", dataDados),
        x       = "Data",
        y       = "Novos óbitos (intervalos de 24 horas)",
        colour  = NULL
    ) +
    geom_point() +
    geom_smooth(se = F) +
    theme_minimal() +
    theme(
        legend.position = c(0.20 , 0.87)
    ) +
    guides(
        colour = guide_legend(
            override.aes = list(fill = NA),
            reverse = TRUE)
    ) +
    scale_x_date(
        breaks = date_breaks("4 weeks"),
        labels = date_format("%d/%b/\n%Y")
    ) +
    scale_y_continuous(
        limits=c(0, 1600)
    )

# Preparar os dados para o gráfico de novos casos (últimas 24 horas)
cases <- select(br, x = data, y = cases)
cases$label <- 'Novos Casos'
movavg <- select(br, x = data, y = media_movel_casos)
movavg$label <- 'Média móvel de 7 dias'
dados <- rbind(cases, movavg)

# Gerar o gráfico de novos casos
plot_cases <- ggplot(dados, aes(x, y, col = label)) +
    labs(
        title = "COVID-19 no Brasil: Novos Casos e Média Móvel de 7 dias",
        subtitle = "Fonte: European Centre for Disease Prevention and Control (ECDC)",
        caption = paste("Dados baixados do ECDC (https://www.ecdc.europa.eu/en) em", dataDados),
        x       = "Data",
        y       = "Novos casos (intervalos de 24 horas)",
        colour  = NULL
    ) +
    geom_point() +
    geom_smooth(se = F) +
    theme_minimal() +
    theme(
        legend.position = c(0.20 , 0.87)
    ) +
    guides(
        colour = guide_legend(
            override.aes = list(fill = NA),
            reverse = TRUE)
    ) +
    scale_x_date(
        breaks = date_breaks("4 weeks"),
        labels = date_format("%d/%b/\n%Y")
    ) +
    scale_y_continuous(
        limits=c(0, 70000)
    )

# Gravar as imagens dos gráficos no disco
ggsave("../img/ecdc_moving_average_br_cases.svg", plot_cases, device=svg())
ggsave("../img/ecdc_moving_average_br_deaths.svg", plot_deaths, device=svg())
Referências