Data

data<- read.csv("gym_members_exercise_tracking.csv")
str(data)
## 'data.frame':    973 obs. of  15 variables:
##  $ Age                          : int  56 46 32 25 38 56 36 40 28 28 ...
##  $ Gender                       : chr  "Male" "Female" "Female" "Male" ...
##  $ Weight..kg.                  : num  88.3 74.9 68.1 53.2 46.1 ...
##  $ Height..m.                   : num  1.71 1.53 1.66 1.7 1.79 1.68 1.72 1.51 1.94 1.84 ...
##  $ Max_BPM                      : int  180 179 167 190 188 168 174 189 185 169 ...
##  $ Avg_BPM                      : int  157 151 122 164 158 156 169 141 127 136 ...
##  $ Resting_BPM                  : int  60 66 54 56 68 74 73 64 52 64 ...
##  $ Session_Duration..hours.     : num  1.69 1.3 1.11 0.59 0.64 1.59 1.49 1.27 1.03 1.08 ...
##  $ Calories_Burned              : num  1313 883 677 532 556 ...
##  $ Workout_Type                 : chr  "Yoga" "HIIT" "Cardio" "Strength" ...
##  $ Fat_Percentage               : num  12.6 33.9 33.4 28.8 29.2 15.5 21.3 30.6 28.9 29.7 ...
##  $ Water_Intake..liters.        : num  3.5 2.1 2.3 2.1 2.8 2.7 2.3 1.9 2.6 2.7 ...
##  $ Workout_Frequency..days.week.: int  4 4 4 3 3 5 3 3 4 3 ...
##  $ Experience_Level             : int  3 2 2 1 1 3 2 2 2 1 ...
##  $ BMI                          : num  30.2 32 24.7 18.4 14.4 ...
summary(data)
##       Age           Gender           Weight..kg.       Height..m.   
##  Min.   :18.00   Length:973         Min.   : 40.00   Min.   :1.500  
##  1st Qu.:28.00   Class :character   1st Qu.: 58.10   1st Qu.:1.620  
##  Median :40.00   Mode  :character   Median : 70.00   Median :1.710  
##  Mean   :38.68                      Mean   : 73.85   Mean   :1.723  
##  3rd Qu.:49.00                      3rd Qu.: 86.00   3rd Qu.:1.800  
##  Max.   :59.00                      Max.   :129.90   Max.   :2.000  
##     Max_BPM         Avg_BPM       Resting_BPM    Session_Duration..hours.
##  Min.   :160.0   Min.   :120.0   Min.   :50.00   Min.   :0.500           
##  1st Qu.:170.0   1st Qu.:131.0   1st Qu.:56.00   1st Qu.:1.040           
##  Median :180.0   Median :143.0   Median :62.00   Median :1.260           
##  Mean   :179.9   Mean   :143.8   Mean   :62.22   Mean   :1.256           
##  3rd Qu.:190.0   3rd Qu.:156.0   3rd Qu.:68.00   3rd Qu.:1.460           
##  Max.   :199.0   Max.   :169.0   Max.   :74.00   Max.   :2.000           
##  Calories_Burned  Workout_Type       Fat_Percentage  Water_Intake..liters.
##  Min.   : 303.0   Length:973         Min.   :10.00   Min.   :1.500        
##  1st Qu.: 720.0   Class :character   1st Qu.:21.30   1st Qu.:2.200        
##  Median : 893.0   Mode  :character   Median :26.20   Median :2.600        
##  Mean   : 905.4                      Mean   :24.98   Mean   :2.627        
##  3rd Qu.:1076.0                      3rd Qu.:29.30   3rd Qu.:3.100        
##  Max.   :1783.0                      Max.   :35.00   Max.   :3.700        
##  Workout_Frequency..days.week. Experience_Level      BMI       
##  Min.   :2.000                 Min.   :1.00     Min.   :12.32  
##  1st Qu.:3.000                 1st Qu.:1.00     1st Qu.:20.11  
##  Median :3.000                 Median :2.00     Median :24.16  
##  Mean   :3.322                 Mean   :1.81     Mean   :24.91  
##  3rd Qu.:4.000                 3rd Qu.:2.00     3rd Qu.:28.56  
##  Max.   :5.000                 Max.   :3.00     Max.   :49.84
names(data)[names(data) == "Session_Duration..hours."] <- "Session_Duration"
names(data)[names(data) == "Weight..kg."] <- "Weight"
names(data)[names(data) == "Height..m."] <- "Height"
names(data)[names(data) == "Workout_Frequency..days.week."] <- "Workout_Frequency"
names(data)[names(data) == "Water_Intake..liters."] <- "Water_Intake"
data$Gender <- as.factor(data$Gender)
data$Workout_Type <- as.factor(data$Workout_Type)

Manova

manova_model <- manova(
  cbind(Calories_Burned, Avg_BPM, Fat_Percentage, Max_BPM) ~ 
    Workout_Type * Gender + Experience_Level,
  data = data
)

summary(manova_model, test = "Wilks")
##                      Df   Wilks approx F num Df den Df  Pr(>F)    
## Workout_Type          3 0.97660     1.90     12 2542.9 0.02947 *  
## Gender                1 0.70465   100.70      4  961.0 < 2e-16 ***
## Experience_Level      1 0.34254   461.12      4  961.0 < 2e-16 ***
## Workout_Type:Gender   3 0.99122     0.71     12 2542.9 0.74518    
## Residuals           964                                           
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Mancova

mancova_model <- manova(
  cbind(Calories_Burned, Avg_BPM, Fat_Percentage, Max_BPM) ~ 
    Workout_Type * Gender + Experience_Level +
    Age + BMI + Session_Duration + Workout_Frequency + Weight,
  data = data
)

summary(mancova_model, test = "Wilks")
##                      Df   Wilks approx F num Df den Df Pr(>F)    
## Workout_Type          3 0.85505     12.9     12 2529.6 <2e-16 ***
## Gender                1 0.41296    339.7      4  956.0 <2e-16 ***
## Experience_Level      1 0.04010   5721.1      4  956.0 <2e-16 ***
## Age                   1 0.45336    288.2      4  956.0 <2e-16 ***
## BMI                   1 0.99053      2.3      4  956.0 0.0584 .  
## Session_Duration      1 0.05839   3853.9      4  956.0 <2e-16 ***
## Workout_Frequency     1 0.99631      0.9      4  956.0 0.4727    
## Weight                1 0.99947      0.1      4  956.0 0.9731    
## Workout_Type:Gender   3 0.98176      1.5     12 2529.6 0.1271    
## Residuals           959                                          
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Visualisasi

pkgs <- c("ggplot2", "dplyr", "tidyr", "corrplot",
          "patchwork", "ggridges", "heplots", "GGally", "viridis")

for (p in pkgs) {
  if (!requireNamespace(p, quietly = TRUE)) install.packages(p)
  library(p, character.only = TRUE)
}
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
## corrplot 0.95 loaded
## Warning: package 'patchwork' was built under R version 4.5.3
## Warning: package 'ggridges' was built under R version 4.5.3
## Warning: package 'heplots' was built under R version 4.5.3
## Loading required package: broom
## Warning: package 'GGally' was built under R version 4.5.3
## Loading required package: viridisLite
dep_vars <- c("Calories_Burned", "Avg_BPM", "Fat_Percentage", "Max_BPM")

warna_workout <- c("Cardio"   = "#E63946",
                   "HIIT"     = "#F4A261",
                   "Strength" = "#2A9D8F",
                   "Yoga"     = "#457B9D")
warna_gender  <- c("Male" = "#3A86FF", "Female" = "#FF006E")

library(reshape2)
## 
## Attaching package: 'reshape2'
## The following object is masked from 'package:tidyr':
## 
##     smiths
data_long <- melt(data, 
                  id.vars = "Workout_Type", 
                  measure.vars = c("Calories_Burned", "Avg_BPM", "Fat_Percentage", "Max_BPM"))

ggplot(data_long, aes(x = Workout_Type, y = value, fill = Workout_Type)) +
  geom_boxplot() +
  facet_wrap(~variable, scales = "free") +
  theme_minimal()

library(corrplot)

num_data <- data[, c("Calories_Burned", "Avg_BPM", "Fat_Percentage", 
                     "Max_BPM", "Resting_BPM", "Session_Duration",
                     "Age", "BMI")]

cor_matrix <- cor(num_data)
print(cor_matrix)
##                  Calories_Burned      Avg_BPM Fat_Percentage      Max_BPM
## Calories_Burned      1.000000000  0.339658667   -0.597615248  0.002090016
## Avg_BPM              0.339658667  1.000000000   -0.007301655 -0.039751443
## Fat_Percentage      -0.597615248 -0.007301655    1.000000000 -0.009055731
## Max_BPM              0.002090016 -0.039751443   -0.009055731  1.000000000
## Resting_BPM          0.016517951  0.059635502   -0.016834389  0.036647481
## Session_Duration     0.908140376  0.016014438   -0.581519771  0.010050981
## Age                 -0.154678760  0.035969143    0.002370051 -0.017072597
## BMI                  0.059760826  0.021605500   -0.119257760  0.067105231
##                   Resting_BPM Session_Duration          Age          BMI
## Calories_Burned   0.016517951      0.908140376 -0.154678760  0.059760826
## Avg_BPM           0.059635502      0.016014438  0.035969143  0.021605500
## Fat_Percentage   -0.016834389     -0.581519771  0.002370051 -0.119257760
## Max_BPM           0.036647481      0.010050981 -0.017072597  0.067105231
## Resting_BPM       1.000000000     -0.016648808  0.004353714 -0.032542632
## Session_Duration -0.016648808      1.000000000 -0.019911904 -0.006492647
## Age               0.004353714     -0.019911904  1.000000000 -0.013691370
## BMI              -0.032542632     -0.006492647 -0.013691370  1.000000000
corrplot(cor_matrix, method = "color", type = "upper",
         tl.col = "black", tl.srt = 45)