JHU - 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 Casos e Média Móvel de 7 dias
COVID-19 no Brasil: Novos Casos 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 obtidos da página Novel Coronavirus (COVID-19) Cases Data, da Humanitarian Data Exchange (HDX), que contém os dados epidemiológicos desde 22 de janeiro de 2020. Os dados são compilados pelo Centro de Ciência e Engenharia de Sistemas da Universidade Johns Hopkins (JHU CCSE) a partir de várias fontes.

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.

#
# source('jhu_moving_average_br.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:
# HDX - HUMANITARIAN DATA EXCHANGE
# Novel Coronavirus (COVID-19) Cases Data
# https://data.humdata.org/dataset/novel-coronavirus-2019-ncov-cases
# Novel Corona Virus (COVID-19) epidemiological data since 22 January 2020.
# The data is compiled by the Johns Hopkins University Center for
# Systems Science and Engineering (JHU CCSE) from various sources.
#
# Bibliotecas
library(tidyverse)
library(gridExtra)
library(pracma)
library(ggsci)
library(ggrepel)
library(scales)
library(grid)

# Ler os dados baixados (casos confirmados)
jhu_cases <- read_csv(
    "~/R/dados/time_series_covid19_confirmed_global_narrow.csv",
    skip = 2,
    col_names = c(
        "Province_State",
        "Country_Region",
        "Lat",
        "Lon",
        "Date",
        "Total_Cases",
        "ISO_3166_1_Alpha_3_Codes",
        "Region_Code",
        "Sub_region_Code",
        "Intermediate_Region_Code"
    ),
    col_types = cols(
        Province_State = col_character(),
        Country_Region = col_character(),
        Lat = col_double(),
        Lon = col_double(),
        Date = col_date(),
        Total_Cases = col_integer(),
        ISO_3166_1_Alpha_3_Codes = col_character(),
        Region_Code = col_character(),
        Sub_region_Code = col_character(),
        Intermediate_Region_Code = col_character()
    )
)

# Ler os dados baixados (óbitos)
jhu_deaths <- read_csv(
    "~/R/dados/time_series_covid19_deaths_global_narrow.csv",
    skip = 2,
    col_names = c(
        "Province_State",
        "Country_Region",
        "Lat",
        "Lon",
        "Date",
        "Total_Deaths",
        "ISO_3166_1_Alpha_3_Codes",
        "Region_Code",
        "Sub_region_Code",
        "Intermediate_Region_Code"
    ),
    col_types = cols(
        Province_State = col_character(),
        Country_Region = col_character(),
        Lat = col_double(),
        Lon = col_double(),
        Date = col_date(),
        Total_Deaths = col_integer(),
        ISO_3166_1_Alpha_3_Codes = col_character(),
        Region_Code = col_character(),
        Sub_region_Code = col_character(),
        Intermediate_Region_Code = col_character()
    )
)

# Data dos dados
dataDados <- toString(max(jhu_cases$Date))

# Manter apenas os dados do Brasil
cases <-
    jhu_cases %>% filter(Country_Region == "Brazil")
deaths <-
    jhu_deaths %>% filter(Country_Region == "Brazil")

# Ficar apenas com as colunas a serem usadas
cases <- select(cases, Country_Region, Date, Total_Cases)
deaths <- select(deaths, Country_Region, Date, Total_Deaths)

# Ordenar pela data
cases <- arrange(cases, Date)
deaths <- arrange(deaths, Date)

# Calcular os casos e óbitos diários
cases <-
    cases %>% mutate(New_Cases = Total_Cases - lag(Total_Cases))
deaths <-
    deaths %>% mutate(New_Deaths = Total_Deaths - lag(Total_Deaths))

# Calcular a média móvel diária
cases <-
    cases %>% mutate(Mov_Avg = movavg(New_Cases, 6, type = "s"))
deaths <-
    deaths %>% mutate(Mov_Avg = movavg(New_Deaths, 6, type = "s"))

# Ficar apenas com os valores das datas superiores a 8/3/2020
cases <- filter(cases, Date >= "2020-03-08")
deaths <- filter(deaths, Date >= "2020-03-08")

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

# 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 = paste(
            "Fonte: Johns Hopkins University Center for",
            "Systems Science and Engineering (JHU CCSE)"
        ),
        caption = paste(
            "Dados baixados do HDX",
            "(https://data.humdata.org/dataset/novel-coronavirus-2019-ncov-cases) em",
            dataDados
        ),
        x       = "Data",
        y       = "Novos óbitos (intervalos de 24 horas)",
        colour  = NULL
    ) +
    geom_point() +
    geom_smooth(method = "gam",
                formula = y ~ s(x),
                se = FALSE) +
    theme_minimal() +
    theme(
        legend.direction = "horizontal",
        legend.position = "top",
        legend.text = element_text(size = 12),
        legend.title = element_text(size = 14),
        panel.grid.major = element_line(
            size = 0.8,
            linetype = 'solid',
            colour = "pink"
        ),
        panel.grid.minor = element_line(
            size = 0.4,
            linetype = 'solid',
            colour = "pink"
        ),
        axis.text.x = element_text(size = 12),
        axis.text.y = element_text(size = 12),
        axis.title.x = element_text(size = 16),
        axis.title.y = element_text(size = 16),
        plot.subtitle = element_text(size = 16),
        plot.title = element_text(size = 20),
        plot.caption = element_text(size = 12),
        plot.margin = unit(c(6, 18, 6, 6), "pt") #top, right, bottom, left
    ) +
    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, 5e3))


# Preparar os dados para o gráfico de novos casos
d1 <- select(cases, x = Date, y = New_Cases)
d1$label <- 'Novos Casos'
d2 <- select(cases, x = Date, y = Mov_Avg)
d2$label <- 'Média móvel de 7 dias'
dados <- rbind(d1, d2)

# 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 = paste(
            "Fonte: Johns Hopkins University Center for",
            "Systems Science and Engineering (JHU CCSE)"
        ),
        caption = paste(
            "Dados baixados do HDX",
            "(https://data.humdata.org/dataset/novel-coronavirus-2019-ncov-cases) em",
            dataDados
        ),
        x       = "Data",
        y       = "Novos casos (intervalos de 24 horas)",
        colour  = NULL
    ) +
    geom_point() +
    geom_smooth(method = "gam",
                formula = y ~ s(x),
                se = FALSE) +
    theme_minimal() +
    theme(
        legend.direction = "horizontal",
        legend.position = "top",
        legend.text = element_text(size = 12),
        legend.title = element_text(size = 14),
        panel.grid.major = element_line(
            size = 0.8,
            linetype = 'solid',
            colour = "lightblue"
        ),
        panel.grid.minor = element_line(
            size = 0.4,
            linetype = 'solid',
            colour = "lightblue"
        ),
        axis.text.x = element_text(size = 12),
        axis.text.y = element_text(size = 12),
        axis.title.x = element_text(size = 16),
        axis.title.y = element_text(size = 16),
        plot.subtitle = element_text(size = 16),
        plot.title = element_text(size = 20),
        plot.caption = element_text(size = 12),
        plot.margin = unit(c(6, 18, 6, 6), "pt") #top, right, bottom, left
    ) +
    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, 1.2e5))

# Gravar as imagens dos gráficos no disco
ggsave(
    "~/doctec/static/img/jhu/jhu_moving_average_br_cases.png",
    plot_cases,
    device = png(),
    width = 12.5,
    height = 6.25,
    dpi = 72
)
ggsave(
    "~/doctec/static/img/jhu/jhu_moving_average_br_deaths.png",
    plot_deaths,
    device = png(),
    width = 12.5,
    height = 6.25,
    dpi = 72
)

dev.off()
dev.off()
Referências