2. Minería de datos.

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))