Tulisan ini merupakan bagian dari tugas mata kuliah Data Mining for Science yang saya ambil tahun lalu.

Analisis Komponen Utama/Principal Component Analysis adalah salah satu algoritma unsupervised untuk mereduksi dimensi data. PCA diaplikasikan dalam visualisasi data berdimensi besar, noise filtering, gene data analysis, stock market predictions, dan lain-lain. PCA hanya menggunakan data sampel tunggal dengan \(p\) variabel. Pada metode ini digunakan asumsi bahwa tidak ada variabel dependen atau variabel respon dan tidak ada pengelompokan observasi (Rencher, 2002).

Tujuan dari PCA adalah untuk mendeteksi korelasi antara variabel pada data. Jika ada variabel yang memiliki korelasi yang kuat satu dengan yang lain, maka dimensi data bisa direduksi. Hasil dari reduksi ini merupakan variabel baru yang lebih sedikit dari variabel awal.

Pada tulisan ini akan dilakukan Analisis Komponen Utama dengan cara manual (dekomposisi nilai eigen) dan otomatis menggunakan fungsi prcomp.

1. Import Data

Data yang akan digunakan adalah data performance CPU. Ada 209 observasi yang terdiri dari variabel-variabel sebagai berikut:

  1. MYCT : Machine Cycle Time dalam nano sekon (integer)
  2. MMIN : Minimum Main Memory dalam kilobyte (integer)
  3. MMAX : Maximum Main Memory dalam kilobyte (integer)
  4. CACH : Cache Memory dalam kilobyte (integer)
  5. CHMIN : Minimum Channels dalam unit (integer)
  6. CHMAX : Maximum Channels dalam unit (integer)
  7. Class (PRP) : Published Relative Performance (integer)

Berdasarkan hubungan kausal dapat dikatakan bahwa variabel pertama hingga keenam merupakan variabel bebas atau independen, sedangkan variabel PRP adalah variabel dependen.

# Menetapkan working directory
setwd("D:/Semester Genap/Tugas/Data Mining")

library(corrplot)
## corrplot 0.84 loaded
library(psych)
## Warning: package 'psych' was built under R version 4.0.4
mydata<-read.csv("cpu.csv",header=T) #input data
head(mydata)
##   MYCT MMIN  MMAX CACH CHMIN CHMAX class
## 1  125  256  6000  256    16   128   198
## 2   29 8000 32000   32     8    32   269
## 3   29 8000 32000   32     8    32   220
## 4   29 8000 32000   32     8    32   172
## 5   29 8000 16000   32     8    16   132
## 6   26 8000 32000   64     8    32   318

Seluruh tipe data sudah sesuai sehingga dapat dilanjutkan ke langkah selanjutnya.

2. Standardisasi Data

Karena atribut pada data memiliki satuan yang berbeda-beda, maka harus dilakukan standardisasi. Standardisasi data membuat distribusi data berpusat di 0 dan berstandar deviasi 1 atau berdistribusi normal baku (mean = 0, variansi = 1).

standardized_data = scale(mydata)
head(standardized_data)
##            MYCT       MMIN       MMAX      CACH     CHMIN       CHMAX     class
## [1,] -0.3028590 -0.6734091 -0.4942755 5.6805690 1.6580079  4.22089912 0.5743802
## [2,] -0.6717167  1.3231141  1.7229127 0.1672280 0.4843461  0.52821054 1.0158381
## [3,] -0.6717167  1.3231141  1.7229127 0.1672280 0.4843461  0.52821054 0.7111700
## [4,] -0.6717167  1.3231141  1.7229127 0.1672280 0.4843461  0.52821054 0.4127196
## [5,] -0.6717167  1.3231141  0.3584892 0.1672280 0.4843461 -0.08723756 0.1640109
## [6,] -0.6832436  1.3231141  1.7229127 0.9548481 0.4843461  0.52821054 1.3205063

3. Merubah Dataframe menjadi Matriks

Definisikan matriks \(X_{(n×p)}\) sebagai matriks data dengan fungsi as.matrix, misalkan terdapat \(p\) variabel dan \(n\) data atau observasi:

4. Bangun matriks variansi – kovariansi dan matriks korelasi.

Dalam data yang berbentuk matriks, kovariansi dapat diperoleh dengan mengalikan transpose dari matriks data dengan matriks data itu sendiri: \[S=X^T X\] Apabila matriks telah distandardisasi maka S adalah matriks korelasi. Ini karena misalkan diambil dua variabel X dan Y, maka korelasi dua variabel ini adalah: \[cor(X,Y)=cov(X,Y)/(\sigma(X)\cdot\sigma(Y))\] Diketahui setelah standaridisasi standar deviasi masing-masing variabel adalah 1, sehingga pada data yang telah distandardisasi \(cor(X,Y)=cov(X_{standardized},Y_{standardized})\). Matriks \(S_{p×p}\) adalah matriks persegi.

matrix.corr<-as.matrix(cov(standardized_data))
corrplot(matrix.corr, type = "upper", order = "original", 
         tl.col = "black", tl.srt = 45)

Dari plot di atas disimpulkan bahwa variabel MYCT memiliki hubungan yang berbanding terbalik dengan variabel lainnya. Sedangkan enam variabel yang lain memiliki hubungan berbanding lurus. Dilihat dari warnanya, banyak hubungan antar variabel yang berkorelasi kuat. Dari asumsi ini dapat disimpulkan dimensi awal data yaitu 7 dapat direduksi menjadi dimensi yang lebih sedikit.

5. Dekomposisi Nilai Eigen

Selanjutnya hitung dekomposisi nilai eigen dengan rumus berikut: \[S_{p×p}=V_{p×q} Λ_{q×q} V_{p×q}^T\] Dengan \(Λ=diag(λ_1,λ_2,…,λ_q)\) yaitu matriks diagonal yang diagonalnya berisi nilai-nilai eigen. Sedangkan \(V\) matriks yang berisikan vektor eigen yang bersesuaian dengan nilai eigen \(λ\).

#menghitung nilai eigen dan eigen vector
eigen.cpu<-eigen(matrix.corr)
eigenval.cpu<-eigen.cpu$values
eigenvec.cpu<-eigen.cpu$vectors
eigenval.cpu
## [1] 4.1762171 0.8321437 0.7887882 0.5181657 0.4163160 0.1740640 0.0943053

6. Bangun Model Komponen Utama

Model komponen utama atau principal component dapat ditulis sebagai berikut: \[Z_j=v_{1j} X_1 + v_{2j} X_2 + ⋯ + v_{pj} X_p\]

7. Hitung persentase keterserapan untuk masing-masing nilai eigen

Nilai persentase ini menunjukkan keterserapan informasi yang dapat diwakili oleh komponen utama, biasa juga disebut proporsi dari variansi: \[ inersiaPC_i = λ_i / (\sum_{i=1}^p λ_i)\]

inersia = (eigenval.cpu/sum(eigenval.cpu))*100
inersia #dalam persen
## [1] 59.660244 11.887767 11.268403  7.402367  5.947371  2.486629  1.347219

Dengan menggunakan cara otomatis yaitu dengan fungsi prcomp :

#Koding PCA dengan fungsi prcomp

library(factoextra)
## 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
# Hitung PCA dengan data yang distandardisasi
cpu.pca <- prcomp(mydata, scale = T)
# Eigenvalues
eig.val <- get_eigenvalue(cpu.pca)
eig.val
##       eigenvalue variance.percent cumulative.variance.percent
## Dim.1  4.1762171        59.660244                    59.66024
## Dim.2  0.8321437        11.887767                    71.54801
## Dim.3  0.7887882        11.268403                    82.81641
## Dim.4  0.5181657         7.402367                    90.21878
## Dim.5  0.4163160         5.947371                    96.16615
## Dim.6  0.1740640         2.486629                    98.65278
## Dim.7  0.0943053         1.347219                   100.00000

Dengan menggunakan perhitungan manual yaitu menghitung nilai eigen dan fungsi prcomp diperoleh 7 nilai eigen beserta inersianya seperti di atas.

Dengan trace matriks nilai eigen yaitu 7. Matriks ini menunjukkan variansi antar variabel hasil komponen utama.

Diambil persentase inersia kumulatif di sekitar 90%. Jadi yang digunakan hanya komponen utama 1 sampai dengan 4 atau nilai eigen pertama sampai keempat. Dengan kata lain, data yang awalnya berdimensi 7 direduksi menjadi 4 variabel di mana telah mewakilkan 90,22% dari keselurhan informasi pada data CPU. Berikut adalah eigen vektor yang berkorelasi dengan nilai eigen pertama sampai keempat:

# Vektor eigen
hasil.pca<-summary(cpu.pca)
hasil.pca$rotation
##              PC1         PC2        PC3         PC4          PC5         PC6
## MYCT   0.2372125  0.79988526 -0.5395352  0.06290484 -0.003468611  0.03196077
## MMIN  -0.3946310 -0.25191958 -0.5213853  0.04690831 -0.098509675 -0.61666579
## MMAX  -0.4315684 -0.07638240 -0.2474057 -0.37814062 -0.019071389  0.68928693
## CACH  -0.3783555  0.11868671  0.1119802  0.66059871  0.600213290  0.12668935
## CHMIN -0.3767141  0.22156332  0.2105309  0.40129818 -0.769066783  0.09352082
## CHMAX -0.3330792  0.47009948  0.5123589 -0.46610387  0.136574194 -0.34296687
## class -0.4535826  0.08194792 -0.2376450 -0.19018030  0.139813714 -0.03409874
##               PC7
## MYCT   0.08845926
## MMIN   0.34172948
## MMAX   0.35809830
## CACH   0.13237886
## CHMIN -0.05850499
## CHMAX  0.22808211
## class -0.82109262

Model komponen utama yang baru untuk proporsi variansi kumulatif 90,218% adalah: \[Z_j = v_{1j} X_{MYCT} + v_{2j} X_{MMIN} + ... + v_{pj} X_{class} \] Dengan \(X\) matriks data, \(V_j\) vektor eigen yang berasosiasi dengan nilai eigen ke-\(j\), \(j=1,2,3,4\). Setiap elemen pada vektor eigen atau pada Tabel di bawah ini adalah kontribusi/bobot yang diberikan setiap variabel untuk setiap komponen.

Untuk dimensi utama atau PC 1 sampai 4 dapat dituliskan sebagai berikut: \[Z_1 = 0.2372 \cdot X_{MYCT} + (-0.3946) \cdot X_{MMIN} + ... + (-0.4535) \cdot X_{class} \] \[Z_2 = 0.7999 \cdot X_{MYCT} + (-0.2519) \cdot X_{MMIN} + ... + 0.0819 \cdot X_{class}\] \[Z_3 = (-0.5395) \cdot X_{MYCT} + (-0.5214) \cdot X_{MMIN} + ... + (-0.2376) \cdot X_{class} \] \[Z_4 = 0.0629 \cdot X_{MYCT} + 0.0469 \cdot X_{MMIN} + ... + (-0.1901) \cdot X_{class} \] Kemudian dapat divisualisasikan bagaimana kontribusi setiap variabel pada dimensi utama.

fviz_pca_var(cpu.pca,
             col.var = "contrib", # Color by contributions to the PC
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE     # Avoid text overlapping
             )

Dari gambar ditunjukkan 6 variabel yaitu MMIN, MMAX, class, CHMIN, CHMAX, CACH berada di sisi kiri, sedangkan variabel MYCT berada di sisi kanan atau sisi yang berlawanan. Dapat disimpulkan bahwa variabel MYCT berkorelasi negatif terhadap 6 variabel yang lain.

Referensi:

  1. Rencher, A. C. (2003). Methods of multivariate analysis (Vol. 492). John Wiley & Sons.
  2. Principal Component Analysis in R: prcomp vs princomp