EKSPLORASI DAN REDUKSI BODY PERFORMANCE DATA

DESKRIPSI DATASET

Sumber Dataset

Dataset yang digunakan dalam project ini adalah Body Performance Data yang diperoleh dari platform Kaggle, yaitu platform penyedia dan berbagi dataset yang banyak dimanfaatkan oleh peneliti maupun praktisi di bidang ilmu data. Dataset tersebut diunggah oleh pengguna bernama kukuroo3 pada tahun 2022 dan tersedia secara publik melalui Body Performance Data Dataset. Dataset ini memuat berbagai informasi terkait kondisi fisik dan tingkat kebugaran tubuh manusia, yang mencakup beragam indikator kesehatan serta kemampuan fisik individu.

Keberagaman variabel dalam dataset menjadikannya memiliki karakteristik multidimensi yang sesuai untuk dilakukan eksplorasi data secara mendalam, baik untuk memahami distribusi data, mengidentifikasi pola, maupun menganalisis hubungan antarvariabel. Selain itu, adanya sejumlah fitur yang saling berhubungan menyebabkan perlunya penerapan reduksi dimensi guna menyederhanakan struktur data, mengurangi redundansi informasi, serta meningkatkan efisiensi analisis tanpa menghilangkan informasi penting yang terkandung di dalamnya. Oleh karena itu, dataset ini dinilai relevan dan tepat digunakan dalam project yang berfokus pada eksplorasi data dan reduksi dimensi sebagai bagian penting dalam analisis kebugaran tubuh manusia.

Jumlah Observasi

Dataset Body Performance Data memiliki 13.393 baris data, di mana setiap baris merepresentasikan satu individu sebagai unit observasi. Jumlah observasi yang relatif besar tersebut dinilai cukup memadai untuk mendukung analisis yang representatif serta menghasilkan kesimpulan yang lebih reliabel. Dengan banyaknya data yang tersedia, proses eksplorasi dapat dilakukan secara lebih komprehensif, mulai dari mengidentifikasi distribusi data, mendeteksi pencilan (outlier), hingga mengamati pola dan kecenderungan yang muncul dalam dataset.

Selain itu, ukuran dataset yang besar juga memberikan keuntungan dalam proses reduksi dimensi. Semakin banyak observasi yang dimiliki, maka struktur data dan hubungan antarvariabel dapat tergambarkan dengan lebih baik, sehingga hasil reduksi dimensi yang diperoleh menjadi lebih akurat, stabil, dan informatif.

Jumlah Variabel

Dataset Body Performance Data terdiri atas 12 variabel dengan karakteristik sebagai berikut:

library(knitr)
library(kableExtra)
variabel <- data.frame(
  "No" = 1:12,
  "Nama Variabel" = c(
    "age",
    "gender",
    "height_cm",
    "weight_kg",
    "body fat_%",
    "diastolic",
    "systolic",
    "gripForce",
    "sit and bend forward_cm",
    "sit-ups counts",
    "broad jump_cm",
    "class"
  ),
  "Tipe Data" = c(
    "Numerik",
    "Kategorikal",
    "Numerik",
    "Numerik",
    "Numerik",
    "Numerik",
    "Numerik",
    "Numerik",
    "Numerik",
    "Numerik",
    "Numerik",
    "Kategorikal"
  ),
  "Keterangan" = c(
    "Umur responden dalam satuan tahun",
    "Jenis kelamin responden (M = laki-laki, F = perempuan)",
    "Tinggi badan dalam sentimeter",
    "Berat badan dalam kilogram",
    "Persentase lemak tubuh",
    "Tekanan darah diastolik (mmHg)",
    "Tekanan darah sistolik (mmHg)",
    "Kekuatan genggaman tangan (kg)",
    "Tingkat fleksibilitas tubuh berdasarkan jarak membungkuk ke depan (cm)",
    "Jumlah gerakan sit-up yang dapat dilakukan",
    "Jarak lompatan jauh tanpa awalan (cm)",
    "Kategori tingkat performa fisik (A, B, C, D)"
  ),
  check.names = FALSE
)

kable(
  variabel,
  caption = "Deskripsi Variabel Dataset Body Performance Data",
  align = "c"
) %>%
  kable_styling(full_width = FALSE) %>%
  row_spec(0, align = "c")
Deskripsi Variabel Dataset Body Performance Data
No Nama Variabel Tipe Data Keterangan
1 age Numerik Umur responden dalam satuan tahun
2 gender Kategorikal Jenis kelamin responden (M = laki-laki, F = perempuan)
3 height_cm Numerik Tinggi badan dalam sentimeter
4 weight_kg Numerik Berat badan dalam kilogram
5 body fat_% Numerik Persentase lemak tubuh
6 diastolic Numerik Tekanan darah diastolik (mmHg)
7 systolic Numerik Tekanan darah sistolik (mmHg)
8 gripForce Numerik Kekuatan genggaman tangan (kg)
9 sit and bend forward_cm Numerik Tingkat fleksibilitas tubuh berdasarkan jarak membungkuk ke depan (cm)
10 sit-ups counts Numerik Jumlah gerakan sit-up yang dapat dilakukan
11 broad jump_cm Numerik Jarak lompatan jauh tanpa awalan (cm)
12 class Kategorikal Kategori tingkat performa fisik (A, B, C, D)

Secara keseluruhan, dataset ini memiliki 10 variabel numerik dan 2 variabel kategorikal, yaitu gender dan class. Variabel class digunakan sebagai variabel target yang terdiri atas empat kategori performa fisik, di mana kategori A menunjukkan performa fisik terbaik, sedangkan kategori D menunjukkan performa fisik terendah.

Tujuan Analisis

Project ini bertujuan untuk melakukan eksplorasi serta reduksi data secara komprehensif pada dataset Body Performance Data guna memperoleh pemahaman yang lebih mendalam mengenai karakteristik dan struktur data kebugaran fisik manusia. Tahap awal penelitian dilakukan melalui Exploratory Data Analysis (EDA) yang meliputi analisis statistik deskriptif, visualisasi data, pengujian hubungan antarvariabel melalui analisis korelasi, identifikasi multikolinearitas, serta penanganan missing value dan outlier. Tahapan tersebut dilakukan untuk memberikan gambaran menyeluruh terkait kondisi, pola, dan kualitas data yang digunakan.

Selanjutnya, dilakukan proses feature engineering dengan membentuk fitur-fitur baru yang dianggap relevan berdasarkan variabel yang tersedia. Setiap fitur yang dihasilkan disertai dengan alasan pembentukan dan interpretasi guna mendukung pemahaman terhadap informasi yang terkandung dalam data. Setelah itu, dilakukan feature selection menggunakan sedikitnya dua metode berbeda untuk menentukan variabel yang paling berpengaruh sekaligus mengurangi variabel yang kurang relevan, sehingga data menjadi lebih sederhana dan efisien untuk dianalisis.

Tahap akhir project dilakukan melalui feature extraction menggunakan metode Principal Component Analysis (PCA) yang bertujuan untuk mereduksi dimensi data. Analisis PCA mencakup interpretasi variasi komponen utama, loading factor, serta visualisasi hasil PCA secara keseluruhan. Secara umum, seluruh rangkaian analisis ini dilakukan untuk memperoleh pemahaman yang lebih baik mengenai faktor-faktor yang memengaruhi tingkat performa fisik seseorang berdasarkan berbagai indikator kesehatan dan kebugaran yang terdapat dalam dataset.

EXPLORATORY DATA ANALYSIS (EDA)

Statistik Deskriptif

Sebelum memasuki tahap analisis lanjutan, dilakukan terlebih dahulu proses pemanggilan library yang diperlukan serta import dataset ke dalam software R. Library readxl digunakan untuk membaca dataset dengan format Excel, sedangkan library psych dimanfaatkan untuk memperoleh hasil statistik deskriptif yang lebih rinci. Selanjutnya, dataset dimuat dari file bodyPerformance.xlsx, kemudian struktur data diperiksa menggunakan fungsi str() guna memastikan tipe data pada setiap variabel telah sesuai sebelum dilakukan analisis lebih lanjut.

# Memanggil library
library(readxl)
library(psych)

# Import data
data <- read_excel("bodyPerformance.xlsx")

# Melihat struktur data
str(data)
## tibble [13,393 × 12] (S3: tbl_df/tbl/data.frame)
##  $ age                    : num [1:13393] 27 25 31 32 28 36 42 33 54 28 ...
##  $ gender                 : chr [1:13393] "M" "M" "M" "M" ...
##  $ height_cm              : num [1:13393] 172 165 180 174 174 ...
##  $ weight_kg              : num [1:13393] 75.2 55.8 78 71.1 67.7 ...
##  $ body fat_%             : num [1:13393] 21.3 15.7 20.1 18.4 17.1 22 32.2 36.9 27.6 14.4 ...
##  $ diastolic              : num [1:13393] 80 77 92 76 70 64 72 84 85 81 ...
##  $ systolic               : num [1:13393] 130 126 152 147 127 119 135 137 165 156 ...
##  $ gripForce              : num [1:13393] 54.9 36.4 44.8 41.4 43.5 23.8 22.7 45.9 40.4 57.9 ...
##  $ sit and bend forward_cm: num [1:13393] 18.4 16.3 12 15.2 27.1 21 0.8 12.3 18.6 12.1 ...
##  $ sit-ups counts         : num [1:13393] 60 53 49 53 45 27 18 42 34 55 ...
##  $ broad jump_cm          : num [1:13393] 217 229 181 219 217 153 146 234 148 213 ...
##  $ class                  : chr [1:13393] "C" "A" "C" "B" ...
# Statistik deskriptif 
describe(data)
##                         vars     n   mean    sd median trimmed   mad   min
## age                        1 13393  36.78 13.63   32.0   35.59 13.34  21.0
## gender*                    2 13393   1.63  0.48    2.0    1.67  0.00   1.0
## height_cm                  3 13393 168.56  8.43  169.2  168.73  9.04 125.0
## weight_kg                  4 13393  67.45 11.95   67.4   67.06 12.66  26.3
## body fat_%                 5 13393  23.24  7.26   22.8   23.00  7.41   3.0
## diastolic                  6 13393  78.80 10.74   79.0   78.92 11.86   0.0
## systolic                   7 13393 130.23 14.71  130.0  130.23 14.83   0.0
## gripForce                  8 13393  36.96 10.62   37.9   36.87 12.90   0.0
## sit and bend forward_cm    9 13393  15.21  8.46   16.2   15.80  7.26 -25.0
## sit-ups counts            10 13393  39.77 14.28   41.0   40.54 14.83   0.0
## broad jump_cm             11 13393 190.13 39.87  193.0  191.86 43.00   0.0
## class*                    12 13393   2.50  1.12    3.0    2.50  1.48   1.0
##                           max range  skew kurtosis   se
## age                      64.0  43.0  0.60    -1.02 0.12
## gender*                   2.0   1.0 -0.55    -1.70 0.00
## height_cm               193.8  68.8 -0.19    -0.43 0.07
## weight_kg               138.1 111.8  0.35     0.17 0.10
## body fat_%               78.4  75.4  0.36     0.13 0.06
## diastolic               156.2 156.2 -0.16     0.36 0.09
## systolic                201.0 201.0 -0.05     0.38 0.13
## gripForce                70.5  70.5  0.02    -0.82 0.09
## sit and bend forward_cm 213.0 238.0  0.79    35.20 0.07
## sit-ups counts           80.0  80.0 -0.47    -0.16 0.12
## broad jump_cm           303.0 303.0 -0.42     0.00 0.34
## class*                    4.0   3.0  0.00    -1.36 0.01

Berdasarkan hasil output str(), dataset memiliki 13.393 observasi dengan 12 variabel. Mayoritas variabel bertipe numerik (num), sedangkan variabel gender dan class bertipe karakter (chr) sehingga perlu dilakukan konversi tipe data apabila akan digunakan pada analisis tertentu.

Hasil statistik deskriptif menggunakan fungsi describe() menunjukkan bahwa rata-rata usia responden sebesar 36,78 tahun dengan standar deviasi 13,63, yang menandakan variasi usia responden cukup beragam. Variabel height_cm memiliki rata-rata 168,56 cm, sedangkan weight_kg memiliki rata-rata 67,45 kg. Persentase lemak tubuh (body fat_%) rata-rata tercatat sebesar 23,24%.

Selain itu, rata-rata tekanan darah diastolik dan sistolik masing-masing sebesar 78,80 mmHg dan 130,23 mmHg. Pada aspek kebugaran fisik, rata-rata kekuatan genggaman (gripForce) adalah 36,96 kg, fleksibilitas tubuh (sit and bend forward_cm) sebesar 15,21 cm, jumlah sit-up sebanyak 39,77 kali, serta kemampuan lompat jauh (broad jump_cm) rata-rata mencapai 190,13 cm.

Ditinjau dari karakteristik distribusinya, variabel sit and bend forward_cm memiliki nilai kurtosis yang sangat tinggi, yaitu 35,20. Hal tersebut mengindikasikan adanya kemungkinan outlier ekstrem pada variabel tersebut sehingga perlu diperhatikan lebih lanjut pada tahap analisis berikutnya.

Visualisasi

Setelah memperoleh gambaran awal melalui statistik deskriptif, tahapan berikutnya adalah melakukan visualisasi data guna memperdalam pemahaman terhadap karakteristik serta distribusi masing-masing variabel pada dataset. Visualisasi data menjadi komponen penting dalam proses eksplorasi data karena mampu menampilkan pola, persebaran, maupun hubungan antarvariabel secara lebih intuitif dan mudah dipahami dibandingkan hanya melalui penyajian statistik numerik.

Pada project ini, visualisasi dilakukan menggunakan library ggplot2 dan patchwork pada software R. Jenis visualisasi yang digunakan disesuaikan dengan karakteristik data masing-masing variabel. Histogram diterapkan untuk melihat distribusi variabel numerik, yaitu age, gripForce, sit-ups counts, dan broad jump_cm. Selanjutnya, bar chart digunakan untuk menggambarkan distribusi variabel kategorikal gender dan class. Scatter plot digunakan untuk mengamati hubungan antara height_cm dengan weight_kg, serta diastolic dengan systolic. Selain itu, boxplot digunakan untuk mendeteksi keberadaan outlier pada variabel body fat_% dan sit and bend forward_cm.

# Memanggil library
library(ggplot2)
library(patchwork)

# HISTOGRAM
age <- ggplot(data, aes(x = age)) +
  geom_histogram(bins = 20,
                 fill = "skyblue",
                 color = "black") +
  labs(title = "Age") +
  theme_minimal()
gripforce <- ggplot(data, aes(x = gripForce)) +
  geom_histogram(bins = 20,
                 fill = "purple",
                 color = "black") +
  labs(title = "Grip Force") +
  theme_minimal()
situps <- ggplot(data, aes(x = `sit-ups counts`)) +
  geom_histogram(bins = 20,
                 fill = "cyan",
                 color = "black") +
  labs(title = "Sit Ups Counts") +
  theme_minimal()
broadjump <- ggplot(data, aes(x = `broad jump_cm`)) +
  geom_histogram(bins = 20,
                 fill = "gold",
                 color = "black") +
  labs(title = "Broad Jump") +
  theme_minimal()
(age | gripforce) / (situps | broadjump)

Secara umum, rangkaian visualisasi data ini memberikan gambaran yang menyeluruh mengenai karakteristik demografi serta performa fisik subjek penelitian. Variabel Age menunjukkan distribusi yang condong ke kanan (right-skewed), dengan dominasi individu pada kelompok usia awal 20-an tahun, kemudian menurun secara bertahap dan cenderung stabil pada usia pertengahan.

Pada variabel Grip Force, terlihat pola distribusi bimodal dengan dua puncak utama pada rentang nilai sekitar 25 dan 45, yang secara statistik mengindikasikan adanya pengelompokan alami dalam populasi, kemungkinan berkaitan dengan perbedaan karakteristik fisiologis antara subjek laki-laki dan perempuan.

Berbeda dengan itu, variabel yang merepresentasikan daya tahan dan kekuatan eksplosif menunjukkan konsentrasi nilai pada tingkat yang relatif tinggi. Hal ini tercermin pada Sit Ups Counts yang mendekati distribusi normal dengan pusat sebaran di kisaran 35 hingga 50 repetisi, serta Broad Jump yang memperlihatkan distribusi miring ke kiri (left-skewed) dengan dominasi nilai lompatan pada rentang 200 hingga 230 cm.

Walaupun sebagian besar subjek memiliki tingkat kebugaran fisik yang tergolong baik, kedua variabel tersebut tetap menunjukkan ekor distribusi di sisi bawah, yang menandakan adanya sejumlah kecil individu dengan performa di bawah rata-rata (outlier rendah) dan berpotensi memerlukan perhatian khusus dalam analisis tingkat kebugaran.

# BAR CHART
gender <- ggplot(data, aes(x = gender)) +
  geom_bar(fill = "orange") +
  labs(title = "Gender") +
  theme_minimal()

class <- ggplot(data, aes(x = class)) +
  geom_bar(fill = "darkgreen") +
  labs(title = "Class") +
  theme_minimal()

gender | class

Panel visualisasi data kategorik ini menyajikan informasi mengenai struktur demografi berdasarkan jenis kelamin serta distribusi tingkat kebugaran subjek dalam dataset. Pada grafik Gender, terlihat bahwa komposisi data tidak seimbang (unbalanced), di mana jumlah subjek laki-laki (M) jauh lebih besar, yakni lebih dari 8.000 individu, dibandingkan dengan subjek perempuan (F) yang hanya berada pada kisaran 5.000 individu.

Sebaliknya, grafik Class menunjukkan pola distribusi yang relatif merata (uniform distribution), dengan jumlah subjek pada setiap kategori kebugaran Kelas A, B, C, dan D yang hampir seimbang, masing-masing sekitar 3.300 individu. Keseimbangan distribusi pada variabel kelas ini secara statistik menunjukkan bahwa proses pengelompokan tingkat kebugaran dilakukan secara objektif, kemungkinan berdasarkan pendekatan kuartil, sehingga tidak terjadi dominasi pada salah satu kategori tertentu.

# SCATTER PLOT
heightweight <- ggplot(data, aes(x = height_cm,
                       y = weight_kg)) +
  geom_point(color = "blue",
             alpha = 0.5) +
  geom_smooth(method = "lm",
              se = FALSE,
              color = "black") +
  labs(title = "Height vs Weight") +
  theme_minimal()

diassys <- ggplot(data, aes(x = diastolic,
                       y = systolic)) +
  geom_point(color = "red",
             alpha = 0.5) +
  geom_smooth(method = "lm",
              se = FALSE,
              color = "black") +
  labs(title = "Diastolic vs Systolic") +
  theme_minimal()

heightweight | diassys

Kedua grafik menunjukkan hubungan positif yang cukup jelas, baik pada ukuran tubuh maupun tekanan darah subjek. Pada grafik Height vs Weight, terlihat bahwa tinggi badan dan berat badan saling berkaitan—semakin tinggi seseorang, umumnya semakin besar pula berat badannya. Titik-titik data mengikuti pola yang naik, meskipun pada tinggi di atas 175 cm sebarannya menjadi lebih bervariasi.

Sementara itu, pada grafik Diastolic vs Systolic, tekanan darah sistolik dan diastolik juga menunjukkan hubungan searah, yaitu ketika sistolik meningkat, diastolik cenderung ikut meningkat. Terdapat kumpulan data yang cukup rapat di sekitar batas 160 (sistolik) dan 100 (diastolik), yang kemungkinan menunjukkan adanya batas pengukuran atau standardisasi alat. Selain itu, ada beberapa titik yang menyimpang dari pola utama, termasuk nilai yang mendekati nol, yang kemungkinan besar disebabkan oleh kesalahan pencatatan atau data yang tidak valid.

# BOXPLOT
bodyfat <- ggplot(data, aes(y = `body fat_%`)) +
  geom_boxplot(fill = "lightgreen") +
  labs(title = "Body Fat") +
  theme_minimal()

sitandbend <- ggplot(data, aes(y = `sit and bend forward_cm`)) +
  geom_boxplot(fill = "salmon") +
  labs(title = "Sit and Bend Forward") +
  theme_minimal()

bodyfat | sitandbend

Panel grafik boxplot ini digunakan untuk menganalisis rentang variasi data sekaligus mendeteksi keberadaan nilai ekstrem (outlier) pada variabel persentase lemak tubuh dan kelenturan subjek. Pada grafik pertama (Body Fat), terlihat bahwa sebagian besar data (50% populasi tengah) berkumpul secara stabil di rentang kuartil berkisar antara 18% hingga 28%, dengan nilai median (garis tengah kotak) berada pada kisaran 23%. Grafik ini menunjukkan adanya tumpukan titik outlier yang cukup banyak di sisi atas (nilai ekstrem tinggi), bahkan ada satu titik data yang sangat jauh menyimpang hingga mendekati angka 80%.

Sementara itu, grafik kedua (Sit and Bend Forward) menunjukkan kotak sebaran data kelenturan yang sangat tipis dan memusat di rentang nilai yang rendah, yaitu sekitar 10 hingga 22 cm. Kondisi kotak yang tipis ini secara statistika mengonfirmasi karakteristik data yang memiliki tingkat keruncingan tinggi (kurtosis tinggi), di mana mayoritas subjek memiliki tingkat kelenturan yang seragam. Namun, akibat dari keruncingan tersebut, grafik ini menghasilkan nilai ekstrem (outlier) yang sangat masif di kedua ujungnya. Di sisi bawah, terdapat tumpukan outlier tebal yang bahkan menembus nilai minus (di bawah 0), sementara di sisi atas terdapat beberapa outlier yang sangat ekstrem hingga mencapai jarak 180 dan 210 cm. Keberadaan nilai-nilai yang terlalu jauh dari klaster utama pada kedua grafik ini mengindikasikan adanya variasi performa fisik yang sangat kontras antar-subjek, atau potensi adanya kesalahan penulisan satuan saat menginput data ke dalam sistem.

Analisis Korelasi

Setelah tahap visualisasi data dilakukan, langkah berikutnya adalah analisis korelasi yang bertujuan untuk mengukur kekuatan sekaligus arah hubungan antar variabel numerik dalam dataset. Analisis ini menjadi bagian penting dalam eksplorasi data karena mampu memberikan gambaran awal mengenai variabel-variabel yang saling berhubungan, sehingga dapat dijadikan dasar pertimbangan pada tahap analisis selanjutnya. Nilai korelasi berada pada rentang -1 hingga 1, di mana nilai yang mendekati 1 menunjukkan hubungan positif yang kuat, nilai yang mendekati -1 menunjukkan hubungan negatif yang kuat, sedangkan nilai yang mendekati 0 mengindikasikan tidak adanya hubungan linear yang berarti antar variabel. Pada tahap ini, hasil analisis korelasi ditampilkan dalam bentuk heatmap korelasi untuk memudahkan pengamatan dan interpretasi hubungan antar variabel secara komprehensif.

# Library yang Dibutuhkan
library(tidyverse)  
library(corrplot)   

# Memilih hanya variabel numerik
df_numerik <- data %>% 
  select(
    age, 
    height_cm, 
    weight_kg, 
    `body fat_%`, 
    diastolic, 
    systolic, 
    gripForce, 
    `sit and bend forward_cm`, 
    `sit-ups counts`, 
    `broad jump_cm`
  ) %>% 
  drop_na() # Menghapus baris yang mengandung nilai Kosong (NA) agar perhitungan valid

# Menghitung Matriks Korelasi (Pearson)
matriks_korelasi <- cor(df_numerik, method = "pearson")

# Menampilkan angka matriks korelasi di konsol R
print("Matriks Korelasi Angka:")
## [1] "Matriks Korelasi Angka:"
print(round(matriks_korelasi, 2))
##                           age height_cm weight_kg body fat_% diastolic systolic
## age                      1.00     -0.29     -0.10       0.24      0.16     0.21
## height_cm               -0.29      1.00      0.73      -0.52      0.15     0.21
## weight_kg               -0.10      0.73      1.00      -0.08      0.26     0.34
## body fat_%               0.24     -0.52     -0.08       1.00      0.05    -0.03
## diastolic                0.16      0.15      0.26       0.05      1.00     0.68
## systolic                 0.21      0.21      0.34      -0.03      0.68     1.00
## gripForce               -0.18      0.74      0.70      -0.54      0.20     0.29
## sit and bend forward_cm -0.07     -0.22     -0.30      -0.07     -0.07    -0.08
## sit-ups counts          -0.54      0.50      0.29      -0.61      0.02     0.06
## broad jump_cm           -0.44      0.67      0.48      -0.67      0.10     0.15
##                         gripForce sit and bend forward_cm sit-ups counts
## age                         -0.18                   -0.07          -0.54
## height_cm                    0.74                   -0.22           0.50
## weight_kg                    0.70                   -0.30           0.29
## body fat_%                  -0.54                   -0.07          -0.61
## diastolic                    0.20                   -0.07           0.02
## systolic                     0.29                   -0.08           0.06
## gripForce                    1.00                   -0.11           0.58
## sit and bend forward_cm     -0.11                    1.00           0.18
## sit-ups counts               0.58                    0.18           1.00
## broad jump_cm                0.75                    0.03           0.75
##                         broad jump_cm
## age                             -0.44
## height_cm                        0.67
## weight_kg                        0.48
## body fat_%                      -0.67
## diastolic                        0.10
## systolic                         0.15
## gripForce                        0.75
## sit and bend forward_cm          0.03
## sit-ups counts                   0.75
## broad jump_cm                    1.00
# Visualisasi Matriks Korelasi (Corrplot)
# Mengatur area plot agar teks label tidak terpotong
corrplot(
  matriks_korelasi, 
  method = "color",          
  type = "upper",            
  order = "original",        
  addCoef.col = "black",     
  tl.col = "black",          
  tl.srt = 45,               
  diag = FALSE,              
number.cex = 0.8,          
  tl.cex = 0.9               
)
mtext("Matriks Korelasi Variabel Body Performance", at = 4, line = 2.5, cex = 1.2, font = 2)

Berdasarkan hasil analisis korelasi Pearson yang ditampilkan pada matriks korelasi di atas, terdapat beberapa pasangan variabel yang memiliki hubungan cukup kuat. Korelasi positif tertinggi ditemukan antara gripForce dengan broad jump_cm (r = 0,75) dan sit-ups counts dengan broad jump_cm (r = 0,75), yang mengindikasikan bahwa individu dengan kekuatan genggaman yang tinggi cenderung memiliki kemampuan lompat jauh dan daya tahan fisik yang lebih baik pula. Variabel height_cm menunjukkan korelasi positif yang kuat dengan gripForce (r = 0,74), weight_kg (r = 0,73), dan broad jump_cm (r = 0,67), serta korelasi negatif yang cukup kuat dengan body fat_% (r = -0,52), yang berarti individu dengan tinggi badan lebih besar cenderung memiliki kekuatan fisik lebih tinggi namun persentase lemak tubuh yang lebih rendah. Variabel weight_kg juga berkorelasi positif dengan gripForce (r = 0,70) dan broad jump_cm (r = 0,48), serta berkorelasi negatif dengan sit and bend forward_cm (r = -0,30), mengindikasikan bahwa berat badan yang lebih tinggi berkaitan dengan kekuatan fisik yang lebih besar namun fleksibilitas yang lebih rendah. Variabel diastolic dan systolic menunjukkan korelasi positif yang cukup kuat (r = 0,68), yang wajar karena keduanya merupakan komponen tekanan darah yang saling berkaitan. Korelasi negatif yang cukup kuat ditemukan antara body fat_% dengan sit-ups counts (r = -0,61), body fat_% dengan broad jump_cm (r = -0,67), dan body fat_% dengan gripForce (r = -0,54), yang menunjukkan bahwa semakin tinggi persentase lemak tubuh maka kemampuan fisik seseorang cenderung semakin rendah. Variabel age menunjukkan korelasi negatif yang signifikan dengan sit-ups counts (r = -0,54) dan broad jump_cm (r = -0,44), mengindikasikan bahwa kemampuan fisik cenderung menurun seiring bertambahnya usia. Sebaliknya, variabel sit and bend forward_cm menunjukkan korelasi yang sangat lemah terhadap hampir seluruh variabel lainnya, dengan nilai korelasi tertinggi hanya sebesar 0,18 terhadap sit-ups counts, yang mengindikasikan bahwa fleksibilitas tubuh relatif tidak berkaitan erat dengan indikator kebugaran fisik lainnya dalam dataset ini.

Analisis Multikolinearitas

Setelah dilakukan analisis korelasi, tahap berikutnya adalah mengevaluasi keberadaan multikolinearitas antar variabel dalam dataset. Multikolinearitas terjadi ketika dua atau lebih variabel independen memiliki hubungan linear yang sangat kuat satu sama lain, yang dapat mengakibatkan hasil analisis menjadi tidak stabil serta interpretasi model kurang reliabel. Deteksi multikolinearitas dilakukan menggunakan metode Variance Inflation Factor (VIF) dengan bantuan library car pada R. Sebelum perhitungan VIF dilakukan, terlebih dahulu dibentuk model regresi linear dengan broad jump_cm sebagai variabel dependen dan seluruh variabel numerik lainnya sebagai variabel independen. Variabel broad jump_cm dipilih sebagai variabel dependen hanya sebagai kebutuhan teknis dalam pembentukan model regresi agar nilai VIF dapat dihitung, bukan untuk tujuan permodelan prediktif. Nilai VIF di bawah 5 menunjukkan tidak adanya indikasi multikolinearitas, nilai antara 5 hingga 10 menunjukkan adanya multikolinearitas sedang yang perlu diperhatikan, sedangkan nilai VIF ≥ 10 mengindikasikan multikolinearitas yang tinggi sehingga variabel terkait berpotensi perlu dihapus atau ditinjau kembali. Hasil perhitungan VIF kemudian disajikan dalam bentuk tabel untuk memudahkan evaluasi tingkat multikolinearitas pada setiap variabel secara lebih terstruktur dan interpretatif.

# Load Library yang Dibutuhkan
library(tidyverse)  
library(car)        

# Memastikan data bersih dari NA dan hanya mengambil kolom numerik yang diperlukan
df_vif <- data %>% 
  dplyr::select(
    age, height_cm, weight_kg, `body fat_%`, diastolic, 
    systolic, gripForce, `sit and bend forward_cm`, 
    `sit-ups counts`, `broad jump_cm`
  ) %>% 
  drop_na()

# Membuat Model Regresi Linier Terlebih Dahulu
model_regresi <- lm(`broad jump_cm` ~ age + height_cm + weight_kg + `body fat_%` + 
                      diastolic + systolic + gripForce + `sit and bend forward_cm` + 
                      `sit-ups counts`, data = df_vif)

# Menghitung dan Menampilkan Nilai VIF
nilai_vif <- vif(model_regresi)

# Mengubah hasil VIF menjadi dataframe 
tabel_vif <- data.frame(
  Variabel = names(nilai_vif),
  Nilai_VIF = round(nilai_vif, 2),
  row.names = NULL 
)
# Menampilkan tabel hasil pengujian VIF 
print(tabel_vif, row.names = FALSE)
##                   Variabel Nilai_VIF
##                        age      1.70
##                  height_cm      4.28
##                  weight_kg      4.79
##               `body fat_%`      3.13
##                  diastolic      1.87
##                   systolic      2.05
##                  gripForce      3.94
##  `sit and bend forward_cm`      1.23
##           `sit-ups counts`      2.80

Berdasarkan hasil perhitungan VIF yang tercantum pada tabel, seluruh variabel numerik dalam dataset memiliki nilai VIF di bawah 5, yang menunjukkan bahwa tidak terdapat indikasi multikolinearitas yang signifikan. Variabel dengan nilai VIF tertinggi adalah weight_kg (VIF = 4,79) dan height_cm (VIF = 4,28), yang menandakan bahwa keduanya memiliki keterkaitan relatif lebih kuat dengan variabel lain dibandingkan variabel lainnya, meskipun masih berada dalam batas yang aman dan dapat diterima. Temuan ini konsisten dengan hasil analisis korelasi sebelumnya, di mana height_cm dan weight_kg memang memperlihatkan hubungan yang cukup kuat dengan beberapa variabel seperti gripForce dan broad jump_cm. Sementara itu, variabel gripForce dan body fat_% juga memiliki nilai VIF yang berada pada tingkat moderat, masing-masing sebesar 3,94 dan 3,13, yang menunjukkan adanya hubungan dengan variabel lain namun tidak sampai menimbulkan permasalahan multikolinearitas. Di sisi lain, variabel sit and bend forward_cm memiliki nilai VIF paling rendah yaitu 1,23, yang mengindikasikan bahwa variabel ini hampir tidak memiliki hubungan linear dengan variabel lainnya, selaras dengan hasil korelasi sebelumnya. Secara keseluruhan, hasil ini menunjukkan bahwa tidak terdapat multikolinearitas yang mengganggu dalam dataset, sehingga seluruh variabel masih dapat dianggap memberikan informasi yang unik dan layak digunakan untuk analisis lanjutan.

Missing Value dan Outlier

Sebelum masuk ke tahap analisis selanjutnya, dilakukan terlebih dahulu pemeriksaan terhadap keberadaan missing value atau nilai yang hilang pada dataset. Missing value merupakan kondisi ketika suatu pengamatan tidak memiliki informasi pada variabel tertentu, yang jika tidak ditangani dengan tepat dapat menurunkan kualitas serta keandalan hasil analisis. Proses pengecekan dilakukan pada seluruh variabel dalam dataset dengan menggunakan fungsi is.na() pada R, yang digunakan untuk mengidentifikasi dan menghitung jumlah nilai yang kosong baik pada setiap variabel maupun secara keseluruhan.

# Mengecek jumlah missing value per variabel
missing_summary <- data %>%
  summarise(across(everything(), ~ sum(is.na(.)))) %>%
  pivot_longer(everything(),
               names_to = "Variabel",
               values_to = "Jumlah_NA")

print(missing_summary, row.names = FALSE)
## # A tibble: 12 × 2
##    Variabel                Jumlah_NA
##    <chr>                       <int>
##  1 age                             0
##  2 gender                          0
##  3 height_cm                       0
##  4 weight_kg                       0
##  5 body fat_%                      0
##  6 diastolic                       0
##  7 systolic                        0
##  8 gripForce                       0
##  9 sit and bend forward_cm         0
## 10 sit-ups counts                  0
## 11 broad jump_cm                   0
## 12 class                           0
# Total missing value keseluruhan
cat("Total missing value:", sum(is.na(data)), "\n")
## Total missing value: 0

Berdasarkan hasil pengecekan missing value pada seluruh variabel dalam dataset, diketahui bahwa tidak ditemukan adanya nilai yang hilang di semua 12 variabel, dengan total missing value bernilai 0. Hal ini mengindikasikan bahwa dataset Body Performance Data berada dalam kondisi lengkap tanpa adanya data yang kosong. Dengan demikian, tidak diperlukan proses penanganan tambahan seperti imputasi maupun penghapusan data. Kondisi ini juga memastikan bahwa seluruh 13.393 observasi dapat digunakan sepenuhnya dalam proses analisis tanpa kehilangan informasi akibat ketidaklengkapan data.

Setelah tahap pengecekan missing value, langkah berikutnya adalah mengidentifikasi keberadaan outlier atau nilai ekstrem dalam dataset. Outlier merupakan data pengamatan yang memiliki nilai yang secara signifikan berbeda dari sebagian besar data lainnya, sehingga dapat memengaruhi hasil analisis apabila tidak ditangani dengan tepat. Pada proses ini, deteksi outlier dilakukan menggunakan pendekatan Interquartile Range (IQR), yaitu suatu nilai dikategorikan sebagai outlier jika berada di bawah batas Q1 − 1,5 × IQR atau melebihi batas Q3 + 1,5 × IQR. Hasil identifikasi kemudian dirangkum dalam bentuk tabel yang menunjukkan jumlah outlier pada masing-masing variabel, serta divisualisasikan menggunakan boxplot untuk mempermudah pengamatan terhadap distribusi dan sebaran nilai ekstrem pada setiap variabel secara lebih jelas dan informatif.

# DETEKSI OUTLIER (METODE IQR)
# Fungsi untuk menghitung jumlah outlier menggunakan metode IQR
hitung_outlier <- function(x) {
  Q1 <- quantile(x, 0.25, na.rm = TRUE)
  Q3 <- quantile(x, 0.75, na.rm = TRUE)
  IQR_val <- Q3 - Q1
  batas_bawah <- Q1 - 1.5 * IQR_val
  batas_atas  <- Q3 + 1.5 * IQR_val
  sum(x < batas_bawah | x > batas_atas, na.rm = TRUE)
}

# Menerapkan fungsi ke seluruh variabel numerik
outlier_summary <- data %>%
  dplyr::select(age, height_cm, weight_kg, `body fat_%`,
                diastolic, systolic, gripForce,
                `sit and bend forward_cm`, `sit-ups counts`,
                `broad jump_cm`) %>%
  summarise(across(everything(), hitung_outlier)) %>%
  pivot_longer(everything(),
               names_to = "Variabel",
               values_to = "Jumlah_Outlier")

print(outlier_summary, row.names = FALSE)
## # A tibble: 10 × 2
##    Variabel                Jumlah_Outlier
##    <chr>                            <int>
##  1 age                                  0
##  2 height_cm                           10
##  3 weight_kg                           83
##  4 body fat_%                          77
##  5 diastolic                           54
##  6 systolic                            29
##  7 gripForce                            3
##  8 sit and bend forward_cm            409
##  9 sit-ups counts                       0
## 10 broad jump_cm                       57
# VISUALISASI OUTLIER (BOXPLOT)
# Membuat boxplot untuk setiap variabel numerik
bp1 <- ggplot(data, aes(y = age)) +
  geom_boxplot(fill = "skyblue") +
  labs(title = "Age") + theme_minimal()

bp2 <- ggplot(data, aes(y = height_cm)) +
  geom_boxplot(fill = "purple") +
  labs(title = "Height (cm)") + theme_minimal()

bp3 <- ggplot(data, aes(y = weight_kg)) +
  geom_boxplot(fill = "cyan") +
  labs(title = "Weight (kg)") + theme_minimal()

bp4 <- ggplot(data, aes(y = `body fat_%`)) +
  geom_boxplot(fill = "gold") +
  labs(title = "Body Fat (%)") + theme_minimal()

bp5 <- ggplot(data, aes(y = diastolic)) +
  geom_boxplot(fill = "orange") +
  labs(title = "Diastolic") + theme_minimal()

bp6 <- ggplot(data, aes(y = systolic)) +
  geom_boxplot(fill = "salmon") +
  labs(title = "Systolic") + theme_minimal()

bp7 <- ggplot(data, aes(y = gripForce)) +
  geom_boxplot(fill = "lightgreen") +
  labs(title = "Grip Force") + theme_minimal()

bp8 <- ggplot(data, aes(y = `sit and bend forward_cm`)) +
  geom_boxplot(fill = "tomato") +
  labs(title = "Sit & Bend Forward (cm)") + theme_minimal()

bp9 <- ggplot(data, aes(y = `sit-ups counts`)) +
  geom_boxplot(fill = "steelblue") +
  labs(title = "Sit-ups Counts") + theme_minimal()

bp10 <- ggplot(data, aes(y = `broad jump_cm`)) +
  geom_boxplot(fill = "mediumpurple") +
  labs(title = "Broad Jump (cm)") + theme_minimal()

# Menggabungkan semua boxplot dalam satu panel
(bp1 | bp2 | bp3 | bp4 | bp5) / (bp6 | bp7 | bp8 | bp9 | bp10)

Berdasarkan hasil deteksi outlier dengan metode IQR pada seluruh variabel numerik, teridentifikasi bahwa beberapa variabel memiliki nilai ekstrem. Variabel sit and bend forward_cm menunjukkan jumlah outlier paling tinggi, yaitu sebanyak 409 data, yang mengindikasikan adanya individu dengan tingkat fleksibilitas tubuh yang jauh berbeda dari mayoritas observasi. Temuan ini sejalan dengan hasil statistik deskriptif sebelumnya yang menunjukkan nilai kurtosis yang sangat tinggi pada variabel tersebut.

Variabel weight_kg dan body fat_% juga memiliki jumlah outlier yang cukup besar, masing-masing sebanyak 83 dan 77 data, yang menggambarkan adanya individu dengan kondisi berat badan serta persentase lemak tubuh yang sangat tinggi maupun sangat rendah dibandingkan sebagian besar responden. Sementara itu, variabel broad jump_cm memiliki 57 outlier, diikuti oleh diastolic sebanyak 54 dan systolic sebanyak 29, serta height_cm sebanyak 10 outlier, yang menunjukkan adanya beberapa pengamatan dengan nilai yang cukup menyimpang pada aspek kemampuan fisik maupun tekanan darah.

Di sisi lain, variabel gripForce hanya memiliki 3 outlier, sedangkan variabel age dan sit-ups counts tidak menunjukkan adanya outlier sama sekali, yang mengindikasikan bahwa kedua variabel tersebut memiliki distribusi yang relatif stabil dan merata. Secara keseluruhan, keberadaan outlier pada beberapa variabel ini perlu diperhatikan dalam analisis lanjutan. Namun demikian, dalam konteks data kebugaran fisik, nilai ekstrem tersebut tidak selalu merupakan kesalahan, melainkan dapat merepresentasikan variasi kondisi fisik individu yang memang secara alami berbeda secara signifikan dari populasi umum.

FEATURE ENGINEERING

Pada tahap feature engineering, dibentuk tiga fitur baru yang dirancang untuk merepresentasikan aspek kesehatan dan kebugaran tubuh yang belum tergambarkan secara langsung oleh variabel asli dalam dataset. Fitur pertama adalah Body Mass Index (BMI), yang diperoleh dari perbandingan antara berat badan dan kuadrat tinggi badan dalam satuan meter. BMI merupakan salah satu indikator yang umum digunakan dalam bidang kesehatan untuk mengevaluasi status gizi dan proporsi tubuh seseorang. Oleh karena itu, fitur ini dapat memberikan informasi tambahan mengenai kondisi tubuh yang tidak dapat dijelaskan hanya melalui variabel berat badan atau tinggi badan secara terpisah.

\[ BMI = \frac{Weight\ (kg)}{Height(m)^2} \]

Fitur kedua adalah Mean Arterial Pressure (MAP) atau tekanan arteri rata-rata. Nilai MAP dihitung menggunakan kombinasi tekanan darah sistolik dan diastolik sehingga mampu menggambarkan kondisi sistem kardiovaskular secara lebih menyeluruh. Dibandingkan menggunakan salah satu komponen tekanan darah saja, MAP memberikan estimasi tekanan rata-rata yang diterima pembuluh darah selama satu siklus jantung, sehingga dinilai lebih representatif dalam menggambarkan fungsi peredaran darah.

\[ MAP = Diastolic + \frac{1}{3}(Systolic - Diastolic) \]

Fitur ketiga adalah Fitness Index, yaitu suatu skor komposit yang digunakan untuk merepresentasikan tingkat kebugaran fisik secara keseluruhan. Skor ini dibangun dengan menjumlahkan nilai z-score dari empat indikator yang berhubungan positif dengan kebugaran fisik, yaitu gripForce, sit and bend forward_cm, sit-ups counts, dan broad jump_cm. Selanjutnya, nilai tersebut dikurangi dengan z-score dari dua variabel yang umumnya berkaitan negatif dengan tingkat kebugaran, yaitu age dan body fat_%. Penggunaan metode z-score bertujuan untuk menyetarakan skala seluruh variabel sebelum digabungkan ke dalam satu indeks, sehingga setiap variabel memberikan kontribusi yang seimbang tanpa dipengaruhi oleh perbedaan satuan pengukuran.

\[ Fitness\ Index = Z_{gripForce} + Z_{sit\ and\ bend\ forward} + Z_{sit-ups} + Z_{broad\ jump} - Z_{age} - Z_{body\ fat} \]

featureeng <- data %>%
  mutate(
    # Body Mass Index (BMI)
    bmi = weight_kg / ((height_cm / 100)^2),
    
    # Mean Arterial Pressure (MAP)
    map = diastolic + ((systolic - diastolic) / 3),
    
    # Proses Standardisasi Skala (Z-Score) untuk Variabel Performa Fisik
    z_grip      = scale(gripForce),
    z_sit_bend  = scale(`sit and bend forward_cm`),
    z_sit_ups   = scale(`sit-ups counts`),
    z_jump      = scale(`broad jump_cm`),
    z_age       = scale(age),
    z_fat       = scale(`body fat_%`),
    
    # Fitness Index
    fitness_index = (z_grip + z_sit_bend + z_sit_ups + z_jump) - (z_age + z_fat)
  ) %>%
  # Menghapus variabel Z-score temporer agar dataframe tidak penuh
  dplyr::select(-starts_with("z_")) 

# Menampilkan 5 sampel baris teratas 
tablefe <- featureeng %>%
  dplyr::select(class, bmi, map, fitness_index) %>%
  head(5)

knitr::kable(
  tablefe, 
  row.names = FALSE, 
  digits = 2,
  col.names = c("Class", "BMI", "MAP", "Fitness Index"),
  align = "cccc",
  caption = "Data Hasil Feature Engineering"
)
Data Hasil Feature Engineering
Class BMI MAP Fitness Index
C 25.34 96.67 5.141084
A 20.50 93.33 3.880712
C 24.18 112.00 1.632016
B 23.35 99.67 3.084604
B 22.41 89.00 4.551612

Berdasarkan tabel hasil feature engineering di atas, dapat dilihat preview lima observasi pertama dari tiga fitur baru yang telah dibuat. Nilai BMI pada sampel data menunjukkan variasi yang mencerminkan perbedaan proporsionalitas tubuh antar individu, di mana nilai BMI yang lebih tinggi mengindikasikan kelebihan berat badan relatif terhadap tinggi badan, sedangkan nilai yang lebih rendah mengindikasikan tubuh yang lebih ramping. Nilai MAP yang dihasilkan merepresentasikan tekanan darah rata-rata masing-masing individu dalam satu siklus jantung, di mana nilai yang lebih tinggi dapat mengindikasikan beban kerja kardiovaskular yang lebih besar. Sementara itu, nilai Fitness Index yang positif mengindikasikan bahwa individu tersebut memiliki kemampuan fisik di atas rata-rata dengan faktor penghambat seperti usia dan lemak tubuh yang relatif rendah, sedangkan nilai negatif mengindikasikan sebaliknya. Ketiga fitur baru ini diharapkan dapat memperkaya representasi data dan memberikan informasi tambahan yang lebih bermakna dalam menggambarkan kondisi kebugaran fisik setiap individu pada tahap analisis selanjutnya.

FEATURE SELECTION

Feature selection merupakan tahapan yang dilakukan untuk menentukan variabel-variabel yang memiliki kontribusi paling besar dalam menjelaskan tingkat performa fisik individu. Proses ini bertujuan untuk mengurangi kompleksitas data, menghilangkan informasi yang bersifat redundan, serta meningkatkan efisiensi analisis tanpa mengurangi kualitas informasi yang terkandung dalam dataset. Pada penelitian ini, feature selection dilakukan menggunakan dua pendekatan, yaitu analisis korelasi dan Random Forest Variable Importance.

  1. LASSO Regression

LASSO (Least Absolute Shrinkage and Selection Operator) merupakan salah satu metode seleksi fitur yang memanfaatkan teknik regularisasi melalui penambahan penalti L1 pada fungsi objektif model. Pemberian penalti ini menyebabkan nilai koefisien beberapa variabel berkurang secara bertahap, bahkan dapat menjadi nol. Akibatnya, variabel yang kontribusinya rendah terhadap model akan tersisih secara otomatis, sehingga hanya variabel yang paling relevan yang dipertahankan.

Pada penelitian ini, metode LASSO diterapkan dalam bentuk regresi multinomial dikarenakan variabel target berupa kategori performa fisik yang terdiri dari empat kelas, yaitu A, B, C, dan D. Penentuan nilai parameter regularisasi (λ) dilakukan menggunakan prosedur cross-validation, sehingga diperoleh nilai λ optimal yang menghasilkan kesalahan prediksi paling kecil dan performa model yang lebih baik.

# Input library
library(glmnet)
library(randomForest)
library(dplyr)

# Mengubah variabel kategorik menjadi factor
data$class <- as.factor(data$class)
data$gender <- as.factor(data$gender)

# METODE 1 : LASSO REGRESSION

# Membentuk matriks prediktor
x <- model.matrix(class ~ ., data = data)[,-1]

# Variabel respon
y <- data$class

# Cross Validation untuk menentukan lambda terbaik
set.seed(123)

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

# Visualisasi Cross Validation
plot(cv_lasso)

# Model LASSO terbaik
lasso_model <- glmnet(
  x,
  y,
  family = "multinomial",
  alpha = 1,
  lambda = cv_lasso$lambda.min
)

# Menampilkan variabel yang terpilih
lasso_coef <- coef(lasso_model)

cat("Variabel terpilih berdasarkan LASSO:\n")
## Variabel terpilih berdasarkan LASSO:
for(i in names(lasso_coef)){
  
  coef_matrix <- as.matrix(lasso_coef[[i]])
  
  selected <- rownames(coef_matrix)[coef_matrix[,1] != 0]
  
  selected_df <- data.frame(
    Variabel = selected
  )

  cat("### Class", i, "\n\n")

  print(
    knitr::kable(
      selected_df,
      caption = paste("Variabel Terpilih LASSO - Class", i)
    )
  )

  cat("\n\n")
}
## ### Class A 
## 
## 
## 
## Table: Variabel Terpilih LASSO - Class A
## 
## |Variabel                  |
## |:-------------------------|
## |(Intercept)               |
## |age                       |
## |genderM                   |
## |height_cm                 |
## |weight_kg                 |
## |`body fat_%`              |
## |diastolic                 |
## |systolic                  |
## |gripForce                 |
## |`sit and bend forward_cm` |
## |`sit-ups counts`          |
## |`broad jump_cm`           |
## 
## 
## ### Class B 
## 
## 
## 
## Table: Variabel Terpilih LASSO - Class B
## 
## |Variabel                  |
## |:-------------------------|
## |(Intercept)               |
## |age                       |
## |genderM                   |
## |height_cm                 |
## |weight_kg                 |
## |`body fat_%`              |
## |diastolic                 |
## |systolic                  |
## |gripForce                 |
## |`sit and bend forward_cm` |
## |`sit-ups counts`          |
## |`broad jump_cm`           |
## 
## 
## ### Class C 
## 
## 
## 
## Table: Variabel Terpilih LASSO - Class C
## 
## |Variabel                  |
## |:-------------------------|
## |(Intercept)               |
## |age                       |
## |genderM                   |
## |height_cm                 |
## |weight_kg                 |
## |`body fat_%`              |
## |diastolic                 |
## |systolic                  |
## |gripForce                 |
## |`sit and bend forward_cm` |
## |`sit-ups counts`          |
## |`broad jump_cm`           |
## 
## 
## ### Class D 
## 
## 
## 
## Table: Variabel Terpilih LASSO - Class D
## 
## |Variabel                  |
## |:-------------------------|
## |(Intercept)               |
## |age                       |
## |genderM                   |
## |height_cm                 |
## |weight_kg                 |
## |`body fat_%`              |
## |diastolic                 |
## |systolic                  |
## |gripForce                 |
## |`sit and bend forward_cm` |
## |`sit-ups counts`          |
## |`broad jump_cm`           |

Berdasarkan hasil proses cross-validation, diperoleh nilai parameter regularisasi (λ) yang menghasilkan nilai multinomial deviance minimum. Grafik cross-validation memperlihatkan bahwa peningkatan penalti secara bertahap mampu menurunkan nilai deviance hingga mencapai titik optimum. Titik tersebut menunjukkan kombinasi terbaik antara kemampuan prediksi model dan tingkat kompleksitasnya, sehingga digunakan sebagai dasar dalam pembentukan model LASSO akhir.

Hasil seleksi fitur menggunakan metode LASSO menunjukkan bahwa seluruh variabel prediktor masih dipertahankan pada model untuk setiap kategori performa fisik, yaitu kelas A, B, C, dan D. Variabel yang memiliki koefisien tidak nol meliputi age, gender, height_cm, weight_kg, body fat_%, diastolic, systolic, gripForce, sit and bend forward_cm, sit-ups counts, serta broad jump_cm.

Tidak adanya koefisien yang bernilai nol menjelaskan bahwa seluruh variabel masih memberikan kontribusi terhadap proses pengelompokan tingkat performa fisik. Dengan demikian, metode LASSO tidak menghapus satu pun variabel pada nilai λ yang dipilih karena setiap fitur masih dianggap memiliki informasi yang relevan untuk membedakan kategori performa fisik individu.

Selain itu, kesamaan variabel yang terpilih pada seluruh kelas menunjukkan bahwa faktor usia, jenis kelamin, kondisi tubuh, tekanan darah, kekuatan otot, fleksibilitas, dan kemampuan fisik lainnya memiliki peran yang konsisten dalam menentukan kategori performa fisik. Hasil ini menjelaskan bahwa performa fisik merupakan karakteristik yang dipengaruhi oleh berbagai aspek yang saling melengkapi, sehingga seluruh variabel tetap layak dipertahankan untuk analisis selanjutnya.

  1. Random Forest Variable Importance

Metode berikutnya menggunakan algoritma Random Forest untuk mengevaluasi tingkat kepentingan masing-masing variabel dalam proses klasifikasi tingkat performa fisik. Pengukuran dilakukan menggunakan indikator Mean Decrease Accuracy dan Mean Decrease Gini, di mana nilai yang lebih besar menunjukkan kontribusi yang lebih tinggi terhadap model.

# METODE 2 : RANDOM FOREST

library(randomForest)

rf_data <- data.frame(
  class = as.factor(data$class),
  gender = as.factor(data$gender),
  age = data$age,
  height_cm = data$height_cm,
  weight_kg = data$weight_kg,
  body_fat = data$`body fat_%`,
  diastolic = data$diastolic,
  systolic = data$systolic,
  gripForce = data$gripForce,
  sit_bend = data$`sit and bend forward_cm`,
  situps = data$`sit-ups counts`,
  broad_jump = data$`broad jump_cm`
)

set.seed(123)

rf_model <- randomForest(
  class ~ .,
  data = rf_data,
  importance = TRUE
)

varImpPlot(rf_model)

importance_df <- data.frame(
  Variable = rownames(importance(rf_model)),
  Importance = importance(rf_model)[, "MeanDecreaseGini"]
)

importance_df <- importance_df[
  order(-importance_df$Importance),
]

importance_df
##              Variable Importance
## sit_bend     sit_bend  2598.0107
## situps         situps  1354.7949
## body_fat     body_fat   980.9694
## weight_kg   weight_kg   890.6320
## age               age   889.1926
## gripForce   gripForce   814.1035
## broad_jump broad_jump   747.4505
## height_cm   height_cm   641.9309
## systolic     systolic   512.9359
## diastolic   diastolic   486.1851
## gender         gender   127.4823

Hasil analisis menunjukkan bahwa variabel sit and bend forward_cm memiliki tingkat kepentingan paling tinggi dibandingkan variabel lainnya. Hasil ini menunjukkan bahwa fleksibilitas tubuh merupakan salah satu faktor utama yang membedakan kategori performa fisik individu dalam dataset.

Selain itu, variabel sit-ups counts, body fat_%, weight_kg, age, gripForce, broad jump_cm, dan height_cm juga memberikan kontribusi yang cukup besar terhadap proses klasifikasi. Sebaliknya, variabel gender memiliki nilai kepentingan paling rendah sehingga pengaruhnya terhadap pembentukan model relatif kecil dibandingkan variabel lainnya.

Secara umum, hasil Random Forest mengindikasikan bahwa fleksibilitas, daya tahan otot, komposisi tubuh, usia, dan kekuatan otot merupakan faktor yang paling berperan dalam menentukan tingkat performa fisik seseorang.

Maka dapat disimpulkan berdasarkan hasil seleksi fitur menggunakan metode LASSO Regression dan Random Forest Variable Importance, tidak ditemukan variabel yang perlu dieliminasi dari dataset. LASSO menunjukkan bahwa seluruh variabel masih memiliki koefisien yang tidak sama dengan nol pada model terbaik, sedangkan Random Forest menunjukkan bahwa setiap variabel memiliki tingkat kepentingan tertentu dalam proses klasifikasi.

Meskipun demikian, hasil Random Forest menjelaskan bahwa beberapa variabel memiliki kontribusi yang lebih dominan dibandingkan variabel lainnya, terutama sit and bend forward_cm, sit-ups counts, body fat_%, age, gripForce, dan broad jump_cm. Variabel-variabel tersebut dapat dianggap sebagai faktor utama yang membedakan tingkat performa fisik antarindividu.

Secara keseluruhan, kedua metode memberikan kesimpulan yang konsisten bahwa seluruh variabel masih mengandung informasi yang bermanfaat dan relevan. Oleh karena itu, seluruh fitur tetap dipertahankan dan digunakan pada tahap reduksi dimensi menggunakan Principal Component Analysis (PCA).

FEATURE EXTRACTION (PCA)

Setelah proses feature selection selesai dilakukan, tahap berikutnya adalah feature extraction menggunakan Principal Component Analysis (PCA). Teknik ini digunakan untuk mereduksi jumlah variabel dengan mengubah sekumpulan variabel yang saling berkorelasi menjadi beberapa komponen utama yang saling bebas satu sama lain. Melalui pendekatan ini, sebagian besar informasi dalam data dapat dipertahankan meskipun jumlah dimensinya berkurang.

Sebelum PCA diterapkan, seluruh variabel numerik terlebih dahulu distandardisasi menggunakan metode z-score. Langkah ini diperlukan karena masing-masing variabel memiliki satuan pengukuran yang berbeda sehingga perlu disetarakan agar tidak ada variabel yang mendominasi pembentukan komponen utama.

# Input library
library(factoextra)
library(dplyr)

# Ambil variabel numerik
numeric_data <- data[, c(
  "age",
  "height_cm",
  "weight_kg",
  "body fat_%",
  "diastolic",
  "systolic",
  "gripForce",
  "sit and bend forward_cm",
  "sit-ups counts",
  "broad jump_cm"
)]

# Standardisasi
scaled_data <- scale(numeric_data)

# PCA
pca <- prcomp(
  scaled_data,
  center = TRUE,
  scale. = TRUE
)

# Ringkasan PCA
summary(pca)
## Importance of components:
##                           PC1    PC2    PC3     PC4     PC5     PC6     PC7
## Standard deviation     2.0448 1.4331 1.1012 0.88844 0.80697 0.56463 0.55186
## Proportion of Variance 0.4181 0.2054 0.1213 0.07893 0.06512 0.03188 0.03045
## Cumulative Proportion  0.4181 0.6235 0.7448 0.82370 0.88882 0.92070 0.95115
##                            PC8     PC9    PC10
## Standard deviation     0.46310 0.41745 0.31584
## Proportion of Variance 0.02145 0.01743 0.00998
## Cumulative Proportion  0.97260 0.99002 1.00000
# Eigenvalue
eig <- pca$sdev^2

# Proporsi Variansi
prop_var <- eig / sum(eig)

# Variansi Kumulatif
cum_var <- cumsum(prop_var)

# Tabel Variansi
variance_table <- data.frame(
  PC = paste0("PC", 1:length(eig)),
  Eigenvalue = round(eig, 3),
  Variance = round(prop_var * 100, 2),
  Cumulative = round(cum_var * 100, 2)
)

variance_table
##      PC Eigenvalue Variance Cumulative
## 1   PC1      4.181    41.81      41.81
## 2   PC2      2.054    20.54      62.35
## 3   PC3      1.213    12.13      74.48
## 4   PC4      0.789     7.89      82.37
## 5   PC5      0.651     6.51      88.88
## 6   PC6      0.319     3.19      92.07
## 7   PC7      0.305     3.05      95.12
## 8   PC8      0.214     2.14      97.26
## 9   PC9      0.174     1.74      99.00
## 10 PC10      0.100     1.00     100.00
# Loading Factor
loading_factor <- round(pca$rotation, 3)

loading_factor
##                            PC1    PC2    PC3    PC4    PC5    PC6    PC7    PC8
## age                      0.208 -0.379  0.047 -0.746 -0.229  0.097  0.256 -0.262
## height_cm               -0.421 -0.076 -0.235 -0.045 -0.125 -0.438 -0.433 -0.348
## weight_kg               -0.337 -0.300 -0.320  0.165 -0.479  0.035  0.012 -0.103
## body fat_%               0.331 -0.240 -0.175  0.536 -0.395  0.219  0.222  0.012
## diastolic               -0.106 -0.509  0.398  0.249  0.249 -0.532  0.400 -0.045
## systolic                -0.143 -0.522  0.373  0.067  0.153  0.502 -0.532  0.059
## gripForce               -0.432 -0.095 -0.057 -0.192 -0.213  0.116  0.271  0.422
## sit and bend forward_cm  0.045  0.275  0.675  0.014 -0.638 -0.179 -0.158  0.035
## sit-ups counts          -0.379  0.265  0.215  0.142  0.082  0.402  0.348 -0.650
## broad jump_cm           -0.439  0.130  0.083 -0.047  0.044  0.089  0.187  0.438
##                            PC9   PC10
## age                     -0.222  0.091
## height_cm               -0.115  0.481
## weight_kg               -0.048 -0.651
## body fat_%              -0.179  0.479
## diastolic                0.024 -0.042
## systolic                 0.006  0.042
## gripForce                0.600  0.305
## sit and bend forward_cm  0.015 -0.028
## sit-ups counts           0.050  0.071
## broad jump_cm           -0.734  0.075
# Scree Plot
fviz_eig(
  pca,
  addlabels = TRUE
)

# Correlation Circle
fviz_pca_var(
  pca,
  col.var = "contrib",
  repel = TRUE
)

# Kontribusi Variabel pada PC1
fviz_contrib(
  pca,
  choice = "var",
  axes = 1,
  top = 10
)

# Kontribusi Variabel pada PC2
fviz_contrib(
  pca,
  choice = "var",
  axes = 2,
  top = 10
)

# Biplot PCA
fviz_pca_biplot(
  pca,
  repel = TRUE
)

Hasil analisis PCA menunjukkan bahwa komponen utama pertama (PC1) memiliki eigenvalue sebesar 4,181 dan mampu menjelaskan 41,81% keragaman data. Sementara itu, komponen utama kedua (PC2) mampu menjelaskan tambahan variasi sebesar 20,54%, sehingga kedua komponen tersebut secara bersama-sama telah merepresentasikan 62,35% informasi yang terkandung dalam dataset. Ketika empat komponen utama pertama dipertahankan, proporsi variasi yang berhasil dijelaskan meningkat menjadi 82,37%. Nilai tersebut menunjukkan bahwa sebagian besar informasi dalam data telah dapat dirangkum melalui empat komponen utama, sehingga jumlah komponen tersebut dinilai cukup representatif untuk menggambarkan karakteristik data secara keseluruhan.

Berdasarkan nilai loading factor, komponen utama pertama terutama dibentuk oleh variabel broad jump_cm, gripForce, height_cm, dan sit-ups counts. Variabel-variabel tersebut berkaitan dengan aspek kekuatan, daya tahan, serta kemampuan fisik individu, sehingga PC1 dapat diinterpretasikan sebagai komponen yang mencerminkan performa fisik secara umum. Selanjutnya, PC2 lebih banyak dipengaruhi oleh variabel systolic, diastolic, dan age, yang menunjukkan bahwa komponen ini berkaitan dengan kondisi fisiologis dan kesehatan kardiovaskular. Pada PC3, variabel yang memberikan kontribusi terbesar adalah sit and bend forward_cm, sehingga komponen ini merepresentasikan fleksibilitas tubuh. Adapun PC4 didominasi oleh age dan body fat_%, yang menggambarkan aspek usia dan komposisi tubuh individu.

Interpretasi tersebut diperkuat oleh hasil visualisasi PCA. Scree Plot menunjukkan adanya penurunan nilai eigenvalue yang cukup tajam pada beberapa komponen pertama, kemudian mulai melandai setelah komponen keempat. Pola ini mengindikasikan bahwa sebagian besar variasi data telah berhasil diringkas oleh empat komponen utama pertama. Selain itu, Correlation Circle dan Biplot PCA memperlihatkan bahwa variabel gripForce, broad jump_cm, height_cm, dan sit-ups counts cenderung mengarah ke arah yang sama. Kondisi tersebut menunjukkan adanya hubungan positif antarvariabel, sehingga individu yang memiliki nilai tinggi pada salah satu indikator tersebut umumnya juga memiliki nilai tinggi pada indikator fisik lainnya.

Sebaliknya, variabel age dan body fat_% berada pada arah yang berlawanan dengan kelompok variabel performa fisik. Hal ini menunjukkan adanya hubungan negatif, yang mengindikasikan bahwa peningkatan usia maupun persentase lemak tubuh cenderung berkaitan dengan penurunan tingkat kebugaran fisik. Di sisi lain, variabel systolic dan diastolic tampak berdekatan dan memiliki arah yang hampir sejajar, yang menunjukkan adanya keterkaitan yang kuat antara kedua indikator tekanan darah tersebut.

Hasil tersebut juga sejalan dengan grafik kontribusi variabel yang menunjukkan bahwa broad jump_cm, gripForce, height_cm, dan sit-ups counts memberikan kontribusi terbesar terhadap pembentukan PC1. Sementara itu, systolic, diastolic, dan age merupakan variabel yang paling dominan dalam pembentukan PC2. Secara keseluruhan, PCA berhasil mereduksi sepuluh variabel numerik menjadi empat komponen utama yang mampu mempertahankan 82,37% variasi total data. Keempat komponen tersebut masing-masing merepresentasikan kemampuan fisik umum, kondisi fisiologis dan kardiovaskular, fleksibilitas tubuh, serta usia dan komposisi tubuh, sehingga dapat digunakan sebagai representasi yang baik dari struktur data asli.

INSIGHT DAN KESIMPULAN

Berdasarkan seluruh analisis yang telah dilakukan, diketahui bahwa tingkat performa fisik individu dipengaruhi oleh berbagai faktor yang saling berkaitan, baik yang berasal dari aspek kondisi tubuh, kemampuan fisik, maupun karakteristik fisiologis. Hasil analisis korelasi menunjukkan adanya hubungan positif yang cukup kuat antara variabel gripForce, sit-ups counts, dan broad jump_cm. Hubungan tersebut menjelaskan bahwa individu yang memiliki kekuatan otot dan daya tahan yang baik cenderung menunjukkan performa yang tinggi pada indikator kebugaran lainnya. Sebaliknya, variabel age dan body fat_% memperlihatkan hubungan yang cenderung negatif terhadap sebagian besar indikator performa fisik, yang menunjukkan bahwa peningkatan usia dan persentase lemak tubuh berkaitan dengan menurunnya tingkat kebugaran.

Pada tahap seleksi fitur menggunakan metode LASSO Regression, seluruh variabel berhasil dipertahankan dalam model karena tidak ditemukan koefisien yang bernilai nol pada nilai λ optimal. Hasil tersebut menunjukkan bahwa setiap variabel masih memiliki kontribusi dalam membedakan kategori performa fisik sehingga tidak ada fitur yang dianggap tidak relevan. Dengan demikian, seluruh variabel yang tersedia tetap digunakan dalam proses analisis berikutnya.

Sementara itu, hasil pengukuran tingkat kepentingan variabel menggunakan Random Forest Variable Importance menunjukkan bahwa variabel sit and bend forward_cm merupakan faktor yang memiliki kontribusi terbesar dalam proses klasifikasi tingkat performa fisik. Selain itu, variabel sit-ups counts, body fat_%, age, gripForce, dan broad jump_cm juga memiliki tingkat kepentingan yang relatif tinggi. Hasil ini menunjukkan bahwa fleksibilitas tubuh, kekuatan otot, daya tahan fisik, komposisi tubuh, serta usia merupakan aspek-aspek utama yang berperan dalam membedakan tingkat kebugaran seseorang.

Proses reduksi dimensi menggunakan Principal Component Analysis (PCA) memberikan hasil yang memuaskan. Dari sepuluh variabel numerik yang dianalisis, diperoleh empat komponen utama yang mampu menjelaskan 82,37% variasi total data. Nilai tersebut menunjukkan bahwa sebagian besar informasi yang terdapat dalam dataset masih dapat dipertahankan meskipun jumlah variabel telah diringkas secara signifikan. Dengan kata lain, PCA berhasil menyederhanakan struktur data tanpa menghilangkan sebagian besar informasi penting yang terkandung di dalamnya.

Interpretasi terhadap komponen utama menunjukkan bahwa PC1 terutama merepresentasikan dimensi kemampuan fisik secara umum karena dibentuk oleh variabel broad jump_cm, gripForce, height_cm, dan sit-ups counts. PC2 menggambarkan kondisi fisiologis dan kesehatan kardiovaskular yang didominasi oleh variabel systolic, diastolic, dan age. Selanjutnya, PC3 mencerminkan aspek fleksibilitas tubuh yang terutama dipengaruhi oleh variabel sit and bend forward_cm, sedangkan PC4 berkaitan dengan karakteristik usia dan komposisi tubuh yang didominasi oleh variabel age dan body fat_%.

Salah satu hasil penting dari penelitian ini adalah bahwa performa fisik tidak dapat dijelaskan hanya oleh satu indikator tertentu, melainkan merupakan hasil interaksi berbagai aspek kebugaran yang saling melengkapi. Individu dengan tingkat kekuatan, daya tahan, dan kemampuan eksplosif yang tinggi cenderung memiliki performa fisik yang lebih baik dibandingkan individu lainnya. Sebaliknya, peningkatan usia dan tingginya persentase lemak tubuh berpotensi menurunkan kemampuan fisik secara keseluruhan. Menariknya, fleksibilitas tubuh terbukti menjadi faktor yang sangat berpengaruh dalam membedakan kategori performa fisik meskipun tidak memiliki hubungan yang kuat dengan sebagian besar variabel lainnya. Hal tersebut menunjukkan bahwa fleksibilitas menyumbangkan informasi yang unik dan tidak dapat sepenuhnya dijelaskan oleh indikator kebugaran yang lain.

Secara keseluruhan, hasil penelitian menunjukkan bahwa sit and bend forward_cm merupakan variabel yang paling dominan dalam menentukan kategori performa fisik, diikuti oleh sit-ups counts, body fat_%, age, gripForce, dan broad jump_cm. Selain itu, penerapan PCA terbukti efektif dalam merangkum sepuluh variabel numerik menjadi empat komponen utama yang tetap mampu mempertahankan sebagian besar informasi dalam data. Keempat komponen tersebut menggambarkan aspek kemampuan fisik umum, kondisi fisiologis dan kardiovaskular, fleksibilitas tubuh, serta karakteristik usia dan komposisi tubuh. Dengan demikian, hasil reduksi dimensi yang diperoleh dapat digunakan sebagai representasi yang lebih sederhana namun tetap informatif dalam menjelaskan karakteristik kebugaran fisik individu pada dataset Body Performance Data.