0% encontró este documento útil (0 votos)
7 vistas14 páginas

EDA de COVID-19: Análisis y Visualización

Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
7 vistas14 páginas

EDA de COVID-19: Análisis y Visualización

Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

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

También podría gustarte