DATASUS - COVID-19 no Brasil - Proporção dos Casos e Óbitos nos Estados, na Região Metropolitana e no Interior

COVID-19 no Brasil: Porcentagem dos Casos Confirmados de COVID-19 nos Estados na Região Metropolitana e no Interior
COVID-19 no Brasil: Porcentagem dos Casos Confirmados de COVID-19 nos Estados na Região Metropolitana e no Interior

O gráfico acima mostra a percentagem de casos confirmados de COVID-19 nos estados do Brasil, na região metropolitana e no interior.

COVID-19 no Brasil: Porcentagem dos Óbitos por COVID-19 nos Estados na Região Metropolitana e no Interior
COVID-19 no Brasil: Porcentagem dos Óbitos por COVID-19 nos Estados na Região Metropolitana e no Interior

O gráfico acima mostra a percentagem de óbitos por COVID-19 nos estados do Brasil, na região metropolitana e no interior.

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 mostrados acima. Antes de ser executado as bibliotecas utilizadas precisam ser instaladas.

#
# source('rsus_covid_19_est_int_met_pct.R')
#
# Programa para gerar gráficos mostrando a proporção entre os casos e
# óbitos confirmados de COVID-19 na região metropolitana e no interior
# dos Estados, permitindo observar a interiorização da doença.
#
# Os dados são baixados do Painel Coronavírus em https://covid.saude.gov.br
#
# Bibliotecas
library(utils)
library(tidyverse)
library(plotly)
library(lubridate)
library(ggrepel)
library(RColorBrewer)

# Ler os dados baixados do Painel Coronavírus
historico <- 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()
    )
)

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

# Dados dos estados no último dia do arquivo baixado
estados <-
    filter(historico,!is.na(estado),
           is.na(codmun),
           estado != 'DF',
           data == dataDados)

# Selecionar apenas os dados necessários
estados <- select(estados, estado, casosAcumulado, obitosAcumulado)

# Adicionar a abrangência
estados <- estados %>% mutate(Local = 'UF')

# Região Metroploitana
metropol <-
    filter(historico,
           interior_metropolitana == 1,
           estado != 'DF',
           data == dataDados)

# Selecionar apenas os dados necessários
metropol <-
    select(metropol, estado, casosAcumulado, obitosAcumulado)

# Totais para as regiões metropolitanas
metropol <- aggregate(metropol[, 2:3],
                      by = list(estado = metropol$estado),
                      FUN = sum)

# Adicionar a abrangência
metropol <- metropol %>% mutate(Local = 'Região Metropolitana')

# Separar Região Metropolitana do Interior
interior <- within(merge(estados, metropol, by = "estado"), {
    casosAcumulado <- casosAcumulado.x - casosAcumulado.y
    obitosAcumulado <- obitosAcumulado.x - obitosAcumulado.y
    Local <- "Interior"
})[, c("estado", "Local", "casosAcumulado", "obitosAcumulado")]

# Proporções
razaoInterior <-
    within(merge(interior, estados, by = "estado"), {
        casosRazao <- casosAcumulado.x / casosAcumulado.y
        obitosRazao <- obitosAcumulado.x / obitosAcumulado.y
        Local <- "Interior"
    })[, c("estado", "Local", "casosRazao", "obitosRazao")]

razaoMetropol <-
    within(merge(metropol, estados, by = "estado"), {
        casosRazao <- casosAcumulado.x / casosAcumulado.y
        obitosRazao <- obitosAcumulado.x / obitosAcumulado.y
        Local <- "Região Metropolitana"
    })[, c("estado", "Local", "casosRazao", "obitosRazao")]

# Juntar região metropolitana com o interior
razao <- rbind(razaoMetropol, razaoInterior)

# Ordenar por estado e local
razao <- arrange(razao, estado, Local)

# Transformar caracter em level
estados <- mutate_if(estados, is.character, as.factor)
razao <- mutate_if(razao, is.character, as.factor)

# Casos
plot_cases <-
    ggplot(razao, aes(x = estado, y = casosRazao, fill = Local)) +
    labs(
        title = "COVID-19 no Brasil: Proporção de Casos Confirmados de COVID-19 nos Estados",
        x = "Estado",
        y = "Casos",
        caption = paste(
            "MS - DATASUS - Dados obtidos de",
            "https://covid.saude.gov.br em",
            dataDados
        )
    ) +
    geom_bar(position = "stack",
             stat = "identity") +
    theme_minimal() +
    scale_y_continuous(labels = scales::percent,
                       expand = c(0, 0)) +
    xlim(rev(levels(razao$estado))) +
    geom_text(aes(label = sprintf("%.1f%%", casosRazao * 100)),
              position = position_stack(vjust = 0.5),
              size = 4) +
    coord_flip() +
    guides(fill = guide_legend(title = NULL, reverse = TRUE)) +
    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.1,
            linetype = 'solid',
            colour = "lightblue"
        ),
        panel.grid.minor = element_line(
            size = 0.1,
            linetype = 'solid',
            colour = "lightblue"
        ),
        panel.grid = element_blank(),
        panel.border = element_blank(),
        axis.text.x = element_text(size = 12),
        axis.text.y = element_text(size = 12),
        axis.title.x = element_text(size = 14),
        axis.title.y = element_text(size = 14),
        plot.title = element_text(size = 16),
        plot.margin = unit(c(12, 18, 12, 12), "pt") #top, right, bottom, left
    ) +
    scale_fill_brewer(palette = "Pastel1")

# Óbitos
plot_deaths <-
    ggplot(razao, aes(x = estado, y = obitosRazao, fill = Local)) +
    labs(
        title = "COVID-19 no Brasil: Proporção de Óbitos por COVID-19 nos Estados",
        x = "Estado",
        y = "Óbitos",
        caption = paste(
            "MS - DATASUS - Dados obtidos de",
            "https://covid.saude.gov.br em",
            dataDados
        )
    ) +
    geom_bar(position = "stack",
             stat = "identity") +
    theme_minimal() +
    scale_y_continuous(labels = scales::percent,
                       expand = c(0, 0)) +
    xlim(rev(levels(razao$estado))) +
    geom_text(aes(label = sprintf("%.1f%%", obitosRazao * 100)),
              position = position_stack(vjust = 0.5),
              size = 4) +
    coord_flip() +
    guides(fill = guide_legend(title = NULL, reverse = TRUE)) +
    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.1,
            linetype = 'solid',
            colour = "pink"
        ),
        panel.grid.minor = element_line(
            size = 0.1,
            linetype = 'solid',
            colour = "pink"
        ),
        panel.grid = element_blank(),
        panel.border = element_blank(),
        axis.text.x = element_text(size = 12),
        axis.text.y = element_text(size = 12),
        axis.title.x = element_text(size = 14),
        axis.title.y = element_text(size = 14),
        plot.title = element_text(size = 16),
        plot.margin = unit(c(12, 18, 12, 12), "pt") #top, right, bottom, left
    ) +
    scale_fill_brewer(palette = "Pastel1")

# Gravar as imagens dos gráficos no disco
ggsave(
    "~/doctec/static/img/sus/covid-19-estados-reg-metropol-interior-casos-pct.png",
    plot_cases,
    device = png(),
    width = 11,
    height = 6.25,
    dpi = 72
)
ggsave(
    "~/doctec/static/img/sus/covid-19-estados-reg-metropol-interior-obitos-pct.png",
    plot_deaths,
    device = png(),
    width = 11,
    height = 6.25,
    dpi = 72
)

dev.off()
dev.off()