R: Limpieza de un dataset con dplyr

R: Limpieza de un dataset con dplyr

Me pasan este dataset el cual he limpiado previamente, incluyendo las fechas, lo cual trataré en otro notebook Con los datos limpios, el objetivo es ir retocando los datos que siguen siendo erróneos o de bajo interes

Cargo la librería dplyr
library(dplyr)
Leo el arhivo csv y lo guardo en un dataframe
actividad <- read.csv('actividad.csv')

# Selecciono las columnas que me interesan 
act_data <- actividad %>% select(h, Dia, Mes, Year, Distancia, Calorias, 
                                 Tiempo, FCMedia, Longitud.media.de.zancada, Ascenso.total, Velocidad.media.kmh)

# Renombro para acortar nombres
act_data <- rename(act_data, 
                   Zancada = Longitud.media.de.zancada,
                   Velocidad = Velocidad.media.kmh,
                   Ascenso = Ascenso.total,
                   Hora = h)
Obtengo información importante sobre los datos
str(act_data)
## 'data.frame':    534 obs. of  11 variables:
##  $ Hora     : int  10 19 10 21 20 14 14 13 11 14 ...
##  $ Dia      : int  18 22 24 26 31 35 40 43 46 48 ...
##  $ Mes      : int  1 1 1 1 1 2 2 2 2 2 ...
##  $ Year     : int  2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 ...
##  $ Distancia: num  6.48 5.01 5.16 5.06 5.09 ...
##  $ Calorias : num  554 409 409 397 390 NA 415 398 811 418 ...
##  $ Tiempo   : num  50.6 35.9 34.7 34.8 31.4 ...
##  $ FCMedia  : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ Zancada  : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Ascenso  : chr  "37" "37" "40" "35" ...
##  $ Velocidad: num  7.68 8.37 8.91 8.72 9.72 8.82 9.85 9.43 8.53 9.24 ...
kable(summary(act_data))
Hora Dia Mes Year Distancia Calorias Tiempo FCMedia Zancada Ascenso Velocidad
Min. : 4.00 Min. : 2.0 Min. : 1.000 Min. :2015 Min. : 0.530 Min. : 1.004 Min. : 3.35 Min. : 26.0 Min. :0.0000 Length:534 Min. : 2.610
1st Qu.: 9.00 1st Qu.:107.2 1st Qu.: 4.000 1st Qu.:2016 1st Qu.: 5.192 1st Qu.:347.250 1st Qu.: 31.92 1st Qu.:138.0 1st Qu.:0.0000 Class :character 1st Qu.: 9.582
Median :10.00 Median :201.5 Median : 7.000 Median :2018 Median : 7.010 Median :432.000 Median : 40.13 Median :147.0 Median :0.9400 Mode :character Median :10.360
Mean :11.72 Mean :189.3 Mean : 6.747 Mean :2018 Mean : 6.837 Mean :432.852 Mean : 40.48 Mean :144.9 Mean :0.6611 NA Mean :10.264
3rd Qu.:15.00 3rd Qu.:271.0 3rd Qu.: 9.000 3rd Qu.:2020 3rd Qu.: 8.030 3rd Qu.:516.750 3rd Qu.: 46.70 3rd Qu.:154.0 3rd Qu.:1.0400 NA 3rd Qu.:10.960
Max. :21.00 Max. :364.0 Max. :12.000 Max. :2021 Max. :21.350 Max. :967.000 Max. :174.25 Max. :186.0 Max. :1.3000 NA Max. :13.770
NA NA NA NA NA NA’s :4 NA NA’s :57 NA NA NA
Con esta información vamos a realizar diferentes tareas para mejorar nuestro dataset
# Elimino las que tienen FCMedia menos de 100, las cuales no me interesan
act_data <- act_data %>% filter(FCMedia> 100)

# Quito alguna actividad que se ha colado de senderismo
act_data <- act_data %>% filter(Velocidad > 6)

# Paso a numérica la columna de Ascenso
act_data$Ascenso <- as.double(act_data$Ascenso)

# Hay 3 registro sin ascenso, las cuales paso a 0, llano absoluto 
act_data <- act_data %>% mutate(Ascenso = ifelse(!is.na(Ascenso), Ascenso, 0))

# Me quedo con las carreras del al menos 1 Km
act_data <- act_data %>% filter(Distancia >= 1)


# Elimino las 4 lineas con NA de Calorias
act_data <- act_data %>% filter(!is.na(Calorias))

# Multiplico por 1000 los registros de Calorias menores de 2, ya que es un error del volcado de la app
act_data %>% filter(Calorias < 2)
act_data <- act_data %>% mutate(Calorias = ifelse(Calorias > 2 , Calorias, Calorias*1000))

#Hasta el momento
kable(summary(act_data))
Hora Dia Mes Year Distancia Calorias Tiempo FCMedia Zancada Ascenso Velocidad
Min. : 5.0 Min. : 2.0 Min. : 1.000 Min. :2015 Min. : 1.01 Min. : 48.0 Min. : 4.53 Min. :105.0 Min. :0.0000 Min. : 0.00 Min. : 7.30
1st Qu.: 9.0 1st Qu.:112.0 1st Qu.: 4.000 1st Qu.:2017 1st Qu.: 5.63 1st Qu.: 349.5 1st Qu.: 32.87 1st Qu.:140.0 1st Qu.:0.0000 1st Qu.: 42.00 1st Qu.: 9.74
Median :10.0 Median :212.0 Median : 7.000 Median :2018 Median : 7.02 Median : 445.0 Median : 40.57 Median :147.0 Median :0.9700 Median : 60.00 Median :10.44
Mean :11.6 Mean :196.6 Mean : 6.989 Mean :2018 Mean : 7.07 Mean : 447.3 Mean : 40.91 Mean :146.4 Mean :0.7505 Mean : 65.98 Mean :10.42
3rd Qu.:15.0 3rd Qu.:278.0 3rd Qu.:10.000 3rd Qu.:2020 3rd Qu.: 8.05 3rd Qu.: 528.5 3rd Qu.: 47.31 3rd Qu.:154.0 3rd Qu.:1.0600 3rd Qu.: 87.00 3rd Qu.:11.03
Max. :21.0 Max. :364.0 Max. :12.000 Max. :2021 Max. :21.35 Max. :1252.0 Max. :119.83 Max. :186.0 Max. :1.3000 Max. :301.00 Max. :13.77
Voy a utilizar un análisis de regresión múltiple para dar valor a la FCMedia donde falta. Para ver en detalle el caso de estudio, ver el notebook https://rpubs.com/cperaltap/regresion_lineal_multiple
# Me quedo temporalmente con las filas que la FCMedia no es nula
act_data_wo_na <- act_data %>% filter(!is.na(FCMedia))

# Tras pruebas y valorando el p-value que me dan distintos modelos se puede valorar, 
# me quedo con Distancia, Calorias y velocidad media como significativas
lm_act_data_wo_na <- lm(data = act_data_wo_na, FCMedia~Distancia+Velocidad+Calorias)

# Por lo que puedo calcular la FCMedia con los valores de la variable independiente
# y las que me aportan la distancia y la velocidad media:

coef_fc <- summary(lm_act_data_wo_na)$coefficients

act_data <- act_data %>% 
  mutate(FCMedia = ifelse(!is.na(FCMedia), FCMedia, coef_fc[1,1] + 
                            coef_fc[2,1]*Distancia + 
                            coef_fc[3,1]*Velocidad))
Realizo ahora lo mismo para la Longitud de zancada, quedándome con Distancia, Velocidad y Calorias como variables relevantes
act_data_wo_0 <- act_data %>% filter(Zancada > 0)
lm_act_data_wo_0 <- lm(data= act_data_wo_0, Zancada~Distancia+Velocidad+Calorias)
coef_lon <- summary(lm_act_data_wo_0)$coefficients

act_data <- act_data %>%
  mutate(Zancada = ifelse(Zancada != 0, Zancada, coef_lon[1,1]+
                                              coef_lon[2,1]*Distancia+
                                              coef_lon[3,1]*Velocidad+
                                              coef_lon[4,1]*Calorias))

El resumen final del dataset limpio es el siguiente:

# Las dimensiones del dataset (registros x columnas)
dim(act_data)
## [1] 463  11
# El resumen estadístico del dataset
kable(summary(act_data))
Hora Dia Mes Year Distancia Calorias Tiempo FCMedia Zancada Ascenso Velocidad
Min. : 5.0 Min. : 2.0 Min. : 1.000 Min. :2015 Min. : 1.01 Min. : 48.0 Min. : 4.53 Min. :105.0 Min. :0.7422 Min. : 0.00 Min. : 7.30
1st Qu.: 9.0 1st Qu.:112.0 1st Qu.: 4.000 1st Qu.:2017 1st Qu.: 5.63 1st Qu.: 349.5 1st Qu.: 32.87 1st Qu.:140.0 1st Qu.:0.9546 1st Qu.: 42.00 1st Qu.: 9.74
Median :10.0 Median :212.0 Median : 7.000 Median :2018 Median : 7.02 Median : 445.0 Median : 40.57 Median :147.0 Median :1.0200 Median : 60.00 Median :10.44
Mean :11.6 Mean :196.6 Mean : 6.989 Mean :2018 Mean : 7.07 Mean : 447.3 Mean : 40.91 Mean :146.4 Mean :1.0226 Mean : 65.98 Mean :10.42
3rd Qu.:15.0 3rd Qu.:278.0 3rd Qu.:10.000 3rd Qu.:2020 3rd Qu.: 8.05 3rd Qu.: 528.5 3rd Qu.: 47.31 3rd Qu.:154.0 3rd Qu.:1.0800 3rd Qu.: 87.00 3rd Qu.:11.03
Max. :21.0 Max. :364.0 Max. :12.000 Max. :2021 Max. :21.35 Max. :1252.0 Max. :119.83 Max. :186.0 Max. :1.3586 Max. :301.00 Max. :13.77

Con una lectura rápida observamos algo de información y todo con sentido para cada variable.

Por comentar algo, hay 463 resgistros en el dataset listo para analizar. Las horas de actividad son entre las 5 y las 21 horas. Hay registros del 2015 al 2021. La máxima distancia es de 21.35 km, lo cual apunta a un medio maratón. La media de la velocidad del atleta es de 10.42 km/h y la frecuencia media de sus pulsaciones en sus sesiones 146 ppm.

Continúa con el análisis descriptivo en el notebook https://rpubs.com/cperaltap/actividad_2_estadistica_descriptiva

También se puede ver un análisis de clasificación Kmeans https://rpubs.com/cperaltap/clasificacion_kmeans_actividades

Entradas relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *