Análisis Exploratorio de Datos (EDA) sobre la pandemia
COVID-19
Brayan David Prieto Aya
2025-09-07
1. Instalación de paquetes
Instalacion de paquetes Necesarios para el analisis y manejo de datos
#Instalación de paquetes
#[Link]("dplyr") # libreria dplyr, que nos ayuda a manipular los datos
#[Link]("readr") # libreria readr, que nos ayuda a imporar y leer el dataset
#[Link] ("tidyverse") #Ayuda con herramientas para trabajar con datos desordenados
#[Link] ("rmarkdown") # rmarkdown, ayuda a crear informes estaticos para el trabajo
#[Link] ("tinytex") #tinytex, para el analisis de datos
#tinytex::install_tinytex() # tinytex para creacion del documento en rmarkdown
#[Link]("tidyr") #para poder convertir las columnas en texto largo
#[Link]("skimr") #generar resúmenes de datos, detallados de manera rápida.
#[Link]("countrycode")
#[Link]("sclae")
# Carga y exploración de datos
library(tidyverse)
## -- Attaching core tidyverse packages ------------------------ tidyverse 2.0.0 --
## v dplyr 1.1.4 v readr 2.1.5
## v forcats 1.0.0 v stringr 1.5.1
## v ggplot2 3.5.2 v tibble 3.3.0
## v lubridate 1.9.4 v tidyr 1.3.1
## v purrr 1.1.0
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
## i Use the conflicted package (<[Link] to force all conflicts to become errors
library(lubridate)
library(skimr)
library(countrycode)
library(scales)
##
## Adjuntando el paquete: ’scales’
1
##
## The following object is masked from ’package:purrr’:
##
## discard
##
## The following object is masked from ’package:readr’:
##
## col_factor
2. Carga y exploración de datos
#Carga de datos, en este caso usamos [Link] y la ruta especifica de nuestro dataset
covid_data <- [Link]("~/TallerEDA/time_series_covid19_confirmed_global.csv")
3. Transformación de los datos
#Transformación de los datos
#Parte 1, pasar de formato largo
covid_long <- covid_data %>%
pivot_longer(
cols = starts_with("X"), # Todas las columnas que empiezan en X (las fechas)
names_to = "Date", # Nueva columna que guardará las fechas
values_to = "ConfirmedCases" # Casos confirmados acumulados
)
#2. Transformamosla columna de fecha al formato correcto
covid_long <- covid_long %>%
mutate(
Date = gsub("X", "", Date), # quitar la X
Date = gsub("\\.", "/", Date), # reemplazar puntos por /
Date = mdy(Date) # convertir a formato fecha (mes/día/año)
)
# 3. Agregamos casos por país y fecha
covid_country <- covid_long %>%
group_by([Link], Date) %>%
summarise(ConfirmedCases = sum(ConfirmedCases, [Link] = TRUE)) %>%
ungroup()
## ‘summarise()‘ has grouped output by ’[Link]’. You can override using
## the ‘.groups‘ argument.
# 4. Creamos columnas de mes y año
covid_country <- covid_country %>%
mutate(
Year = year(Date),
Month = month(Date, label = TRUE, abbr = TRUE) # Mes abreviado (Ene, Feb, etc.)
)
# 5. Verificamos resultado con los dies primeros datos.
head(covid_country, 10)
2
## # A tibble: 10 x 5
## [Link] Date ConfirmedCases Year Month
## <chr> <date> <int> <dbl> <ord>
## 1 Afghanistan 2020-01-22 0 2020 ene
## 2 Afghanistan 2020-01-23 0 2020 ene
## 3 Afghanistan 2020-01-24 0 2020 ene
## 4 Afghanistan 2020-01-25 0 2020 ene
## 5 Afghanistan 2020-01-26 0 2020 ene
## 6 Afghanistan 2020-01-27 0 2020 ene
## 7 Afghanistan 2020-01-28 0 2020 ene
## 8 Afghanistan 2020-01-29 0 2020 ene
## 9 Afghanistan 2020-01-30 0 2020 ene
## 10 Afghanistan 2020-01-31 0 2020 ene
4. Estadísticos descriptivos
media, mediana, varianza y desviación estandar.
Con el fin de entender la distribución general de los casos de COVID-19 entre países, se calcularon medidas
estadísticas descriptivas como la media, mediana, varianza y desviación estándar.
#Calculamos la media, mediana, varianza y la Desviacion estandar
library(tidyverse)
stats_country <- covid_country %>%
group_by([Link])%>%
summarise(
TotalCases = max(ConfirmedCases, [Link] = TRUE)
)%>%
summarise(
Media = comma(mean(TotalCases)),
Mediana = comma(median(TotalCases)),
varianza = comma(var(TotalCases)),
DesvEstandar = comma(sd(TotalCases))
)
stats_country
## # A tibble: 1 x 4
## Media Mediana varianza DesvEstandar
## <chr> <chr> <chr> <chr>
## 1 3,366,048 317,367 102,463,446,298,077 10,122,423
#2. Calculamos la moda (valor mas frecuente o que mas se repite)
getmode <- function(v){
uniqv <- unique(v)
uniqv[[Link](tabulate(match(v,uniqv)))]
}
total_cases <- covid_country %>%
group_by([Link]) %>%
summarise(TotalCases = max(ConfirmedCases, [Link] = TRUE))
moda_total <- getmode(total_cases$TotalCases)
moda_total
## [1] 209451
3
5. Visualización de los datos
Diagrama boxplots
Visualización con diagramas de cajas (boxplots) para mostrar la distribución de contagios acumulados por
continente o región.
#3 Boxplot de contagios acumulados por país
# Crear columna continente para cada país
covid_continent <- covid_country %>%
mutate(Continent = countrycode([Link], # nombre de tu columna
origin = "[Link]",
destination = "continent"))
## Warning: There was 1 warning in ‘mutate()‘.
## i In argument: ‘Continent = countrycode([Link], origin =
## "[Link]", destination = "continent")‘.
## Caused by warning:
## ! Some values were not matched unambiguously: Diamond Princess, Kosovo, Micronesia, MS Zaandam, Summe
#Obtener los casos acumulados por país
cases_continent <- covid_continent %>%
group_by([Link], Continent) %>%
summarise(TotalCases = max(ConfirmedCases, [Link] = TRUE)) %>%
ungroup()
## ‘summarise()‘ has grouped output by ’[Link]’. You can override using
## the ‘.groups‘ argument.
ggplot(cases_continent, aes(x = Continent, y = TotalCases, fill = Continent)) +
geom_boxplot([Link] = "red", [Link] = 1) +
scale_y_log10() + # Escala logarítmica para ver mejor (ya que hay países con valores
labs(title = "Distribución de contagios acumulados por continente",
x = "Continente",
y = "Casos acumulados (log)") +
theme_minimal()
4
Distribución de contagios acumulados por continente
1e+08
Continent
Casos acumulados (log)
Africa
1e+05 Americas
Antarctica
Asia
Europe
Oceania
1e+02 NA
Africa Americas Antarctica Asia Europe Oceania NA
Continente
## Histograma casos confirmados diarios globales
etc etc etc
#4 histograma de casos diarios globales
covid_global <- covid_country %>%
group_by(Date) %>%
summarise(DailyCases = sum(ConfirmedCases)) %>%
arrange(Date) %>%
mutate(NewCases=DailyCases - lag(DailyCases, default = 0))
library(scales)
ggplot(covid_global, aes(x = NewCases)) +
geom_histogram(bins = 50, fill = "steelblue", color = "white") +
scale_x_continuous(labels = comma) + # muestra miles con comas/puntos
labs(title = "Histograma de casos diarios globales",
x = "Casos diarios",
y = "Frecuencia")
5
Histograma de casos diarios globales
120
80
Frecuencia
40
0 1,000,000 2,000,000 3,000,000 4,000,000
Casos diarios
Diagrama de cajas (casos diarios de 2020)
#5 boxplots del total de contagios en un mes "abril 2020"
abril2020 <- covid_country %>%
filter(Year == 2020, Month == "abr")%>%
group_by([Link]) %>%
summarise(TotalCases = max(ConfirmedCases, [Link] = TRUE))
ggplot(abril2020, aes(y = TotalCases)) +
geom_boxplot(fill = "tomato", alpha = 0.7) +
scale_y_log10()+
labs(title = "Distribución de contagios acumulados - Abril 2020" ,
y = "casos acumulados"
)
## Warning in scale_y_log10(): log-10 transformation introduced infinite values.
## Warning: Removed 16 rows containing non-finite outside the scale range
## (‘stat_boxplot()‘).
6
Distribución de contagios acumulados − Abril 2020
1e+05
casos acumulados
1e+03
1e+01
−0.4 −0.2 0.0 0.2 0.4
Interpretación de las graficas
¿Se observa mucha dispersion entre paises? Si La varianza (102,463,446,298,077) y la desviacion estandar
(10,122,423) son muy altas que indican que los valores de contagios entre países están muy dispersos.
En los bloxplots se ve que hay una gran variabilidad de que algunos paises tienen mas casos que los otros
¿Existen países “outliers” con números muy superiores al resto? Si En los boxplots aparecen puntos rojos
(outliers) que corresponden a países con números de contagios extraordinariamente altos frente al resto.
Ejemplo: Estados Unidos, India o Brasil, que concentran gran parte de los casos globales.
¿Qué tan representativa es la media frente a la mediana? poco representativa, la media (3.3millones) y la
mediana (317mil), esto muestra que la distribución esta desviada a la derecha(pocos paises con valores muy
altos inflan la media).
6. Análisis exploratorio
Cual fue el mes que presento el mayor numero de contagios, en este caso los 4 meses
# ¿En cuál mes se presentó el mayor número de contagios?
mes_global <- covid_country %>%
group_by(Year, Month) %>%
summarise(TotalCases = sum(ConfirmedCases, [Link] = TRUE)) %>%
arrange(Year, Month) %>%
mutate(NewCases=TotalCases - lag(TotalCases, default = 0))
7
## ‘summarise()‘ has grouped output by ’Year’. You can override using the
## ‘.groups‘ argument.
#mes con mas contagios
maximo_mes <- mes_global %>%
filter(NewCases == max(NewCases, [Link] = TRUE))
#imprime el valor de los meses con mas contagios reportados
maximo_mes
## # A tibble: 4 x 4
## # Groups: Year [4]
## Year Month TotalCases NewCases
## <dbl> <ord> <dbl> <dbl>
## 1 2020 dic 2297773408 648734578
## 2 2021 ene 2924193988 2924193988
## 3 2022 ene 10275647283 10275647283
## 4 2023 ene 20669212563 20669212563
En esa misma fecha, que pais reporto mas contagios.
#En ese mismo mes, que pais reporto mas contagios
maximo_contagios <- covid_country %>%
group_by([Link], Year, Month) %>%
summarise(TotalCases=max(ConfirmedCases, [Link] = TRUE)) %>%
arrange(Year, Month) %>%
group_by([Link]) %>%
mutate(NewCases = TotalCases - lag(TotalCases, default = 0)) %>%
ungroup()
## ‘summarise()‘ has grouped output by ’[Link]’, ’Year’. You can override
## using the ‘.groups‘ argument.
#Filtrar el mas con mas casos
maximo_region <- maximo_contagios %>%
filter(Year == maximo_mes$Year, Month == maximo_mes$Month) %>%
arrange(desc(NewCases)) %>%
slice(1)
## Warning: There were 3 warnings in ‘filter()‘.
## The first warning was:
## i In argument: ‘Year == maximo_mes$Year‘.
## Caused by warning in ‘Year == maximo_mes$Year‘:
## ! longitud de objeto mayor no es múltiplo de la longitud de uno menor
## i Run ‘dplyr::last_dplyr_warnings()‘ to see the 2 remaining warnings.
#imprimir la region con mas contagios segun el mes
maximo_region
## # A tibble: 1 x 5
## [Link] Year Month TotalCases NewCases
## <chr> <dbl> <ord> <int> <int>
## 1 US 2022 ene 75244152 20336435
8
Grafica del pais que reporto mas contagios en ese mes
ggplot(maximo_region, aes(x= interactive(Year, Month), y = NewCases)) +
aes(x = reorder([Link], - NewCases), y = NewCases)+
geom_col(fill = "tomato") +
labs(tittle = paste("Casos nuevos", maximo_mes$Month, maximo_mes$Year),
x = "pais", y = "casos nuevos")+
scale_y_continuous(labels = comma) +
theme([Link].x = element_text(angle=90, hjust=1))
20,000,000
15,000,000
casos nuevos
10,000,000
5,000,000
0
US
pais
Cual es el pais que menos reporto contagios en esa fecha
menor_country <- covid_country %>%
group_by([Link]) %>%
summarise(TotalCases = max(ConfirmedCases, [Link] = TRUE)) %>%
filter(TotalCases > 0) %>%
arrange(TotalCases) %>%
slice(1)
menor_country
## # A tibble: 1 x 2
## [Link] TotalCases
## <chr> <int>
## 1 Korea, North 1
9
7. Visualización Grafica
gráfica que muestra la variación de contagios, mes a mes, de los tres países con más casos reportados.
#identifica los 3 paises con mas contagios
top3_country <- covid_country %>%
group_by([Link]) %>%
summarise(TotalCases = max(ConfirmedCases, [Link] = TRUE)) %>%
arrange(desc(TotalCases)) %>%
slice(1:3) %>%
pull([Link])
top3_country
## [1] "US" "India" "France"
#2. Calcular casos nuevos mensual para esos países
covid_top3_country <- covid_country %>%
group_by([Link], Year, Month) %>%
summarise(MaxCases = max(ConfirmedCases, [Link] = TRUE)) %>%
arrange([Link], Year, Month) %>%
group_by([Link]) %>%
mutate(NewCases = MaxCases - lag(MaxCases, default = 0)) %>%
filter([Link] %in% top3_country)
## ‘summarise()‘ has grouped output by ’[Link]’, ’Year’. You can override
## using the ‘.groups‘ argument.
covid_top3_country
## # A tibble: 117 x 5
## # Groups: [Link] [3]
## [Link] Year Month MaxCases NewCases
## <chr> <dbl> <ord> <int> <int>
## 1 France 2020 ene 5 5
## 2 France 2020 feb 100 95
## 3 France 2020 mar 52281 52181
## 4 France 2020 abr 169098 116817
## 5 France 2020 may 190975 21877
## 6 France 2020 jun 204244 13269
## 7 France 2020 jul 227239 22995
## 8 France 2020 ago 321160 93921
## 9 France 2020 sept 605893 284733
## 10 France 2020 oct 1414396 808503
## # i 107 more rows
Grafica que nos muestra los contagios de mes a mes de esos 3 paises
ggplot(covid_top3_country, aes(x = interaction(Year, Month), y = NewCases,
color = [Link], group = [Link]))+
geom_line(size = 1)+
geom_point()+
10
scale_y_continuous(labels = comma) +
labs(title="Variacion de contagios mes a mes (top 3 paises)",
x = "Año-Mes", y = "Casos nuevos",
color = "pais")+
theme([Link] = element_text(angle=90, hjust=1))
## Warning: Using ‘size‘ aesthetic for lines was deprecated in ggplot2 3.4.0.
## i Please use ‘linewidth‘ instead.
## This warning is displayed once every 8 hours.
## Call ‘lifecycle::last_lifecycle_warnings()‘ to see where this warning was
## generated.
Variacion de contagios mes a mes (top 3 paises)
5,000,000 10,000,000 15,000,000 20,000,000
Casos nuevos
pais
France
India
US
0
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
Año−Mes
comparación del total de contagios de cinco países
#5 paises que queremos analizar
paises_5 <- c("US", "India", "Brazil", "France", "Colombia")
# Calcular el total acumulado de contagios para esos países
top_5 <- covid_country %>%
filter([Link] %in% paises_5) %>%
group_by([Link]) %>%
summarise(TotalCases = max(ConfirmedCases, [Link] = TRUE)) %>%
11
arrange(desc(TotalCases))
top_5
## # A tibble: 5 x 2
## [Link] TotalCases
## <chr> <int>
## 1 US 103802702
## 2 India 44690738
## 3 France 39866718
## 4 Brazil 37081209
## 5 Colombia 6359093
# Grafica comparativa de los 5 paises analizados
ggplot(top_5, aes(x = reorder([Link], TotalCases), y = TotalCases,
geom_col(alpha = 0.8) +
coord_flip() + # barras horizontales para mejor lectura
scale_y_continuous(labels = scales::comma) +
labs(title = "Comparacion del total de contagios acumulados en 5 paises",
x = "Pais", y = "Total de casos acumulados") +
theme_minimal()
Comparacion del total de contagios acumulados en 5 paises
US
India
[Link]
Brazil
Colombia
Pais
France
France
India
US
Brazil
Colombia
0 25,000,000 50,000,000 75,000,000 100,000,000
Total de casos acumulados
Gráfica que muestra el porcentaje de contagios de cada país con respecto al total de contagios en el mundo
# Total mundial correcto = suma de todos los países en la última fecha
total_mundial <- covid_country %>%
12
group_by(Date) %>%
summarise(TotalMundo = sum(ConfirmedCases, [Link] = TRUE)) %>%
arrange(desc(Date)) %>%
slice(1) %>%
pull(TotalMundo)
# Total de tus 5 países
top_5 <- covid_country %>%
filter([Link] %in% paises_5) %>%
group_by([Link]) %>%
summarise(TotalCases = max(ConfirmedCases, [Link] = TRUE))
# Calcular otros países
otros <- total_mundial - sum(top_5$TotalCases)
otros_df <- [Link]([Link] = "Otros países",
TotalCases = otros)
# Unir
top_5_ext <- bind_rows(top_5, otros_df) %>%
mutate(Porcentaje = (TotalCases / total_mundial) * 100)
# Gráfica comparativa
ggplot(top_5_ext, aes(x = reorder([Link], -Porcentaje),
y = Porcentaje, fill = [Link])) +
geom_col(alpha = 0.8) +
labs(title = "Porcentaje de contagios de 5 países + resto del mundo",
x = "Países", y = "% de contagios") +
theme_minimal()
13
Porcentaje de contagios de 5 países + resto del mundo
60
[Link]
Brazil
% de contagios
40
Colombia
France
India
Otros países
20 US
Otros países US India France Brazil Colombia
Países
8. Reflexion
El análisis de los datos globales de infección por COVID-19 ha identificado tendencias clave en la evolución de
la pandemia. El intercambio de datos, las observaciones y las estadísticas descriptivas revelaron diferencias
significativas entre países, y algunos, como Estados Unidos, India y Brasil, reportaron un alto número de
casos.
El proceso de análisis reveló no solo la necesidad de comprender los datos, sino también de utilizar her-
ramientas como tidyverse, ggplot2 y countrycode para transformar los datos brutos en información valiosa.
Las observaciones mensuales de los tres países y las comparaciones regionales demostraron claramente las
tendencias estacionales y nacionales del virus.
14