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.
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
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:
- Konversi tipe data: kolom
body.fat_.dikonversi ke numerik karena mungkin terbaca sebagai karakter.- Hapus missing values: baris dengan nilai NA dihapus menggunakan
drop_na().- Filter outlier ekstrem: observasi dengan
body_fat >= 60%(tidak realistis secara biologis) dansit_bend >= 100 cmdihapus untuk menghindari distorsi analisis.
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)
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, danbroad_jumpmemiliki rentang nilai yang lebar, menunjukkan tingkat kebugaran yang bervariasi antar individu. Perbedaan satuan antar variabel menjadi alasan utama perlunya standardisasi sebelum PCA/FA.
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.
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, dansit_upsberkorelasi positif → mengelompok sebagai indikator kebugaran fisik aktif. -body_fatberkorelasi negatif dengan variabel kebugaran aktif. -ageberkorelasi negatif dengan variabel performa fisik → performa menurun seiring usia. -systolicdandiastolicberkorelasi positif kuat → keduanya merupakan ukuran tekanan darah.Adanya korelasi signifikan antar variabel merupakan syarat penting untuk dapat menerapkan PCA dan FA.
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.
## 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
## $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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
## 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:
Standardized loadings (pattern matrix): bobot setiap variabel terhadap setiap faktor. Nilai di atas 0.4 (atau 0.5) biasanya dianggap signifikan.
SS loadings: jumlah kuadrat loading per faktor, menunjukkan variansi yang dijelaskan oleh faktor tersebut.
Proportion Var: proporsi variansi total yang dijelaskan oleh masing-masing faktor.
Cumulative Var: variansi kumulatif.
h2 (communality): proporsi variansi variabel yang dapat dijelaskan oleh seluruh faktor. Nilai mendekati 1 berarti variabel tersebut dijelaskan dengan baik.
u2 (uniqueness): 1 − h2, variansi unik yang tidak dijelaskan faktor. Nilai kecil lebih baik.
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.
## 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_upsmemiliki loading tinggi pada Faktor 1 → Faktor 1 dapat diberi nama “Kebugaran Fisik”. - Jikabody_fat,weight_kgmemiliki loading tinggi pada Faktor 2 → Faktor 2 dapat diberi nama “Komposisi Tubuh”.
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.
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.
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.
| 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 |
Uji Asumsi: Data memenuhi syarat untuk PCA dan FA (KMO ≥ 0.70, Bartlett p < 0.05).
PCA: Beberapa PC pertama mampu menjelaskan sebagian besar variansi data (~80%). PC1 umumnya menangkap dimensi kebugaran aktif, PC2 menangkap dimensi komposisi/ukuran tubuh.
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.
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.