R Markdown

Anggota Kelompok: 1. Zulaika Fadila Handini 23031554182 2. Kezia Joice Cicilia 23031554191

Import Library

# 1️⃣ Load Library yang Dibutuhkan
library(readr)       # Untuk membaca file CSV
## Warning: package 'readr' was built under R version 4.4.3
library(dplyr)       # Untuk manipulasi data
## Warning: package 'dplyr' was built under R version 4.4.3
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(psych)       # Untuk uji KMO dan Bartlett
## Warning: package 'psych' was built under R version 4.4.3
library(corrplot)    # Untuk visualisasi korelasi
## Warning: package 'corrplot' was built under R version 4.4.3
## corrplot 0.95 loaded
library(FactoMineR)  # Untuk PCA FactoMineR
## Warning: package 'FactoMineR' was built under R version 4.4.3
library(factoextra)  # Untuk visualisasi PCA
## Warning: package 'factoextra' was built under R version 4.4.3
## Loading required package: ggplot2
## 
## Attaching package: 'ggplot2'
## The following objects are masked from 'package:psych':
## 
##     %+%, alpha
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa

Membaca Dataset dan menghasilkan: 506 obs. of 14 variables → Dataset memiliki 506 observasi dan 14 variabel. Seluruh data merupakan bertipe numerik Min (Minimum): Nilai terkecil dalam variabel. 1st Qu. (Kuartil 1): Nilai di persentil ke-25. Median (Kuartil 2): Nilai tengah dalam dataset. Mean: Rata-rata dari semua nilai dalam variabel. 3rd Qu. (Kuartil 3): Nilai di persentil ke-75. Max (Maksimum): Nilai terbesar dalam variabel.

# 2️⃣ Baca Dataset
data <- read_csv("C:/Users/zulai/Downloads/Boston.csv")
## New names:
## Rows: 506 Columns: 15
## ── Column specification
## ──────────────────────────────────────────────────────── Delimiter: "," dbl
## (15): ...1, crim, zn, indus, chas, nox, rm, age, dis, rad, tax, ptratio,...
## ℹ Use `spec()` to retrieve the full column specification for this data. ℹ
## Specify the column types or set `show_col_types = FALSE` to quiet this message.
## • `` -> `...1`
# 3️⃣ Hapus kolom pertama karena hanya berisi indeks
data <- data %>% select(-1)
# 4️⃣ Cek Struktur Data dan Ringkasan Statistik
head(data)
## # A tibble: 6 × 14
##      crim    zn indus  chas   nox    rm   age   dis   rad   tax ptratio black
##     <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>   <dbl> <dbl>
## 1 0.00632    18  2.31     0 0.538  6.58  65.2  4.09     1   296    15.3  397.
## 2 0.0273      0  7.07     0 0.469  6.42  78.9  4.97     2   242    17.8  397.
## 3 0.0273      0  7.07     0 0.469  7.18  61.1  4.97     2   242    17.8  393.
## 4 0.0324      0  2.18     0 0.458  7.00  45.8  6.06     3   222    18.7  395.
## 5 0.0690      0  2.18     0 0.458  7.15  54.2  6.06     3   222    18.7  397.
## 6 0.0298      0  2.18     0 0.458  6.43  58.7  6.06     3   222    18.7  394.
## # ℹ 2 more variables: lstat <dbl>, medv <dbl>
str(data)
## tibble [506 × 14] (S3: tbl_df/tbl/data.frame)
##  $ crim   : num [1:506] 0.00632 0.02731 0.02729 0.03237 0.06905 ...
##  $ zn     : num [1:506] 18 0 0 0 0 0 12.5 12.5 12.5 12.5 ...
##  $ indus  : num [1:506] 2.31 7.07 7.07 2.18 2.18 2.18 7.87 7.87 7.87 7.87 ...
##  $ chas   : num [1:506] 0 0 0 0 0 0 0 0 0 0 ...
##  $ nox    : num [1:506] 0.538 0.469 0.469 0.458 0.458 0.458 0.524 0.524 0.524 0.524 ...
##  $ rm     : num [1:506] 6.58 6.42 7.18 7 7.15 ...
##  $ age    : num [1:506] 65.2 78.9 61.1 45.8 54.2 58.7 66.6 96.1 100 85.9 ...
##  $ dis    : num [1:506] 4.09 4.97 4.97 6.06 6.06 ...
##  $ rad    : num [1:506] 1 2 2 3 3 3 5 5 5 5 ...
##  $ tax    : num [1:506] 296 242 242 222 222 222 311 311 311 311 ...
##  $ ptratio: num [1:506] 15.3 17.8 17.8 18.7 18.7 18.7 15.2 15.2 15.2 15.2 ...
##  $ black  : num [1:506] 397 397 393 395 397 ...
##  $ lstat  : num [1:506] 4.98 9.14 4.03 2.94 5.33 ...
##  $ medv   : num [1:506] 24 21.6 34.7 33.4 36.2 28.7 22.9 27.1 16.5 18.9 ...
summary(data)
##       crim                zn             indus            chas        
##  Min.   : 0.00632   Min.   :  0.00   Min.   : 0.46   Min.   :0.00000  
##  1st Qu.: 0.08205   1st Qu.:  0.00   1st Qu.: 5.19   1st Qu.:0.00000  
##  Median : 0.25651   Median :  0.00   Median : 9.69   Median :0.00000  
##  Mean   : 3.61352   Mean   : 11.36   Mean   :11.14   Mean   :0.06917  
##  3rd Qu.: 3.67708   3rd Qu.: 12.50   3rd Qu.:18.10   3rd Qu.:0.00000  
##  Max.   :88.97620   Max.   :100.00   Max.   :27.74   Max.   :1.00000  
##       nox               rm             age              dis        
##  Min.   :0.3850   Min.   :3.561   Min.   :  2.90   Min.   : 1.130  
##  1st Qu.:0.4490   1st Qu.:5.886   1st Qu.: 45.02   1st Qu.: 2.100  
##  Median :0.5380   Median :6.208   Median : 77.50   Median : 3.207  
##  Mean   :0.5547   Mean   :6.285   Mean   : 68.57   Mean   : 3.795  
##  3rd Qu.:0.6240   3rd Qu.:6.623   3rd Qu.: 94.08   3rd Qu.: 5.188  
##  Max.   :0.8710   Max.   :8.780   Max.   :100.00   Max.   :12.127  
##       rad              tax           ptratio          black       
##  Min.   : 1.000   Min.   :187.0   Min.   :12.60   Min.   :  0.32  
##  1st Qu.: 4.000   1st Qu.:279.0   1st Qu.:17.40   1st Qu.:375.38  
##  Median : 5.000   Median :330.0   Median :19.05   Median :391.44  
##  Mean   : 9.549   Mean   :408.2   Mean   :18.46   Mean   :356.67  
##  3rd Qu.:24.000   3rd Qu.:666.0   3rd Qu.:20.20   3rd Qu.:396.23  
##  Max.   :24.000   Max.   :711.0   Max.   :22.00   Max.   :396.90  
##      lstat            medv      
##  Min.   : 1.73   Min.   : 5.00  
##  1st Qu.: 6.95   1st Qu.:17.02  
##  Median :11.36   Median :21.20  
##  Mean   :12.65   Mean   :22.53  
##  3rd Qu.:16.95   3rd Qu.:25.00  
##  Max.   :37.97   Max.   :50.00
  1. Uji Bartlett menghasilkan p-value < 0.001, menunjukkan bahwa ada korelasi antar variabel, sehingga PCA bisa digunakan.
  2. Uji KMO menunjukkan nilai 0.78, artinya data cukup baik untuk PCA, meskipun tidak sempurna.
  3. Determinasi matriks korelasi adalah 0.0023, menunjukkan tidak ada masalah multikolinearitas serius, tetapi ada variabel yang mungkin sangat berkorelasi.
  4. Dari heatmap ini, kita bisa melihat beberapa pola menarik: “rm” vs. “medv” memiliki korelasi positif yang cukup tinggi, yang berarti jumlah kamar berkorelasi positif dengan harga rumah. “lstat” vs. “medv” memiliki korelasi negatif yang cukup kuat, artinya semakin tinggi persentase penduduk berstatus sosial rendah, semakin rendah harga rumah. “tax” vs. “rad” memiliki korelasi yang sangat tinggi, yang mungkin menunjukkan bahwa daerah dengan aksesibilitas jalan raya tertentu memiliki pajak properti yang lebih tinggi.
  5. Data dinormalisasi dengan scale() agar semua variabel berada dalam skala yang sama sebelum PCA diterapkan.

PCA dapat dilakukan

# 5️⃣ Uji Asumsi untuk PCA
# Uji Bartlett’s Test (Cek korelasi antar variabel)
# Tentukan jumlah observasi secara otomatis
# Tentukan jumlah observasi
n <- nrow(data)
# Uji Bartlett dengan jumlah sampel yang benar
cortest.bartlett(R = cor(data), n = n)
## $chisq
## [1] 5132.764
## 
## $p.value
## [1] 0
## 
## $df
## [1] 91
# Uji KMO (Cek kecocokan data untuk PCA)
KMO(data)
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = data)
## Overall MSA =  0.85
## MSA for each item = 
##    crim      zn   indus    chas     nox      rm     age     dis     rad     tax 
##    0.92    0.84    0.90    0.63    0.89    0.84    0.91    0.86    0.77    0.80 
## ptratio   black   lstat    medv 
##    0.80    0.94    0.89    0.79
# Cek Determinan Matriks Korelasi (Cek multikolinearitas)
det(cor(data))  
## [1] 3.445683e-05
# (Opsional) Visualisasi Heatmap Korelasi
corrplot(cor(data), method = "color", type = "upper", tl.col = "black", tl.cex = 0.7)

# 6️⃣ Normalisasi Data (Standarisasi)
scaled_data <- scale(data %>% select(-medv))  # Tidak termasuk variabel target

Matriks kovarians digunakan untuk mengukur hubungan antara variabel dalam dataset setelah dinormalisasi. Eigenvalues menunjukkan seberapa besar variasi data yang bisa dijelaskan oleh setiap Principal Component (PC). Semakin besar eigenvalue, semakin besar kontribusi PC tersebut dalam menjelaskan variasi data. Biasanya, kita memilih PC dengan eigenvalue ≥ 1 atau berdasarkan cumulative variance (≥ 70%). Eigenvectors adalah kombinasi linier dari variabel asli yang membentuk setiap Principal Component. Setiap kolom dari eigenvectors mewakili satu Principal Component (PC). Elemen dalam eigenvector menunjukkan bobot dari masing-masing variabel dalam pembentukan PC tersebut.

Interpretasi output: a. PC1 (Komponen 1) memiliki eigenvalue 5.34, artinya PC1 menjelaskan varian terbesar dalam data. PC2 (Komponen 2) memiliki eigenvalue 2.78, artinya PC2 menjelaskan varians kedua terbesar. PC yang memiliki eigenvalue kecil (< 1) biasanya diabaikan karena kontribusinya kecil.

  1. PC1 lebih banyak dipengaruhi oleh variabel rm (jumlah kamar) dan zn (zona perumahan). PC2 dipengaruhi oleh indus (persentase area industri) dan nox (polusi udara). PC3 memiliki kontribusi dari nox dan indus, tetapi dengan arah yang berbeda dari PC2.
# 7️⃣ Menghitung Eigenvalues dan Eigenvectors Secara Manual
cov_matrix <- cov(scaled_data)   # Matriks kovarians
eig_decomp <- eigen(cov_matrix)  # Dekomposisi nilai eigen

# 8️⃣ Menampilkan Eigenvalues dan Eigenvectors
eig_values <- eig_decomp$values  # Nilai eigen
eig_vectors <- eig_decomp$vectors  # Vektor eigen

print(eig_values)  # Menampilkan nilai eigen
##  [1] 6.12684883 1.43327512 1.24261667 0.85757511 0.83481594 0.65740718
##  [7] 0.53535609 0.39609731 0.27694333 0.22023782 0.18601437 0.16930298
## [13] 0.06350926
print(eig_vectors)  # Menampilkan vektor eigen
##               [,1]        [,2]        [,3]        [,4]         [,5]        [,6]
##  [1,]  0.250951397  0.31525237 -0.24656649 -0.06177071  0.082156919 -0.21965961
##  [2,] -0.256314541  0.32331290 -0.29585782 -0.12871159  0.320616987 -0.32338810
##  [3,]  0.346672065 -0.11249291  0.01594592 -0.01714571 -0.007811194 -0.07613790
##  [4,]  0.005042434 -0.45482914 -0.28978082 -0.81594136  0.086530945  0.16749014
##  [5,]  0.342852313 -0.21911553 -0.12096411  0.12822614  0.136853557 -0.15298267
##  [6,] -0.189242570 -0.14933154 -0.59396117  0.28059184 -0.423447195  0.05926707
##  [7,]  0.313670596 -0.31197778  0.01767481  0.17520603  0.016690847 -0.07170914
##  [8,] -0.321543866  0.34907000  0.04973627 -0.21543585  0.098592247  0.02343872
##  [9,]  0.319792768  0.27152094 -0.28725483 -0.13234996 -0.204131621 -0.14319401
## [10,]  0.338469147  0.23945365 -0.22074447 -0.10333509 -0.130460565 -0.19293428
## [11,]  0.204942258  0.30589695  0.32344627 -0.28262198 -0.584002232  0.27315330
## [12,] -0.202972612 -0.23855944  0.30014590 -0.16849850 -0.345606947 -0.80345454
## [13,]  0.309759840  0.07432203  0.26700025 -0.06941441  0.394561129 -0.05321583
##               [,7]         [,8]        [,9]        [,10]       [,11]
##  [1,]  0.777607207  0.153350477  0.26039028 -0.019369130  0.10964435
##  [2,] -0.274996280 -0.402680309  0.35813749 -0.267527234 -0.26275629
##  [3,] -0.339576454  0.173931716  0.64441615  0.363532262  0.30316943
##  [4,]  0.074136208 -0.024662148 -0.01372777  0.006181836 -0.01392667
##  [5,] -0.199634840  0.080120560 -0.01852201 -0.231056455 -0.11131888
##  [6,]  0.063939924 -0.326752259  0.04789804  0.431420193 -0.05316154
##  [7,]  0.116010713 -0.600822917 -0.06756218 -0.362778957  0.45915939
##  [8,] -0.103900440 -0.121811982 -0.15329124  0.171213138  0.69569257
##  [9,] -0.137942546  0.080358311 -0.47089067 -0.021909452 -0.03654388
## [10,] -0.314886835  0.082774347 -0.17656339  0.035168348  0.10483575
## [11,]  0.002323869 -0.317884202  0.25442836 -0.153430488 -0.17450534
## [12,]  0.070294759 -0.004922915 -0.04489802  0.096515117 -0.01927490
## [13,]  0.087011169 -0.424352926 -0.19522139  0.600711409 -0.27138243
##              [,12]        [,13]
##  [1,]  0.086761070  0.045952304
##  [2,] -0.071425278 -0.080918973
##  [3,] -0.113199629 -0.251076540
##  [4,] -0.003982683  0.035921715
##  [5,]  0.804322567  0.043630446
##  [6,]  0.152872864  0.045567096
##  [7,] -0.211936074 -0.038550683
##  [8,]  0.390941129 -0.018298538
##  [9,] -0.107025890 -0.633489720
## [10,] -0.215191126  0.720233448
## [11,]  0.209598826  0.023398052
## [12,]  0.041723158 -0.004463073
## [13,]  0.055225960  0.024431677

-scaled_data adalah data yang sudah dinormalisasi (standardized). -eig_vectors adalah eigenvectors yang sebelumnya dihitung. -Operasi perkalian matriks (%*%) ini mengonversi data awal ke dalam Principal Component (PC) space. -prcomp() adalah fungsi di R untuk melakukan PCA. -scale = FALSE dan center = FALSE digunakan karena kita sudah melakukan normalisasi sebelumnya. -Outputnya akan berisi nilai eigen (variance explained), eigenvectors, dan skor PCA.

Interpretasi Output Summary: a. Standard Deviation (Simpangan Baku) Kolom pertama menunjukkan standard deviation (simpangan baku) dari setiap Principal Component (PC). PC1 memiliki nilai tertinggi (2.4752) → artinya PC1 memiliki variabilitas terbesar dalam data. PC13 memiliki nilai terendah (0.25201) → artinya PC13 menyumbang sedikit informasi terhadap total variabilitas data.

  1. Proportion of Variance (Proporsi Variansi) Menunjukkan berapa persen variabilitas total yang dijelaskan oleh setiap PC. PC1 menjelaskan 47.13% dari total variansi data. PC2 menambah 11.03% → Total (PC1 + PC2) = 58.16%. PC3 menambah 9.56% → Total (PC1 + PC2 + PC3) = 67.71%. PC4 menambah 6.59% → Total (PC1 + PC2 + PC3 + PC4) = 74.31%.

  2. Cumulative Proportion (Proporsi Kumulatif Variansi) Menunjukkan akumulasi variabilitas yang dijelaskan oleh PC secara bertahap. PC1 hingga PC4 sudah menjelaskan 74.31% dari total variabilitas data. PC1 hingga PC5 sudah menjelaskan 80.73%. PC1 hingga PC7 sudah menjelaskan 89.91%. Semua PC (PC1 - PC13) menjelaskan 100% variansi.

Output Plot: 1. Plot 1. Plot Layar ( Gambar 1(Gambar 1) Menampilkan persentase variansi yang dijelaskan oleh masing-masing komponen utama (principal komponen). Komponen pertama (Dim1) menjelaskan 47.1% dari total variansi — ini berarti komponen pertama sudah menjelaskan hampir setengah informasi dari data asli. Komponen kedua (Dim2) menjelaskan 11% variansi tambahan. Setelah komponen ke-2, kontribusi setiap dimensi menurun signifikan, artinya hanya komponen 1 dan 2 yang paling signifikan analisis untuk visualisasi.

  1. Ini adalah visualisasi kontribusi masing-masing variabel terhadap dua komponen utama (Dim1 & Dim2). Panjang anak panah menunjukkan seberapa kuat kontribusi variabel tersebut (semakin panjang, semakin penting). Warna anak panah menunjukkan kualitas representasi variabel pada komponen (dengan cos²; warna merah lebih tinggi artinya lebih baik terwakili). Variabel-variabel yang dekat dengan lingkaran luar memiliki kontribusi besar. Variabel yang berkontribusi besar ke PC1 (Dim1) : age, nox, indus, lstat, tax, crim— ini berarti mereka yang paling penting dalam membentuk dimensi utama pertama. Variabel dengan kontribusi tinggi pada PC2 (Dim2) : chas, black, rmmeskipun kontribusinya tidak sebesar yang dominan di Dim1.

  2. Ini adalah gabungan antara observasi (titik data, ditampilkan sebagai angka berwarna merah) dan variabel (arah panah biru). Angka merah mewakili masing-masing titik observasi/data. Arah panah menunjukkan arah variabel kontribusi; observasi yang terletak pada arah panah lebih jauh cenderung memiliki nilai tinggi untuk variabel tersebut.

# 9️⃣ Menghitung Skor PCA (Perkalian Matriks)
pca_scores_manual <- as.data.frame(scaled_data %*% eig_vectors)

# 🔟 PCA Menggunakan prcomp() (Verifikasi Hasil)
pca_prcomp <- prcomp(scaled_data, scale = FALSE, center = FALSE)

# 1️⃣1️⃣ Menampilkan Ringkasan PCA
summary(pca_prcomp)
## Importance of components:
##                           PC1    PC2     PC3     PC4     PC5     PC6     PC7
## Standard deviation     2.4752 1.1972 1.11473 0.92605 0.91368 0.81081 0.73168
## Proportion of Variance 0.4713 0.1103 0.09559 0.06597 0.06422 0.05057 0.04118
## Cumulative Proportion  0.4713 0.5816 0.67713 0.74310 0.80732 0.85789 0.89907
##                            PC8    PC9    PC10    PC11    PC12    PC13
## Standard deviation     0.62936 0.5263 0.46930 0.43129 0.41146 0.25201
## Proportion of Variance 0.03047 0.0213 0.01694 0.01431 0.01302 0.00489
## Cumulative Proportion  0.92954 0.9508 0.96778 0.98209 0.99511 1.00000
# 1️⃣2️⃣ Visualisasi Scree Plot
fviz_eig(pca_prcomp, addlabels = TRUE, barfill = "steelblue", barcolor = "black")

# 1️⃣3️⃣ Visualisasi Biplot PCA
fviz_pca_biplot(pca_prcomp, repel = TRUE, col.var = "blue", col.ind = "red")

# 1️⃣4️⃣ Visualisasi Kontribusi Variabel pada PCA
fviz_pca_var(pca_prcomp, col.var = "cos2", gradient.cols = c("blue", "red"))

# 1️⃣5️⃣ Simpan Hasil PCA untuk Analisis Lebih Lanjut
write.csv(pca_scores_manual, "C:/Users/zulai/Downloads/PCA_Scores_Manual.csv", row.names = FALSE)
write.csv(pca_prcomp$x, "C:/Users/zulai/Downloads/PCA_Scores_prcomp.csv", row.names = FALSE)

Melakukan Factor Analysis (FA) menggunakan metode Maximum Likelihood (ML). nfactors = 3berarti kita ingin mencari 3 faktor utama dari data kita. rotate = “varimax”dipakai supaya hasil faktor lebih “bersih” dan mudah diinterpretasi (variabel cenderung hanya dominan pada satu faktor). print(fa_ml)akan menampilkan hasil loading faktor (berapa besar variabel masuk ke faktor 1, 2, atau 3), komunalitas (seberapa besar variabel faktor yang dijelaskan), dan keunikan (sisa variansi yang tidak menjelaskan faktor).

Menggunakan metode Principal Axis Factoring (PAF). PAF lebih cocok jika data tidak normal. nfactors = 3juga mencari 3 faktor, dengan rotasi varimax. print(fa_paf)akan menampilkan struktur loading faktor, komunalitas, dan keunikan hasil metode PAF.

# Analisis Faktor (FA)
fa_ml <- fa(data, nfactors = 3, fm = "ml", rotate = "varimax")
fa_paf <- fa(data, nfactors = 3, fm = "pa", rotate = "varimax")
# 1️⃣6️⃣ Factor Analysis (FA) - Maximum Likelihood
fa_ml <- fa(r = cor(data), nfactors = 3, fm = "ml", rotate = "varimax")  # Ubah nfactors sesuai kebutuhan
print(fa_ml)
## Factor Analysis using method =  ml
## Call: fa(r = cor(data), nfactors = 3, rotate = "varimax", fm = "ml")
## Standardized loadings (pattern matrix) based upon correlation matrix
##           ML3   ML1   ML2   h2    u2 com
## crim     0.20  0.56 -0.21 0.40 0.599 1.5
## zn      -0.68 -0.11  0.20 0.51 0.491 1.2
## indus    0.63  0.51 -0.24 0.72 0.276 2.2
## chas     0.15 -0.04  0.21 0.07 0.930 1.9
## nox      0.72  0.47 -0.15 0.77 0.233 1.8
## rm      -0.21 -0.11  0.70 0.55 0.451 1.2
## age      0.76  0.29 -0.15 0.69 0.310 1.4
## dis     -0.87 -0.32 -0.02 0.86 0.136 1.3
## rad      0.23  0.91 -0.10 0.89 0.109 1.2
## tax      0.29  0.91 -0.18 0.94 0.059 1.3
## ptratio  0.11  0.40 -0.41 0.34 0.663 2.1
## black   -0.19 -0.40  0.19 0.23 0.765 1.9
## lstat    0.47  0.34 -0.61 0.71 0.290 2.5
## medv    -0.22 -0.27  0.89 0.92 0.081 1.3
## 
##                        ML3  ML1  ML2
## SS loadings           3.28 3.17 2.15
## Proportion Var        0.23 0.23 0.15
## Cumulative Var        0.23 0.46 0.61
## Proportion Explained  0.38 0.37 0.25
## Cumulative Proportion 0.38 0.75 1.00
## 
## Mean item complexity =  1.6
## Test of the hypothesis that 3 factors are sufficient.
## 
## df null model =  91  with the objective function =  10.28
## df of  the model are 52  and the objective function was  0.87 
## 
## The root mean square of the residuals (RMSR) is  0.04 
## The df corrected root mean square of the residuals is  0.05 
## 
## Fit based upon off diagonal values = 0.99
## Measures of factor score adequacy             
##                                                    ML3  ML1  ML2
## Correlation of (regression) scores with factors   0.95 0.97 0.96
## Multiple R square of scores with factors          0.90 0.94 0.91
## Minimum correlation of possible factor scores     0.79 0.87 0.83
# 1️⃣7️⃣ Factor Analysis (FA) - Principal Axis Factoring (PAF)
fa_paf <- fa(r = cor(data), nfactors = 3, fm = "pa", rotate = "varimax")
print(fa_paf)
## Factor Analysis using method =  pa
## Call: fa(r = cor(data), nfactors = 3, rotate = "varimax", fm = "pa")
## Standardized loadings (pattern matrix) based upon correlation matrix
##           PA1   PA3   PA2    h2    u2 com
## crim     0.17  0.59 -0.21 0.427 0.573 1.4
## zn      -0.64 -0.12  0.25 0.486 0.514 1.4
## indus    0.64  0.47 -0.28 0.714 0.286 2.2
## chas     0.17 -0.05  0.20 0.072 0.928 2.1
## nox      0.73  0.46 -0.15 0.769 0.231 1.8
## rm      -0.20 -0.07  0.73 0.580 0.420 1.2
## age      0.76  0.29 -0.17 0.693 0.307 1.4
## dis     -0.88 -0.31  0.02 0.866 0.134 1.3
## rad      0.23  0.93 -0.12 0.929 0.071 1.2
## tax      0.30  0.87 -0.21 0.899 0.101 1.4
## ptratio  0.13  0.34 -0.42 0.314 0.686 2.1
## black   -0.17 -0.44  0.16 0.247 0.753 1.6
## lstat    0.44  0.34 -0.63 0.711 0.289 2.4
## medv    -0.19 -0.27  0.89 0.904 0.096 1.3
## 
##                        PA1  PA3  PA2
## SS loadings           3.23 3.12 2.26
## Proportion Var        0.23 0.22 0.16
## Cumulative Var        0.23 0.45 0.62
## Proportion Explained  0.37 0.36 0.26
## Cumulative Proportion 0.37 0.74 1.00
## 
## Mean item complexity =  1.6
## Test of the hypothesis that 3 factors are sufficient.
## 
## df null model =  91  with the objective function =  10.28
## df of  the model are 52  and the objective function was  0.9 
## 
## The root mean square of the residuals (RMSR) is  0.04 
## The df corrected root mean square of the residuals is  0.05 
## 
## Fit based upon off diagonal values = 0.99
## Measures of factor score adequacy             
##                                                    PA1  PA3  PA2
## Correlation of (regression) scores with factors   0.95 0.97 0.95
## Multiple R square of scores with factors          0.90 0.94 0.91
## Minimum correlation of possible factor scores     0.81 0.87 0.81

fa.diagram(fa_ml) # Untuk FA Maximum Likelihood fa.diagram(fa_paf) # Untuk FA Principal Axis Factoring Fungsi: Menampilkan diagram yang menampilkan faktor (PA1, PA2, PA3) dan variabel-variabel yang berisi faktor tersebut, lengkap dengan nilai loadings-nya.

-⃣ Cek Variance Explained oleh Setiap Faktor SS Loadings : jumlah loading kuadrat untuk masing-masing faktor. Proportion Var : proporsi varians yang dijelaskan tiap faktor. Proporsi Kumulatif : akumulasi varians yang dijelaskan oleh seluruh faktor.

Interpretasi Output: Hasil analisis faktor menggunakan metode Maximum Likelihood (ML) dan Principal Axis Factoring (PAF) menunjukkan bahwa tiga faktor utama mampu menjelaskan sekitar 61-62% dari total varians dalam dataset. Faktor pertama menangkap proporsi varians terbesar, dengan ML menjelaskan 23.46% dan PAF menjelaskan 23.06%. Faktor kedua dan ketiga menambah akumulasi varians yang dijelaskan hingga 61.47% dalam ML dan 61.50% dalam PAF.

Interpretasi Visualisasi: 1. Maximal Likelihood a. ML1 – Faktor Infrastruktur & Regulasi Variabel dengan loading tinggi: RAD (0.9) – Akses ke jalan raya utama TAX (0.9) – Pajak properti CRIM (0.6) – Tingkat kriminalitas BLACK (-0.4) – Proporsi populasi keturunan Afrika-Amerika (karena negatif sering menjadi indikator ketimpangan sosial) Interpretasi: Faktor ini menunjukkan keterkaitan antara ketersediaan infrastruktur (akses ke jalan raya), besarnya pajak properti, dan aspek sosial (kriminalitas, minoritas). Bisa disebut sebagai Faktor Infrastruktur, Pajak, dan Ketimpangan Sosial.

  1. ML2 – Faktor Kualitas Hunian & Ekonomi Variabel dengan loading tinggi: MEDV (0.9) – Median harga rumah RM (0.7) – Jumlah rata-rata kamar per rumah LSTAT (-0.6) – Persentase penduduk berstatus sosial rendah PTRATIO (-0.4) – Rasio murid-guru di sekolah umum Interpretasi: Faktor ini berkaitan dengan kualitas properti (harga rumah, jumlah kamar) yang berlawanan arah dengan status sosial rendah dan kualitas pendidikan buruk (PTRATIO tinggi). Ini cocok disebut Faktor Kualitas Hunian dan Status Ekonomi.

  2. ML3 – Faktor Urbanisasi & Polusi Variabel dengan loading tinggi: DIS (-0.9) – Jarak ke pusat pekerjaan (negatif berarti semakin dekat ke pusat kota) AGE (0.8) – Persentase bangunan tua NOX (0.7) – Konsentrasi polusi udara ZN (-0.7) – Zona perumahan kelas atas (negatif loading) INDUS (0.6) – Persentase area bisnis non-ritel Interpretasi: Faktor ini menangkap aspek urbanisasi: area dekat pusat kota (DIS negatif) dengan polusi tinggi (NOX), bangunan tua (AGE), area industri (INDUS), dan zona yang bukan perumahan elit (ZN negatif). Faktor ini bisa disebut Faktor Urbanisasi, Polusi, dan Kepadatan Kota.

  1. Principal Axis Factoring Tiga faktor yang terbentuk dalam metode PAF adalah:
  1. PA1 – Faktor Urbanisasi & Polusi Variabel dengan loading tinggi: DIS (-0.9) – Jarak ke pusat pekerjaan (semakin jauh dari pusat kota) AGE (0.8) – Persentase bangunan tua NOX (0.7) – Konsentrasi polusi udara INDUS (0.6) – Persentase area bisnis non-ritel ZN (-0.6) - Zona perumahan kelas atas (negatif loading) Interpretasi: Faktor ini menangkap aspek urbanisasi dan kepadatan kota. Semakin jauh dari pusat kota (DIS negatif), semakin tinggi proporsi bangunan tua dan area industri, serta meningkatnya polusi udara. Bisa disebut sebagai Faktor Urbanisasi & Polusi Lingkungan.

  2. PA2 – Faktor Kualitas Hunian & Status Ekonomi Variabel dengan loading tinggi: MEDV (0.9) – Median harga rumah RM (0.7) – Jumlah rata-rata kamar per rumah LSTAT (-0.6) – Persentase penduduk dengan status sosial rendah PTRATIO (-0.4) – Rasio murid-guru di sekolah umum Interpretasi: Faktor ini berkaitan dengan kualitas hunian dan status ekonomi penduduk. Harga rumah tinggi (MEDV) dan jumlah kamar banyak (RM) berlawanan arah dengan status sosial rendah (LSTAT) dan tingginya rasio murid-guru. Bisa disebut sebagai Faktor Kualitas Hunian & Status Sosial-Ekonomi.

  3. PA3 – Faktor Infrastruktur & Keamanan Variabel dengan loading tinggi: RAD (0.9) – Akses ke jalan raya utama TAX (0.9) – Pajak properti CRIM (0.6) – Tingkat kriminalitas BLACK (-0.4) – Proporsi populasi keturunan Afrika-Amerika Interpretasi: Faktor ini menangkap hubungan antara aksesibilitas, regulasi pajak, dan tingkat keamanan. Wilayah dengan akses jalan raya tinggi dan pajak properti tinggi sering kali berhubungan dengan tingkat kriminalitas tertentu. Bisa disebut sebagai Faktor Infrastruktur & Keamanan Lingkungan.

# 1️⃣8️⃣ Visualisasi Faktor (Loading Plot)
fa.diagram(fa_ml)  # Untuk FA Maximum Likelihood

fa.diagram(fa_paf) # Untuk FA Principal Axis Factoring

# 1️⃣9️⃣ Cek Komunalitas (Seberapa baik variabel dijelaskan oleh faktor)
print(fa_ml$communalities)
##       crim         zn      indus       chas        nox         rm        age 
## 0.40119309 0.50946281 0.72414838 0.06986859 0.76684851 0.54909402 0.68976968 
##        dis        rad        tax    ptratio      black      lstat       medv 
## 0.86433805 0.89086287 0.94051406 0.33671646 0.23485915 0.70968608 0.91906872
print(fa_paf$communalities)
## [1] 8.610414
# 2️⃣0️⃣ Cek Variance Explained oleh Setiap Faktor
print(fa_ml$Vaccounted)
##                             ML3       ML1       ML2
## SS loadings           3.2841542 3.1702438 2.1520653
## Proportion Var        0.2345824 0.2264460 0.1537189
## Cumulative Var        0.2345824 0.4610284 0.6147474
## Proportion Explained  0.3815916 0.3683562 0.2500522
## Cumulative Proportion 0.3815916 0.7499478 1.0000000
print(fa_paf$Vaccounted)
##                             PA1       PA3       PA2
## SS loadings           3.2281204 3.1223325 2.2599615
## Proportion Var        0.2305800 0.2230237 0.1614258
## Cumulative Var        0.2305800 0.4536038 0.6150296
## Proportion Explained  0.3749088 0.3626228 0.2624684
## Cumulative Proportion 0.3749088 0.7375316 1.0000000
# 2️⃣1️⃣ Simpan Hasil F
write.csv(fa_ml$loadings, "C:/Users/zulai/Downloads/FA_Loadings_ML.csv", row.names = TRUE)
write.csv(fa_paf$loadings, "C:/Users/zulai/Downloads/FA_Loadings_PAF.csv", row.names = TRUE)

# Menampilkan Proporsi Varians yang Dijelaskan
print(fa_ml$Vaccounted)  # Untuk metode Maximum Likelihood
##                             ML3       ML1       ML2
## SS loadings           3.2841542 3.1702438 2.1520653
## Proportion Var        0.2345824 0.2264460 0.1537189
## Cumulative Var        0.2345824 0.4610284 0.6147474
## Proportion Explained  0.3815916 0.3683562 0.2500522
## Cumulative Proportion 0.3815916 0.7499478 1.0000000
print(fa_paf$Vaccounted) # Untuk metode Principal Axis Factoring
##                             PA1       PA3       PA2
## SS loadings           3.2281204 3.1223325 2.2599615
## Proportion Var        0.2305800 0.2230237 0.1614258
## Cumulative Var        0.2305800 0.4536038 0.6150296
## Proportion Explained  0.3749088 0.3626228 0.2624684
## Cumulative Proportion 0.3749088 0.7375316 1.0000000
write.csv(fa_ml$Vaccounted, "C:/Users/zulai/Downloads/FA_Variance_ML.csv", row.names = TRUE)
write.csv(fa_paf$Vaccounted, "C:/Users/zulai/Downloads/FA_Variance_PAF.csv", row.names = TRUE)