/ Tecnologia / Raspberry Pi / R Estatísticas / Exemplos / JHU - COVID-19 …

JHU - COVID-19 na América do Sul - Casos Novos x Acumulados

Argentina, Brasil, Chile, Colômbia, Equador, Peru e Uruguai

COVID-19: Casos Novos X Casos Acumulados na América do Sul
COVID-19: Casos Novos X Casos Acumulados na América do Sul

Este programa, escrito em R, gera um gráfico relacionando o número de casos confirmados de COVID-19 acumulados com a média móvel de 7 dias dos novos casos (últimas 24 horas), para alguns países escolhidos da América do Sul.

Os dados são oriundos do repositório de dados de COVID-19, disponibilizado pelo Centro de Ciência e Engenharia de Sistemas (CSSE) da Universidade Johns Hopkins, em sua página do GitHub https://github.com/CSSEGISandData/COVID-19.

A pasta COVID-19/csse_covid_19_data/csse_covid_19_time_series/ contém tabelas de resumo de séries temporais diárias.

Abaixo está mostrado o código do programa, mas antes de ser executado as bibliotecas utilizadas precisam ser instaladas no R do Raspberry Pi. Os eixos dos gráficos estão em escala logarítimica, uma vez que a diferença de valores entre os países é muito grande.

#
# source('jhu_casos_acum_casos_novos.R')
#
# Programa para gerar um gráfico relacionando o número de casos confirmados de
# COVID-19 acumulados com a média móvel de 7 dias dos novos casos (últimas 24
# horas) para alguns países escolhidos da América do Sul.
#
# Os dados são oriundos do repositório de dados de COVID-19 disponibilizado pelo
# Centro de Ciência e Engenharia de Sistemas (CSSE) da Universidade Johns Hopkins
# em sua página do GitHub:
# https://github.com/CSSEGISandData/COVID-19
#
# A pasta COVID-19/csse_covid_19_data/csse_covid_19_time_series/
# https://github.com/CSSEGISandData/COVID-19/tree/master/csse_covid_19_data/csse_covid_19_time_series
# contém tabelas de resumo de séries temporais diárias.
#
# Pivoting
# https://tidyr.tidyverse.org/articles/pivot.html
#
# Comando para baixar os dados:
# wget https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv

library(tidyr)
library(dplyr)
library(ggplot2)
library(gridExtra)
library(pracma)
library(ggsci)

# Função para calcular o incremento em relação ao valor anterior.
# Retorna um array com os incrementos do array passado como parâmetro.
# Usada para calcular os casos e óbitos do dia a partir do valor acumulado.
incremento <- function(arr){
	res = arr
	for(i in 2:length(arr)) {
		res[i] <- arr[i] - arr[i-1]
	}
	res
}

# Ler os dados fornecidos pela JHU no formato CSV
df <- read.csv('~/R/dados/time_series_covid19_confirmed_global.csv')

# Como no arquivo fornecido pela JHU existe uma linha para cada província/estado
# e uma coluna para cada data, ou seja, a planilha cresce no número de colunas e
# não no número de linhas na medida em que o tempo passa, é necessário pivotar a
# planilha para termos uma linha para cada dia em vez de uma coluna para cada
# dia.
casos <- pivot_longer(df,
	cols = starts_with("X"),
	names_to = "mdy",
	values_to = "casos_acum",
	values_drop_na = TRUE
)

# Criar uma coluna contendo a data a partir da data fornecida no arquivo 
casos$data <- as.Date(casos$mdy,format="X%m.%d.%y")

# Criar uma coluna para os casos novos (úĺtimas 24 horas) com valores iguais a 0 
casos$casos_novos <- 0

# Valor inicial dos casos novos = casos acumulados
casos$casos_novos[1] <- casos$casos_acum[1]

# Dados para os países escolhidos

Argentina <- subset(casos, Country.Region == "Argentina", select = c("Country.Region", "data", "casos_novos", "casos_acum"))
Argentina$casos_novos <- incremento(Argentina$casos_acum)
Argentina$media_movel_casos <- movavg(Argentina$casos_novos, 6, type="s")
Argentina <- Argentina[Argentina$media_movel_casos >=1, ]

Brazil <- subset(casos, Country.Region == "Brazil", select = c("Country.Region", "data", "casos_novos", "casos_acum"))
Brazil$casos_novos <- incremento(Brazil$casos_acum)
Brazil$media_movel_casos <- movavg(Brazil$casos_novos, 6, type="s")
Brazil <- Brazil[Brazil$media_movel_casos >=1, ]

Chile <- subset(casos, Country.Region == "Chile", select = c("Country.Region", "data", "casos_novos", "casos_acum"))
Chile$casos_novos <- incremento(Chile$casos_acum)
Chile$media_movel_casos <- movavg(Chile$casos_novos, 6, type="s")
Chile <- Chile[Chile$media_movel_casos >=1, ]

Colombia <- subset(casos,Country.Region == "Colombia", select = c("Country.Region", "data", "casos_novos", "casos_acum"))
Colombia$casos_novos <- incremento(Colombia$casos_acum)
Colombia$media_movel_casos <- movavg(Colombia$casos_novos, 6, type="s")
Colombia <- Colombia[Colombia$media_movel_casos >=1, ]

Ecuador <- subset(casos,Country.Region == "Ecuador", select = c("Country.Region", "data", "casos_novos", "casos_acum"))
Ecuador$casos_novos <- incremento(Ecuador$casos_acum)
Ecuador$media_movel_casos <- movavg(Ecuador$casos_novos, 6, type="s")
Ecuador <- Ecuador[Ecuador$media_movel_casos >=1, ]

Peru <- subset(casos, Country.Region == "Peru", select = c("Country.Region", "data", "casos_novos", "casos_acum"))
Peru$casos_novos <- incremento(Peru$casos_acum)
Peru$media_movel_casos <- movavg(Peru$casos_novos, 6, type="s")
Peru <- Peru[Peru$media_movel_casos >=1, ]

Uruguay <- subset(casos, Country.Region == "Uruguay", select = c("Country.Region", "data", "casos_novos", "casos_acum"))
Uruguay$casos_novos <- incremento(Uruguay$casos_acum)
Uruguay$media_movel_casos <- movavg(Uruguay$casos_novos, 6, type="s")
Uruguay <- Uruguay[Uruguay$media_movel_casos >=1, ]

# Juntar os dados dos países
dados <- rbind(Argentina, Brazil)
dados <- rbind(dados, Chile)
dados <- rbind(dados, Colombia)
dados <- rbind(dados, Ecuador)
dados <- rbind(dados, Peru)
dados <- rbind(dados, Uruguay)

# Data dos dados = maior data encontrada no arquivo
lastUpdate = toString(max(dados$data))

# Criar o gráfico
plot <- ggplot(dados, aes(x = casos_acum, y = media_movel_casos, color = Country.Region)) +
	geom_point(
		size = 1
	) +
	annotate(
		geom = "text",
		x = max(dados$casos_acum),
		y = min(dados$media_movel_casos + 0.15),
		color = "gray",
		hjust = "right",
		vjust = "bottom",
		size = 4.1,
		label = "(Log-log scale plot)"
	) +
	theme_minimal() +
	theme(legend.position = c(0.16 , 0.75)) +
	guides(color = guide_legend(title = "País")) +
	scale_x_log10(name = "Casos Acumulados") +
	scale_y_log10(name = "Casos Novos (média móvel de 7 dias)") +
	scale_color_npg()

# Mostrar o gráfico
grid.arrange(plot,
    nrow = 1,
    top="COVID-19: Casos Novos X Casos Acumulados na América do Sul",
    bottom = paste(	"COVID-19 Data Repository by the Center for Systems Science and Engineering (CSSE)\n",
					"Johns Hopkins University (https://github.com/CSSEGISandData/COVID-19) -",
					lastUpdate)
)

Veja também