Eksplorasi dan Reduksi Data Fitness Tracking Dataset

1. Deskripsi Data

Dataset yang digunakan dalam penelitian ini adalah Gym Members Exercise Dataset yang diperoleh dari platform Kaggle (https://www.kaggle.com/datasets/valakhorasani/gym-members-exercise-dataset), diunggah oleh Vala Khorasani. Dataset ini termasuk dalam bidang kesehatan dan kebugaran (health and fitness) yang memuat informasi mengenai karakteristik fisik anggota gym, pola latihan, dan indikator kebugaran tubuh.

Dataset terdiri dari 973 observasi dan 15 variabel, yang terbagi menjadi 13 variabel numerik dan 2 variabel kategorik, tanpa adanya missing value pada seluruh variabel. Berikut adalah daftar lengkap variabel dalam dataset

No Variabel Tipe Keterangan
1. Age Numerik Usia anggota (tahun)
2. Gender Kategorik Jenis kelamin (Male/Female)
3. Weight (kg) Numerik Berat badan (kg)
4. Height (m) Numerik Tinggi badan (m)
5. Max_BPM Numerik Detak jantung maksimum saat latihan
6. Avg_BPM Numerik Rata-rata detak jantung saat latihan
7. Resting_BPM Numerik Detak jantung saat istirahat
8. Session_Duration (hours) Numerik Durasi sesi latihan (jam)
9. Calories_Burned Numerik Kalori yang terbakar per sesi
10. Workout_Type Kategorik Jenis latihan (Yoga/HIIT/Cardio/Strength)
11. Fat_Percentage Numerik Persentase lemak tubuh (%)
12. Water_Intake (liters) Numerik Konsumsi air harian (liter)
13. Workout_Frequency (days/week) Numerik Frekuensi latihan per minggu
14. Experience_Level Numerik (Ordinal) Tingkat pengalaman gym (1=Pemula, 2=Menengah, 3=Ahli)
15. BMI Numerik Body Mass Index (kg/m²)

Tujuan analisis pada penelitian ini adalah melakukan eksplorasi data dan reduksi dimensi untuk mengetahui variabel yang paling berpengaruh terhadap kebugaran anggota gym. Tahapan analisis yang dilakukan meliputi Exploratory Data Analysis (EDA), feature engineering, feature selection, dan Principal Component Analysis (PCA). Pada proses analisis multivariat dan PCA, variabel yang digunakan difokuskan pada variabel numerik karena PCA bekerja berdasarkan hubungan linier dan matriks kovarians antar variabel numerik. Analisis ini diharapkan dapat menyederhanakan dimensi data tanpa menghilangkan informasi utama yang terkandung dalam dataset.

2. Exploratory Data Analysis (EDA)

library(tidyverse)
library(corrplot)
library(car)
library(glmnet)
library(randomForest)
library(caret)
library(FactoMineR)
library(moments)
library(readxl)

Impor dan Struktur Data

# Data
data <- read_excel(
  "C:/Users/Asus/Downloads/gym_members_exercise_tracking.xlsx"
)

# Cek nama kolom asli
colnames(data)
##  [1] "Age"                           "Gender"                       
##  [3] "Weight (kg)"                   "Height (m)"                   
##  [5] "Max_BPM"                       "Avg_BPM"                      
##  [7] "Resting_BPM"                   "Session_Duration (hours)"     
##  [9] "Calories_Burned"               "Workout_Type"                 
## [11] "Fat_Percentage"                "Water_Intake (liters)"        
## [13] "Workout_Frequency (days/week)" "Experience_Level"             
## [15] "BMI"
# Bersihkan nama kolom (ganti spasi & karakter khusus dengan titik)
colnames(data) <- make.names(colnames(data))
colnames(data)
##  [1] "Age"                           "Gender"                       
##  [3] "Weight..kg."                   "Height..m."                   
##  [5] "Max_BPM"                       "Avg_BPM"                      
##  [7] "Resting_BPM"                   "Session_Duration..hours."     
##  [9] "Calories_Burned"               "Workout_Type"                 
## [11] "Fat_Percentage"                "Water_Intake..liters."        
## [13] "Workout_Frequency..days.week." "Experience_Level"             
## [15] "BMI"
# Melihat struktur data
str(data)
## tibble [973 × 15] (S3: tbl_df/tbl/data.frame)
##  $ Age                          : num [1:973] 56 46 32 25 38 56 36 40 28 28 ...
##  $ Gender                       : chr [1:973] "Male" "Female" "Female" "Male" ...
##  $ Weight..kg.                  : num [1:973] 88.3 74.9 68.1 53.2 46.1 ...
##  $ Height..m.                   : num [1:973] 1.71 1.53 1.66 1.7 1.79 1.68 1.72 1.51 1.94 1.84 ...
##  $ Max_BPM                      : num [1:973] 180 179 167 190 188 168 174 189 185 169 ...
##  $ Avg_BPM                      : num [1:973] 157 151 122 164 158 156 169 141 127 136 ...
##  $ Resting_BPM                  : num [1:973] 60 66 54 56 68 74 73 64 52 64 ...
##  $ Session_Duration..hours.     : num [1:973] 1.69 1.3 1.11 0.59 0.64 1.59 1.49 1.27 1.03 1.08 ...
##  $ Calories_Burned              : num [1:973] 1313 883 677 532 556 ...
##  $ Workout_Type                 : chr [1:973] "Yoga" "HIIT" "Cardio" "Strength" ...
##  $ Fat_Percentage               : num [1:973] 12.6 33.9 33.4 28.8 29.2 15.5 21.3 30.6 28.9 29.7 ...
##  $ Water_Intake..liters.        : num [1:973] 3.5 2.1 2.3 2.1 2.8 2.7 2.3 1.9 2.6 2.7 ...
##  $ Workout_Frequency..days.week.: num [1:973] 4 4 4 3 3 5 3 3 4 3 ...
##  $ Experience_Level             : num [1:973] 3 2 2 1 1 3 2 2 2 1 ...
##  $ BMI                          : num [1:973] 30.2 32 24.7 18.4 14.4 ...
sapply(data,class)
##                           Age                        Gender 
##                     "numeric"                   "character" 
##                   Weight..kg.                    Height..m. 
##                     "numeric"                     "numeric" 
##                       Max_BPM                       Avg_BPM 
##                     "numeric"                     "numeric" 
##                   Resting_BPM      Session_Duration..hours. 
##                     "numeric"                     "numeric" 
##               Calories_Burned                  Workout_Type 
##                     "numeric"                   "character" 
##                Fat_Percentage         Water_Intake..liters. 
##                     "numeric"                     "numeric" 
## Workout_Frequency..days.week.              Experience_Level 
##                     "numeric"                     "numeric" 
##                           BMI 
##                     "numeric"
data$Gender <- as.factor(data$Gender)
data$Workout_Type <- as.factor(data$Workout_Type)

str(data)
## tibble [973 × 15] (S3: tbl_df/tbl/data.frame)
##  $ Age                          : num [1:973] 56 46 32 25 38 56 36 40 28 28 ...
##  $ Gender                       : Factor w/ 2 levels "Female","Male": 2 1 1 2 2 1 2 1 2 2 ...
##  $ Weight..kg.                  : num [1:973] 88.3 74.9 68.1 53.2 46.1 ...
##  $ Height..m.                   : num [1:973] 1.71 1.53 1.66 1.7 1.79 1.68 1.72 1.51 1.94 1.84 ...
##  $ Max_BPM                      : num [1:973] 180 179 167 190 188 168 174 189 185 169 ...
##  $ Avg_BPM                      : num [1:973] 157 151 122 164 158 156 169 141 127 136 ...
##  $ Resting_BPM                  : num [1:973] 60 66 54 56 68 74 73 64 52 64 ...
##  $ Session_Duration..hours.     : num [1:973] 1.69 1.3 1.11 0.59 0.64 1.59 1.49 1.27 1.03 1.08 ...
##  $ Calories_Burned              : num [1:973] 1313 883 677 532 556 ...
##  $ Workout_Type                 : Factor w/ 4 levels "Cardio","HIIT",..: 4 2 1 3 3 2 1 1 3 1 ...
##  $ Fat_Percentage               : num [1:973] 12.6 33.9 33.4 28.8 29.2 15.5 21.3 30.6 28.9 29.7 ...
##  $ Water_Intake..liters.        : num [1:973] 3.5 2.1 2.3 2.1 2.8 2.7 2.3 1.9 2.6 2.7 ...
##  $ Workout_Frequency..days.week.: num [1:973] 4 4 4 3 3 5 3 3 4 3 ...
##  $ Experience_Level             : num [1:973] 3 2 2 1 1 3 2 2 2 1 ...
##  $ BMI                          : num [1:973] 30.2 32 24.7 18.4 14.4 ...
# Deskripsi dataset
summary(data)
##       Age           Gender     Weight..kg.       Height..m.       Max_BPM     
##  Min.   :18.00   Female:462   Min.   : 40.00   Min.   :1.500   Min.   :160.0  
##  1st Qu.:28.00   Male  :511   1st Qu.: 58.10   1st Qu.:1.620   1st Qu.:170.0  
##  Median :40.00                Median : 70.00   Median :1.710   Median :180.0  
##  Mean   :38.68                Mean   : 73.85   Mean   :1.723   Mean   :179.9  
##  3rd Qu.:49.00                3rd Qu.: 86.00   3rd Qu.:1.800   3rd Qu.:190.0  
##  Max.   :59.00                Max.   :129.90   Max.   :2.000   Max.   :199.0  
##     Avg_BPM       Resting_BPM    Session_Duration..hours. Calories_Burned 
##  Min.   :120.0   Min.   :50.00   Min.   :0.500            Min.   : 303.0  
##  1st Qu.:131.0   1st Qu.:56.00   1st Qu.:1.040            1st Qu.: 720.0  
##  Median :143.0   Median :62.00   Median :1.260            Median : 893.0  
##  Mean   :143.8   Mean   :62.22   Mean   :1.256            Mean   : 905.4  
##  3rd Qu.:156.0   3rd Qu.:68.00   3rd Qu.:1.460            3rd Qu.:1076.0  
##  Max.   :169.0   Max.   :74.00   Max.   :2.000            Max.   :1783.0  
##    Workout_Type Fat_Percentage  Water_Intake..liters.
##  Cardio  :255   Min.   :10.00   Min.   :1.500        
##  HIIT    :221   1st Qu.:21.30   1st Qu.:2.200        
##  Strength:258   Median :26.20   Median :2.600        
##  Yoga    :239   Mean   :24.98   Mean   :2.627        
##                 3rd Qu.:29.30   3rd Qu.:3.100        
##                 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
# Dimensi
dim(data)
## [1] 973  15
# Nama Variabel
names(data)
##  [1] "Age"                           "Gender"                       
##  [3] "Weight..kg."                   "Height..m."                   
##  [5] "Max_BPM"                       "Avg_BPM"                      
##  [7] "Resting_BPM"                   "Session_Duration..hours."     
##  [9] "Calories_Burned"               "Workout_Type"                 
## [11] "Fat_Percentage"                "Water_Intake..liters."        
## [13] "Workout_Frequency..days.week." "Experience_Level"             
## [15] "BMI"
# Cek Missing Value
# Jumlah Missing Value per Variabel
missing_val <- colSums(is.na(data))
print(missing_val)
##                           Age                        Gender 
##                             0                             0 
##                   Weight..kg.                    Height..m. 
##                             0                             0 
##                       Max_BPM                       Avg_BPM 
##                             0                             0 
##                   Resting_BPM      Session_Duration..hours. 
##                             0                             0 
##               Calories_Burned                  Workout_Type 
##                             0                             0 
##                Fat_Percentage         Water_Intake..liters. 
##                             0                             0 
## Workout_Frequency..days.week.              Experience_Level 
##                             0                             0 
##                           BMI 
##                             0
# Persentase Missing Value (%)
missing_pct <- round(colMeans(is.na(data)) * 100, 2)
print(missing_pct)
##                           Age                        Gender 
##                             0                             0 
##                   Weight..kg.                    Height..m. 
##                             0                             0 
##                       Max_BPM                       Avg_BPM 
##                             0                             0 
##                   Resting_BPM      Session_Duration..hours. 
##                             0                             0 
##               Calories_Burned                  Workout_Type 
##                             0                             0 
##                Fat_Percentage         Water_Intake..liters. 
##                             0                             0 
## Workout_Frequency..days.week.              Experience_Level 
##                             0                             0 
##                           BMI 
##                             0
# Variabel Numerik
numeric_data <- data %>%
  select(where(is.numeric))

# cek jumlah variabel numerik
ncol(numeric_data)
## [1] 13
# cek nama variabelnya
names(numeric_data)
##  [1] "Age"                           "Weight..kg."                  
##  [3] "Height..m."                    "Max_BPM"                      
##  [5] "Avg_BPM"                       "Resting_BPM"                  
##  [7] "Session_Duration..hours."      "Calories_Burned"              
##  [9] "Fat_Percentage"                "Water_Intake..liters."        
## [11] "Workout_Frequency..days.week." "Experience_Level"             
## [13] "BMI"

Statistik Deskriptif

# Fungsi statistik lengkap
stat_desc <- data.frame(
  Variabel = names(numeric_data),
  Mean     = round(sapply(numeric_data, mean), 2),
  Median   = round(sapply(numeric_data, median), 2),
  SD       = round(sapply(numeric_data, sd), 2),
  Min      = round(sapply(numeric_data, min), 2),
  Max      = round(sapply(numeric_data, max), 2),
  Skewness = round(sapply(numeric_data, 
                          function(x) mean((x - mean(x))^3) / sd(x)^3), 2)
)

print(stat_desc)
##                                                    Variabel   Mean Median
## Age                                                     Age  38.68  40.00
## Weight..kg.                                     Weight..kg.  73.85  70.00
## Height..m.                                       Height..m.   1.72   1.71
## Max_BPM                                             Max_BPM 179.88 180.00
## Avg_BPM                                             Avg_BPM 143.77 143.00
## Resting_BPM                                     Resting_BPM  62.22  62.00
## Session_Duration..hours.           Session_Duration..hours.   1.26   1.26
## Calories_Burned                             Calories_Burned 905.42 893.00
## Fat_Percentage                               Fat_Percentage  24.98  26.20
## Water_Intake..liters.                 Water_Intake..liters.   2.63   2.60
## Workout_Frequency..days.week. Workout_Frequency..days.week.   3.32   3.00
## Experience_Level                           Experience_Level   1.81   2.00
## BMI                                                     BMI  24.91  24.16
##                                   SD    Min     Max Skewness
## Age                            12.18  18.00   59.00    -0.08
## Weight..kg.                    21.21  40.00  129.90     0.77
## Height..m.                      0.13   1.50    2.00     0.34
## Max_BPM                        11.53 160.00  199.00    -0.04
## Avg_BPM                        14.35 120.00  169.00     0.09
## Resting_BPM                     7.33  50.00   74.00    -0.07
## Session_Duration..hours.        0.34   0.50    2.00     0.03
## Calories_Burned               272.64 303.00 1783.00     0.28
## Fat_Percentage                  6.26  10.00   35.00    -0.63
## Water_Intake..liters.           0.60   1.50    3.70     0.07
## Workout_Frequency..days.week.   0.91   2.00    5.00     0.15
## Experience_Level                0.74   1.00    3.00     0.32
## BMI                             6.66  12.32   49.84     0.76
# distribusi kategorik
table(data$Gender)
## 
## Female   Male 
##    462    511
table(data$Workout_Type)
## 
##   Cardio     HIIT Strength     Yoga 
##      255      221      258      239

Visualisasi Data

# Histogram semua variabel numerik
# Untuk melihat distribusi data pada setiap variabel numerik
numeric_data %>%
  pivot_longer(everything()) %>%
  ggplot(aes(x = value)) +
  geom_histogram(fill = "steelblue", color = "brown",bins = 30) +
  facet_wrap(~name, scales = "free") +
  labs(
    title = "Distribusi Variabel Numerik",
    x = "Nilai",
    y = "Frekuensi"
  ) +
  theme_minimal()

# Distribusi variabel kategorik Workout_Type
# Untuk melihat frekuensi masing-masing jenis latihan
barplot(table(data$Workout_Type), col = rainbow(4),
        main = "Frekuensi Tipe Workout", las = 1)

# Boxplot Calories Burned berdasarkan Gender
# Membandingkan distribusi Calories_Burned berdasarkan Gender
ggplot(data,
       aes(x = Gender, y = Calories_Burned, fill = Gender)) +
  geom_boxplot(alpha = 0.7) +
  labs(
    title = "Kalori Terbakar berdasarkan Gender",
    x = "Gender",
    y = "Calories Burned"
  ) +
  theme_minimal()

# Boxplot Calories Burned berdasarkan Workout Type
# Membandingkan distribusi Calories_Burned berdasarkan Workout Type
ggplot(data,
       aes(x = Workout_Type, y = Calories_Burned, fill = Workout_Type)) +
  geom_boxplot(alpha = 0.7) +
  labs(
    title = "Kalori Terbakar berdasarkan Jenis Latihan",
    x = "Workout Type",
    y = "Calories Burned" 
  ) +
  theme_minimal()

# Scatterplot Session Duration vs Calories Burned
# melihat hubungan antar variabel
ggplot(data,
       aes(x = Session_Duration..hours., y = Calories_Burned,color = Gender)) +
  geom_point(alpha = 0.5) +
  geom_smooth(method = "lm", 
              se = FALSE) +
  labs(
    title = "Durasi Latihan vs Kalori Terbakar",
    x = "Session Duration (hours)",
    y = "Calories Burned"
  ) +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

Analisis Korelasi

# Memilih variabel numerik
numeric_data <- data %>%
  select(where(is.numeric))

# Matriks korelasi
cor_matrix <- cor(numeric_data)

# Menampilkan nilai korelasi
round(cor_matrix, 3)
##                                  Age Weight..kg. Height..m. Max_BPM Avg_BPM
## Age                            1.000      -0.036     -0.028  -0.017   0.036
## Weight..kg.                   -0.036       1.000      0.365   0.057   0.010
## Height..m.                    -0.028       0.365      1.000  -0.018  -0.015
## Max_BPM                       -0.017       0.057     -0.018   1.000  -0.040
## Avg_BPM                        0.036       0.010     -0.015  -0.040   1.000
## Resting_BPM                    0.004      -0.032     -0.005   0.037   0.060
## Session_Duration..hours.      -0.020      -0.014     -0.010   0.010   0.016
## Calories_Burned               -0.155       0.095      0.086   0.002   0.340
## Fat_Percentage                 0.002      -0.226     -0.236  -0.009  -0.007
## Water_Intake..liters.          0.042       0.394      0.394   0.032  -0.003
## Workout_Frequency..days.week.  0.008      -0.012     -0.011  -0.029  -0.011
## Experience_Level              -0.019       0.003     -0.010   0.001  -0.001
## BMI                           -0.014       0.853     -0.159   0.067   0.022
##                               Resting_BPM Session_Duration..hours.
## Age                                 0.004                   -0.020
## Weight..kg.                        -0.032                   -0.014
## Height..m.                         -0.005                   -0.010
## Max_BPM                             0.037                    0.010
## Avg_BPM                             0.060                    0.016
## Resting_BPM                         1.000                   -0.017
## Session_Duration..hours.           -0.017                    1.000
## Calories_Burned                     0.017                    0.908
## Fat_Percentage                     -0.017                   -0.582
## Water_Intake..liters.               0.008                    0.283
## Workout_Frequency..days.week.      -0.008                    0.644
## Experience_Level                    0.002                    0.765
## BMI                                -0.033                   -0.006
##                               Calories_Burned Fat_Percentage
## Age                                    -0.155          0.002
## Weight..kg.                             0.095         -0.226
## Height..m.                              0.086         -0.236
## Max_BPM                                 0.002         -0.009
## Avg_BPM                                 0.340         -0.007
## Resting_BPM                             0.017         -0.017
## Session_Duration..hours.                0.908         -0.582
## Calories_Burned                         1.000         -0.598
## Fat_Percentage                         -0.598          1.000
## Water_Intake..liters.                   0.357         -0.589
## Workout_Frequency..days.week.           0.576         -0.537
## Experience_Level                        0.694         -0.654
## BMI                                     0.060         -0.119
##                               Water_Intake..liters.
## Age                                           0.042
## Weight..kg.                                   0.394
## Height..m.                                    0.394
## Max_BPM                                       0.032
## Avg_BPM                                      -0.003
## Resting_BPM                                   0.008
## Session_Duration..hours.                      0.283
## Calories_Burned                               0.357
## Fat_Percentage                               -0.589
## Water_Intake..liters.                         1.000
## Workout_Frequency..days.week.                 0.239
## Experience_Level                              0.304
## BMI                                           0.214
##                               Workout_Frequency..days.week. Experience_Level
## Age                                                   0.008           -0.019
## Weight..kg.                                          -0.012            0.003
## Height..m.                                           -0.011           -0.010
## Max_BPM                                              -0.029            0.001
## Avg_BPM                                              -0.011           -0.001
## Resting_BPM                                          -0.008            0.002
## Session_Duration..hours.                              0.644            0.765
## Calories_Burned                                       0.576            0.694
## Fat_Percentage                                       -0.537           -0.654
## Water_Intake..liters.                                 0.239            0.304
## Workout_Frequency..days.week.                         1.000            0.837
## Experience_Level                                      0.837            1.000
## BMI                                                   0.002            0.016
##                                  BMI
## Age                           -0.014
## Weight..kg.                    0.853
## Height..m.                    -0.159
## Max_BPM                        0.067
## Avg_BPM                        0.022
## Resting_BPM                   -0.033
## Session_Duration..hours.      -0.006
## Calories_Burned                0.060
## Fat_Percentage                -0.119
## Water_Intake..liters.          0.214
## Workout_Frequency..days.week.  0.002
## Experience_Level               0.016
## BMI                            1.000
# Visualisasi heatmap korelasi
library(corrplot)

corrplot(
  cor_matrix,
  method = "color",
  type = "upper",
  addCoef.col = "black",
  number.cex = 0.6,
  tl.cex = 0.8,
  tl.col = "black",
  diag = FALSE
)

# Korelasi terhadap Calories_Burned
# Untuk melihat variabel yang paling berhubungan dengan target
cor_calories <- sort(
  cor_matrix["Calories_Burned", ],
  decreasing = TRUE
)

round(cor_calories, 3)
##               Calories_Burned      Session_Duration..hours. 
##                         1.000                         0.908 
##              Experience_Level Workout_Frequency..days.week. 
##                         0.694                         0.576 
##         Water_Intake..liters.                       Avg_BPM 
##                         0.357                         0.340 
##                   Weight..kg.                    Height..m. 
##                         0.095                         0.086 
##                           BMI                   Resting_BPM 
##                         0.060                         0.017 
##                       Max_BPM                           Age 
##                         0.002                        -0.155 
##                Fat_Percentage 
##                        -0.598

Identifikasi Multikolinieritas (VIF)

# Gunakan regresi linear untuk hitung VIF
model_vif <- lm(
  Calories_Burned ~ Age + Weight..kg. +
    Height..m. + Max_BPM + Avg_BPM +
    Resting_BPM + Session_Duration..hours. +
    Fat_Percentage + Water_Intake..liters. +
    Workout_Frequency..days.week. +
    Experience_Level + BMI,
  data = data
)

vif_values <- vif(model_vif)
print(round(vif_values, 2))
##                           Age                   Weight..kg. 
##                          1.02                         71.65 
##                    Height..m.                       Max_BPM 
##                         20.62                          1.01 
##                       Avg_BPM                   Resting_BPM 
##                          1.01                          1.01 
##      Session_Duration..hours.                Fat_Percentage 
##                          2.51                          2.59 
##         Water_Intake..liters. Workout_Frequency..days.week. 
##                          1.86                          3.37 
##              Experience_Level                           BMI 
##                          5.31                         64.18

Deteksi Outlier (METODE IQR)

# Menghitung jumlah outlier pada setiap variabel numerik
deteksi_outlier <- function(x){
  
  Q1 <- quantile(x, 0.25)
  Q3 <- quantile(x, 0.75)
  
  IQR_value <- Q3 - Q1
  
  lower <- Q1 - 1.5 * IQR_value
  upper <- Q3 + 1.5 * IQR_value
  
  sum(x < lower | x > upper)
}

outlier_count <- sapply(numeric_data, deteksi_outlier)

outlier_df <- data.frame(
  Variabel = names(outlier_count),
  Jumlah_Outlier = outlier_count
)

print("Jumlah Outlier per Variabel:")
## [1] "Jumlah Outlier per Variabel:"
print(outlier_df)
##                                                    Variabel Jumlah_Outlier
## Age                                                     Age              0
## Weight..kg.                                     Weight..kg.              9
## Height..m.                                       Height..m.              0
## Max_BPM                                             Max_BPM              0
## Avg_BPM                                             Avg_BPM              0
## Resting_BPM                                     Resting_BPM              0
## Session_Duration..hours.           Session_Duration..hours.              0
## Calories_Burned                             Calories_Burned             10
## Fat_Percentage                               Fat_Percentage              0
## Water_Intake..liters.                 Water_Intake..liters.              0
## Workout_Frequency..days.week. Workout_Frequency..days.week.              0
## Experience_Level                           Experience_Level              0
## BMI                                                     BMI             25
# Visualisasi Outlier dengan Boxplot
numeric_data %>%
  pivot_longer(
    cols = everything(),
    names_to = "Variabel",
    values_to = "Nilai"
  ) %>%
  ggplot(aes(x = Variabel, y = Nilai)) +
  geom_boxplot(
    fill = "steelblue",
    alpha = 0.6,
    outlier.color = "brown"
  ) +
  facet_wrap(~Variabel, scales = "free") +
  labs(
    title = "Deteksi Outlier pada Variabel Numerik",
    x = "",
    y = "Nilai"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_blank())

a. Statistik Deskriptif

Berdasarkan hasil summary(data) dan data.frame(sapply(…)) yang dijalankan pada dataset, diketahui bahwa dataset terdiri dari 973 observasi dengan 15 variabel. Variabel Age memiliki rentang usia antara 18 hingga 59 tahun dengan rata-rata 38.68 tahun, mencerminkan bahwa anggota gym didominasi oleh kelompok usia dewasa produktif. Variabel Weight..kg. menunjukkan rentang yang cukup lebar dari 40 kg hingga 129.9 kg dengan rata-rata 73.85 kg dan standar deviasi 21.21, mengindikasikan keragaman kondisi fisik anggota yang cukup tinggi. Height..m. berkisar antara 1.50 m hingga 2.00 m dengan rata-rata 1.72 m.

Untuk variabel denyut jantung, Max_BPM rata-rata 179.88 dengan rentang 160–199, Avg_BPM rata-rata 143.77 dengan rentang 120–169, dan Resting_BPM rata-rata 62.22 dengan rentang 50–74. Ketiga variabel ini memiliki standar deviasi yang relatif kecil, menandakan distribusi yang cukup seragam antar anggota. Session_Duration..hours. memiliki rata-rata 1.26 jam dengan nilai minimum 0.50 jam dan maksimum 2.00 jam, artinya rata-rata anggota berlatih sekitar satu hingga satu setengah jam per sesi.

Variabel target Calories_Burned memiliki rata-rata 905.42 kalori dengan standar deviasi yang cukup besar yaitu 272.64, rentang nilainya antara 303 hingga 1783 kalori, menunjukkan variasi pembakaran kalori yang signifikan antar individu. Fat_Percentage rata-rata 24.98% dengan rentang 10–35%, sementara Water_Intake..liters. rata-rata 2.63 liter per sesi dengan rentang 1.5–3.7 liter. Workout_Frequency..days.week. rata-rata 3.32 hari per minggu dengan rentang 2–5 hari, dan Experience_Level memiliki rata-rata 1.81 dari skala 1–3, yang berarti sebagian besar anggota berada pada level pemula hingga menengah. BMI rata-rata 24.91 dengan standar deviasi 6.66 dan rentang 12.32–49.84, mencerminkan keragaman komposisi tubuh yang luas.

Untuk variabel kategorik, distribusi Gender relatif seimbang antara Female sebanyak 462 orang dan Male sebanyak 511 orang. Distribusi Workout_Type juga relatif merata dengan Cardio 255 orang, HIIT 221 orang, Strength 258 orang, dan Yoga 239 orang, menandakan tidak ada dominasi tipe latihan tertentu dalam dataset ini.

b. Visualisasi

Untuk distribusi variabel kategorik, barplot dari table(data$Workout_Type) menunjukkan bahwa keempat tipe workout yaitu Cardio, HIIT, Strength, dan Yoga memiliki frekuensi yang hampir seimbang berkisar antara 221 hingga 258 anggota, sehingga tidak ditemukan ketimpangan distribusi pada variabel ini. Untuk histogram, divisualisasikan menggunakan par(mfrow = c(3,3)) yang menampilkan 13 variabel numerik secara sekaligus. Berdasarkan hasil histogram tersebut, variabel Calories_Burned menunjukkan distribusi yang mendekati simetris dengan puncak di sekitar 800–1000 kalori. Fat_Percentage memiliki distribusi yang sedikit miring ke kiri dengan konsentrasi nilai di rentang 20–30%. BMI menunjukkan distribusi condong ke kanan karena adanya nilai ekstrem tinggi. Session_Duration..hours. terdistribusi relatif merata antara 0.5 hingga 2 jam. Variabel Experience_Level menunjukkan distribusi yang sangat tidak merata dengan mayoritas anggota berada di level 1 dan 2, sedangkan level 3 jauh lebih sedikit. Variabel BPM (Max_BPM, Avg_BPM, Resting_BPM) semuanya menunjukkan distribusi yang relatif seragam dan simetris. Selain menggunakan base R, histogram juga divisualisasikan menggunakan facet_wrap dari ggplot2 yang menampilkan seluruh variabel numerik dalam satu panel dengan skala bebas, mempermudah perbandingan pola distribusi antar variabel secara bersamaan.

Untuk deteksi outlier, boxplot divisualisasikan dengan dua cara yaitu menggunakan par(mfrow = c(3,3)) dengan warna berbeda untuk setiap variabel, serta menggunakan facet_wrap ggplot2. Berdasarkan kedua visualisasi tersebut terlihat bahwa sebagian besar variabel memiliki distribusi yang bersih tanpa outlier ekstrem, kecuali pada BMI, Calories_Burned, dan Weight..kg. yang masing-masing menunjukkan satu titik di luar batas whisker atas.

c. Analisis Korelasi

Berdasarkan matriks korelasi yang dihasilkan, terdapat beberapa hubungan antar variabel yang perlu diperhatikan. Korelasi paling kuat ditemukan antara Session_Duration..hours. dengan Calories_Burned sebesar r = 0.908, yang menunjukkan bahwa semakin lama durasi latihan maka semakin banyak kalori yang terbakar. Selain itu, Weight..kg. dengan BMI memiliki korelasi sangat kuat sebesar r = 0.853, yang wajar mengingat BMI memang diturunkan secara langsung dari berat badan dan tinggi badan. Hubungan kuat lainnya ditemukan antara Workout_Frequency..days.week. dengan Experience_Level sebesar r = 0.837, serta Session_Duration..hours. dengan Experience_Level sebesar r = 0.765, yang mengindikasikan bahwa anggota gym berpengalaman cenderung berlatih lebih lama dan lebih sering. Dari sisi korelasi negatif, Experience_Level dengan Fat_Percentage menunjukkan nilai r = -0.654, artinya semakin tinggi tingkat pengalaman seseorang maka persentase lemak tubuhnya cenderung semakin rendah. Hal serupa juga terlihat antara Calories_Burned dengan Fat_Percentage sebesar r = -0.598 dan Session_Duration..hours. dengan Fat_Percentage sebesar r = -0.582. Sebaliknya, variabel seperti Age, Max_BPM, Resting_BPM, dan Height..m. hampir tidak menunjukkan korelasi yang berarti dengan variabel lainnya, dengan nilai korelasi yang mendekati nol

d. Multikolinearitas

Berdasarkan hasil uji Variance Inflation Factor (VIF), ditemukan indikasi multikolinearitas yang serius pada beberapa variabel. Nilai GVIF tertinggi ditemukan pada Weight..kg. sebesar 73.21 dan BMI sebesar 66.87, jauh melampaui ambang batas VIF > 10 yang mengindikasikan multikolinearitas serius. Kondisi ini sangat dapat dipahami karena BMI dihitung langsung dari berat badan dibagi kuadrat tinggi badan, sehingga ketiga variabel tersebut membawa informasi yang sangat tumpang tindih. Height..m. turut terdampak dengan GVIF sebesar 22.50. Sementara itu, Experience_Level menunjukkan nilai GVIF 5.41 dan Workout_Frequency..days.week. sebesar 3.38 yang tergolong moderat, kemungkinan disebabkan oleh korelasi kuat di antara keduanya (r = 0.837). Variabel lain seperti Age, Max_BPM, Avg_BPM, dan Resting_BPM menunjukkan nilai VIF yang sangat aman di kisaran 1.01–1.02, artinya tidak ada masalah multikolinearitas pada variabel-variabel tersebut. Temuan ini menegaskan bahwa Weight..kg., BMI, dan Height..m. menjadi kandidat utama untuk dieliminasi atau disederhanakan pada tahap feature selection guna mengatasi masalah multikolinearitas.

e. Missing Value dan Outlier

Berdasarkan hasil pengecekan menggunakan colSums(is.na(data)) dan sapply(data, function(x) sum(is.na(x))), seluruh variabel dalam dataset menunjukkan nilai nol tanpa terkecuali, yang berarti tidak terdapat missing value pada dataset ini. Data sudah dalam kondisi lengkap dan bersih sehingga tidak diperlukan proses imputasi sebelum analisis dilanjutkan.

Terkait outlier, berdasarkan visualisasi boxplot pada seluruh 13 variabel numerik, ditemukan outlier pada tiga variabel yaitu BMI dengan nilai ekstrem tertinggi sekitar 49.84, Calories_Burned dengan nilai tertinggi sekitar 1783, serta Weight..kg. dengan nilai tertinggi sekitar 129.9 kg. Masing-masing variabel hanya memiliki satu titik outlier dari total 973 observasi. Variabel lainnya seperti Age, Max_BPM, Avg_BPM, Resting_BPM, Session_Duration, Fat_Percentage, Water_Intake, Workout_Frequency, Experience_Level, dan Height..m. tidak menunjukkan adanya outlier. Mengingat jumlah outlier yang sangat sedikit dan nilai-nilai tersebut masih dapat mencerminkan kondisi nyata individu dengan massa tubuh sangat tinggi atau intensitas latihan yang sangat tinggi, outlier tidak perlu dihapus dan analisis dapat dilanjutkan tanpa penanganan khusus.

3. Feature Engineering

## JENIS 1
## Membuat Variabel Baru

# 1. Calorie per Hour
# Menghitung laju pembakaran kalori per jam (Standarisasi durasi latihan)
data$Calorie_per_Hour <- data$Calories_Burned / data$Session_Duration..hours.

# 2. Fitness Score
# Skor gabungan: Frekuensi & pengalaman dibanding PERSENTASE lemak tubuh 
data$Fitness_Score <- (data$Experience_Level * data$Workout_Frequency..days.week.) / data$Fat_Percentage

# 3. Heart Rate Efficiency
# Kalori yang terbakar per satu detak jantung rata-rata
data$HR_Efficiency <- data$Calories_Burned / data$Avg_BPM

## JENIS 2
## Transformasi Variabel

# 4. Melakukan transformasi logaritma pada variabel BMI dan Weight yang skew
data$Log_BMI <- log(data$BMI)
data$Log_Weight <- log(data$Weight..kg.)

# Cek hasil
feature_baru <- data %>%
  select(Calories_Burned, Calorie_per_Hour, Fitness_Score, HR_Efficiency, Log_BMI, Log_Weight)

head(feature_baru)
## # A tibble: 6 × 6
##   Calories_Burned Calorie_per_Hour Fitness_Score HR_Efficiency Log_BMI
##             <dbl>            <dbl>         <dbl>         <dbl>   <dbl>
## 1            1313             777.         0.952          8.36    3.41
## 2             883             679.         0.236          5.85    3.47
## 3             677             610.         0.240          5.55    3.21
## 4             532             902.         0.104          3.24    2.91
## 5             556             869.         0.103          3.52    2.67
## 6            1116             702.         0.968          7.15    3.02
## # ℹ 1 more variable: Log_Weight <dbl>
summary(feature_baru)
##  Calories_Burned  Calorie_per_Hour Fitness_Score     HR_Efficiency   
##  Min.   : 303.0   Min.   :539.9    Min.   :0.05714   Min.   : 2.295  
##  1st Qu.: 720.0   1st Qu.:655.6    1st Qu.:0.09967   1st Qu.: 5.147  
##  Median : 893.0   Median :715.3    Median :0.22814   Median : 6.256  
##  Mean   : 905.4   Mean   :720.4    Mean   :0.33382   Mean   : 6.296  
##  3rd Qu.:1076.0   3rd Qu.:781.9    3rd Qu.:0.32389   3rd Qu.: 7.378  
##  Max.   :1783.0   Max.   :929.5    Max.   :1.48515   Max.   :10.945  
##     Log_BMI        Log_Weight   
##  Min.   :2.511   Min.   :3.689  
##  1st Qu.:3.001   1st Qu.:4.062  
##  Median :3.185   Median :4.248  
##  Mean   :3.181   Mean   :4.263  
##  3rd Qu.:3.352   3rd Qu.:4.454  
##  Max.   :3.909   Max.   :4.867
# cek korelasi
round(cor(feature_baru), 3)
##                  Calories_Burned Calorie_per_Hour Fitness_Score HR_Efficiency
## Calories_Burned            1.000            0.411         0.700         0.939
## Calorie_per_Hour           0.411            1.000         0.066         0.150
## Fitness_Score              0.700            0.066         1.000         0.745
## HR_Efficiency              0.939            0.150         0.745         1.000
## Log_BMI                    0.083            0.142         0.073         0.085
## Log_Weight                 0.123            0.254         0.117         0.129
##                  Log_BMI Log_Weight
## Calories_Burned    0.083      0.123
## Calorie_per_Hour   0.142      0.254
## Fitness_Score      0.073      0.117
## HR_Efficiency      0.085      0.129
## Log_BMI            1.000      0.853
## Log_Weight         0.853      1.000
# Visualisasi
feature_baru %>%
  pivot_longer(-Calories_Burned) %>%
  ggplot(aes(x = value, y = Calories_Burned)) +
  geom_point(alpha = 0.4, color = "steelblue") +
  geom_smooth(method = "lm", se = FALSE, color = "red") +
  facet_wrap(~name, scales = "free") +
  labs(title = "Hubungan Fitur Baru terhadap Calories Burned",
       x = "Nilai Fitur", y = "Calories Burned") +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

1. Calorie per Hour

Alasan Pembuatan: Berdasarkan hasil Exploratory Data Analysis (EDA) yang telah dilakukan sebelumnya, variabel durasi latihan (Session_Duration) menunjukkan korelasi positif yang sangat kuat terhadap total kalori yang terbakar (Calories_Burned) dengan koefisien korelasi mencapai r = 0,908. Namun, durasi latihan yang panjang secara teoritis tidak selalu mencerminkan intensitas atau efektivitas pembakaran energi yang optimal karena adanya potensi waktu istirahat di sela-sela sesi. Oleh karena itu, fitur Calorie_per_Hour dibentuk untuk menormalisasi variabel durasi tersebut. Fitur ini dihitung dengan membagi total kalori dengan durasi latihan dalam satuan jam. Pendekatan ini termasuk ke dalam jenis “Membuat Variabel Baru dari Hasil Operasi Variabel Eksisting”, yang bertujuan untuk mengukur laju pembakaran energi secara murni per satuan waktu tanpa terdistorsi oleh lamanya waktu anggota berada di dalam gym.

Interpretasi: Berdasarkan statistik deskriptif, fitur Calorie_per_Hour memiliki nilai rata-rata (mean) sebesar 720,4 kalori/jam dan median 715,3 kalori/jam, yang mengindikasikan bahwa distribusi data cenderung simetris. Hasil uji korelasi menunjukkan hubungan positif pada kategori sedang terhadap variabel target (Calories_Burned) dengan koefisien sebesar 0,411.

Hubungan tersebut digambarkan secara visual melalui grafik scatterplot pada panel Calorie_per_Hour. Titik-titik biru (steelblue) merepresentasikan data individual anggota gym yang membentuk pola tren naik ke arah kanan atas. Tren ini diperjelas oleh garis regresi berwarna merah dengan kemiringan positif, yang membuktikan bahwa semakin tinggi laju pembakaran kalori per jam, maka total kalori yang terbakar juga akan meningkat secara linear. Namun, sebaran titik biru yang tidak merapat sempurna pada garis merah mengonfirmasi nilai korelasi yang berada di tingkat sedang (r = 0,411), karena total kalori terbakar masih dipengaruhi secara kuat oleh faktor akumulasi durasi latihan.

2. Fitness Score

Alasan Pembuatan: Berdasarkan hasil EDA, terdapat tiga variabel yang menunjukkan korelasi kuat terhadap Calories_Burned, yaitu Experience_Level (r = 0.694), Workout_Frequency (r = 0.576), dan Fat_Percentage (r = -0.598). Karena ketiga variabel tersebut masing-masing mencerminkan aspek kebugaran yang berbeda (perilaku, kemahiran, dan komposisi tubuh), maka dilakukan penggabungan menjadi satu skor holistik yang merepresentasikan profil kebugaran anggota gym secara menyeluruh. Variabel Fat_Percentage ditempatkan sebagai pembagi karena memiliki hubungan negatif terhadap Calories_Burned, di mana kadar lemak yang lebih rendah merepresentasikan kondisi fisik yang lebih prima dan kapasitas pembakaran kalori yang lebih optimal. Pendekatan ini termasuk ke dalam jenis “Membuat Variabel Baru dari Hasil Operasi Variabel Eksisting”, yang bertujuan untuk merangkum profil kebugaran anggota gym secara komprehensif dalam satu indikator tunggal.

interpretasi: Berdasarkan statistik deskriptif, fitur Fitness_Score memiliki nilai rata-rata (mean) sebesar 0,334 dan median sebesar 0,228. Nilai mean yang lebih besar dari median ini mengindikasikan bahwa distribusi data menceng ke kanan (right-skewed), yang berarti mayoritas anggota gym memiliki skor kebugaran standar dan hanya sebagian kecil yang memiliki kondisi fisik sangat terlatih. Hasil analisis menunjukkan nilai rata-rata sebesar 0,334 dengan nilai korelasi terhadap target sebesar 0,700 (kategori kuat).

Hubungan tersebut digambarkan secara visual melalui grafik scatterplot pada panel Fitness_Score. Titik-titik sebaran data berwarna biru (steelblue) merepresentasikan data individual dari setiap anggota gym, sedangkan garis linear berwarna merah merupakan garis regresi (fitted regression line). Secara visual pada diagram pencar, terlihat tren positif yang jelas dari sebaran titik-titik biru yang bergerak naik ke arah kanan atas mengikuti arah kemiringan garis merah. Artinya, semakin tinggi pengalaman dan frekuensi latihan, serta semakin rendah persentase lemak tubuh seseorang, maka skor kebugarannya akan semakin tinggi. Hal ini membuktikan bahwa skor kebugaran holistik ini sangat baik dalam merepresentasikan kapasitas pembakaran kalori anggota gym saat beraktivitas. Sebaran titik yang cukup merapat pada garis regresi tersebut mengonfirmasi kekuatan hubungan linear yang berada di tingkat kuat (r = 0,700).

3. Heart Rate Efficiency

Alasan Pembuatan: Berdasarkan hasil Exploratory Data Analysis (EDA) yang telah dilakukan sebelumnya, variabel rata-rata detak jantung (Avg_BPM) menunjukkan korelasi positif yang tergolong sedang terhadap total kalori yang terbakar (Calories_Burned) dengan koefisien korelasi sebesar r = 0.340. Namun, tingginya detak jantung rata-rata saja tidak cukup untuk menggambarkan seberapa efektif tubuh dalam membakar kalori secara riil pada setiap denyutnya, karena detak jantung yang tinggi bisa saja terjadi akibat stres atau kondisi medis tertentu tanpa disertai pembakaran kalori yang optimal. Oleh karena itu, fitur HR_Efficiency dibentuk dengan membagi total kalori yang terbakar dengan rata-rata detak jantung selama sesi latihan. Pendekatan ini termasuk ke dalam jenis “Membuat Variabel Baru dari Hasil Operasi Variabel Eksisting”, yang bertujuan untuk mengukur tingkat efisiensi kardiovaskular individu secara lebih spesifik, yaitu seberapa banyak kalori yang mampu dibakar untuk setiap satu denyut jantung rata-rata selama latihan berlangsung

Interpretasi: Hasil ringkasan data menunjukkan nilai rata-rata sebesar 6.296 dan median sebesar 6.256, yang berarti setiap satu detak jantung rata-rata berkontribusi terhadap pembakaran sekitar 6.3 kalori. Analisis korelasi menunjukkan nilai yang sangat tinggi terhadap target, yaitu sebesar 0.939 (kategori sangat kuat).

Hubungan yang sangat kuat tersebut digambarkan secara visual melalui grafik scatterplot pada panel HR_Efficiency. Titik-titik sebaran data berwarna biru (steelblue) merepresentasikan karakteristik data individual dari setiap anggota gym, sedangkan garis linear berwarna merah merupakan garis regresi (fitted regression line). Secara visual pada diagram pencar, sebaran data membentuk pola linearitas yang sangat rapat dan sempurna berupa garis lurus positif yang bergerak naik ke arah kanan atas, berhimpitan langsung dengan arah kemiringan garis merah regresi.

Namun, perlu dicatat secara khusus dalam konteks statistika bahwa hubungan yang hampir sempurna ini wajar terjadi secara matematis karena variabel target (Calories_Burned) bertindak langsung sebagai pembilang dalam formulasi fitur tersebut. Meskipun terdapat faktor dependensi matematis, fitur ini secara biologis tetap membuktikan dengan konsisten bahwa semakin efektif jantung bekerja dalam memompa dan mengalirkan oksigen saat latihan, semakin optimal pula kapasitas kardiovaskular seseorang dalam membakar energi.

4. Log Transformation pada BMI dan Weight

Alasan Pembuatan: Berdasarkan hasil EDA, variabel BMI dan Weight memiliki distribusi tidak simetris/right-skewed dengan nilai skewness masing-masing sebesar 0,76 dan 0,77. Selain itu, uji multikolinearitas menunjukkan nilai VIF yang sangat tinggi, yaitu BMI sebesar 64,18 dan Weight sebesar 71,65 (melampaui batas toleransi VIF > 10). Oleh karena itu, dilakukan transformasi logaritma (Log Transformation) untuk mereduksi efek pencilan (outliers), memperbaiki sebaran data agar lebih simetris, serta menstabilkan varians variabel agar lebih layak digunakan dalam analisis multivariat seperti PCA. Pendekatan ini termasuk ke dalam jenis “Transformasi Variabel”.

Interpretasi: Setelah transformasi, Log_BMI menghasilkan nilai mean 3,181 dan median 3,185, sementara Log_Weight memiliki mean 4,263 dan median 4,248. Kedekatan nilai mean dan median ini membuktikan bahwa transformasi logaritma sukses mengubah distribusi data yang tadinya menceng menjadi lebih simetris dan mendekati normal.

Hasil uji korelasi menunjukkan hubungan yang lemah terhadap target Calories_Burned, yaitu sebesar 0,083 untuk Log_BMI dan 0,123 untuk Log_Weight. Hubungan lemah ini terkonfirmasi pada grafik scatterplot, di mana titik-titik biru (steelblue) data individual menyebar luas tanpa pola linear yang jelas, dipertegas oleh garis regresi berwarna merah yang cenderung landai/datar. Namun, esensi keberhasilan transformasi ini bukan pada kekuatan korelasi, melainkan pada rentang nilai data yang berhasil terkompresi secara signifikan (Log_BMI: 2,5–3,9 dan Log_Weight: 3,7–4,9) dibandingkan rentang aslinya (BMI: 12,32–49,84 dan Weight: 40–129,9). Hal ini membuktikan bahwa metode logaritma efektif mereduksi skewness dan menstabilkan sebaran data.

4. Feature Selection

# FEATURE SELECTION
#FILTER METHOD (KORELASI)


# Korelasi terhadap target
cor_target <- cor(
  numeric_data,
  data$Calories_Burned
)

cor_target <- sort(cor_target[,1], decreasing = TRUE)

# Menampilkan korelasi
round(cor_target, 3)
##               Calories_Burned      Session_Duration..hours. 
##                         1.000                         0.908 
##              Experience_Level Workout_Frequency..days.week. 
##                         0.694                         0.576 
##         Water_Intake..liters.                       Avg_BPM 
##                         0.357                         0.340 
##                   Weight..kg.                    Height..m. 
##                         0.095                         0.086 
##                           BMI                   Resting_BPM 
##                         0.060                         0.017 
##                       Max_BPM                           Age 
##                         0.002                        -0.155 
##                Fat_Percentage 
##                        -0.598
# Visualisasi korelasi terhadap target
cor_df <- data.frame(
  Variabel = names(cor_target),
  Korelasi = as.numeric(cor_target)
)

ggplot(cor_df,
       aes(x = reorder(Variabel, Korelasi),
           y = Korelasi,
           fill = Korelasi)) +
  geom_col() +
  coord_flip() +
  labs(
    title = "Korelasi Variabel terhadap Calories Burned",
    x = "Variabel",
    y = "Nilai Korelasi"
  ) +
  theme_minimal()

#WRAPPER METHOD (STEPWISE REGRESSION)


# Model lengkap
full_model <- lm(
  Calories_Burned ~ Age + Gender +
    Weight..kg. + Height..m. +
    Max_BPM + Avg_BPM + Resting_BPM +
    Session_Duration..hours. +
    Workout_Type +
    Fat_Percentage +
    Water_Intake..liters. +
    Workout_Frequency..days.week. +
    Experience_Level +
    BMI +
    Calorie_per_Hour +
    Fitness_Score +
    HR_Efficiency,
  data = data
)

# Model null
null_model <- lm(
  Calories_Burned ~ 1,
  data = data
)

# Stepwise Bidirectional
step_model <- step(
  null_model,
  scope = list(
    lower = null_model,
    upper = full_model
  ),
  direction = "both"
)
## Start:  AIC=10914.47
## Calories_Burned ~ 1
## 
##                                 Df Sum of Sq      RSS     AIC
## + HR_Efficiency                  1  63735309  8516753  8836.1
## + Session_Duration..hours.       1  59587644 12664418  9222.1
## + Fitness_Score                  1  35360320 36891741 10262.5
## + Experience_Level               1  34812177 37439885 10276.8
## + Fat_Percentage                 1  25804389 46447672 10486.6
## + Workout_Frequency..days.week.  1  23983997 48268064 10524.0
## + Calorie_per_Hour               1  12219901 60032160 10736.2
## + Water_Intake..liters.          1   9204877 63047184 10783.9
## + Avg_BPM                        1   8335577 63916485 10797.2
## + Age                            1   1728668 70523393 10892.9
## + Gender                         1   1639714 70612347 10894.1
## + Weight..kg.                    1    658177 71593884 10907.6
## + Height..m.                     1    538710 71713351 10909.2
## + BMI                            1    258038 71994024 10913.0
## <none>                                       72252061 10914.5
## + Resting_BPM                    1     19713 72232348 10916.2
## + Max_BPM                        1       316 72251746 10916.5
## + Workout_Type                   3    211670 72040391 10917.6
## 
## Step:  AIC=8836.08
## Calories_Burned ~ HR_Efficiency
## 
##                                 Df Sum of Sq      RSS     AIC
## + Avg_BPM                        1   7906366   610387  6273.5
## + Calorie_per_Hour               1   5404107  3112645  7858.7
## + Resting_BPM                    1     52123  8464630  8832.1
## <none>                                        8516753  8836.1
## + Max_BPM                        1     17443  8499309  8836.1
## + Workout_Frequency..days.week.  1      7249  8509503  8837.2
## + Age                            1      6961  8509792  8837.3
## + BMI                            1      3792  8512960  8837.6
## + Experience_Level               1      2542  8514210  8837.8
## + Gender                         1      1929  8514823  8837.9
## + Session_Duration..hours.       1      1327  8515426  8837.9
## + Weight..kg.                    1      1302  8515451  8837.9
## + Fat_Percentage                 1       820  8515932  8838.0
## + Height..m.                     1       246  8516507  8838.1
## + Water_Intake..liters.          1       128  8516625  8838.1
## + Fitness_Score                  1        14  8516739  8838.1
## + Workout_Type                   3      3671  8513082  8841.7
## - HR_Efficiency                  1  63735309 72252061 10914.5
## 
## Step:  AIC=6273.54
## Calories_Burned ~ HR_Efficiency + Avg_BPM
## 
##                                 Df Sum of Sq      RSS     AIC
## + Resting_BPM                    1      3650   606737  6269.7
## + Calorie_per_Hour               1      1686   608701  6272.9
## + Session_Duration..hours.       1      1461   608926  6273.2
## <none>                                         610387  6273.5
## + Height..m.                     1       815   609572  6274.2
## + Workout_Frequency..days.week.  1       661   609726  6274.5
## + Age                            1       578   609809  6274.6
## + Fat_Percentage                 1       570   609817  6274.6
## + Gender                         1       426   609961  6274.9
## + Max_BPM                        1       392   609995  6274.9
## + Fitness_Score                  1       356   610031  6275.0
## + Experience_Level               1       295   610092  6275.1
## + Weight..kg.                    1       126   610261  6275.3
## + Water_Intake..liters.          1        72   610315  6275.4
## + BMI                            1         5   610382  6275.5
## + Workout_Type                   3      1953   608434  6276.4
## - Avg_BPM                        1   7906366  8516753  8836.1
## - HR_Efficiency                  1  63306098 63916485 10797.2
## 
## Step:  AIC=6269.71
## Calories_Burned ~ HR_Efficiency + Avg_BPM + Resting_BPM
## 
##                                 Df Sum of Sq      RSS     AIC
## + Calorie_per_Hour               1      1589   605147  6269.2
## + Session_Duration..hours.       1      1349   605388  6269.5
## <none>                                         606737  6269.7
## + Height..m.                     1       826   605911  6270.4
## + Workout_Frequency..days.week.  1       660   606076  6270.6
## + Age                            1       578   606158  6270.8
## + Max_BPM                        1       492   606244  6270.9
## + Fat_Percentage                 1       485   606252  6270.9
## + Gender                         1       388   606349  6271.1
## + Experience_Level               1       328   606409  6271.2
## + Fitness_Score                  1       268   606468  6271.3
## + Weight..kg.                    1       173   606564  6271.4
## + Water_Intake..liters.          1        59   606677  6271.6
## + BMI                            1        18   606719  6271.7
## + Workout_Type                   3      1934   604803  6272.6
## - Resting_BPM                    1      3650   610387  6273.5
## - Avg_BPM                        1   7857893  8464630  8832.1
## - HR_Efficiency                  1  63308735 63915472 10799.2
## 
## Step:  AIC=6269.16
## Calories_Burned ~ HR_Efficiency + Avg_BPM + Resting_BPM + Calorie_per_Hour
## 
##                                 Df Sum of Sq      RSS     AIC
## <none>                                         605147  6269.2
## - Calorie_per_Hour               1      1589   606737  6269.7
## + Max_BPM                        1       560   604587  6270.3
## + Fitness_Score                  1       438   604709  6270.5
## + Workout_Frequency..days.week.  1       305   604842  6270.7
## + Fat_Percentage                 1       237   604911  6270.8
## + Height..m.                     1       203   604944  6270.8
## + Gender                         1        68   605080  6271.0
## + Experience_Level               1        65   605082  6271.1
## + Water_Intake..liters.          1        54   605093  6271.1
## + BMI                            1        29   605118  6271.1
## + Session_Duration..hours.       1        28   605119  6271.1
## + Weight..kg.                    1        17   605130  6271.1
## + Age                            1         0   605147  6271.2
## + Workout_Type                   3      1996   603151  6271.9
## - Resting_BPM                    1      3554   608701  6272.9
## - Avg_BPM                        1   2499689  3104837  7858.2
## - HR_Efficiency                  1  59414410 60019557 10740.0
# Ringkasan model
summary(step_model)
## 
## Call:
## lm(formula = Calories_Burned ~ HR_Efficiency + Avg_BPM + Resting_BPM + 
##     Calorie_per_Hour, data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -98.274 -10.816   0.142  10.996 105.167 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)      -915.67126   10.66993 -85.818   <2e-16 ***
## HR_Efficiency     143.20594    0.46452 308.285   <2e-16 ***
## Avg_BPM             6.15246    0.09730  63.234   <2e-16 ***
## Resting_BPM         0.26151    0.10968   2.384   0.0173 *  
## Calorie_per_Hour    0.02589    0.01624   1.594   0.1112    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 25 on 968 degrees of freedom
## Multiple R-squared:  0.9916, Adjusted R-squared:  0.9916 
## F-statistic: 2.865e+04 on 4 and 968 DF,  p-value: < 2.2e-16
# Variabel terpilih
formula(step_model)
## Calories_Burned ~ HR_Efficiency + Avg_BPM + Resting_BPM + Calorie_per_Hour
# Nilai AIC
AIC(step_model)
## [1] 9032.411
# EMBEDDED METHOD (LASSO)


# Membuat matrix X dan y
x <- model.matrix(
  Calories_Burned ~ Age + Gender +
    Weight..kg. + Height..m. +
    Max_BPM + Avg_BPM + Resting_BPM +
    Session_Duration..hours. +
    Workout_Type +
    Fat_Percentage +
    Water_Intake..liters. +
    Workout_Frequency..days.week. +
    Experience_Level +
    BMI +
    Calorie_per_Hour +
    Fitness_Score +
    HR_Efficiency,
  data = data
)[,-1]

y <- data$Calories_Burned

# Cross Validation mencari lambda terbaik
set.seed(123)

cv_lasso <- cv.glmnet(
  x,
  y,
  alpha = 1
)

# Plot Cross Validation
plot(cv_lasso)

# Lambda terbaik
cv_lasso$lambda.min
## [1] 0.8779851
# Model LASSO final
lasso_model <- glmnet(
  x,
  y,
  alpha = 1,
  lambda = cv_lasso$lambda.min
)

# Koefisien model
coef(lasso_model)
## 20 x 1 sparse Matrix of class "dgCMatrix"
##                                          s0
## (Intercept)                   -896.05860630
## Age                              .         
## GenderMale                       .         
## Weight..kg.                      .         
## Height..m.                       .         
## Max_BPM                          .         
## Avg_BPM                          5.77306803
## Resting_BPM                      0.14683008
## Session_Duration..hours.        36.36519303
## Workout_TypeHIIT                 0.23580539
## Workout_TypeStrength            -0.68946984
## Workout_TypeYoga                 .         
## Fat_Percentage                   .         
## Water_Intake..liters.            .         
## Workout_Frequency..days.week.    .         
## Experience_Level                 .         
## BMI                              .         
## Calorie_per_Hour                 0.09012021
## Fitness_Score                    2.22752232
## HR_Efficiency                  135.18365211
# Variabel yang terpilih
coef_lasso <- coef(lasso_model)

selected_lasso <- rownames(coef_lasso)[coef_lasso[,1] != 0]

selected_lasso
## [1] "(Intercept)"              "Avg_BPM"                 
## [3] "Resting_BPM"              "Session_Duration..hours."
## [5] "Workout_TypeHIIT"         "Workout_TypeStrength"    
## [7] "Calorie_per_Hour"         "Fitness_Score"           
## [9] "HR_Efficiency"
# EMBEDDED METHOD (RANDOM FOREST)


set.seed(123)

rf_model <- randomForest(
  Calories_Burned ~ Age + Gender +
    Weight..kg. + Height..m. +
    Max_BPM + Avg_BPM + Resting_BPM +
    Session_Duration..hours. +
    Workout_Type +
    Fat_Percentage +
    Water_Intake..liters. +
    Workout_Frequency..days.week. +
    Experience_Level +
    BMI +
    Calorie_per_Hour +
    Fitness_Score +
    HR_Efficiency,
  data = data,
  importance = TRUE
)

# Ringkasan model
rf_model
## 
## Call:
##  randomForest(formula = Calories_Burned ~ Age + Gender + Weight..kg. +      Height..m. + Max_BPM + Avg_BPM + Resting_BPM + Session_Duration..hours. +      Workout_Type + Fat_Percentage + Water_Intake..liters. + Workout_Frequency..days.week. +      Experience_Level + BMI + Calorie_per_Hour + Fitness_Score +      HR_Efficiency, data = data, importance = TRUE) 
##                Type of random forest: regression
##                      Number of trees: 500
## No. of variables tried at each split: 5
## 
##           Mean of squared residuals: 841.7749
##                     % Var explained: 98.87
# Nilai importance
importance(rf_model)
##                                  %IncMSE IncNodePurity
## Age                            9.9639351      425898.6
## Gender                         7.7325054      104921.2
## Weight..kg.                    6.8950943      366392.6
## Height..m.                     5.8235582      224513.3
## Max_BPM                       -1.8108754      181073.6
## Avg_BPM                       48.5029588     3458269.0
## Resting_BPM                    1.5419165      212618.0
## Session_Duration..hours.      25.2367466    17062064.1
## Workout_Type                   0.3069813      156307.5
## Fat_Percentage                 9.7427379     3879908.7
## Water_Intake..liters.          5.9936289      814176.3
## Workout_Frequency..days.week.  5.7426078     1025326.8
## Experience_Level              12.6894893     5992654.6
## BMI                            6.3414432      265681.0
## Calorie_per_Hour              50.3086290     5026388.6
## Fitness_Score                 13.6282936     6835302.8
## HR_Efficiency                 32.8607322    25863396.7
# Visualisasi importance
varImpPlot(rf_model)

Ringkasan Hasil Fitur Selection

Pada penelitian ini digunakan tiga metode feature selection yaitu Filter Method (Korelasi), Wrapper Method (Stepwise Regression), dan Embedded Method (LASSO Regression & Random Forest). Tujuan feature selection adalah memilih variabel yang paling relevan terhadap variabel target Calories_Burned serta mengurangi variabel yang redundan akibat multikolinearitas.

Interpretasi Feature Selection

a. Filter Method (Korelasi)

Metode filter dilakukan menggunakan analisis korelasi Pearson terhadap variabel target Calories_Burned. Variabel dipilih berdasarkan kekuatan hubungan linear terhadap target.

Hasil korelasi menunjukkan bahwa variabel dengan hubungan paling kuat adalah:

  • HR_Efficiency = 0.939

  • Session_Duration..hours. = 0.908

  • Fitness_Score = 0.700

  • Experience_Level = 0.694

  • Workout_Frequency..days.week. = 0.576

  • Avg_BPM = 0.340

Variabel-variabel tersebut dipilih karena memiliki hubungan yang cukup kuat hingga sangat kuat terhadap pembakaran kalori. Semakin tinggi nilai variabel tersebut, maka kecenderungan Calories_Burned juga semakin tinggi.

Sementara itu, beberapa variabel dieliminasi atau dianggap kurang penting karena memiliki korelasi sangat rendah atau mendekati nol, yaitu:

  • Age = -0.155

  • Max_BPM = 0.002

  • Resting_BPM = 0.017

  • Height..m. = 0.086

  • BMI = 0.060

Variabel tersebut dieliminasi karena kontribusinya dalam menjelaskan variasi Calories_Burned relatif kecil sehingga kurang informatif untuk model.

Selain itu, variabel Weight..kg., BMI, dan Height..m. juga menunjukkan multikolinearitas tinggi berdasarkan hasil VIF, sehingga tidak seluruhnya dipertahankan agar model lebih stabil dan tidak redundan.

b. Wrapper Method (Stepwise Regression)

Metode stepwise regression digunakan untuk memilih kombinasi variabel terbaik secara otomatis berdasarkan nilai AIC (Akaike Information Criterion). Pendekatan yang digunakan adalah bidirectional stepwise, yaitu kombinasi forward selection dan backward elimination. Metode ini memilih kombinasi variabel terbaik secara otomatis dengan mempertimbangkan performa model.

Hasil stepwise regression menunjukkan bahwa variabel yang dipilih dalam model akhir adalah:

  • HR_Efficiency

  • Avg_BPM

  • Resting_BPM

  • Calorie_per_Hour

Wrapper Method (Stepwise Bidirectional) memilih 4 variabel final dengan AIC terkecil sebesar 9032.41.

Variabel tersebut dipertahankan karena memberikan kontribusi paling signifikan terhadap model regresi dan mampu menghasilkan nilai Adjusted R-Squared sebesar 0.9916. Hal ini menunjukkan bahwa sekitar 99.16% variasi Calories_Burned dapat dijelaskan oleh variabel terpilih.

Sementara itu, variabel yang dieliminasi antara lain:

  • Age

  • Gender

  • Weight..kg.

  • Height..m.

  • BMI

  • Workout_Type

  • Fat_Percentage

  • Water_Intake..liters.

  • Workout_Frequency..days.week.

  • Experience_Level

  • Fitness_Score

  • Session_Duration..hours.

Dieliminasi karena tidak memberikan penurunan AIC yang berarti. Variabel-variabel tersebut pula dieliminasi karena kontribusinya dianggap kurang optimal setelah dikombinasikan dengan variabel lain, atau karena membawa informasi yang sudah diwakili oleh variabel yang lebih kuat seperti HR_Efficiency dan Calorie_per_Hour.

c. Embedded Method (LASSO Regression)

LASSO Regression melakukan seleksi variabel secara otomatis dengan memberikan penalti terhadap koefisien regresi. Variabel yang kurang penting akan memiliki koefisien mendekati nol bahkan menjadi nol sepenuhnya sehingga otomatis dieliminasi dari model.

Metode LASSO dengan lambda optimal sebesar 0.8779 berhasil melakukan seleksi variabel secara otomatis dengan menghilangkan koefisien yang tidak penting.

Variabel yang dipertahankan oleh LASSO adalah:

  • Avg_BPM

  • Resting_BPM

  • Session_Duration..hours.

  • Workout_TypeHIIT

  • Workout_TypeStrength

  • Calorie_per_Hour

  • Fitness_Score

  • HR_Efficiency

Variabel tersebut dipilih karena masih memiliki kontribusi terhadap model prediksi Calories_Burned.

Sementara itu, variabel:

  • Age

  • Gender

  • Weight..kg.

  • Height..m.

  • Max_BPM

  • Fat_Percentage

  • Water_Intake..liters.

  • Workout_Frequency..days.week.

  • Experience_Level

  • BMI

memiliki koefisien nol sehingga otomatis dieliminasi oleh model LASSO.

d. Embedded Method (Random Forest Feature Importance)

Metode Random Forest menunjukkan bahwa variabel dengan nilai %IncMSE tertinggi adalah:

  • Calorie_per_Hour (50.31%)

  • Avg_BPM (48.50%)

  • HR_Efficiency (32.86%)

  • Session_Duration..hours. (25.24%)

  • Fitness_Score (13.63%)

  • Experience_Level (12.69%)

Variabel tersebut dianggap paling penting karena memberikan kontribusi terbesar terhadap peningkatan performa prediksi model.

Sebaliknya, variabel seperti:

  • Max_BPM (-1.81%)

  • Workout_Type (0.31%)

  • Resting_BPM (1.54%)

menunjukkan nilai importance yang sangat rendah sehingga kontribusinya terhadap model relatif kecil.

Kesimpulan Akhir Feature Selection

Berdasarkan hasil keempat metode feature selection, variabel yang paling konsisten terpilih dan layak digunakan pada tahap reduksi dimensi maupun PCA adalah:

  • Session_Duration..hours.

  • HR_Efficiency

  • Calorie_per_Hour

  • Fitness_Score

  • Avg_BPM

  • Experience_Level

Variabel-variabel tersebut dipilih karena memiliki hubungan kuat terhadap target, kontribusi tinggi terhadap performa model, dan konsisten muncul pada beberapa metode feature selection.

Sementara itu, variabel Weight..kg., BMI, dan Height..m. dieliminasi karena mengalami multikolinearitas serius (VIF > 20). Variabel Age, Max_BPM, Resting_BPM, dan Workout_Type juga dieliminasi karena kontribusinya relatif kecil dan tidak konsisten terpilih di berbagai metode.

Khusus variabel HR_Efficiency, meskipun memiliki hubungan matematis langsung dengan target karena dibentuk dari Calories_Burned, variabel ini tetap dipertahankan karena secara konsisten menunjukkan importance tinggi di seluruh metode serta memiliki interpretasi biologis yang relevan dalam menggambarkan efisiensi kardiovaskular selama latihan.

5. Feature Extraction

# Load package
library(factoextra)
## Welcome to factoextra!
## Want to learn more? See two factoextra-related books at https://www.datanovia.com/en/product/practical-guide-to-principal-component-methods-in-r/
# MEMILIH VARIABEL NUMERIK
data_pca <- data[,c(
  "Age",
  "Weight..kg.",
  "Height..m.",
  "Max_BPM",
  "Avg_BPM",
  "Resting_BPM",
  "Session_Duration..hours.",
  "Calories_Burned",
  "Fat_Percentage",
  "Water_Intake..liters.",
  "Workout_Frequency..days.week.",
  "Experience_Level",
  "BMI"
)]
# STANDARISASI DATA

data_scaled <- scale(data_pca)

# PCA

hasil_pca <- prcomp(
  data_scaled,
  center = TRUE,
  scale. = TRUE
)

# Ringkasan PCA
summary(hasil_pca)
## Importance of components:
##                          PC1   PC2     PC3    PC4     PC5     PC6     PC7
## Standard deviation     2.001 1.447 1.13655 1.0678 1.01971 1.01572 0.96087
## Proportion of Variance 0.308 0.161 0.09937 0.0877 0.07999 0.07936 0.07102
## Cumulative Proportion  0.308 0.469 0.56836 0.6561 0.73604 0.81540 0.88642
##                            PC8     PC9    PC10    PC11    PC12    PC13
## Standard deviation     0.74035 0.68497 0.55361 0.36283 0.12206 0.07856
## Proportion of Variance 0.04216 0.03609 0.02358 0.01013 0.00115 0.00047
## Cumulative Proportion  0.92859 0.96468 0.98825 0.99838 0.99953 1.00000

Pembahasan

Berdasarkan hasil Principal Component Analysis (PCA), diperoleh 13 komponen utama yang merupakan hasil transformasi dari 13 variabel numerik pada dataset. Setiap komponen utama memiliki kemampuan yang berbeda dalam menjelaskan keragaman data yang direpresentasikan melalui nilai Proportion of Variance.

Komponen utama pertama (PC1) mampu menjelaskan sebesar 30,8% variasi total data. Hal ini menunjukkan bahwa PC1 merupakan komponen yang paling dominan dalam merepresentasikan informasi yang terkandung dalam data. Komponen utama kedua (PC2) memberikan kontribusi sebesar 16,1% terhadap variasi data. Dengan demikian, dua komponen utama pertama secara kumulatif mampu menjelaskan 46,9% variasi total data.

Selanjutnya, komponen utama ketiga (PC3) memberikan kontribusi sebesar 9,94%, sehingga tiga komponen utama pertama mampu menjelaskan 56,84% variasi data. Jika ditambahkan hingga komponen keempat (PC4), proporsi variasi kumulatif meningkat menjadi 65,61%. Lima komponen utama pertama mampu menjelaskan 73,60% variasi data, sedangkan enam komponen utama pertama mampu menjelaskan 81,54% variasi data.

Nilai proporsi variansi yang semakin menurun pada komponen-komponen berikutnya menunjukkan bahwa sebagian besar informasi data telah terkonsentrasi pada beberapa komponen utama pertama. Oleh karena itu, penggunaan enam komponen utama dianggap cukup representatif karena mampu mempertahankan lebih dari 80% informasi yang terdapat pada data asli.

# EIGENVALUE DAN PROPORSI VARIANSI

eigenvalue <- hasil_pca$sdev^2

proporsi_var <- eigenvalue/sum(eigenvalue)

kumulatif_var <- cumsum(proporsi_var)

tabel_variansi <- data.frame(
  Komponen = paste0("PC",1:length(eigenvalue)),
  Eigenvalue = round(eigenvalue,3),
  Proporsi = round(proporsi_var*100,2),
  Kumulatif = round(kumulatif_var*100,2)
)

tabel_variansi
##    Komponen Eigenvalue Proporsi Kumulatif
## 1       PC1      4.004    30.80     30.80
## 2       PC2      2.093    16.10     46.90
## 3       PC3      1.292     9.94     56.84
## 4       PC4      1.140     8.77     65.61
## 5       PC5      1.040     8.00     73.60
## 6       PC6      1.032     7.94     81.54
## 7       PC7      0.923     7.10     88.64
## 8       PC8      0.548     4.22     92.86
## 9       PC9      0.469     3.61     96.47
## 10     PC10      0.306     2.36     98.83
## 11     PC11      0.132     1.01     99.84
## 12     PC12      0.015     0.11     99.95
## 13     PC13      0.006     0.05    100.00

Pembahasan

Hasil PCA menghasilkan 13 komponen utama yang merupakan transformasi dari 13 variabel numerik pada dataset. Nilai eigenvalue menunjukkan besarnya variasi yang mampu dijelaskan oleh masing-masing komponen utama. Semakin besar nilai eigenvalue, semakin besar pula kontribusi komponen tersebut dalam merepresentasikan informasi data.

Berdasarkan Tabel Eigenvalue dan Proporsi Variansi, komponen utama pertama (PC1) memiliki eigenvalue sebesar 4,004 dengan proporsi variansi sebesar 30,80%. Hal ini menunjukkan bahwa PC1 merupakan komponen yang paling dominan karena mampu menjelaskan hampir sepertiga dari total variasi data. Komponen utama kedua (PC2) memiliki eigenvalue sebesar 2,093 dan mampu menjelaskan 16,10% variasi data. Secara kumulatif, PC1 dan PC2 mampu menjelaskan 46,90% variasi total data.

Komponen utama ketiga (PC3) memiliki eigenvalue sebesar 1,292 dengan proporsi variansi sebesar 9,94%, sehingga tiga komponen utama pertama secara bersama-sama mampu menjelaskan 56,84% variasi data. Sementara itu, komponen utama keempat (PC4), kelima (PC5), dan keenam (PC6) masing-masing memiliki proporsi variansi sebesar 8,77%, 8,00%, dan 7,94%.

Jika dilihat dari proporsi kumulatif, enam komponen utama pertama mampu menjelaskan 81,54% variasi total data. Nilai tersebut menunjukkan bahwa sebagian besar informasi yang terdapat dalam data asli telah dapat direpresentasikan hanya dengan enam komponen utama. Oleh karena itu, reduksi dimensi dari 13 variabel menjadi 6 komponen dapat dilakukan tanpa kehilangan informasi yang signifikan.

Selain itu, terlihat bahwa nilai eigenvalue dan proporsi variansi cenderung menurun pada komponen-komponen berikutnya. Komponen utama ketujuh (PC7) hingga komponen ketiga belas (PC13) hanya memberikan tambahan informasi yang relatif kecil terhadap variasi total data. Bahkan komponen terakhir (PC13) hanya mampu menjelaskan 0,05% variasi data.

Berdasarkan kriteria Kaiser, komponen yang memiliki eigenvalue lebih besar dari 1 layak untuk dipertahankan. Pada hasil PCA ini terdapat enam komponen utama yang memiliki eigenvalue lebih besar dari 1, yaitu PC1 hingga PC6. Oleh karena itu, keenam komponen tersebut dapat dipilih sebagai representasi data yang lebih ringkas tanpa kehilangan sebagian besar informasi yang terkandung dalam dataset.

# SCREE PLOT

fviz_eig(
  hasil_pca,
  addlabels = TRUE,
  ylim = c(0,50)
)

Pembahasan

Scree plot digunakan untuk membantu menentukan jumlah komponen utama yang layak dipertahankan dalam analisis PCA. Grafik ini menampilkan persentase variasi yang mampu dijelaskan oleh setiap komponen utama.

Berdasarkan scree plot, komponen utama pertama (PC1) memiliki kontribusi terbesar terhadap variasi data, yaitu sebesar 30,8%. Komponen utama kedua (PC2) menjelaskan 16,1% variasi data, sedangkan komponen utama ketiga (PC3) menjelaskan 9,9% variasi data. Setelah komponen ketiga, terlihat bahwa persentase variasi yang dijelaskan oleh setiap komponen cenderung menurun dan relatif lebih kecil.

Pada grafik terlihat adanya perubahan kemiringan yang cukup tajam dari PC1 ke PC3, kemudian kurva mulai melandai setelahnya. Kondisi ini menunjukkan bahwa sebagian besar informasi penting dalam data telah berhasil ditangkap oleh beberapa komponen utama pertama. Sementara itu, komponen-komponen berikutnya hanya memberikan tambahan informasi yang relatif kecil.

Selain itu, berdasarkan kriteria Kaiser, komponen yang memiliki nilai eigenvalue lebih besar dari 1 dapat dipertahankan. Dari hasil sebelumnya diketahui bahwa terdapat enam komponen utama (PC1 sampai PC6) yang memiliki eigenvalue lebih besar dari 1. Oleh karena itu, enam komponen utama tersebut dianggap cukup representatif untuk menggambarkan karakteristik data.

Secara keseluruhan, scree plot menunjukkan bahwa penggunaan enam komponen utama sudah memadai karena mampu mempertahankan sekitar 81,54% variasi total data. Dengan demikian, dimensi data dapat direduksi dari 13 variabel menjadi 6 komponen utama tanpa kehilangan sebagian besar informasi yang terkandung dalam data.

# LOADING FACTOR

loading_factor <- hasil_pca$rotation

round(loading_factor,3)
##                                  PC1    PC2    PC3    PC4    PC5    PC6    PC7
## Age                           -0.025  0.007 -0.072 -0.069 -0.727  0.604 -0.204
## Weight..kg.                    0.110 -0.646  0.131  0.007 -0.021 -0.049  0.062
## Height..m.                     0.086 -0.271 -0.698  0.128  0.084 -0.098 -0.089
## Max_BPM                        0.005 -0.075  0.119 -0.141  0.572  0.481 -0.629
## Avg_BPM                        0.051  0.022  0.166  0.831 -0.159 -0.053 -0.315
## Resting_BPM                    0.001  0.029 -0.033  0.361  0.303  0.598  0.643
## Session_Duration..hours.       0.433  0.179  0.099 -0.031  0.020 -0.019 -0.036
## Calories_Burned                0.437  0.092  0.102  0.276  0.078 -0.119 -0.103
## Fat_Percentage                -0.410  0.091  0.167  0.059  0.017 -0.068 -0.030
## Water_Intake..liters.          0.279 -0.324 -0.338  0.003 -0.040  0.097 -0.033
## Workout_Frequency..days.week.  0.393  0.178  0.087 -0.179 -0.070  0.040  0.092
## Experience_Level               0.439  0.168  0.085 -0.147 -0.021  0.041  0.062
## BMI                            0.074 -0.537  0.521 -0.062 -0.079  0.007  0.113
##                                  PC8    PC9   PC10   PC11   PC12   PC13
## Age                           -0.123  0.168 -0.022  0.002  0.105  0.025
## Weight..kg.                   -0.287  0.043 -0.026 -0.020 -0.153  0.662
## Height..m.                    -0.509  0.042 -0.027 -0.035  0.031 -0.357
## Max_BPM                       -0.051 -0.059 -0.004  0.015  0.001 -0.002
## Avg_BPM                        0.010 -0.305 -0.020 -0.042 -0.234 -0.041
## Resting_BPM                   -0.053  0.046  0.017  0.004 -0.009 -0.003
## Session_Duration..hours.      -0.067  0.573  0.078  0.084 -0.638 -0.122
## Calories_Burned               -0.019  0.401  0.067  0.114  0.698  0.130
## Fat_Percentage                -0.325  0.165  0.787 -0.183  0.029  0.002
## Water_Intake..liters.          0.628 -0.090  0.533 -0.040 -0.043  0.000
## Workout_Frequency..days.week. -0.327 -0.529  0.288  0.538 -0.005  0.004
## Experience_Level              -0.158 -0.256  0.008 -0.807  0.041  0.006
## BMI                           -0.013  0.014 -0.008  0.005  0.109 -0.633
# Loading PC1
sort(loading_factor[,1], decreasing = TRUE)
##              Experience_Level               Calories_Burned 
##                   0.438731526                   0.436992177 
##      Session_Duration..hours. Workout_Frequency..days.week. 
##                   0.433265299                   0.393348154 
##         Water_Intake..liters.                   Weight..kg. 
##                   0.279375333                   0.110268624 
##                    Height..m.                           BMI 
##                   0.086267861                   0.073761886 
##                       Avg_BPM                       Max_BPM 
##                   0.051030709                   0.004916258 
##                   Resting_BPM                           Age 
##                   0.001140096                  -0.025390522 
##                Fat_Percentage 
##                  -0.409565512

Pembahasan

Loading factor menunjukkan tingkat kontribusi masing-masing variabel terhadap pembentukan suatu komponen utama. Semakin besar nilai absolut loading factor, maka semakin besar pengaruh variabel tersebut dalam membentuk komponen utama yang bersangkutan.

Berdasarkan hasil loading factor, variabel yang memiliki kontribusi positif terbesar pada PC1 adalah Experience_Level (0,439), Calories_Burned (0,437), Session_Duration (hours) (0,433), dan Workout_Frequency (days/week) (0,393). Selain itu, Water_Intake (liters) juga memberikan kontribusi positif yang cukup besar sebesar 0,279.

Sementara itu, variabel Fat_Percentage memiliki loading negatif terbesar (-0,410). Hal ini menunjukkan bahwa PC1 menggambarkan hubungan yang berlawanan antara tingkat aktivitas olahraga dan persentase lemak tubuh. Individu dengan durasi latihan yang lebih lama, frekuensi olahraga yang lebih tinggi, pengalaman olahraga yang lebih baik, serta jumlah kalori yang terbakar lebih besar cenderung memiliki persentase lemak tubuh yang lebih rendah.

Dengan demikian, PC1 dapat diinterpretasikan sebagai komponen aktivitas dan kebugaran fisik, karena didominasi oleh variabel yang berkaitan dengan intensitas dan konsistensi aktivitas olahraga

# Loading PC2
sort(loading_factor[,2], decreasing = TRUE)
##      Session_Duration..hours. Workout_Frequency..days.week. 
##                   0.179263501                   0.177891910 
##              Experience_Level               Calories_Burned 
##                   0.167962200                   0.092331922 
##                Fat_Percentage                   Resting_BPM 
##                   0.091304944                   0.028863254 
##                       Avg_BPM                           Age 
##                   0.021565615                   0.007090218 
##                       Max_BPM                    Height..m. 
##                  -0.075200294                  -0.271368768 
##         Water_Intake..liters.                           BMI 
##                  -0.324463154                  -0.536593654 
##                   Weight..kg. 
##                  -0.645981713

Pembahasan

Pada PC2, variabel yang memiliki kontribusi terbesar adalah Weight (kg) dengan loading sebesar -0,646 dan BMI sebesar -0,537. Selain itu, Water_Intake (liters) juga memiliki kontribusi negatif yang cukup besar yaitu -0,324.

Sebaliknya, variabel yang memberikan kontribusi positif terbesar adalah Session_Duration (hours) (0,179), Workout_Frequency (days/week) (0,178), dan Experience_Level (0,168), meskipun nilainya tidak sebesar kontribusi variabel berat badan dan BMI.

Hasil ini menunjukkan bahwa PC2 lebih menggambarkan karakteristik ukuran tubuh, terutama yang berkaitan dengan berat badan dan indeks massa tubuh (BMI). Individu dengan nilai PC2 yang rendah cenderung memiliki berat badan dan BMI yang lebih tinggi, sedangkan individu dengan nilai PC2 yang tinggi cenderung memiliki durasi latihan dan frekuensi olahraga yang lebih baik.

Kesimpulan Loading Factor

Secara keseluruhan, komponen utama pertama (PC1) merepresentasikan tingkat aktivitas dan kebugaran fisik anggota gym, yang ditunjukkan oleh tingginya kontribusi variabel seperti Calories_Burned, Session_Duration, Workout_Frequency, dan Experience_Level. Sementara itu, komponen utama kedua (PC2) lebih merepresentasikan karakteristik fisik tubuh, khususnya yang berkaitan dengan Weight (kg) dan BMI.

Dengan demikian, dua komponen utama pertama dapat digunakan untuk menggambarkan karakteristik utama anggota gym, yaitu aspek aktivitas olahraga dan aspek kondisi fisik tubuh.

# PLOT LOADING PC1

barplot(
  loading_factor[,1],
  las = 2,
  main = "Loading Factor PC1"
)

Pembahasan

Grafik Loading Factor PC1 menunjukkan kontribusi masing-masing variabel dalam membentuk komponen utama pertama (PC1). Semakin tinggi nilai loading factor, semakin besar pengaruh variabel tersebut terhadap komponen utama yang terbentuk.

Berdasarkan grafik, variabel Experience_Level, Calories_Burned, Session_Duration (hours), dan Workout_Frequency (days/week) memiliki nilai loading positif terbesar. Hal ini menunjukkan bahwa variabel-variabel tersebut menjadi faktor utama yang membentuk PC1. Selain itu, Water_Intake (liters) juga memberikan kontribusi positif yang cukup besar.

Sebaliknya, Fat_Percentage memiliki nilai loading negatif terbesar. Kondisi ini menunjukkan adanya hubungan yang berlawanan antara persentase lemak tubuh dengan tingkat aktivitas olahraga. Semakin tinggi durasi latihan, frekuensi olahraga, pengalaman berolahraga, dan jumlah kalori yang terbakar, maka persentase lemak tubuh cenderung lebih rendah.

Secara umum, PC1 dapat diinterpretasikan sebagai komponen yang menggambarkan tingkat aktivitas dan kebugaran fisik anggota gym.

# PLOT LOADING PC2

barplot(
  loading_factor[,2],
  las = 2,
  main = "Loading Factor PC2"
)

Pembahasan

Grafik Loading Factor PC2 menunjukkan kontribusi variabel terhadap pembentukan komponen utama kedua (PC2). Pada grafik terlihat bahwa variabel Weight (kg) memiliki nilai loading negatif terbesar, diikuti oleh BMI dan Water_Intake (liters).

Di sisi lain, variabel Session_Duration (hours), Workout_Frequency (days/week), dan Experience_Level memiliki nilai loading positif yang relatif lebih besar dibandingkan variabel lainnya.

Hasil tersebut menunjukkan bahwa PC2 lebih banyak dipengaruhi oleh karakteristik fisik tubuh, khususnya berat badan dan indeks massa tubuh (BMI). Individu dengan berat badan dan BMI yang lebih tinggi cenderung memiliki nilai PC2 yang lebih rendah, sedangkan individu yang memiliki durasi latihan lebih lama, frekuensi olahraga lebih tinggi, dan pengalaman olahraga yang lebih baik cenderung memiliki nilai PC2 yang lebih tinggi.

Kesimpulan Grafik Loading Factor

Berdasarkan kedua grafik, komponen utama pertama (PC1) lebih merepresentasikan aspek aktivitas olahraga dan kebugaran fisik yang ditunjukkan oleh tingginya kontribusi variabel Calories_Burned, Session_Duration, Workout_Frequency, dan Experience_Level. Sementara itu, komponen utama kedua (PC2) lebih menggambarkan karakteristik fisik tubuh yang didominasi oleh variabel Weight (kg) dan BMI.

Dengan demikian, dua komponen utama pertama mampu memberikan gambaran yang cukup baik mengenai karakteristik anggota gym, yaitu dari sisi aktivitas olahraga serta kondisi fisik tubuh.

# PLOT VARIABEL PCA

fviz_pca_var(
  hasil_pca,
  col.var = "contrib",
  gradient.cols = c("blue","yellow","red"),
  repel = TRUE
)

Pembahasan

Plot variabel PCA menunjukkan hubungan antara variabel asli dengan dua komponen utama pertama, yaitu PC1 dan PC2. Panjang panah menunjukkan besarnya kontribusi variabel terhadap pembentukan komponen utama, sedangkan arah panah menunjukkan hubungan antarvariabel.

Berdasarkan plot, variabel Session_Duration (hours), Calories_Burned, dan Experience_Level berada pada arah yang hampir sama di sisi kanan grafik. Hal ini menunjukkan bahwa ketiga variabel tersebut memiliki hubungan positif yang kuat. Dengan kata lain, individu yang memiliki durasi latihan lebih lama cenderung membakar lebih banyak kalori dan memiliki tingkat pengalaman olahraga yang lebih tinggi.

Variabel Workout_Frequency (days/week) dan Fat_Percentage berada pada sisi kiri grafik. Posisi yang berlawanan dengan Calories_Burned dan Session_Duration (hours) menunjukkan adanya kecenderungan hubungan negatif antara persentase lemak tubuh dengan indikator aktivitas olahraga. Semakin aktif seseorang berolahraga, persentase lemak tubuh cenderung lebih rendah.

Selain itu, variabel Weight (kg) dan BMI terletak berdekatan pada bagian bawah grafik. Posisi tersebut menunjukkan bahwa kedua variabel memiliki hubungan positif yang kuat karena sama-sama menggambarkan ukuran tubuh seseorang. Variabel Height (m) juga berada pada area yang relatif dekat dengan BMI dan berat badan, namun dengan arah yang sedikit berbeda.

Berdasarkan warna kontribusi (contrib), variabel seperti Session_Duration (hours), Calories_Burned, Weight (kg), dan BMI memiliki kontribusi yang relatif besar terhadap pembentukan dua komponen utama pertama.

# PLOT OBSERVASI

fviz_pca_ind(
  hasil_pca,
  repel = TRUE
)

Pembahasan

Plot individu PCA menunjukkan penyebaran seluruh anggota gym berdasarkan kombinasi nilai komponen utama pertama (PC1) dan komponen utama kedua (PC2). Setiap titik pada grafik mewakili satu individu dalam dataset.

Berdasarkan plot, sebagian besar individu tersebar di sekitar pusat grafik dan tidak membentuk kelompok yang terpisah secara jelas. Hal ini menunjukkan bahwa karakteristik anggota gym relatif beragam dan tidak terdapat pemisahan kelompok yang sangat kuat berdasarkan dua komponen utama pertama.

Meskipun demikian, terlihat beberapa individu berada cukup jauh dari pusat data. Individu-individu tersebut dapat dianggap memiliki karakteristik yang berbeda dibandingkan mayoritas anggota gym, misalnya dalam hal tingkat aktivitas olahraga, jumlah kalori yang terbakar, berat badan, atau nilai BMI.

Penyebaran titik yang cukup luas pada arah horizontal (PC1) menunjukkan bahwa variasi terbesar dalam data lebih banyak dijelaskan oleh komponen utama pertama. Hasil ini sejalan dengan proporsi variansi sebelumnya yang menunjukkan bahwa PC1 memiliki kontribusi terbesar, yaitu sebesar 30,8% dari total variasi data.

# BIPLOT PCA

fviz_pca_biplot(
  hasil_pca,
  repel = TRUE
)

Pembahasan

Biplot PCA merupakan visualisasi yang menggabungkan plot individu dan plot variabel dalam satu grafik. Grafik ini menunjukkan hubungan antarvariabel sekaligus penyebaran individu berdasarkan dua komponen utama pertama, yaitu PC1 dan PC2.

Berdasarkan biplot, variabel Session_Duration (hours), Calories_Burned, Workout_Frequency (days/week), dan Experience_Level mengarah ke arah yang hampir sama. Hal ini menunjukkan bahwa variabel-variabel tersebut memiliki hubungan positif yang kuat. Artinya, individu yang memiliki durasi latihan lebih lama cenderung membakar lebih banyak kalori, berolahraga lebih sering, dan memiliki tingkat pengalaman olahraga yang lebih tinggi.

Sebaliknya, variabel Fat_Percentage berada pada arah yang berlawanan dengan variabel aktivitas olahraga tersebut. Hal ini mengindikasikan adanya hubungan negatif, yaitu semakin tinggi aktivitas olahraga seseorang maka persentase lemak tubuh cenderung lebih rendah.

Selain itu, variabel Weight (kg) dan BMI berada pada posisi yang berdekatan sehingga menunjukkan hubungan positif yang kuat. Kedua variabel tersebut sama-sama menggambarkan karakteristik ukuran tubuh seseorang.

Secara umum, biplot menunjukkan bahwa komponen utama pertama (PC1) lebih banyak menggambarkan tingkat aktivitas dan kebugaran fisik, sedangkan komponen utama kedua (PC2) lebih berkaitan dengan karakteristik fisik tubuh seperti berat badan dan BMI.

# KONTRIBUSI VARIABEL KE PC1 DAN PC2

fviz_contrib(
  hasil_pca,
  choice = "var",
  axes = 1,
  top = 13
)

Pembahasan

Grafik kontribusi variabel terhadap Dimensi 1 menunjukkan variabel-variabel yang paling berperan dalam pembentukan komponen utama pertama (PC1). Garis putus-putus merah menunjukkan rata-rata kontribusi seluruh variabel. Variabel yang berada di atas garis tersebut dianggap memiliki kontribusi yang signifikan.

Berdasarkan grafik, variabel yang memberikan kontribusi terbesar terhadap PC1 adalah:

  • Experience_Level
  • Calories_Burned
  • Session_Duration (hours)
  • Fat_Percentage
  • Workout_Frequency (days/week)
  • Water_Intake (liters)

Variabel-variabel tersebut memiliki kontribusi di atas rata-rata sehingga menjadi faktor utama pembentuk PC1. Hasil ini menunjukkan bahwa PC1 merepresentasikan aspek aktivitas olahraga dan kebugaran fisik anggota gym. Semakin tinggi nilai komponen ini, semakin tinggi pula tingkat aktivitas olahraga, pengalaman latihan, serta jumlah kalori yang terbakar.

Sebaliknya, variabel seperti Age, Max_BPM, Avg_BPM, Resting_BPM, Height (m), dan BMI memiliki kontribusi yang relatif kecil terhadap pembentukan PC1.

fviz_contrib(
  hasil_pca,
  choice = "var",
  axes = 2,
  top = 13
)

Pembahasan

Grafik kontribusi variabel terhadap Dimensi 2 menunjukkan bahwa variabel yang paling dominan dalam membentuk PC2 adalah:

  • Weight (kg)
  • BMI
  • Water_Intake (liters)
  • Height (m)

Variabel Weight (kg) memiliki kontribusi terbesar, yaitu lebih dari 40%, diikuti oleh BMI dengan kontribusi sekitar 29%. Kedua variabel tersebut jauh melampaui garis rata-rata kontribusi sehingga menjadi faktor utama pembentuk komponen utama kedua.

Selain itu, Water_Intake (liters) dan Height (m) juga memberikan kontribusi yang cukup besar terhadap PC2. Sementara itu, variabel seperti Calories_Burned, Fat_Percentage, Max_BPM, Avg_BPM, Resting_BPM, dan Age memiliki kontribusi yang relatif kecil.

Hasil ini menunjukkan bahwa PC2 lebih banyak menggambarkan karakteristik fisik tubuh anggota gym, terutama yang berkaitan dengan berat badan, tinggi badan, dan indeks massa tubuh (BMI).

Kesimpulan PCA

Berdasarkan hasil Principal Component Analysis (PCA), diperoleh 13 komponen utama yang merupakan transformasi dari 13 variabel numerik pada dataset anggota gym. Hasil analisis menunjukkan bahwa komponen utama pertama (PC1) mampu menjelaskan 30,8% variasi data, sedangkan komponen utama kedua (PC2) menjelaskan 16,1% variasi data. Secara kumulatif, kedua komponen tersebut mampu menjelaskan 46,9% variasi total data. Sementara itu, enam komponen utama pertama mampu menjelaskan 81,54% variasi total data sehingga sebagian besar informasi pada data asli tetap dapat dipertahankan meskipun dimensi data direduksi.

Berdasarkan scree plot dan kriteria Kaiser (eigenvalue > 1), terdapat enam komponen utama yang layak dipertahankan, yaitu PC1 hingga PC6. Hal ini menunjukkan bahwa reduksi dimensi dari 13 variabel menjadi 6 komponen utama dapat dilakukan tanpa kehilangan informasi yang signifikan.

Hasil loading factor, biplot, dan kontribusi variabel menunjukkan bahwa komponen utama pertama (PC1) didominasi oleh variabel Experience_Level, Calories_Burned, Session_Duration (hours), Workout_Frequency (days/week), dan Water_Intake (liters), serta berhubungan negatif dengan Fat_Percentage. Oleh karena itu, PC1 dapat diinterpretasikan sebagai komponen yang menggambarkan tingkat aktivitas olahraga dan kebugaran fisik anggota gym. Individu dengan nilai PC1 yang tinggi cenderung memiliki durasi latihan lebih lama, frekuensi olahraga lebih tinggi, pengalaman olahraga yang lebih baik, serta jumlah kalori yang terbakar lebih besar.

Sementara itu, komponen utama kedua (PC2) didominasi oleh variabel Weight (kg), BMI, Height (m), dan Water_Intake (liters). Komponen ini lebih menggambarkan karakteristik fisik tubuh anggota gym, khususnya yang berkaitan dengan ukuran tubuh dan komposisi fisik.

Visualisasi PCA menunjukkan bahwa variabel-variabel yang berkaitan dengan aktivitas olahraga cenderung saling berhubungan positif, sedangkan variabel Fat_Percentage memiliki kecenderungan hubungan yang berlawanan dengan indikator aktivitas olahraga. Selain itu, variabel Weight (kg) dan BMI memiliki hubungan yang kuat karena berada pada arah yang berdekatan pada biplot.

Secara keseluruhan, PCA berhasil menyederhanakan struktur data dengan merangkum informasi dari 13 variabel numerik ke dalam beberapa komponen utama yang lebih ringkas. Komponen utama pertama merepresentasikan aspek aktivitas dan kebugaran fisik, sedangkan komponen utama kedua merepresentasikan karakteristik fisik tubuh. Dengan demikian, PCA efektif digunakan sebagai metode ekstraksi fitur karena mampu mengurangi kompleksitas data sekaligus mempertahankan sebagian besar informasi penting yang terkandung dalam dataset.

6. Insight dan Kesimpulan

Variabel apa yang paling penting?

Berdasarkan hasil analisis menggunakan korelasi, feature selection, dan Principal Component Analysis (PCA), variabel yang paling penting dalam dataset adalah Session_Duration (hours). Variabel ini memiliki korelasi tertinggi terhadap Calories_Burned yaitu sebesar 0,908, menunjukkan bahwa semakin lama durasi latihan maka semakin besar jumlah kalori yang terbakar.

Pada metode feature selection, hasil LASSO menunjukkan bahwa Session_Duration tetap dipertahankan dalam model dengan koefisien positif yang cukup besar, menandakan bahwa variabel tersebut memiliki kontribusi penting dalam menjelaskan variasi Calories_Burned. Selain itu, variabel Avg_BPM, Resting_BPM, HR_Efficiency, dan Calorie_per_Hour juga terpilih sebagai variabel yang informatif. Sementara itu, metode Stepwise memilih HR_Efficiency, Avg_BPM, Resting_BPM, dan Calorie_per_Hour sebagai kombinasi variabel terbaik berdasarkan kriteria AIC. Hal ini menunjukkan bahwa faktor efisiensi detak jantung dan intensitas latihan memiliki pengaruh yang kuat terhadap pembakaran kalori.

Selain Session_Duration, variabel penting lainnya adalah Experience_Level, Workout_Frequency (days/week), Fat_Percentage, dan Avg_BPM. Experience_Level dan Workout_Frequency memiliki hubungan positif yang kuat terhadap aktivitas olahraga, sedangkan Fat_Percentage menunjukkan hubungan negatif yang cukup kuat. Hal ini mengindikasikan bahwa individu yang lebih berpengalaman dan lebih sering berolahraga cenderung memiliki persentase lemak tubuh yang lebih rendah serta membakar kalori lebih banyak.

Hasil PCA memperkuat temuan tersebut. Pada komponen utama pertama (PC1), variabel dengan loading terbesar adalah Experience_Level (0,439), Calories_Burned (0,437), Session_Duration (0,433), Workout_Frequency (0,393), dan Fat_Percentage (-0,410). Oleh karena itu, PC1 dapat diinterpretasikan sebagai komponen aktivitas dan kebugaran fisik. Sementara itu, PC2 didominasi oleh Weight (kg) dan BMI yang lebih merepresentasikan karakteristik fisik tubuh.

Secara keseluruhan, Session_Duration (hours) dapat dianggap sebagai variabel paling penting dalam dataset karena secara konsisten muncul sebagai variabel dominan pada analisis korelasi, feature selection, maupun PCA. Temuan ini menunjukkan bahwa lamanya durasi latihan merupakan faktor utama yang memengaruhi tingkat pembakaran kalori dan kebugaran anggota gym.

Apakah reduksi dimensi berhasil?

Berdasarkan hasil Principal Component Analysis (PCA), reduksi dimensi dapat dinyatakan berhasil. Hal ini ditunjukkan oleh kemampuan enam komponen utama pertama (PC1–PC6) dalam menjelaskan 81,54% variasi total data. Dengan demikian, jumlah dimensi berhasil disederhanakan dari 13 variabel numerik menjadi 6 komponen utama tanpa kehilangan sebagian besar informasi yang terkandung dalam data.

Selain itu, berdasarkan kriteria Kaiser, hanya enam komponen yang memiliki eigenvalue lebih besar dari 1 sehingga layak dipertahankan. Hasil scree plot juga menunjukkan bahwa setelah komponen keenam, tambahan variasi yang dijelaskan oleh komponen berikutnya relatif kecil. Oleh karena itu, penggunaan enam komponen utama sudah cukup representatif untuk menggambarkan karakteristik data secara keseluruhan.

Keberhasilan reduksi dimensi ini menunjukkan bahwa PCA mampu mengurangi kompleksitas data sekaligus mempertahankan informasi penting, sehingga analisis menjadi lebih sederhana dan efisien tanpa mengurangi kualitas informasi secara signifikan.

Apa makna substantif dari principal components?

Makna substantif dari principal components dapat dijelaskan berdasarkan variabel-variabel yang memiliki loading factor terbesar. Komponen utama pertama (PC1) merepresentasikan tingkat aktivitas dan kebugaran fisik anggota gym karena didominasi oleh variabel Experience_Level, Session_Duration, Workout_Frequency, dan Calories_Burned, serta berhubungan negatif dengan Fat_Percentage. Dengan demikian, PC1 menggambarkan seberapa aktif dan bugar seorang anggota gym.

Sementara itu, komponen utama kedua (PC2) merepresentasikan karakteristik fisik tubuh anggota gym karena didominasi oleh variabel Weight (kg), BMI, dan Water_Intake. Komponen ini menggambarkan perbedaan ukuran dan komposisi tubuh antar anggota gym.

Secara keseluruhan, PCA menunjukkan bahwa karakteristik anggota gym dapat diringkas ke dalam dua dimensi utama, yaitu aspek aktivitas dan kebugaran fisik (PC1) serta aspek kondisi fisik tubuh (PC2). Kedua komponen tersebut mampu menggambarkan struktur utama data secara lebih sederhana tanpa kehilangan sebagian besar informasi penting.

Insight apa yang diperoleh dari data?

1. Durasi Latihan Merupakan Faktor yang Paling Penting

Berdasarkan hasil analisis korelasi, variabel Session_Duration (hours) memiliki korelasi tertinggi dengan Calories_Burned yaitu sebesar \(r = 0.908\). Selain itu, variabel ini juga menjadi salah satu kontributor utama pada komponen utama pertama (PC1). Temuan ini menunjukkan bahwa semakin lama durasi latihan yang dilakukan anggota gym, semakin besar jumlah kalori yang dapat dibakar selama sesi latihan.

2. Anggota yang Lebih Berpengalaman Cenderung Lebih Bugar

Variabel Experience_Level memiliki hubungan positif yang kuat dengan Workout_Frequency (days/week) (\(r = 0.837\)) dan Session_Duration (hours) (\(r = 0.765\)), serta hubungan negatif dengan Fat_Percentage (\(r = -0.654\)). Hasil ini menunjukkan bahwa anggota gym yang lebih berpengalaman cenderung berlatih lebih sering, memiliki durasi latihan yang lebih panjang, dan memiliki persentase lemak tubuh yang lebih rendah dibandingkan anggota yang kurang berpengalaman.

3. Persentase Lemak Tubuh Berhubungan Negatif dengan Kebugaran

Variabel Fat_Percentage memiliki hubungan negatif terhadap Calories_Burned, Session_Duration (hours), dan Experience_Level. Hal ini mengindikasikan bahwa individu yang lebih aktif berolahraga dan memiliki tingkat kebugaran yang lebih baik cenderung memiliki persentase lemak tubuh yang lebih rendah. Dengan kata lain, aktivitas olahraga yang konsisten berkontribusi terhadap komposisi tubuh yang lebih sehat.

4. Terdapat Informasi yang Tumpang Tindih pada Weight dan BMI

Hasil analisis multikolinearitas menunjukkan bahwa variabel Weight (kg) dan BMI memiliki korelasi yang sangat kuat serta nilai VIF yang tinggi. Kondisi ini menunjukkan bahwa kedua variabel membawa informasi yang hampir sama sehingga menyebabkan redundansi informasi dalam dataset. Oleh karena itu, diperlukan proses feature selection maupun reduksi dimensi untuk menyederhanakan struktur data.

5. Karakteristik Anggota Gym Dapat Diringkas Menjadi Dua Aspek Utama

Hasil Principal Component Analysis (PCA) menunjukkan bahwa sebagian besar variasi data dapat dijelaskan oleh dua komponen utama:

  • PC1 (Aktivitas dan Kebugaran Fisik), yang didominasi oleh variabel Session_Duration (hours), Calories_Burned, Workout_Frequency (days/week), dan Experience_Level.
  • PC2 (Karakteristik Fisik Tubuh), yang didominasi oleh variabel Weight (kg) dan BMI.

Temuan ini menunjukkan bahwa karakteristik anggota gym pada dasarnya dapat dipahami melalui dua dimensi utama, yaitu tingkat aktivitas olahraga dan kondisi fisik tubuh.

6. Reduksi Dimensi Berhasil Dilakukan

Hasil PCA menunjukkan bahwa 13 variabel numerik dapat direduksi menjadi 6 komponen utama yang mampu mempertahankan 81,54% variasi total data. Hal ini menunjukkan bahwa sebagian besar informasi penting dalam dataset tetap dapat dipertahankan meskipun jumlah dimensi data berhasil dikurangi secara signifikan.

Kesimpulan

Berdasarkan seluruh tahapan analisis yang telah dilakukan, variabel yang paling berpengaruh dalam menggambarkan kebugaran anggota gym adalah Session_Duration (hours), Experience_Level, Workout_Frequency (days/week), dan Fat_Percentage. Hasil feature selection dan PCA menunjukkan bahwa tidak semua variabel memiliki kontribusi yang sama penting, sehingga reduksi dimensi diperlukan untuk memperoleh representasi data yang lebih sederhana dan efisien.

Analisis PCA berhasil mereduksi 13 variabel numerik menjadi 6 komponen utama dengan tetap mempertahankan 81,54% variasi data. Komponen utama pertama merepresentasikan aspek aktivitas dan kebugaran fisik, sedangkan komponen utama kedua merepresentasikan karakteristik fisik tubuh. Dengan demikian, PCA terbukti efektif dalam menyederhanakan struktur data tanpa kehilangan sebagian besar informasi penting yang terkandung dalam dataset.

Secara keseluruhan, hasil analisis menunjukkan bahwa anggota gym yang lebih aktif, lebih berpengalaman, dan memiliki durasi latihan yang lebih panjang cenderung membakar lebih banyak kalori serta memiliki persentase lemak tubuh yang lebih rendah. Temuan ini memberikan gambaran bahwa konsistensi dan intensitas latihan merupakan faktor utama yang berperan dalam meningkatkan kebugaran fisik anggota gym.