DATASUS - COVID-19 no Brasil: Casos, óbitos e letalidade nas Capitais

COVID-19 no Brasil: Casos, óbitos e letalidade nas Capitais
COVID-19 no Brasil: Casos, óbitos e letalidade nas Capitais

Os gráficos acima mostram os casos, óbitos e letalidade nas Capitais. Pode ser observado que a Cidade do Rio de Janeiro tem a maior letalidade entre todas as capitais, 9,11%. A capital com a maior letalidade, depois do Rio de Janeiro, é Manaus, com 5,26%, e a capital com a menor letalidade é Florianópolis, com 0,84%.

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 o gráfico mostrado acima. Antes de ser executado as bibliotecas utilizadas precisam ser instaladas.

#
# source('rsus_covid_19_capitais_casos_obitos_letalidade.R')
#
# Programa para gerar uma imagem contendo dois gráficos para a COVID-19:
# letalidade (óbitos/casos) e óbitos versus casos nas Capitais.
#
# 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(scales)
library(grid)
library(gridExtra)
library(ggrepel)

# 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()
    )
)

# Usar somente as data válidas
dados <-
    filter(historico,!is.na(data))

# Última data
dataDados = max(historico$data)

# Capitais
estadoCapital <- read_csv("~/R/dados/estado_capital.csv")

# Permanecer apenas com os dados das capitais
capitais <- historico %>% inner_join(estadoCapital)

# Permanecer apenas com os dados mais recentes das capitais
capitais <- filter(capitais, data == dataDados)

# Permanecer apenas com as colunas necessárias
capitais <-
    select(capitais, Capital = municipio, casosAcumulado, obitosAcumulado)

# Adicionar a letalidade
capitais <-
    capitais %>% mutate(letalidade = obitosAcumulado / casosAcumulado)

# Ordenar por capital
capitais <- arrange(capitais, Capital)

# Transformar caracter em fator
capitais <- mutate_if(capitais, is.character, as.factor)

# Gráfico de letalidade
plot_leth <-
    ggplot(capitais, aes(fct_rev(fct_infreq(factor(
        Capital
    ))))) +
    labs(title = "Letalidade (óbitos / casos) na Capitais",
         x = "Capital",
         y = "Letalidade") +
    geom_col(aes(y = letalidade),
             fill = "#008280FF") +
    geom_text(aes(y = letalidade,
                  label = sprintf("%.2f%%", 100 * letalidade)),
              hjust = -.1,
              size = 4) +
    coord_flip() +
    guides(fill = guide_legend(title = NULL, reverse = TRUE)) +
    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,
            linetype = 'solid',
            colour = "lightblue"
        ),
        panel.grid.minor = element_line(
            size = 0,
            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_y_continuous(labels = percent,
                       limits = c(0, 0.10),
                       expand = c(0, 0))

# Óbitos x Casos
plot_ajust <-
    ggplot(capitais, aes(x = casosAcumulado, y = obitosAcumulado)) +
    labs(title = "Óbitos x Casos nas Capitais",
         x = "Casos",
         y = "Óbitos") +
    geom_text_repel(
        aes(label = Capital),
        size = 4,
        hjust = "center",
        vjust = "center",
        color = "#EE0000FF",
        max.overlaps = Inf,
        max.time = 1,
        show.legend = FALSE
    ) +
    geom_smooth (
        method = "gam",
        alpha = 0.3,
        size = 0,
        span = 0.5
    ) +
    stat_smooth(
        geom = "line",
        alpha = 1,
        size = 0.5,
        span = 0.5,
        method = "gam",
        color = "#3B4992FF",
        show.legend = FALSE
    ) +
    annotate(
        geom = "text",
        x = Inf,
        y = min(capitais$obitosAcumulado) + 50,
        color = "gray",
        hjust = "right",
        size = 4,
        label = "(Gráfico log-log) "
    ) +
    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,
            linetype = 'solid',
            colour = "lightblue"
        ),
        panel.grid.minor = element_line(
            size = 0,
            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_x_log10() +
    scale_y_log10(labels = scientific,
                  expand = c(0, 0))


# Juntar os dois gráficos
imagem <- grid.arrange(
    plot_leth,
    plot_ajust,
    nrow = 1,
    ncol = 2,
    top = textGrob(
        "COVID-19 no Brasil: Casos, óbitos e letalidade nas Capitais",
        gp = gpar(fontsize = 18, font = 2)
    ),
    bottom = paste(
        "MS - DATASUS - Dados obtidos de",
        "https://covid.saude.gov.br em",
        dataDados
    )
)

# Gravar a imagem com os dois gráficos no disco
ggsave(
    "~/doctec/static/img/sus/rsus_covid_19_capitais_casos_obitos_letalidade.png",
    imagem,
    device = png(),
    width = 12.5,
    height = 6.25,
    dpi = 72
)

dev.off()