JHU - Casos e óbitos por Covid-19 nos Países Nórdicos

Dinamarca, Finlândia, Noruega e Suécia

Casos e óbitos por Covid-19 nos Países Nórdicos
Casos e óbitos por Covid-19 nos Países Nórdicos

Os quatro gráficos acima mostram os novos casos e óbitos (últimas 24 horas) e o total de casos e óbitos acumulados até esta data para os quatro Países Nórdicos cam maior incidência de COVID-19 (Dinamarca, Finlândia, Noruega e Suécia). Como pode ser observado, a Suécia predominou nos quatro gráficos apresentados, seguida pela Dinamarca.

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 quatro gráficos mostrando os novos casos e óbitos (últimas 24 horas) e o total de casos e óbitos acumulados até a data do arquivo baixado para os Países Nórdicos (Dinamarca, Finlândia, Islândia, Noruega e Suécia). Antes de ser executado as bibliotecas utilizadas precisam ser instaladas.

#
# source('jhu_nordic_countries.R')
#
# Programa para gerar uma imagem contendo quatro gráficos
# (novos casos, novas mortes, total de casos, total de mortes)
# por COVID-19 nos países nórdicos.
# 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))

# Países Nórdicos
pn <- c("Denmark",
        "Finland",
        "Norway",
        "Sweden")

# Manter apenas os países nórdicos
cases <-
    jhu_cases %>% filter(Country_Region %in% pn)
deaths <-
    jhu_deaths %>% filter(Country_Region %in% pn)

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

# Acumular os valor por dia para cada país
cases <-
    aggregate(
        x = cases$Total_Cases,
        by = list(Country = cases$Country_Region, Date = cases$Date),
        FUN = sum
    )
deaths <-
    aggregate(
        x = deaths$Total_Deaths,
        by = list(Country = deaths$Country_Region, Date = deaths$Date),
        FUN = sum
    )

# Nomes das colunas
colnames(cases) <- c("Country", "Date", "Total_Cases")
colnames(deaths) <- c("Country", "Date", "Total_Deaths")

# Ordenar pelo país e pela data
cases <- arrange(cases, Country, Date)
deaths <- arrange(deaths, Country, Date)

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

# Manter apenas os valores da data dos dados
cases <- filter(cases, Date == dataDados)
deaths <- filter(deaths, Date == dataDados)

# Ficar apenas com as colunas a serem usadas
cases <- select(cases, Country, Total_Cases, New_Cases)
deaths <- select(deaths, Country, Total_Deaths, New_Deaths)

# Unir casos e óbitos
dados <- cases %>% inner_join(deaths, by = "Country")

# Acrescentar a letalidade % (óbitos / casos * 100)
dados <-
    dados %>%  mutate(Lethality = Total_Deaths / Total_Cases * 1e2)

# Converter daos em um data.frame
dados <- as.data.frame(dados)

# Total de óbitos por país

dados$pos = (cumsum(c(0, dados$Total_Deaths)) + c(dados$Total_Deaths / 2, .01))[1:nrow(dados)]

tot_deaths <- ggplot(dados, aes(1, Total_Deaths, fill = Country)) +
    geom_col(
        color = 'black',
        position = position_stack(reverse = TRUE),
        show.legend = FALSE
    ) +
    geom_text(
        aes(
            x = 1.2,
            label = prettyNum(Total_Deaths, big.mark = ".", decimal.mark =
                                  ","),
        ),
        position = position_stack(reverse = TRUE, vjust = 0.5),
        size = 3
    ) +
    geom_text_repel(
        aes(
            x = 1.25,
            y = pos,
            label = sprintf("%s\n(%.1f%%)", Country, Lethality)
        ),
        nudge_x = 0,
        nudge_y = 0,
        hjust = 1,
        vjust = 1,
        size = 3,
        segment.size = .7,
        show.legend = FALSE
    ) +
    coord_polar('y', start = pi / 3) +
    theme(
        plot.title = element_text(size = 11),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        panel.background = element_rect(fill = "white", colour = "white")
    ) +
    labs(x = NULL,
         y = NULL,
         title = "Óbitos Acumulados (Letalidade %)")

# Novos óbitos por país (últimas 24 horas)

dados$pos = (cumsum(c(0, dados$New_Deaths)) + c(dados$New_Deaths / 2, .01))[1:nrow(dados)]

new_deaths <- ggplot(dados, aes(1, New_Deaths, fill = Country)) +
    geom_col(
        color = 'black',
        position = position_stack(reverse = TRUE),
        show.legend = FALSE
    ) +
    geom_text(
        aes(
            x = 1.2,
            label = prettyNum(New_Deaths, big.mark = ".", decimal.mark =
                                  ","),
        ),
        position = position_stack(reverse = TRUE, vjust = 0.5),
        size = 3
    ) +
    geom_text_repel(
        aes(x = 1.4,
            y = pos,
            label = Country),
        nudge_x = 0,
        nudge_y = 0,
        hjust = 1,
        vjust = 1,
        size = 3,
        segment.size = .7,
        show.legend = FALSE
    ) +
    coord_polar('y', start = pi / 3) +
    theme(
        plot.title = element_text(size = 11),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        panel.background = element_rect(fill = "white", colour = "white")
    ) +
    labs(x = NULL,
         y = NULL,
         title = "Novos Óbitos (últimas 24 horas)")

# Total de Casos por país

dados$pos = (cumsum(c(0, dados$Total_Cases)) + c(dados$Total_Cases / 2, .01))[1:nrow(dados)]

tot_cases <- ggplot(dados, aes(1, Total_Cases, fill = Country)) +
    geom_col(
        color = 'black',
        position = position_stack(reverse = TRUE),
        show.legend = FALSE
    ) +
    geom_text(
        aes(
            x = 1.2,
            label = prettyNum(Total_Cases, big.mark = ".", decimal.mark =
                                  ","),
        ),
        position = position_stack(reverse = TRUE, vjust = 0.5),
        size = 3
    ) +
    geom_text_repel(
        aes(x = 1.4,
            y = pos,
            label = Country),
        nudge_x = 0,
        nudge_y = 0,
        hjust = 1,
        vjust = 1,
        size = 3,
        segment.size = .7,
        show.legend = FALSE
    ) +
    coord_polar('y', start = pi / 3) +
    theme(
        plot.title = element_text(size = 11),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        panel.background = element_rect(fill = "white", colour = "white")
    ) +
    labs(x = NULL,
         y = NULL,
         title = "Casos Acumulados")

# Novos de Casos por País (últimas 24 horas)

dados$pos = (cumsum(c(0, dados$New_Cases)) + c(dados$New_Cases / 2, .01))[1:nrow(dados)]

new_cases <- ggplot(dados, aes(1, New_Cases, fill = Country)) +
    geom_col(
        color = 'black',
        position = position_stack(reverse = TRUE),
        show.legend = FALSE
    ) +
    geom_text(
        aes(
            x = 1.2,
            label = prettyNum(New_Cases, big.mark = ".", decimal.mark =
                                  ","),
        ),
        position = position_stack(reverse = TRUE, vjust = 0.5),
        size = 3
    ) +
    geom_text_repel(
        aes(x = 1.4,
            y = pos,
            label = Country),
        nudge_x = 0,
        nudge_y = 0,
        hjust = 1,
        vjust = 1,
        size = 3,
        segment.size = .7,
        show.legend = FALSE
    ) +
    coord_polar('y', start = pi / 3) +
    theme(
        plot.title = element_text(size = 11),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        panel.background = element_rect(fill = "white", colour = "white")
    ) +
    labs(x = NULL,
         y = NULL,
         title = "Novos Casos (últimas 24 horas)")

# Juntar os quatro gráficos em uma imagem
plot <- grid.arrange(
    new_cases,
    new_deaths,
    tot_cases,
    tot_deaths,
    nrow = 2,
    top = "COVID-19 nos Países Nórdicos",
    bottom = textGrob(
        paste(
            "Dados baixados do HDX",
            "(https://data.humdata.org/dataset/novel-coronavirus-2019-ncov-cases) em",
            dataDados
        ),
        hjust = 0.5,
        gp = gpar(fontface = 3, fontsize = 9)
    )
)

# Gravar a imagem do gráfico no disco
ggsave(
    "~/doctec/static/img/jhu/jhu_nordic_countries.png",
    plot,
    device = png(),
    width = 9,
    height = 9,
    dpi = 72
)

dev.off()