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
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
## '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 ...
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:
## [1] 463 11
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.