1 Pendahuluan

Laporan ini menyajikan analisis Principal Component Analysis (PCA) dan Factor Analysis (FA) pada dataset Body Performance yang berisi data kebugaran fisik. Kedua metode ini merupakan teknik reduksi dimensi yang bertujuan menemukan struktur tersembunyi dalam data multivariat.

  • PCA bertujuan menemukan kombinasi linier variabel yang memaksimalkan variansi.
  • FA bertujuan menemukan faktor-faktor laten yang menjelaskan korelasi antar variabel.

2 Persiapan dan Pembersihan Data

2.1 Load Library

library(tidyverse)
library(corrplot)
library(factoextra)
library(psych)
library(ggplot2)
library(gridExtra)
library(reshape2)

Penjelasan Library: - tidyverse : koleksi paket untuk manipulasi dan visualisasi data - corrplot : visualisasi matriks korelasi - factoextra: visualisasi hasil PCA (scree plot, biplot, kontribusi variabel) - psych : uji KMO, Bartlett, dan Factor Analysis - ggplot2 : pembuatan grafik - gridExtra : menggabungkan beberapa plot - reshape2 : transformasi data dari wide ke long format

2.2 Load dan Bersihkan Data

df_raw <- read.csv("body_performance.csv", sep = ";", stringsAsFactors = FALSE)

df_raw$body.fat_. <- as.numeric(df_raw$body.fat_.)
df_clean <- df_raw %>% drop_na()

df_clean <- df_clean %>%
  filter(body.fat_. < 60,
         sit.and.bend.forward_cm < 100)

cat("Dimensi setelah hapus outlier ekstrem:", nrow(df_clean), "baris x", ncol(df_clean), "kolom\n")
## Dimensi setelah hapus outlier ekstrem: 13319 baris x 12 kolom

Penjelasan Output: Output menampilkan jumlah baris dan kolom setelah proses pembersihan data. Proses yang dilakukan:

  1. Konversi tipe data: kolom body.fat_. dikonversi ke numerik karena mungkin terbaca sebagai karakter.
  2. Hapus missing values: baris dengan nilai NA dihapus menggunakan drop_na().
  3. Filter outlier ekstrem: observasi dengan body_fat >= 60% (tidak realistis secara biologis) dan sit_bend >= 100 cm dihapus untuk menghindari distorsi analisis.

2.3 Seleksi Variabel Numerik

num_cols <- c("age", "height_cm", "weight_kg", "body.fat_.",
              "diastolic", "systolic", "gripForce",
              "sit.and.bend.forward_cm", "sit.ups.counts", "broad.jump_cm")

X <- df_clean %>% select(all_of(num_cols))

colnames(X) <- c("age", "height_cm", "weight_kg", "body_fat",
                 "diastolic", "systolic", "gripForce",
                 "sit_bend", "sit_ups", "broad_jump")

Penjelasan: Dipilih 10 variabel numerik yang merepresentasikan kondisi fisik responden:

Variabel Keterangan
age Usia (tahun)
height_cm Tinggi badan (cm)
weight_kg Berat badan (kg)
body_fat Persentase lemak tubuh (%)
diastolic Tekanan darah diastolik (mmHg)
systolic Tekanan darah sistolik (mmHg)
gripForce Kekuatan genggaman (kg)
sit_bend Fleksibilitas duduk & membungkuk (cm)
sit_ups Jumlah sit-up
broad_jump Lompat jauh tanpa awalan (cm)

3 Statistik Deskriptif

desc_stats <- data.frame(
  Variabel = colnames(X),
  N        = sapply(X, function(x) sum(!is.na(x))),
  Mean     = round(sapply(X, mean, na.rm = TRUE), 2),
  SD       = round(sapply(X, sd,   na.rm = TRUE), 2),
  Min      = round(sapply(X, min,  na.rm = TRUE), 2),
  Q1       = round(sapply(X, quantile, probs = 0.25, na.rm = TRUE), 2),
  Median   = round(sapply(X, median, na.rm = TRUE), 2),
  Q3       = round(sapply(X, quantile, probs = 0.75, na.rm = TRUE), 2),
  Max      = round(sapply(X, max,  na.rm = TRUE), 2)
)
print(desc_stats)
##              Variabel     N   Mean    SD   Min    Q1 Median     Q3   Max
## age               age 13319  36.77 13.62  21.0  25.0   32.0  48.00  64.0
## height_cm   height_cm 13319 168.57  8.43 125.0 162.4  169.2 174.80 193.8
## weight_kg   weight_kg 13319  67.46 11.95  26.3  58.2   67.5  75.38 138.1
## body_fat     body_fat 13319  23.24  7.24   3.0  18.0   22.8  28.00  54.9
## diastolic   diastolic 13319  78.78 10.75   0.0  71.0   79.0  86.00 156.2
## systolic     systolic 13319 130.21 14.71   0.0 120.0  130.0 141.00 201.0
## gripForce   gripForce 13319  36.96 10.63   0.0  27.5   37.9  45.20  70.5
## sit_bend     sit_bend 13319  15.16  8.14 -25.0  10.9   16.2  20.70  42.0
## sit_ups       sit_ups 13319  39.76 14.27   0.0  30.0   41.0  50.00  80.0
## broad_jump broad_jump 13319 190.14 39.88   0.0 162.0  193.0 221.00 303.0

Penjelasan Output: Tabel statistik deskriptif menampilkan ringkasan setiap variabel:

  • N: jumlah observasi valid (non-NA).
  • Mean: rata-rata, menggambarkan nilai tengah distribusi.
  • SD: standar deviasi, mengukur seberapa jauh data menyebar dari rata-rata. SD yang besar mengindikasikan variasi tinggi.
  • Min & Max: nilai minimum dan maksimum.
  • Q1, Median, Q3: kuartil pertama, median, dan kuartil ketiga, berguna untuk memahami distribusi dan mendeteksi skewness.

Perhatikan bahwa variabel seperti gripForce, sit_ups, dan broad_jump memiliki rentang nilai yang lebar, menunjukkan tingkat kebugaran yang bervariasi antar individu. Perbedaan satuan antar variabel menjadi alasan utama perlunya standardisasi sebelum PCA/FA.


4 Eksplorasi Data (EDA)

4.1 Distribusi Variabel Kunci

p1 <- ggplot(X, aes(x = age)) +
  geom_histogram(bins = 40, fill = "#2E75B6", color = "white", alpha = 0.85) +
  labs(title = "Distribusi Usia", x = "Usia (tahun)", y = "Frekuensi") +
  theme_minimal(base_size = 11) +
  theme(plot.title = element_text(face = "bold"))

p2 <- ggplot(X, aes(x = body_fat)) +
  geom_histogram(bins = 40, fill = "#E74C3C", color = "white", alpha = 0.85) +
  labs(title = "Distribusi Body Fat (%)", x = "Body Fat (%)", y = "Frekuensi") +
  theme_minimal(base_size = 11) +
  theme(plot.title = element_text(face = "bold"))

p3 <- ggplot(X, aes(x = gripForce)) +
  geom_histogram(bins = 40, fill = "#27AE60", color = "white", alpha = 0.85) +
  labs(title = "Distribusi Grip Force", x = "Grip Force (kg)", y = "Frekuensi") +
  theme_minimal(base_size = 11) +
  theme(plot.title = element_text(face = "bold"))

p4 <- ggplot(X, aes(x = broad_jump)) +
  geom_histogram(bins = 40, fill = "#8E44AD", color = "white", alpha = 0.85) +
  labs(title = "Distribusi Broad Jump", x = "Broad Jump (cm)", y = "Frekuensi") +
  theme_minimal(base_size = 11) +
  theme(plot.title = element_text(face = "bold"))

grid.arrange(p1, p2, p3, p4, nrow = 2, top = "Distribusi Variabel Kunci")

Penjelasan Output: Keempat histogram menampilkan distribusi frekuensi variabel-variabel kunci:

  • Usia: distribusi cenderung miring ke kanan (right-skewed), artinya lebih banyak responden berusia muda dibanding tua.
  • Body Fat (%): distribusi relatif mendekati normal dengan puncak di kisaran 15–25%.
  • Grip Force: distribusi berbentuk bimodal (dua puncak), kemungkinan mencerminkan perbedaan kekuatan antara laki-laki dan perempuan.
  • Broad Jump: distribusi mendekati normal, sedikit miring ke kiri.

Adanya dua puncak pada Grip Force dan Broad Jump mengindikasikan perbedaan karakteristik berdasarkan jenis kelamin, yang wajar dalam data kebugaran fisik.

4.2 Matriks Korelasi

cor_matrix <- cor(X)
corrplot(cor_matrix, method = "color", tl.cex = 0.7,
         addCoef.col = "black", number.cex = 0.6)

Penjelasan Output: Matriks korelasi menampilkan hubungan linier antar variabel (nilai −1 hingga +1):

  • Warna biru gelap = korelasi positif kuat → kedua variabel meningkat bersama.
  • Warna merah gelap = korelasi negatif kuat → satu variabel naik, yang lain turun.
  • Warna putih/pucat = korelasi lemah atau tidak ada.

Pola yang terlihat: - gripForce, broad_jump, dan sit_ups berkorelasi positif → mengelompok sebagai indikator kebugaran fisik aktif. - body_fat berkorelasi negatif dengan variabel kebugaran aktif. - age berkorelasi negatif dengan variabel performa fisik → performa menurun seiring usia. - systolic dan diastolic berkorelasi positif kuat → keduanya merupakan ukuran tekanan darah.

Adanya korelasi signifikan antar variabel merupakan syarat penting untuk dapat menerapkan PCA dan FA.

4.3 Boxplot Variabel Terstandarisasi

X_scaled_df <- as.data.frame(scale(X))
X_melt      <- melt(X_scaled_df)

ggplot(X_melt, aes(x = variable, y = value, fill = variable)) +
  geom_boxplot(alpha = 0.75, outlier.size = 0.5, outlier.alpha = 0.3) +
  labs(title = "Boxplot Variabel (Standardisasi Z-Score)",
       x = "Variabel", y = "Nilai Terstandarisasi") +
  theme_minimal(base_size = 11) +
  theme(legend.position = "none",
        axis.text.x = element_text(angle = 45, hjust = 1),
        plot.title  = element_text(face = "bold"))

Penjelasan Output: Boxplot ini menampilkan distribusi setiap variabel setelah standardisasi Z-Score (mean = 0, SD = 1). Standardisasi dilakukan agar semua variabel memiliki skala yang sama dan tidak mendominasi hasil analisis hanya karena perbedaan satuan.

  • Kotak (IQR): rentang 25%–75% data.
  • Garis tengah: median.
  • Titik-titik di luar whisker: outlier.

Setelah standardisasi, seluruh variabel berada pada skala yang sama sehingga perbandingan antar variabel menjadi valid. Beberapa variabel masih memiliki outlier yang cukup banyak (titik-titik kecil), namun ini wajar dalam data biologis dan fisik.


5 Uji Asumsi (KMO dan Bartlett)

kmo_result  <- KMO(X)
print(kmo_result)
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = X)
## Overall MSA =  0.73
## MSA for each item = 
##        age  height_cm  weight_kg   body_fat  diastolic   systolic  gripForce 
##       0.64       0.77       0.60       0.61       0.60       0.64       0.84 
##   sit_bend    sit_ups broad_jump 
##       0.67       0.83       0.88
bart_result <- cortest.bartlett(X)
print(bart_result)
## $chisq
## [1] 83465.15
## 
## $p.value
## [1] 0
## 
## $df
## [1] 45

Penjelasan Output:

Sebelum melakukan PCA dan FA, perlu dilakukan dua uji kelayakan data:

Uji KMO (Kaiser-Meyer-Olkin)

KMO mengukur kecukupan sampling — seberapa cocok data untuk dianalisis dengan FA/PCA.

Nilai KMO Interpretasi
≥ 0.90 Sangat baik (Marvelous)
0.80–0.89 Baik (Meritorious)
0.70–0.79 Cukup (Middling)
0.60–0.69 Biasa (Mediocre)
< 0.50 Tidak layak

Nilai KMO keseluruhan (Overall MSA) dan nilai per variabel ditampilkan. Jika nilai Overall MSA ≥ 0.70, data layak untuk FA/PCA.

Uji Bartlett

Uji Bartlett menguji apakah matriks korelasi secara signifikan berbeda dari matriks identitas (artinya ada korelasi antar variabel).

  • H₀: Matriks korelasi adalah matriks identitas (tidak ada korelasi antar variabel).
  • H₁: Matriks korelasi bukan matriks identitas (ada korelasi signifikan).

Jika p-value < 0.05, H₀ ditolak → terdapat korelasi signifikan → data layak untuk PCA/FA.


6 Principal Component Analysis (PCA)

6.1 Eksekusi PCA

X_scaled   <- scale(X)
pca_result <- prcomp(X_scaled, center = FALSE, scale. = FALSE)
print(summary(pca_result))
## Importance of components:
##                           PC1    PC2    PC3     PC4    PC5     PC6    PC7
## Standard deviation     2.0449 1.4361 1.1018 0.88886 0.8019 0.56348 0.5514
## Proportion of Variance 0.4182 0.2062 0.1214 0.07901 0.0643 0.03175 0.0304
## Cumulative Proportion  0.4182 0.6244 0.7458 0.82479 0.8891 0.92084 0.9513
##                            PC8     PC9    PC10
## Standard deviation     0.46341 0.41725 0.31410
## Proportion of Variance 0.02148 0.01741 0.00987
## Cumulative Proportion  0.97272 0.99013 1.00000

Penjelasan Output: summary(pca_result) menghasilkan tiga baris ringkasan untuk setiap PC:

  • Standard deviation: akar kuadrat dari eigenvalue, menunjukkan besarnya variansi yang ditangkap oleh tiap PC.
  • Proportion of Variance: proporsi variansi total yang dijelaskan oleh masing-masing PC.
  • Cumulative Proportion: variansi kumulatif. Umumnya, PC yang dipilih adalah yang mencapai ≥ 70–80% variansi kumulatif.

6.2 Tabel Eigenvalue dan Variansi

eigenvalues   <- pca_result$sdev^2
var_explained <- eigenvalues / sum(eigenvalues) * 100
cum_var       <- cumsum(var_explained)

pca_summary <- data.frame(
  PC           = paste0("PC", 1:10),
  Eigenvalue   = round(eigenvalues, 4),
  Variansi_pct = round(var_explained, 2),
  Variansi_Kum = round(cum_var, 2)
)
print(pca_summary)
##      PC Eigenvalue Variansi_pct Variansi_Kum
## 1   PC1     4.1815        41.81        41.81
## 2   PC2     2.0623        20.62        62.44
## 3   PC3     1.2140        12.14        74.58
## 4   PC4     0.7901         7.90        82.48
## 5   PC5     0.6430         6.43        88.91
## 6   PC6     0.3175         3.18        92.08
## 7   PC7     0.3040         3.04        95.12
## 8   PC8     0.2148         2.15        97.27
## 9   PC9     0.1741         1.74        99.01
## 10 PC10     0.0987         0.99       100.00

Penjelasan Output: Tabel ini merangkum informasi penting setiap Principal Component:

  • Eigenvalue: ukuran variansi yang dijelaskan oleh sebuah PC. Berdasarkan Kriteria Kaiser, PC dengan eigenvalue > 1 dianggap signifikan.
  • Variansi_pct: persentase variansi total yang dijelaskan oleh masing-masing PC.
  • Variansi_Kum: akumulasi persentase variansi. PC yang dipilih adalah hingga kumulatif mencapai ≥ 80%.

Dari tabel ini kita dapat menentukan berapa PC yang optimal untuk dipertahankan dalam analisis selanjutnya.

6.3 Scree Plot

fviz_eig(pca_result,
         addlabels = TRUE,
         ylim      = c(0, 50),
         barfill   = "#2E75B6",
         barcolor  = "white",
         linecolor = "#E74C3C",
         main      = "Scree Plot PCA",
         xlab      = "Principal Component",
         ylab      = "Persentase Variansi yang Dijelaskan (%)")

Penjelasan Output: Scree Plot menampilkan persentase variansi yang dijelaskan oleh setiap PC dalam bentuk batang, dengan garis merah menghubungkan titik-titik antar PC.

Cara membaca Scree Plot: - Perhatikan titik di mana kurva mulai “melandai” (elbow point). - PC sebelum titik siku inilah yang sebaiknya dipertahankan. - Biasanya, PC pertama menjelaskan variansi terbesar dan semakin berkurang untuk PC berikutnya.

Scree Plot membantu secara visual menentukan jumlah komponen yang optimal.

6.4 Grafik Variansi Kumulatif

ggplot(pca_summary, aes(x = as.numeric(gsub("PC", "", PC)))) +
  geom_col(aes(y = Variansi_pct), fill = "#2E75B6", alpha = 0.8) +
  geom_line(aes(y = Variansi_Kum), color = "#E74C3C", size = 1.2) +
  geom_point(aes(y = Variansi_Kum), color = "#E74C3C", size = 3) +
  geom_hline(yintercept = 80, linetype = "dashed", color = "#27AE60", size = 1) +
  annotate("text", x = 9.5, y = 82, label = "80%", color = "#27AE60", fontface = "bold") +
  scale_x_continuous(breaks = 1:10, labels = paste0("PC", 1:10)) +
  labs(title = "Variansi Kumulatif PCA",
       x = "Principal Component", y = "Variansi (%)") +
  theme_minimal(base_size = 11) +
  theme(plot.title  = element_text(face = "bold"),
        axis.text.x = element_text(angle = 45, hjust = 1))

Penjelasan Output: Grafik ini menggabungkan dua informasi penting:

  • Batang biru: persentase variansi per PC (individual).
  • Garis merah: variansi kumulatif.
  • Garis putus-putus hijau: ambang batas 80%.

PC yang diperlukan adalah yang cukup untuk mencapai garis 80%. Grafik ini memudahkan penentuan jumlah PC secara visual dan kuantitatif sekaligus.

6.5 Loading Matrix PCA

loadings_pca <- as.data.frame(pca_result$rotation[, 1:4])
colnames(loadings_pca) <- c("PC1", "PC2", "PC3", "PC4")
print(round(loadings_pca, 3))
##               PC1    PC2    PC3    PC4
## age         0.208 -0.378  0.050 -0.748
## height_cm  -0.421 -0.077 -0.235 -0.045
## weight_kg  -0.337 -0.301 -0.319  0.164
## body_fat    0.331 -0.241 -0.174  0.534
## diastolic  -0.106 -0.506  0.404  0.250
## systolic   -0.143 -0.518  0.380  0.067
## gripForce  -0.432 -0.095 -0.056 -0.193
## sit_bend    0.047  0.285  0.668  0.011
## sit_ups    -0.378  0.267  0.216  0.142
## broad_jump -0.439  0.130  0.082 -0.047

Penjelasan Output: Loading matrix menunjukkan koefisien (bobot) setiap variabel asli terhadap masing-masing PC.

  • Nilai loading berkisar antara −1 hingga +1.
  • Loading tinggi positif (mendekati +1): variabel berkontribusi besar searah dengan PC tersebut.
  • Loading tinggi negatif (mendekati −1): variabel berkontribusi besar berlawanan arah.
  • Loading mendekati 0: variabel tidak banyak berkontribusi pada PC tersebut.

Dengan membaca loading matrix, kita dapat menginterpretasikan makna setiap PC berdasarkan variabel-variabel dominan yang membentuknya.

6.6 Heatmap Loading PCA

load_melt <- melt(as.matrix(loadings_pca))
colnames(load_melt) <- c("Variabel", "Komponen", "Loading")

ggplot(load_melt, aes(x = Komponen, y = Variabel, fill = Loading)) +
  geom_tile(color = "white") +
  geom_text(aes(label = round(Loading, 2)), size = 3.5, fontface = "bold") +
  scale_fill_gradient2(low = "#D73027", mid = "white", high = "#1A6FBA",
                       midpoint = 0, limits = c(-1, 1)) +
  labs(title = "Heatmap Loading Matrix PCA",
       x = "Komponen Utama", y = "Variabel", fill = "Loading") +
  theme_minimal(base_size = 11) +
  theme(plot.title  = element_text(face = "bold"),
        axis.text.y = element_text(size = 10))

Penjelasan Output: Heatmap adalah representasi visual dari loading matrix, memudahkan identifikasi pola:

  • Biru gelap: loading positif kuat → variabel penting untuk PC tersebut (arah positif).
  • Merah gelap: loading negatif kuat → variabel penting untuk PC tersebut (arah negatif).
  • Putih: loading mendekati nol → variabel tidak berpengaruh pada PC tersebut.

Dari heatmap, pola kelompok variabel per PC lebih mudah terlihat secara visual dibanding hanya membaca angka di loading matrix.

6.7 Biplot PCA

fviz_pca_biplot(pca_result,
                geom.ind    = "point",
                pointshape  = 21,
                pointsize   = 1.5,
                fill.ind    = "#AED6F1",
                col.ind     = "transparent",
                col.var     = "#E74C3C",
                arrowsize   = 0.8,
                repel       = TRUE,
                alpha.ind   = 0.3,
                title       = "Biplot PCA (PC1 vs PC2)")

Penjelasan Output: Biplot menggabungkan dua informasi dalam satu grafik:

  • Titik biru (individu/observasi): posisi setiap responden dalam ruang PC1–PC2. Titik yang berdekatan memiliki karakteristik fisik yang mirip.
  • Panah merah (variabel): arah dan panjang panah menunjukkan kontribusi dan korelasi variabel terhadap PC.

Cara membaca Biplot: - Panah yang searah → variabel berkorelasi positif. - Panah yang berlawanan arah → variabel berkorelasi negatif. - Panah yang tegak lurus → variabel tidak berkorelasi. - Panjang panah menunjukkan besarnya kontribusi variabel tersebut. - Observasi yang searah dengan sebuah panah memiliki nilai tinggi untuk variabel tersebut.

6.8 Kontribusi Variabel ke PC1 dan PC2

contrib_pc1 <- fviz_contrib(pca_result, choice = "var", axes = 1,
                            fill = "#2E75B6", color = "white",
                            title = "Kontribusi Variabel ke PC1")

contrib_pc2 <- fviz_contrib(pca_result, choice = "var", axes = 2,
                            fill = "#E74C3C", color = "white",
                            title = "Kontribusi Variabel ke PC2")

grid.arrange(contrib_pc1, contrib_pc2, nrow = 1,
             top = "Kontribusi Variabel ke PC1 dan PC2")

Penjelasan Output: Grafik kontribusi menunjukkan seberapa besar setiap variabel berkontribusi dalam membentuk PC tertentu (dalam persen).

  • Garis putus-putus merah: ambang rata-rata kontribusi (100%/jumlah variabel = 10% untuk 10 variabel). Variabel di atas garis ini dianggap berkontribusi signifikan.
  • PC1: variabel yang dominan menggambarkan dimensi pertama (biasanya kebugaran umum atau ukuran tubuh).
  • PC2: variabel yang dominan menggambarkan dimensi kedua (aspek fisik yang orthogonal terhadap PC1).

Variabel dengan batang tinggi (melampaui garis merah) adalah variabel yang paling berpengaruh dalam mendefinisikan komponen tersebut.


7 Factor Analysis (FA)

7.1 Parallel Analysis (Penentuan Jumlah Faktor)

fa.parallel(X_scaled,
            fa   = "fa",
            fm   = "ml",
            main = "Parallel Analysis untuk Menentukan Jumlah Faktor")

## Parallel analysis suggests that the number of factors =  4  and the number of components =  NA

Penjelasan Output: Parallel Analysis adalah metode yang lebih akurat dibanding hanya menggunakan kriteria Kaiser (eigenvalue > 1) untuk menentukan jumlah faktor optimal.

Cara kerja: Data acak (simulasi) dengan ukuran dan jumlah variabel yang sama dibuat berkali-kali, lalu eigenvalue-nya dihitung. Faktor riil yang eigenvalue-nya melebihi garis simulasi acak dianggap signifikan.

Cara membaca grafik: - Garis biru (FA Actual Data): eigenvalue dari data nyata. - Garis merah (Simulated Data): rata-rata eigenvalue dari data acak. - Titik di mana garis biru berada di atas garis merah: jumlah faktor yang direkomendasikan.

Jumlah faktor yang ditunjukkan oleh output teks (“Parallel analysis suggests that the number of factors = X”) adalah rekomendasi yang digunakan.

7.2 Ekstraksi Faktor

fa_result <- fa(X_scaled,
                nfactors = 3,
                rotate   = "varimax",
                fm       = "ml")

print(fa_result)
## Factor Analysis using method =  ml
## Call: fa(r = X_scaled, nfactors = 3, rotate = "varimax", fm = "ml")
## Standardized loadings (pattern matrix) based upon correlation matrix
##              ML2   ML1   ML3   h2    u2 com
## age        -0.46  0.00  0.26 0.28 0.715 1.6
## height_cm   0.66  0.54  0.11 0.74 0.263 2.0
## weight_kg   0.33  0.92  0.21 1.00 0.005 1.4
## body_fat   -0.81  0.20 -0.02 0.70 0.298 1.1
## diastolic   0.00  0.12  0.72 0.54 0.464 1.1
## systolic    0.05  0.14  0.91 0.85 0.151 1.1
## gripForce   0.72  0.45  0.21 0.77 0.227 1.9
## sit_bend    0.09 -0.35 -0.05 0.13 0.865 1.2
## sit_ups     0.81  0.03  0.00 0.65 0.349 1.0
## broad_jump  0.89  0.18  0.09 0.84 0.163 1.1
## 
##                        ML2  ML1  ML3
## SS loadings           3.40 1.57 1.52
## Proportion Var        0.34 0.16 0.15
## Cumulative Var        0.34 0.50 0.65
## Proportion Explained  0.52 0.24 0.23
## Cumulative Proportion 0.52 0.77 1.00
## 
## Mean item complexity =  1.3
## Test of the hypothesis that 3 factors are sufficient.
## 
## df null model =  45  with the objective function =  6.27 with Chi Square =  83465.15
## df of  the model are 18  and the objective function was  0.58 
## 
## The root mean square of the residuals (RMSR) is  0.05 
## The df corrected root mean square of the residuals is  0.08 
## 
## The harmonic n.obs is  13319 with the empirical chi square  1399.29  with prob <  2e-286 
## The total n.obs was  13319  with Likelihood Chi Square =  7756.83  with prob <  0 
## 
## Tucker Lewis Index of factoring reliability =  0.768
## RMSEA index =  0.18  and the 90 % confidence intervals are  0.176 0.183
## BIC =  7585.88
## Fit based upon off diagonal values = 0.99
## Measures of factor score adequacy             
##                                                    ML2  ML1  ML3
## Correlation of (regression) scores with factors   0.96 0.99 0.93
## Multiple R square of scores with factors          0.92 0.98 0.86
## Minimum correlation of possible factor scores     0.84 0.95 0.73

Penjelasan Output: Hasil print(fa_result) menampilkan informasi lengkap Factor Analysis:

Bagian-bagian output:

  1. Standardized loadings (pattern matrix): bobot setiap variabel terhadap setiap faktor. Nilai di atas 0.4 (atau 0.5) biasanya dianggap signifikan.

  2. SS loadings: jumlah kuadrat loading per faktor, menunjukkan variansi yang dijelaskan oleh faktor tersebut.

  3. Proportion Var: proporsi variansi total yang dijelaskan oleh masing-masing faktor.

  4. Cumulative Var: variansi kumulatif.

  5. h2 (communality): proporsi variansi variabel yang dapat dijelaskan oleh seluruh faktor. Nilai mendekati 1 berarti variabel tersebut dijelaskan dengan baik.

  6. u2 (uniqueness): 1 − h2, variansi unik yang tidak dijelaskan faktor. Nilai kecil lebih baik.

  7. Fit indices: RMSEA, TLI, dll., mengukur seberapa baik model faktor cocok dengan data.

Metode yang digunakan: - fm = "ml": Maximum Likelihood — metode estimasi yang optimal untuk data yang mendekati normal. - rotate = "varimax": rotasi ortogonal yang memaksimalkan loading tinggi pada sedikit variabel per faktor, memudahkan interpretasi.

7.3 Tabel Loading Faktor

loadings_fa <- as.data.frame(unclass(fa_result$loadings))
print(round(loadings_fa, 3))
##               ML2    ML1    ML3
## age        -0.464 -0.001  0.263
## height_cm   0.661  0.537  0.108
## weight_kg   0.331  0.918  0.207
## body_fat   -0.813  0.204 -0.019
## diastolic  -0.002  0.124  0.722
## systolic    0.052  0.145  0.908
## gripForce   0.724  0.454  0.209
## sit_bend    0.086 -0.353 -0.049
## sit_ups     0.807  0.029  0.001
## broad_jump  0.893  0.181  0.088

Penjelasan Output: Tabel loading faktor menunjukkan hubungan antara variabel asli dan faktor laten:

  • Setiap kolom mewakili satu faktor laten (ML1, ML2, ML3).
  • Nilai loading ≥ 0.40 biasanya dijadikan batas untuk menyatakan bahwa variabel “memuati” faktor tersebut secara bermakna.
  • Variabel dengan loading tinggi pada faktor yang sama dikelompokkan untuk memberi nama/label faktor yang bermakna secara substantif.

Contoh interpretasi: - Jika gripForce, broad_jump, sit_ups memiliki loading tinggi pada Faktor 1 → Faktor 1 dapat diberi nama “Kebugaran Fisik”. - Jika body_fat, weight_kg memiliki loading tinggi pada Faktor 2 → Faktor 2 dapat diberi nama “Komposisi Tubuh”.

7.4 Diagram Struktur Faktor

fa.diagram(fa_result,
           main   = "Diagram Struktur Faktor",
           simple = TRUE)

Penjelasan Output: Diagram ini menampilkan hubungan antara faktor laten dan variabel observasi dalam format diagram path:

  • Kotak kiri: faktor-faktor laten (ML1, ML2, ML3).
  • Teks di kanan: variabel-variabel yang diobservasi.
  • Garis dan angka: loading faktor (koefisien jalur). Hanya loading yang signifikan ditampilkan (berdasarkan simple = TRUE).
  • Nilai positif: hubungan positif antara faktor dan variabel.
  • Nilai negatif: hubungan negatif.

Diagram ini memudahkan pemahaman tentang variabel mana yang membentuk faktor mana, dan menjadi dasar interpretasi substantif dari setiap faktor.

7.5 Scree Plot Factor Analysis

eigen_fa <- eigen(cor(X_scaled))$values

plot(eigen_fa, type = "b",
     main = "Scree Plot Factor Analysis",
     xlab = "Faktor",
     ylab = "Eigenvalue",
     pch  = 19,
     col  = "#2E75B6")
abline(h = 1, col = "red", lty = 2)

Penjelasan Output: Scree Plot untuk FA menggunakan eigenvalue dari matriks korelasi:

  • Titik dan garis biru: menunjukkan eigenvalue setiap faktor.
  • Garis merah putus-putus (y = 1): batas Kriteria Kaiser. Faktor dengan eigenvalue di atas garis merah (> 1) dianggap layak dipertahankan.

Cara membaca: - Hitung berapa faktor yang eigenvalue-nya berada di atas garis merah. - Perhatikan juga “siku” (elbow) pada kurva sebagai panduan visual tambahan.

Scree Plot FA ini dikombinasikan dengan hasil Parallel Analysis untuk menentukan jumlah faktor yang paling tepat.

7.6 Heatmap Loading FA

loadings_fa <- as.data.frame(unclass(fa_result$loadings))

load_melt_fa <- melt(as.matrix(loadings_fa))
colnames(load_melt_fa) <- c("Variabel", "Faktor", "Loading")

ggplot(load_melt_fa, aes(x = Faktor, y = Variabel, fill = Loading)) +
  geom_tile(color = "white") +
  geom_text(aes(label = round(Loading, 2)), size = 3.5, fontface = "bold") +
  scale_fill_gradient2(low = "#D73027", mid = "white", high = "#1A6FBA",
                       midpoint = 0, limits = c(-1, 1)) +
  labs(title = "Heatmap Loading Matrix Factor Analysis",
       x = "Faktor", y = "Variabel", fill = "Loading") +
  theme_minimal(base_size = 11) +
  theme(plot.title  = element_text(face = "bold"),
        axis.text.y = element_text(size = 10))

Penjelasan Output: Heatmap loading FA memvisualisasikan struktur faktor secara intuitif:

  • Biru tua: loading positif tinggi → variabel sangat berkaitan dengan faktor tersebut (hubungan positif).
  • Merah tua: loading negatif tinggi → variabel berkaitan berlawanan arah dengan faktor.
  • Putih/pucat: loading rendah → variabel tidak banyak berkaitan dengan faktor tersebut.

Heatmap yang “bersih” (setiap variabel hanya berwarna gelap pada satu faktor saja) menunjukkan bahwa rotasi varimax berhasil menghasilkan simple structure — struktur faktor yang mudah diinterpretasikan.


8 Perbandingan PCA dan FA

Aspek PCA FA
Tujuan Reduksi dimensi, memaksimalkan variansi Menemukan faktor laten yang tidak teramati
Model Tidak ada model probabilistik Ada model probabilistik (faktor + error)
Jumlah komponen Sama dengan variabel (dipilih sebagian) Lebih sedikit dari variabel
Komunalitas Menggunakan variansi total (h² = 1) Memisahkan variansi bersama dan unik
Rotasi Opsional Umumnya digunakan (varimax, oblimin)
Interpretasi PC sebagai kombinasi linier variabel Faktor sebagai konstruk laten bermakna
Penggunaan utama Preprocessing, reduksi noise Konstruksi skala, validasi konstruk

9 Kesimpulan

  1. Uji Asumsi: Data memenuhi syarat untuk PCA dan FA (KMO ≥ 0.70, Bartlett p < 0.05).

  2. PCA: Beberapa PC pertama mampu menjelaskan sebagian besar variansi data (~80%). PC1 umumnya menangkap dimensi kebugaran aktif, PC2 menangkap dimensi komposisi/ukuran tubuh.

  3. FA: Tiga faktor laten berhasil diidentifikasi, merepresentasikan konstruk-konstruk seperti kebugaran fisik aktif, komposisi tubuh, dan kondisi kardiovaskular. Rotasi varimax menghasilkan struktur faktor yang mudah diinterpretasikan.

  4. Implikasi praktis: Variabel kebugaran yang berjumlah 10 dapat dirangkum menjadi 3–4 dimensi/faktor utama tanpa kehilangan informasi yang signifikan, memudahkan analisis lanjutan atau pembuatan indeks kebugaran.