Untuk membentuk PC dan nilai pada PC dibutuhkan eigen values & eigen vector. Secara manual, eigen values dan eigen vector didapatkan dari operasi matrix.
Teori matrix:
Perkalian skalar-vektor: mengubah besaran vektor (tidak merubah arah kecuali berbalik arah) \[2\left(\begin{array}{cc}2\\3\end{array}\right) = \left(\begin{array}{cc}4\\6\end{array}\right)\] \[-2\left(\begin{array}{cc}2\\3\end{array}\right) = \left(\begin{array}{cc}-4\\-6\end{array}\right)\]
Perkalian matrix-vektor: mengubah besaran dan arah
\[\left(\begin{array}{cc}1 & 2\\-1 & 2\end{array}\right)\left(\begin{array}{cc}2\\3 \end{array}\right) = \left(\begin{array}{cc}8\\4\end{array}\right)\]
Perkalian Matrix-Vektor Spesial
\[ \left(\begin{array}{cc} 0 & -1\\ 1 & 0 \end{array}\right) \left(\begin{array}{cc} 2\\ 3 \end{array}\right)= \left(\begin{array}{cc} -3\\ 2 \end{array}\right) \]
# perkalian matrix di R
matrix(c(0,1,-1,0), nrow=2) %*% as.vector(c(2,3))
#> [,1]
#> [1,] -3
#> [2,] 2
\[ \left(\begin{array}{cc} 1 & 0\\ 0 & 1 \end{array}\right) \left(\begin{array}{cc} 2\\ 3 \end{array}\right)= \left(\begin{array}{cc} 2\\ 3 \end{array}\right) \]
# perkalian matrix di R
matrix(c(1,0,0,1), nrow=2) %*% as.vector(c(2,3))
#> [,1]
#> [1,] 2
#> [2,] 3
Eigen dari suatu Matrix
Untuk setiap matrix, terdapat vektor spesial (eigen vector) yang jika dikalikan dengan matrixnya, hasilnya akan sama dengan vektor tersebut dikalikan suatu skalar (eigen value). Sehingga didapatkan rumus:
\[Ax = \lambda x\] Dimana \(x\) adalah eigen vector dan \(\lambda\) adalah eigen value dari matrix \(A\).
\[ \left(\begin{array}{cc} 2 & 3\\ 2 & 1 \end{array}\right) \left(\begin{array}{cc} 3\\ 2 \end{array}\right) = \left(\begin{array}{cc} 12\\ 8 \end{array}\right) =4 \left(\begin{array}{cc} 3\\ 2 \end{array}\right) \]
Teori eigen dipakai untuk menentukan PC dan nilai-nilai pada PC.
Penerapan Eigen dalam PCA: \[Cx = \lambda x\]
Matrix covariance adalah matrix yang dapat merangkum informasi (variance) dari data. Kita menggunakan matrix covariance untuk mendapatkan mendapatkan eigen vector dan eigen value dari matrix tersebut, dimana:
Eigen vector akan menjadi formula untuk kalkulasi nilai di setiap PC. Contohnya, untuk data yang terdiri dari 2 variabel, bila diketahui eigen vector dari PC1 adalah:
\[x_{PC1}= \left(\begin{array}{cc}b_1\\b_2\end{array}\right)\]
Maka formula untuk menghitung nilai pada PC1 (untuk tiap barisnya) adalah:
\[PC1= b_1X1 + b_2X2\]
Keterangan:
Mencari Eigen dengan R
# membuat data dummy
RNGkind(sample.kind = "Rounding")
set.seed(100)
# buat data random dengan distribusi normal
x <- runif(200)
# buat data frame
data <- data.frame(x=x, y=-x+runif(100, 1.05, 1.25))
# scale data
data <- scale(data)
head(data)
#> x y
#> [1,] -0.69524199 0.5781964712
#> [2,] -0.87017881 1.1453429992
#> [3,] 0.15879719 0.1183517145
#> [4,] -1.57312115 1.7370570727
#> [5,] -0.13375526 -0.0003546811
#> [6,] -0.08059893 0.3262449661
plot(data)
# matrix covariance
A <- cov(data)
A
#> x y
#> x 1.000000 -0.982719
#> y -0.982719 1.000000
# menghitung eigen
eig <- eigen(A)
eig
#> eigen() decomposition
#> $values
#> [1] 1.98271899 0.01728101
#>
#> $vectors
#> [,1] [,2]
#> [1,] -0.7071068 -0.7071068
#> [2,] 0.7071068 -0.7071068
Keterangan:
eigen(A)$values: Eigen value untuk tiap PC, besar
variansi yang dapat ditangkap oleh tiap PC. Eigen value tertinggi adalah
milik PC1, kedua tertinggi milik PC2, dan seterusnya.eigen(A)$vectors: Eigen vector untuk tiap PC. Eigen
vector untuk PC1 adalah kolom pertama [,1]; untuk PC2
adalah kolom kedua [,2].Jika kita mengekstrak eigen vector pertama dan menghitung slope-nya (kita dapat menganggap ini sebagai principal component 1) dan melakukan hal yang sama untuk eigen vector kedua (principal component 2). Kita kemudian dapat menggunakan keduanya sebagai koordinat baru pada plot data kita:
# plotting eigen vector as new coordinate
slope1 <- eigen(A)$vectors[1,1]/eigen(A)$vectors[2,1]
slope2 <- eigen(A)$vectors[1,2]/eigen(A)$vectors[2,2]
plot(data, pch=19, cex=0.25, xlim=c(-1.5,1.5), ylim=c(-1.5,1.5))
lines(data[,1], data[,1] * slope1, col="blue") # PC1
lines(data[,1], data[,1] * slope2, col="green") # PC2
Mendapatkan koordinat data baru dengan cara mengalikan data awal dengan matriks rotasi (eigen vectors):
data_baru <- data %*% eig$vectors
colnames(data_baru) <- c("PC1", "PC2")
head(data_baru)
#> PC1 PC2
#> [1,] 0.90045697 0.08276368
#> [2,] 1.42518914 -0.19457046
#> [3,] -0.02859927 -0.19597387
#> [4,] 2.34064947 -0.11592021
#> [5,] 0.09432845 0.09483005
#> [6,] 0.28768208 -0.17369798
Plot data hasil PCA:
plot(data_baru, ylim = c(-1.5, 1.5))
Untuk mengetahui berapa persen besar variansi yang dijelaskan oleh tiap
PC, kita bisa melihat nilai eigen values tiap PC dibagi jumlah eigen
values yang dihasilkan sebagai berikut:
eig$values / (eig$values[1] + eig$values[2])
#> [1] 0.991359493 0.008640507
Kesimpulan: PC1 menjelaskan 99.14% variansi dari data awal, sementara PC2 menjelaskan sisanya yaitu 0.86% variansi dari data awal.