Fuente de datos (CSV):Aquí
La Universidad John Hopkins recopila datos acerca del virus SARS-COV-2, y consolida en el enlace a la fuente de datos en formato CSV, los casos confirmados de su enfermedad, el COVID-19, alrededor del mundo.
A partir de este conjunto de datos, desarrollar un proceso ETL para la limpieza y la preparación de los datos que contemple:
• Cargar los datos en un dataframe.
url <- "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv"
covid_data <- read.csv(url)
covid_data<-data.frame(covid_data)
# visualizar un fragmeto de la base
covid_data[c(1:6),c(1:10)]
## Province.State Country.Region Lat Long X1.22.20 X1.23.20 X1.24.20
## 1 Afghanistan 33.93911 67.70995 0 0 0
## 2 Albania 41.15330 20.16830 0 0 0
## 3 Algeria 28.03390 1.65960 0 0 0
## 4 Andorra 42.50630 1.52180 0 0 0
## 5 Angola -11.20270 17.87390 0 0 0
## 6 Antarctica -71.94990 23.34700 0 0 0
## X1.25.20 X1.26.20 X1.27.20
## 1 0 0 0
## 2 0 0 0
## 3 0 0 0
## 4 0 0 0
## 5 0 0 0
## 6 0 0 0
• Recomponer la estructura del dataframe, así:
Utilizo la función gather para convertir el dataframe ancho en uno largo
covid_data <- gather(covid_data, key = Date, value = Confirmed, -Province.State, -Country.Region, -Lat, -Long)
head(covid_data)
## Province.State Country.Region Lat Long Date Confirmed
## 1 Afghanistan 33.93911 67.70995 X1.22.20 0
## 2 Albania 41.15330 20.16830 X1.22.20 0
## 3 Algeria 28.03390 1.65960 X1.22.20 0
## 4 Andorra 42.50630 1.52180 X1.22.20 0
## 5 Angola -11.20270 17.87390 X1.22.20 0
## 6 Antarctica -71.94990 23.34700 X1.22.20 0
• Validar la completitud de los datos y descartar columnas con más del 50% de valores nulos, así como las columnas no relevantes ([Lat] y [Long]).
# Validar la completitud de los datos
completitud <- apply(is.na(covid_data), 2, sum)
completitud_porcentaje <- completitud / nrow(covid_data) * 100
completitud_porcentaje
## Province.State Country.Region Lat Long Date
## 0.0000000 0.0000000 0.6920415 0.6920415 0.0000000
## Confirmed
## 0.0000000
# Descartar columnas con más del 50% de valores nulos y las columnas no relevantes
covid_data_limpio <- covid_data %>%
select(-Lat, -Long) %>%
select_if(~sum(!is.na(.)) / nrow(covid_data) > 0.5)
# Verificar que se hayan eliminado las columnas no relevantes y las columnas con muchos valores nulos
names(covid_data_limpio)
## [1] "Province.State" "Country.Region" "Date" "Confirmed"
head(covid_data_limpio)
## Province.State Country.Region Date Confirmed
## 1 Afghanistan X1.22.20 0
## 2 Albania X1.22.20 0
## 3 Algeria X1.22.20 0
## 4 Andorra X1.22.20 0
## 5 Angola X1.22.20 0
## 6 Antarctica X1.22.20 0
• Modificar el formato de la columna tipo fecha [Date], así: yyyy-mm-dd
# Eliminar la letra "X" del texto de la fecha
covid_data_limpio$Date <- gsub("X", "", covid_data_limpio$Date)
# Convertir la cadena de texto a formato fecha
covid_data_limpio$Date <- as.Date(covid_data_limpio$Date, format = "%m.%d.%y")
# Modificar el formato de la fecha a %Y-%m-%d
covid_data_limpio$Date <- format(covid_data_limpio$Date, "%Y-%m-%d")
# Imprimir la fecha modificada
head(covid_data_limpio)
## Province.State Country.Region Date Confirmed
## 1 Afghanistan 2020-01-22 0
## 2 Albania 2020-01-22 0
## 3 Algeria 2020-01-22 0
## 4 Andorra 2020-01-22 0
## 5 Angola 2020-01-22 0
## 6 Antarctica 2020-01-22 0
• Agregar columnas con nuevos datos. A partir de la columna [Date], crear las columnas [Month] y [Year].
# Agregar columnas con el mes y el año
covid_data_limpio$Month <- month(covid_data_limpio$Date)
covid_data_limpio$Year <- year(covid_data_limpio$Date)
# Imprimir el dataframe modificado
head(covid_data_limpio)
## Province.State Country.Region Date Confirmed Month Year
## 1 Afghanistan 2020-01-22 0 1 2020
## 2 Albania 2020-01-22 0 1 2020
## 3 Algeria 2020-01-22 0 1 2020
## 4 Andorra 2020-01-22 0 1 2020
## 5 Angola 2020-01-22 0 1 2020
## 6 Antarctica 2020-01-22 0 1 2020
• Realizar ordenamiento descendente del dataframe por país [Country/Region] y fecha [Date].
# Ordenar el dataframe por país [Country/Region] y fecha [Date] en orden descendente
covid_data_limpio <- arrange(covid_data_limpio, desc(Country.Region), desc(Date))
# Imprimir el dataframe
head(covid_data_limpio)
## Province.State Country.Region Date Confirmed Month Year
## 1 Zimbabwe 2023-03-09 264276 3 2023
## 2 Zimbabwe 2023-03-08 264276 3 2023
## 3 Zimbabwe 2023-03-07 264127 3 2023
## 4 Zimbabwe 2023-03-06 264127 3 2023
## 5 Zimbabwe 2023-03-05 264127 3 2023
## 6 Zimbabwe 2023-03-04 264127 3 2023
• Mostrar dataframe resultante.
datatable(covid_data_limpio, options = list(server = TRUE))