En esta publicación usaremos R para analizar una base de datos con información acerca del número de casos confirmados y de muertes por COVID-19 en los países del mundo.
Seguramente has oído hablar en los últimos meses acerca del brote denominado Coronavirus o COVID-19. Al virus causante de este brote se le llama Síndrome Respiratorio Agudo Severo Coronavirus 2 (SARS-CoV-2) y a la enfermedad se le conoce como Enfermedad por Coronavirus (COVID-19).
Este brote inició en la ciudad de Wuhan, China y los primeros casos de COVID-19 en este país fueron confirmados a finales del año 2019. Posteriormente, el brote llegó a otros países y los primeros casos de COVID-19 confirmados fuera de China se reportaron en enero de 2020 en Tailandia y Japón.
Actualmente, en todas las regiones del mundo se han reportado casos de COVID-19 y muchos países han tenido que tomar medidas extremas como el aislamiento obligatorio para evitar que el número de contagiados por el virus siga aumentando.
Para más información acerca del COVID-19 visita la página web de la Organización Mundial de la Salud.
Our World in Data es una publicación científica en línea enfocada en problemas globales como la pobreza, las enfermedades, el cambio climático, entre otros. Su principal objetivo es lograr que los datos y las investigaciones desarrolladas en estos problemas sean accesibles y comprensibles para todos.
Coronavirus Disease COVID-19 es un artículo creado por Our World in Data en el cual se presentan diariamente estadísticas globales referentes al número de casos confirmados y de muertes por COVID-19. Los datos utilizados en este artículo provienen del Centro Europeo para la Prevención y el Control de Enfermedades y pueden ser descargados de forma gratuita aquí.
La base de datos que analizaremos contiene 7213 observaciones y 6 variables. Las observaciones corresponden al número de casos y muertes confirmadas por COVID-19 diariamente, a partir del día 12 de diciembre de 2019 hasta el día 27 de marzo de 2020 en algunos países del mundo. En otros países la fecha de inicio es diferente ya que el virus llegó posteriormente a algunas regiones del mundo. En la siguiente tabla se observa la descripción de las variables pertenecientes a esta base de datos:
| Variables | Descripción |
|---|---|
| date | Fecha |
| location | País |
| new_cases | Número de casos confirmados de COVID-19 |
| new_deaths | Número de muertes por COVID-19 |
| total_cases | Número total de casos confirmados de COVID-19 hasta la fecha |
| total_deaths | Número total de muertes por COVID-19 hasta la fecha |
El primer paso en el análisis de esta base de datos con R es cargar los paquetes o librerías necesarias para esta tarea.
library(readr) # Para importar la base de datos
library(dplyr) # Para manipular la base de datos
library(ggplot2) # Para construir gráficos
library(gridExtra) # Para manipular múltiples gráficos
Recuerda que para cargar los paquetes es necesario instalarlos previamente usando el comando install.packages("nombre del paquete").
Ahora debemos importar la base de datos usando el paquete readr. Antes de importarla, es necesario cambiar el directorio de trabajo y seleccionar la carpeta donde está guardada nuestra base de datos.
datos <- read_csv("full_data.csv")
Para la exploración inicial de la base de datos, utilizaremos algunas funciones que nos permitirán conocer la dimensión, las primeras y últimas filas, los tipos de variables incluidas en la base de datos y si la base de datos contiene valores nulos.
dim(datos) # Para conocer la dimensión de la base de datos
## [1] 7213 6
glimpse(datos) # Para explorar las variables
## Observations: 7,213
## Variables: 6
## $ date <date> 2019-12-31, 2020-01-01, 2020-01-02, 2020-01-03, 2020-...
## $ location <chr> "Afghanistan", "Afghanistan", "Afghanistan", "Afghanis...
## $ new_cases <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
## $ new_deaths <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
## $ total_cases <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
## $ total_deaths <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
head(datos) # Seis primeras observaciones de la base de datos
## # A tibble: 6 x 6
## date location new_cases new_deaths total_cases total_deaths
## <date> <chr> <dbl> <dbl> <dbl> <dbl>
## 1 2019-12-31 Afghanistan 0 0 0 0
## 2 2020-01-01 Afghanistan 0 0 0 0
## 3 2020-01-02 Afghanistan 0 0 0 0
## 4 2020-01-03 Afghanistan 0 0 0 0
## 5 2020-01-04 Afghanistan 0 0 0 0
## 6 2020-01-05 Afghanistan 0 0 0 0
tail(datos) # Últimas seis observaciones de la base de datos
## # A tibble: 6 x 6
## date location new_cases new_deaths total_cases total_deaths
## <date> <chr> <dbl> <dbl> <dbl> <dbl>
## 1 2020-03-22 Zimbabwe 1 0 2 0
## 2 2020-03-23 Zimbabwe 0 0 2 0
## 3 2020-03-24 Zimbabwe 0 1 2 1
## 4 2020-03-25 Zimbabwe 0 0 2 1
## 5 2020-03-26 Zimbabwe 1 0 3 1
## 6 2020-03-27 Zimbabwe 0 0 3 1
# Para determinar si hay valores NA por columnas
sapply(datos, function(x) sum(is.na(x)))
## date location new_cases new_deaths total_cases total_deaths
## 0 0 0 0 0 0
Con la ayuda de estas funciones podemos determinar que en la base de datos contamos con 4 variables numéricas, una variable categórica y una variable tipo fecha. Además, la base de datos está organizada según el orden alfabético de los países incluidos y por esta razón, las primeras seis observaciones corresponden a Afganistán y las últimas seis observaciones corresponden a Zimbabue. Finalmente, la base de datos no contiene valores nulos.
En la base de datos encontramos información para cada país e información a nivel mundial acerca del número de casos confirmados y el número de muertes por COVID-19. En esta sección, nos centraremos en la información a nivel mundial Para extraer esta información de la base de datos, utilizamos el siguiente código:
global <- datos[datos$location=="World",]
Después de extraer la información, podemos utilizar algunos comandos para determinar en que fecha se ha reportado el número máximo de casos confirmados de COVID-19 y el número máximo de muertes a nivel mundial.
global$date[which.max(global$new_cases)] # Para el número de casos confirmados
## [1] "2020-03-27"
global$date[which.max(global$new_deaths)] # Para el número de muertes
## [1] "2020-03-27"
También podemos calcular el promedio de número de casos confirmados y el promedio de número de muertes por día.
mean(global$new_cases) # Para el número de casos confirmados
## [1] 6000.284
mean(global$new_deaths) # Para el número de muertes
## [1] 268.9659
Ahora construyamos algunas gráficas que nos permitan visualizar esta información. En este caso usaremos la librería ggplot2. Estas gráficas nos permitirán observar el número de casos confirmados a nivel mundial cada día, el número acumulado de casos confirmados, el número de muertes a nivel mundial cada día y el número acumulado de muertes.
# Gráfico número de casos confirmados de COVID-19
ggplot(data = global, aes(x = date, y = new_cases)) +
geom_point(color = "green3") + geom_line(color = "green3") +
labs(x = 'Fecha', y = 'Número de casos confirmados',
title = 'Número de casos confirmados de COVID-19') +
scale_y_continuous(breaks = seq(0, 60000, 5000))
# Gráfico número total de casos confirmados de COVID-19 hasta 27/03/2020
ggplot(data = global, aes(x = date, y = total_cases)) +
geom_line(color = "seagreen4") +
labs(x = 'Fecha', y = 'Número total de casos confirmados (acumulado)',
title = 'Número total de casos confirmados hasta 27/03/2020') +
scale_y_continuous(breaks = seq(0, 530000, 50000))
# Gráfico número de muertes por COVID-19
ggplot(data = global, aes(x = date, y = new_deaths)) +
geom_point(color = "green3") + geom_line(color = "green3") +
labs(x='Fecha', y='Número de muertes',
title = 'Número de muertes por COVID-19') +
scale_y_continuous(breaks = seq(0, 3000, 200))
# Gráfico número total de muertes por COVID-19 hasta 27/03/2020
ggplot(data = global, aes(x = date, y = total_deaths)) +
geom_line(color = "seagreen4") +
labs(x = 'Fecha', y = 'Número total de muertes (acumulado)',
title = 'Número total de muertes hasta 27/03/2020') +
scale_y_continuous(breaks = seq(0, 25000, 2000))
Después de analizar los datos a nivel mundial, haremos un análisis por países. De la base de datos original vamos a extraer sólo los datos de los países utilizando el siguiente comando:
paises <- datos[datos$location != "World",]
Si queremos determinar cuál ha sido el mayor número de casos confirmados y el mayor número de muertes en un día y en cuales países, utilizamos el siguiente código:
# Para el máximo número de casos confirmados en un día
max(paises$new_cases)
## [1] 16797
# País con el máximo número de casos confirmados en un día
paises$location[which.max(paises$new_cases)]
## [1] "United States"
# Para el máximo número de muertes en un día
max(paises$new_deaths)
## [1] 795
# País con el máximo número de muertes en un día
paises$location[which.max(paises$new_deaths)]
## [1] "Italy"
Ahora para todos los países vamos a calcular el promedio de casos confirmados de COVID-19 y el promedio de muertes por COVID-19 por día. Para lograrlo usaremos el paquete dplyr:
datos2 <- paises %>% group_by(location) %>% summarise(promcasos = mean(new_cases),
prommuertes = mean(new_deaths))
A partir de estos datos vamos a determinar cuál es el país con el mayor promedio de casos confirmados y el mayor promedio de muertes por día:
# Ordenar de mayor a menor el promedio de casos confirmados por día
pcasos <- arrange(datos2, -promcasos)
# Ordenar de mayor a menor el promedio de muertes por día
pmuertes <- arrange(datos2, -prommuertes)
Después de ordenar la base de datos de mayor a menor según el número promedio de casos confirmados por día y según el número promedio de muertes por día, seleccionamos los diez países con los mayores promedios de casos confirmados y los mayores promedios de muertes y construimos gráficos de barras con estos datos.
# Gráfico de los diez países con los mayores promedios de casos confirmados
subpcasos <- pcasos[1:10,]
ggplot(data = subpcasos, aes(x = location, y = promcasos)) +
geom_bar(stat = "identity", width = 0.5, fill = "limegreen") +
theme_bw() + labs(x = "Países", y = "Promedio Casos Confirmados") +
scale_x_discrete(limits = c("United States", "China",
"Italy", "Spain", "Germany",
"Iran", "France", "Turkey",
"Portugal", "United Kingdom"),
labels = c("United \n States", "China",
"Italy", "Spain", "Germany",
"Iran", "France", "Turkey",
"Portugal", "United \n Kingdom")) +
geom_text(size = 3.5, aes(label = round(promcasos, 2)), vjust = -0.5)
# Gráfico de los diez países con los mayores promedios de muertes
subpmuertes <- pmuertes[1:10,]
ggplot(data = subpmuertes, aes(x = location, y = prommuertes)) +
geom_bar(stat = "identity", width = 0.5, fill = "limegreen") +
theme_bw() + labs(x = "Países", y = "Promedio muertes") +
scale_x_discrete(limits = c("Italy", "Spain",
"China", "Iran",
"France", "United States",
"United Kingdom", "Turkey",
"Netherlands", "Germany"),
labels = c("Italy", "Spain",
"China", "Iran",
"France", "United \n States",
"United \n Kingdom", "Turkey",
"Netherlands", "Germany")) +
geom_text(size = 3.5, aes(label = round(prommuertes, 2)), vjust = -0.5)
Finalmente, veremos cuáles son los países que hasta el 27 de marzo de 2020 tenían el número total de casos confirmados más alto y el número total de muertes más alto, al igual que los países que tenían el número total de casos confirmados más bajo y el número total de muertes más bajo:
# Para extraer los datos del 27 de marzo de 2020 de todos los países
subdatos <- datos[datos$date == "2020-03-27" & datos$location != "World",]
# Países con el máximo y mínimo total de casos confirmados
subdatos$location[which.max(subdatos$total_cases)]
## [1] "United States"
subdatos$location[which.min(subdatos$total_cases)]
## [1] "Libya"
# Países con el máximo y mínimo total de muertes
subdatos$location[which.max(subdatos$total_deaths)]
## [1] "Italy"
subdatos$location[which.min(subdatos$total_deaths)]
## [1] "Angola"
Como se puede observar, Libia es el país con el número total de casos confirmados más bajo y Angola es el país con el número total de muertes más bajo. Es importante destacar que en realidad hay varios países con el mismo número total de casos confirmados que Libia y varios países con el mismo número total de muertes que Angola, sin embargo, al utilizar este comando vamos a obtener el primer país de la lista que tenga estos valores y como la base de datos está ordenada según el orden alfabético de los países, los primeros países con los valores mínimos de casos confirmados y de muertes son Libia y Angola respectivamente.
Para saber cuáles países al igual que Libia y Angola tienen el número total de casos confirmados más bajo y el número total de muertes más bajo, utilizamos el siguiente comando:
subdatos$location[which(subdatos$total_cases == 1)]
## [1] "Libya" "Papua New Guinea"
## [3] "Saint Vincent and the Grenadines" "Timor"
subdatos$location[which(subdatos$total_deaths == 0)]
## [1] "Angola" "Anguilla"
## [3] "Antigua and Barbuda" "Aruba"
## [5] "Bahamas" "Barbados"
## [7] "Belarus" "Belize"
## [9] "Benin" "Bermuda"
## [11] "Bhutan" "Bolivia"
## [13] "British Virgin Islands" "Brunei"
## [15] "Cambodia" "Central African Republic"
## [17] "Chad" "Congo"
## [19] "Cote d'Ivoire" "Djibouti"
## [21] "Dominica" "El Salvador"
## [23] "Equatorial Guinea" "Eritrea"
## [25] "Ethiopia" "Faeroe Islands"
## [27] "Fiji" "French Polynesia"
## [29] "Georgia" "Gibraltar"
## [31] "Greenland" "Grenada"
## [33] "Guernsey" "Guinea"
## [35] "Guinea-Bissau" "Haiti"
## [37] "Isle of Man" "Jordan"
## [39] "Kazakhstan" "Kuwait"
## [41] "Kyrgyzstan" "Laos"
## [43] "Latvia" "Liberia"
## [45] "Libya" "Liechtenstein"
## [47] "Madagascar" "Maldives"
## [49] "Mali" "Malta"
## [51] "Mauritania" "Monaco"
## [53] "Mongolia" "Montserrat"
## [55] "Mozambique" "Myanmar"
## [57] "Namibia" "Nepal"
## [59] "New Caledonia" "New Zealand"
## [61] "Nicaragua" "Oman"
## [63] "Papua New Guinea" "Qatar"
## [65] "Rwanda" "Saint Kitts and Nevis"
## [67] "Saint Lucia" "Saint Vincent and the Grenadines"
## [69] "Senegal" "Seychelles"
## [71] "Sint Maarten (Dutch part)" "Slovakia"
## [73] "Somalia" "Sri Lanka"
## [75] "Suriname" "Swaziland"
## [77] "Syria" "Tanzania"
## [79] "Timor" "Togo"
## [81] "Turks and Caicos Islands" "Uganda"
## [83] "United States Virgin Islands" "Uruguay"
## [85] "Uzbekistan" "Vatican"
## [87] "Vietnam" "Zambia"
Como Estados Unidos es el país con el número total de casos confirmados más alto, podríamos estar interesados en construir gráficas similares a las presentadas en la sección anterior pero sólo con los datos correspondientes a este país. Antes de construir las gráficas, es necesario extraer los datos de Estados Unidos utilizando el siguiente comando:
estadosunidos <- datos[datos$location == "United States",]
Para construir las gráficas utilizamos el mismo código de la sección anterior, modificando el nombre de la base de datos por estadosunidos. En este caso, organizaremos las cuatro gráficas con ayuda del paquete gridExtra y el comando grid.arrange(plot1, plot2, plot3, plot4, ncol = 2, nrow = 2), donde plot1, plot2, plot3, plot4 corresponden al nombre dado a cada una de las gráficas.
Es importante destacar que estas gráficas se pueden construir para el país que desees extrayendo de la base de datos original los datos del país de interés y utilizando estos datos para construir las gráficas.