DATASUS - COVID-19 no Brasil - Casos e óbitos por semana epidemiológica e estado da região

COVID-19 no Brasil: Casos Confirmados por Estado e Semana Epidemiológica na Região Sudeste
COVID-19 no Brasil: Casos Confirmados por Estado e Semana Epidemiológica na Região Sudeste

O gráfico acima mostra a quantidade de casos novos de COVID-19 no Brasil por semana epidemiológica na região Sudeste, vendo-se, também, a participação dos estados da região na composição do valor total das semanas. Como pode ser observado, o número de casos na região aumentou até atingir um valor máximo na 33ª semana epidemiológica de 2020 (09/08/2020 a 15/08/2020), diminuindo, depois, até a 45ª semana epidemiológica de 2020 (01/11/2020 a 07/11/2020), quando voltou a aumentar, atingindo o valor máximo histórico na 14ª semana epidemiológica de 2021 (04/04/2021 a 10/04/2021).

Por convenção internacional as semanas epidemiológicas são contadas de Domingo a Sábado. A primeira semana do ano é aquela que contém o maior número de dias de Janeiro, e a última a que contém o maior número de dias de Dezembro. A 12ª semana epidemiológica de 2020, início dos óbitos no Brasil, foi de 15/03/2020 a 21/03/2020. A 53ª semana epidemiológica de 2020, última do ano, foi de 27/12/2020 a 02/01/2021. Na 3ª semana epidemiológica de 2021, de 17/01/2021 a 23/01/2021, as vacinas do Butantan e da Fiocruz foram aprovadas pela Anvisa e a enfermeira Mônica Calazans, de 54 anos, foi a primeira pessoa a ser vacinada no Estado de São Paulo. Note que a última semana epidemiológica do gráfico pode estar incompleta.

A primeira troca de Ministros da Saúde, saída de Luiz Henrique Mandetta e entrada de Nelson Teich, ocorreu em 16/4/2020, durante a 16ª semana epidemiológica de 2020. A saída do Ministro Nelson Teich se deu em 15/5/2020, durante a 20ª semana epidemiológica de 2020, quando assumiu a pasta, no início interinamente, Eduardo Pazuello, que foi substituído por Marcelo Queiroga na 12ª semana epidemiológica de 2021 em 23/3/2021.

COVID-19 no Brasil: Óbitos por Estado e Semana Epidemiológica na Região Sudeste
COVID-19 no Brasil: Óbitos por Estado e Semana Epidemiológica na Região Sudeste

O gráfico acima mostra a quantidade de óbitos por COVID-19 no Brasil por semana epidemiológica na região Sudeste, vendo-se, também, a participação dos estados da região na composição do valor total das semanas. Como pode ser observado, o número de óbitos na região aumentou até atingir o máximo na 25ª semana epidemiológica de 2020 (14/06/2020 a 20/06/2020), diminuindo, depois, até a 45ª semana epidemiológica de 2020 (01/11/2020 a 07/11/2020), quando voltou a aumentar, atingindo o valor máximo histórico na 15ª semana epidemiológica de 2021 (11/04/2021 a 17/04/2021).

Dados

Os dados são baixados do Painel Coronavírus do Ministério da Saúde / DATASUS.

Programa

Abaixo está mostrado o código do programa, escrito em R, que gera dois gráficos para cada região do Brasil, mostrando separadamente a quantidade casos e óbitos por COVID-19 em cada uma das regiões nas semanas epidemiológicas, vendo-se, também, a participação dos estados da região na composição do valor total das semanas. Antes de ser executado as bibliotecas utilizadas precisam ser instaladas.

#
# source('rsus_covid_19_regiao_estados_semana_epi_bar.R')
#
# Programa para gerar dois gráficos para cada região do Brasil, contendo os
# casos e óbitos por COVID-19 em cada uma dessas regiões, e mostrando a
# participação dos estados da região na composição do total nas semanas
# epidemiológicas.
# As imagens dos gráficos são gravadas em disco.
#
# Os dados são baixados do Painel Coronavírus em https://covid.saude.gov.br
#
# Bibliotecas
library(tidyverse)
library(lubridate)
library(ggsci)
library(knitr)

# Ler os dados baixados do Painel Coronavírus
dados <- read_csv2(
    "~/R/dados/HIST_PAINEL_COVIDBR.csv",
    skip = 1,
    col_names = c(
        "regiao",
        "estado",
        "municipio",
        "coduf",
        "codmun",
        "codRegiaoSaude",
        "nomeRegiaoSaude",
        "data",
        "semanaEpi",
        "populacaoTCU2019",
        "casosAcumulado",
        "casosNovos",
        "obitosAcumulado",
        "obitosNovos",
        "Recuperadosnovos",
        "emAcompanhamentoNovos",
        "interior_metropolitana"
    ),
    col_types = cols(
        regiao = col_character(),
        estado = col_character(),
        municipio = col_character(),
        coduf = col_character(),
        codmun = col_character(),
        codRegiaoSaude = col_character(),
        nomeRegiaoSaude = col_character(),
        data = col_date(format = "%Y-%m-%d"),
        semanaEpi = col_integer(),
        populacaoTCU2019 = col_integer(),
        casosAcumulado = col_integer(),
        casosNovos = col_integer(),
        obitosAcumulado = col_integer(),
        obitosNovos = col_integer(),
        Recuperadosnovos = col_integer(),
        emAcompanhamentoNovos = col_integer(),
        interior_metropolitana = col_integer()
    )
)

# Permanecer apenas com os dados dos estados
dados <- filter(dados, !is.na(estado), is.na(codmun))

# Selecionar apenas os dados necessários
dados <-
    select(dados, data, regiao, estado, casosNovos, obitosNovos)

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

# Semana epidemiológica
dados <-
    dados %>% mutate(semanaEpi = epiweek(data))

# Ano da semana epidemiológica
dados <-
    dados %>% mutate(anoEpi = epiyear(data))

# Concatenar Ano e Semana Epidemiológicos
dados <-
    dados %>% mutate(anoSemanaEpi = sprintf("%s-%02.0f", anoEpi, semanaEpi))

# Agrupar por semana epidemiológica
casos <-
    dados %>%
    select(anoSemanaEpi, regiao, estado, casosNovos) %>%
    group_by(anoSemanaEpi, regiao, estado) %>%
    summarise_at(vars(casosNovos), list(casosAcumulados = sum))
obitos <-
    dados %>%
    select(anoSemanaEpi, regiao, estado, obitosNovos) %>%
    group_by(anoSemanaEpi, regiao, estado) %>%
    summarise_at(vars(obitosNovos), list(obitosAcumulados = sum))

# Manter os dados das semanas epidemiológicas com casos/óbitos
casos <-
    filter(casos, casosAcumulados > 0)
obitos <-
    filter(obitos, obitosAcumulados > 0)

# Calcular o somatório dos casos e óbitos por semana epidemiológica e região
sumRegioesCasos <- aggregate(
    casos[, 4],
    by = list(
        anoSemanaEpi = casos$anoSemanaEpi,
        regiao = casos$regiao
    ),
    FUN = sum
)
sumRegioesObitos <- aggregate(
    obitos[, 4],
    by = list(
        anoSemanaEpi = obitos$anoSemanaEpi,
        regiao = obitos$regiao
    ),
    FUN = sum
)

# Regiões do Brasil
regioes <- unique(dados$regiao)

# Gerar ps gráficos de casos e óbitos para todas as regiões do Brasil
for (Regiao in regioes) {
    # Casos e óbitos nos estados da região por semana epidemiológica
    estadosRegiaoCasos <- filter(casos, regiao == Regiao)
    estadosRegiaoObitos <- filter(obitos, regiao == Regiao)

    # Casos e óbitos na região por semana epidemiológica
    sumRegiaoCasos <- filter(sumRegioesCasos, regiao == Regiao)
    sumRegiaoObitos <- filter(sumRegioesObitos, regiao == Regiao)

    # Número máximo de casos acumulados numa semana
    max_cases <- max(sumRegiaoCasos$casosAcumulados)

    # Número máximo de óbitos acumulados numa semana
    max_deaths <- max(sumRegiaoObitos$obitosAcumulados)

    # Casos Novos de COVID-19 por Semana Epidemiológica e Região
    plot_cases <-
        ggplot(estadosRegiaoCasos,
               aes(x = anoSemanaEpi, y = casosAcumulados, fill = estado)) +
        labs(
            title = "COVID-19: Casos por Semana Epidemiológica, Região e Estado",
            x = "Semana Epidemiológica",
            y = "Casos",
            caption = paste(
                "Dados baixados do Painel Coronavírus (https://covid.saude.gov.br) em",
                dataDados
            )
        ) +
        geom_bar(position = "stack",
                 stat = "identity") +
        geom_text(
            aes(
                x = anoSemanaEpi,
                y = casosAcumulados + 1000,
                angle = 90,
                hjust = "left",
                label = prettyNum(
                    casosAcumulados,
                    big.mark = ".",
                    decimal.mark = ","
                ),
                fill = NULL
            ),
            size = 3.6,
            data = sumRegiaoCasos
        ) +
        annotate(
            geom = "text",
            x = -Inf,
            y = max_cases * 1.40,
            color = "#AD002AFF",
            hjust = "left",
            vjust = "top",
            size = 4.0,
            label = "Mandetta\n⟶"
        ) +
        annotate(
            geom = "text",
            x = "2020-16",
            y = max_cases * 1.40,
            color = "#AD002AFF",
            hjust = "left",
            vjust = "top",
            size = 4.0,
            label = "Teich\n⟶"
        ) +
        annotate(
            geom = "text",
            x = "2020-20",
            y = max_cases * 1.40,
            color = "#AD002AFF",
            hjust = "left",
            vjust = "top",
            size = 4.0,
            label = "Pazuello\n⟶"
        ) +
        annotate(
            geom = "text",
            x = "2021-12",
            y = max_cases * 1.40,
            color = "#AD002AFF",
            hjust = "left",
            vjust = "top",
            size = 4.0,
            label = "Queiroga\n⟶"
        ) +
        guides(fill = guide_legend(title = paste("Região", Regiao))) +
        theme_minimal() +
        theme(
            legend.title = element_text(size = 14),
            legend.text = element_text(size = 12),
            legend.direction = "horizontal",
            legend.position = "top",
            panel.grid.major = element_line(
                size = 0.5,
                linetype = 'solid',
                colour = "lightblue"
            ),
            axis.text.x = element_text(
                size = 11,
                angle = 60,
                hjust = 1
            ),
            axis.text.y = element_text(size = 11),
            axis.title.x = element_text(size = 16),
            axis.title.y = element_text(size = 16),
            plot.title = element_text(size = 20),
            plot.subtitle =  element_text(size = 18),
            plot.margin = unit(c(6, 12, 6, 6), "pt") #top, right, bottom, left
        ) +
        scale_x_discrete() +
        ylim(0, max_cases * 1.40) +
        scale_fill_npg()

    # Gravar a imagem do gráfico no disco
    if (Regiao == "Sudeste") {
        ggsave(
            paste0(
                "~/doctec/static/img/sus/rsus_covid_19_semana_epi_bar_casos_",
                Regiao,
                ".png"
            ),
            plot_cases,
            device = png(),
            width = 12.5,
            height = 6.25,
            dpi = 72
        )
        dev.off()
    }

    # Óbitos Novos de COVID-19 por Semana Epidemiológica e Região
    plot_deaths <-
        ggplot(estadosRegiaoObitos,
               aes(x = anoSemanaEpi, y = obitosAcumulados, fill = estado)) +
        labs(
            title = "COVID-19: Óbitos por Semana Epidemiológica, Região e Estado",
            x = "Semana Epidemiológica",
            y = "Óbitos",
            caption = paste(
                "MS - DATASUS - Dados obtidos de",
                "https://covid.saude.gov.br em",
                dataDados
            )
        ) +
        geom_bar(position = "stack",
                 stat = "identity") +
        geom_text(
            aes(
                x = anoSemanaEpi,
                y = obitosAcumulados + 50,
                label = prettyNum(
                    obitosAcumulados,
                    big.mark = ".",
                    decimal.mark = ","
                ),
                angle = 90,
                hjust = "left",
                fill = NULL
            ),
            size = 3.6,
            data = sumRegiaoObitos
        ) +
        annotate(
            geom = "text",
            x = -Inf,
            y = max_deaths * 1.40,
            color = "#AD002AFF",
            hjust = "left",
            vjust = "top",
            size = 4.0,
            label = "Mandetta\n⟶"
        ) +
        annotate(
            geom = "text",
            x = "2020-16",
            y = max_deaths * 1.40,
            color = "#AD002AFF",
            hjust = "left",
            vjust = "top",
            size = 4.0,
            label = "Teich\n⟶"
        ) +
        annotate(
            geom = "text",
            x = "2020-20",
            y = max_deaths * 1.40,
            color = "#AD002AFF",
            hjust = "left",
            vjust = "top",
            size = 4.0,
            label = "Pazuello\n⟶"
        ) +
        annotate(
            geom = "text",
            x = "2021-12",
            y = max_deaths * 1.40,
            color = "#AD002AFF",
            hjust = "left",
            vjust = "top",
            size = 4.0,
            label = "Queiroga\n⟶"
        ) +
        guides(fill = guide_legend(title = paste("Região", Regiao))) +
        theme_minimal() +
        theme(
            legend.title = element_text(size = 14),
            legend.text = element_text(size = 12),
            legend.direction = "horizontal",
            legend.position = "top",
            panel.grid.major = element_line(
                size = 0.5,
                linetype = 'solid',
                colour = "pink"
            ),
            axis.text.x = element_text(
                size = 11,
                angle = 60,
                hjust = 1
            ),
            axis.text.y = element_text(size = 11),
            axis.title.x = element_text(size = 16),
            axis.title.y = element_text(size = 16),
            plot.title = element_text(size = 20),
            plot.subtitle =  element_text(size = 18),
            plot.margin = unit(c(6, 12, 6, 6), "pt") #top, right, bottom, left
        ) +
        scale_x_discrete() +
        ylim(0, max_deaths * 1.40) +
        scale_fill_npg()

    # Gravar a imagem do gráfico no disco
    if (Regiao == "Sudeste") {
        ggsave(
            paste0(
                "~/doctec/static/img/sus/rsus_covid_19_semana_epi_bar_obitos_",
                Regiao,
                ".png"
            ),
            plot_deaths,
            device = png(),
            width = 12.5,
            height = 6.25,
            dpi = 72
        )
        dev.off()
    }

}
Referências