Garmin Vector 3 Dual Sensing & Favero Assioma Duo
Predictor: Time, Cadence, Power Output, Heart Rate and Speed.
In a specific way: The usage of the method can also be implemented into another workout or activity such as Golf or Boxing (To measure the power of the swing or the impact, usually with wearing a smartwatch)
Traffic Condition
Weather (Rain, Wind speed and the angle of attack)
Road Condition (Rolling resistance, Surface condition)
Cyclist are in good shape (Proper nutrition, no sleep deprivation)
No body injury
Proper fitted bike
No broken/ worn bicycle components
Constant elevation (Jakarta)
Cyclist position (Time Trialist are usually in a aero position all the time and not allowed to drafting)
Legend
## timer.s timer.min timestamp delta.t lat
## 0 0 0 0 0
## lon distance.km speed.kmh elevation.m delta.elev
## 0 0 0 0 0
## VAM power.W power.smooth.W work.kJ Wexp.kJ
## 0 0 0 0 5680
## cadence.rpm hr.bpm lap
## 0 0 0
## Rows: 5,680
## Columns: 18
## $ timer.s <int> 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, …
## $ timer.min <dbl> 0.00000000, 0.01666667, 0.03333333, 0.05000000, 0.0666…
## $ timestamp <dttm> 2020-06-13 23:24:58, 2020-06-13 23:24:59, 2020-06-13 …
## $ delta.t <dbl> 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
## $ lat <dbl> -6.197816, -6.197863, -6.197918, -6.197969, -6.198023,…
## $ lon <dbl> 106.7691, 106.7691, 106.7691, 106.7691, 106.7691, 106.…
## $ distance.km <dbl> 0.00000, 0.00517, 0.01127, 0.01692, 0.02284, 0.02891, …
## $ speed.kmh <dbl> 17.0316, 18.9792, 19.5156, 20.8944, 21.2616, 21.8016, …
## $ elevation.m <dbl> 28.4, 28.2, 28.6, 28.8, 29.0, 28.8, 28.8, 28.8, 28.8, …
## $ delta.elev <dbl> 0.0, -0.2, 0.4, 0.2, 0.2, -0.2, 0.0, 0.0, 0.0, 0.0, 0.…
## $ VAM <dbl> 0.00000000, 0.00000000, 0.20000000, 0.06666667, 0.0500…
## $ power.W <int> 183, 181, 238, 188, 190, 190, 157, 162, 155, 148, 126,…
## $ power.smooth.W <dbl> 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, …
## $ work.kJ <dbl> 0.000, 0.181, 0.419, 0.607, 0.797, 0.987, 1.144, 1.306…
## $ Wexp.kJ <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ cadence.rpm <int> 59, 63, 66, 69, 69, 72, 72, 73, 76, 79, 79, 84, 84, 87…
## $ hr.bpm <int> 130, 130, 130, 129, 129, 127, 128, 128, 127, 128, 129,…
## $ lap <ord> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
As we can see, some of the data type are still inappropiate and there is some unuse column, lets try to fix it.
#We need to extract timestamp into local time and ignore the date as it happened in a day (A session)
cyclist$hourmin <- hms::as.hms(cyclist$timestamp)## Warning: as.hms() is deprecated, please use as_hms().
## This warning is displayed once per session.
cyclist <- cyclist %>%
select(c(speed.kmh, power.W, cadence.rpm, hr.bpm, hourmin, date ))
head(cyclist)Now we have a proper dataset and ready to be explored.
Visual Of Power Output, Speed, Heart Rate and Cadence over Time plotly prep
#for interactive text
cyclist <- cyclist %>%
mutate(text = paste(hourmin, power.W, "Watts")) %>%
mutate(textspeed = paste(hourmin, round(speed.kmh,1), "km/h")) %>%
mutate(texthr = paste(hourmin, "with", hr.bpm, "bpm")) %>%
mutate(textcad = paste(hourmin, "with", cadence.rpm, "rpm"))plot_power <- ggplot(cyclist, aes(hourmin, power.W, text = text))+
geom_col(aes(fill=power.W))+
labs(x = "Time (Hour and Minutes)", y= "Power Output", title = "Power Output by Time")+
scale_x_time(limits = c(23000,26000)) + #i dont know how this works, i am only guessing
theme(legend.position = "none")
ggplotly(plot_power, tooltip = "text") %>%
config(displayModeBar = F)## Warning: Removed 2805 rows containing missing values (position_stack).
From the shown graph above, we can see that there is a spark of 742 watts shown, but it can’t be assume that the cyclist can produce such a constant power over time.
plot_speed <- ggplot(cyclist, aes(hourmin, speed.kmh, text = textspeed)) +
geom_col(aes(fill = speed.kmh))+
labs(x="Time (Hour and Minutes)", y = "Speed(kmh)", title = "Speed by Time")+
scale_x_time(limits = c(23000,26000)) +
theme(legend.position = "none")
ggplotly(plot_speed, tooltip = "textspeed") %>%
config(displayModeBar = F)## Warning: Removed 2805 rows containing missing values (position_stack).
plot_hr <- ggplot(cyclist, aes(hourmin, hr.bpm, text = texthr)) +
geom_col(aes(fill = hr.bpm))+
labs(x="Time (Hour and Minutes)", y = "Heart Rate (BPM)", title = "Heart Rate Beat by Time")+
scale_x_time(limits = c(23000,26000)) +
scale_fill_gradient(low = "green", high = "red")+
theme(legend.position = "none")
ggplotly(plot_hr, tooltip = "texthr") %>%
config(displayModeBar = F)## Warning: Removed 2805 rows containing missing values (position_stack).
In cycling, we divide our heart rate beat into 6 zones. From that, we can determine what kind of energy that we use, aerobic or anaerobic zone.
In simple way, the higher your heart beats, the faster your body needs energy, the easiest way the body to get the energy is from blood glucose (consists of carbohydrates, nutrition and other substances). If we are on an aerobic activity (low level of zones, let say 1-2) body will mostly use fat and some protein as energy. To determine all 6 zones of HR, we need to tailored it by our resting heart rate and maximum heart rate.
for reference: https://www.bikeradar.com/advice/fitness-and-training/heart-rate-monitor-training-for-cyclists/#
plot_cadence <- ggplot(cyclist, aes(hourmin, cadence.rpm, text = textcad)) +
geom_col(aes(fill = cadence.rpm))+
labs(x="Time (Hour and Minutes)", y = "Cadence (BPM)", title = "Cadence by Time")+
scale_x_time(limits = c(23000,26000)) +
theme(legend.position = "none")
ggplotly(plot_cadence, tooltip = "textcad") %>%
config(displayModeBar = F)## Warning: Removed 2805 rows containing missing values (position_stack).
## Warning in ggcorr(cyclist): data in column(s) 'hourmin', 'date', 'text',
## 'textspeed', 'texthr', 'textcad' are not numeric and were ignored
From the correlation graph above, we can see that there is a high correlation between power.W and cadence.rpm