Notes Theme: - PCA: united (default di RMarkdown)
Library:
> # install.packages("knitr")
> # install.packages("rmarkdown")
> # install.packages("prettydoc")
> # install.packages("equatiomatic")
Analisis multivariat adalah pendekatan statistik yang digunakan untuk memahami hubungan kompleks antara banyak variabel dalam satu set data. Saat bekerja dengan data yang memiliki banyak dimensi atau atribut, seperti data dalam ilmu ekonomi, ilmu sosial, atau analisis bisnis, penting untuk mengidentifikasi pola-pola yang mendasari, mengurangi kompleksitas data, dan memahami kontribusi masing-masing variabel terhadap variasi total. Dalam konteks ini, Analisis Komponen Utama (PCA) muncul sebagai alat yang sangat berguna.
PCA (Principal Component Analysis) adalah salah satu teknik paling umum dalam analisis multivariat yang bertujuan untuk mengurangi dimensi data dengan memproyeksikan variabel-variabel asli ke dalam sistem koordinat baru yang disebut komponen utama. Dengan demikian, PCA membantu mengidentifikasi dimensi-dimensi yang paling penting dalam data dan mengurangi kerumitan analisis multidimensi, memungkinkan kita untuk mengungkap pola-pola yang mendasari data dengan lebih mudah dan efisien. Teknik ini memiliki beragam aplikasi, termasuk dalam analisis data eksploratori, pengelompokan data, dan pengurangan dimensi dalam machine learning.
Data yang diambil merupakan dataset cereal yang diperoleh dari kaggle. Dataset ini berisikan produk-produk sereal disertai dengan masing-masing kalori, protein, lemak, sodium, fiber, carbo, dan gula, potassium, vitamin, shelf, berat, cups, dan rating (13 variabel).
> # Library
> library(factoextra)
> library(ggcorrplot)
> # Setting directory
> setwd("F:/College/anmul/praktikum")
> # Mengeksplor data
> data.cereal <- read.csv("cereal.csv")
> str(data.cereal)
'data.frame': 77 obs. of 16 variables:
$ name : chr "100% Bran" "100% Natural Bran" "All-Bran" "All-Bran with Extra Fiber" ...
$ mfr : chr "N" "Q" "K" "K" ...
$ type : chr "C" "C" "C" "C" ...
$ calories: int 70 120 70 50 110 110 110 130 90 90 ...
$ protein : int 4 3 4 4 2 2 2 3 2 3 ...
$ fat : int 1 5 1 0 2 2 0 2 1 0 ...
$ sodium : int 130 15 260 140 200 180 125 210 200 210 ...
$ fiber : num 10 2 9 14 1 1.5 1 2 4 5 ...
$ carbo : num 5 8 7 8 14 10.5 11 18 15 13 ...
$ sugars : int 6 8 5 0 8 10 14 8 6 5 ...
$ potass : int 280 135 320 330 -1 70 30 100 125 190 ...
$ vitamins: int 25 0 25 25 25 25 25 25 25 25 ...
$ shelf : int 3 3 3 3 3 1 2 3 1 3 ...
$ weight : num 1 1 1 1 1 1 1 1.33 1 1 ...
$ cups : num 0.33 1 0.33 0.5 0.75 0.75 1 0.75 0.67 0.67 ...
$ rating : num 68.4 34 59.4 93.7 34.4 ...
> colSums(is.na(data.cereal)) # Memeriksa missing values
name mfr type calories protein fat sodium fiber
0 0 0 0 0 0 0 0
carbo sugars potass vitamins shelf weight cups rating
0 0 0 0 0 0 0 0
> View(data.cereal)
> # Normalisasi data
> data.cereal <- data.cereal[,-c(1:3)]
> View(data.cereal)
> cor(data.cereal)
calories protein fat sodium fiber
calories 1.00000000 0.019066068 0.498609814 0.300649227 -0.29341275
protein 0.01906607 1.000000000 0.208430990 -0.054674348 0.50033004
fat 0.49860981 0.208430990 1.000000000 -0.005407464 0.01671924
sodium 0.30064923 -0.054674348 -0.005407464 1.000000000 -0.07067501
fiber -0.29341275 0.500330043 0.016719237 -0.070675009 1.00000000
carbo 0.25068091 -0.130863648 -0.318043492 0.355983473 -0.35608274
sugars 0.56234029 -0.329141777 0.270819175 0.101451381 -0.14120539
potass -0.06660886 0.549407400 0.193278602 -0.032603467 0.90337367
vitamins 0.26535630 0.007335371 -0.031156266 0.361476688 -0.03224268
shelf 0.09723437 0.133864789 0.263691089 -0.069719015 0.29753906
weight 0.69609108 0.216158486 0.214625033 0.308576451 0.24722563
cups 0.08719955 -0.244469158 -0.175892142 0.119664615 -0.51306093
rating -0.68937603 0.470618465 -0.409283660 -0.401295204 0.58416042
carbo sugars potass vitamins shelf
calories 0.25068091 0.56234029 -0.06660886 0.265356298 0.09723437
protein -0.13086365 -0.32914178 0.54940740 0.007335371 0.13386479
fat -0.31804349 0.27081918 0.19327860 -0.031156266 0.26369109
sodium 0.35598347 0.10145138 -0.03260347 0.361476688 -0.06971902
fiber -0.35608274 -0.14120539 0.90337367 -0.032242679 0.29753906
carbo 1.00000000 -0.33166538 -0.34968522 0.258147549 -0.10179030
sugars -0.33166538 1.00000000 0.02169581 0.125137260 0.10043789
potass -0.34968522 0.02169581 1.00000000 0.020698687 0.36066341
vitamins 0.25814755 0.12513726 0.02069869 1.000000000 0.29926167
shelf -0.10179030 0.10043789 0.36066341 0.299261665 1.00000000
weight 0.13513642 0.45064760 0.41630315 0.320324059 0.19076197
cups 0.36393247 -0.03235762 -0.49519495 0.128404543 -0.33526876
rating 0.05205466 -0.75967466 0.38016537 -0.240543611 0.02515882
weight cups rating
calories 0.6960911 0.08719955 -0.68937603
protein 0.2161585 -0.24446916 0.47061846
fat 0.2146250 -0.17589214 -0.40928366
sodium 0.3085765 0.11966461 -0.40129520
fiber 0.2472256 -0.51306093 0.58416042
carbo 0.1351364 0.36393247 0.05205466
sugars 0.4506476 -0.03235762 -0.75967466
potass 0.4163032 -0.49519495 0.38016537
vitamins 0.3203241 0.12840454 -0.24054361
shelf 0.1907620 -0.33526876 0.02515882
weight 1.0000000 -0.19958272 -0.29812398
cups -0.1995827 1.00000000 -0.20316006
rating -0.2981240 -0.20316006 1.00000000
> ggcorrplot(cor(data.cereal))
> library(rmarkdown)
> paged_table(as.data.frame(x))
Error in as.data.frame(x): object 'x' not found
> pca <- prcomp(data.cereal, center = TRUE,scale. = TRUE)
> pca$rotation
PC1 PC2 PC3 PC4 PC5
calories 0.33325770 0.3540139 -0.07308253 0.310355769 0.10011713
protein -0.30350996 0.1840913 -0.21402139 0.487982044 0.18592601
fat 0.06117068 0.3334252 0.27702228 0.364438411 0.44961181
sodium 0.21498742 0.1289957 -0.39268086 -0.023246751 -0.30711733
fiber -0.42768885 0.2366169 -0.10160606 -0.093597811 -0.24394397
carbo 0.19454080 -0.1558489 -0.55656859 0.111598513 0.12697220
sugars 0.26823424 0.3185932 0.31783521 -0.203435176 -0.29985232
potass -0.35969408 0.3494167 -0.08431129 -0.007793219 -0.18777422
vitamins 0.15038361 0.1745444 -0.40671499 -0.438602292 0.22243824
shelf -0.11360533 0.2795025 -0.04010916 -0.483363806 0.57904983
weight 0.09400496 0.4417863 -0.24306975 0.119565685 -0.25454786
cups 0.27161796 -0.2508459 -0.14300053 0.160753010 0.08103983
rating -0.45456749 -0.2059514 -0.20769280 0.058186320 0.04467135
PC6 PC7 PC8 PC9 PC10
calories -0.26460458 0.01498978 -0.02281052 0.01334435 -0.19957001
protein 0.15170567 -0.22719127 -0.32251078 0.54173171 -0.15116767
fat 0.31169592 0.12818669 0.14648175 -0.45797475 0.01304935
sodium 0.62270867 0.38210484 0.17939260 0.23312260 0.04240406
fiber 0.07240825 -0.08258368 0.24298629 -0.22599391 -0.09908523
carbo -0.35737318 0.27484150 0.19065854 -0.16580913 -0.41780268
sugars -0.14064192 -0.22842387 0.04051536 0.22755181 -0.47283223
potass 0.04174594 -0.13336127 0.28351947 -0.18083652 -0.24633333
vitamins 0.22240340 -0.38321224 -0.47879609 -0.32410564 -0.07167993
shelf -0.12424005 0.13697250 0.35305822 0.40528584 0.11986130
weight -0.38496596 -0.05973177 -0.02919860 -0.04510871 0.65471082
cups 0.13621347 -0.67930809 0.55537769 0.05698475 0.13237275
rating -0.18951565 -0.05255890 0.03489036 -0.06805101 -0.03241640
PC11 PC12 PC13
calories 0.28043868 0.640419468 -2.288634e-01
protein -0.03161281 -0.154300238 1.889853e-01
fat 0.05426156 -0.342665063 -8.977980e-02
sodium 0.08437340 -0.028669463 -2.409229e-01
fiber 0.59848142 0.070600095 4.328289e-01
carbo -0.09599574 -0.296433152 2.465290e-01
sugars 0.11830639 -0.449901336 -1.699277e-01
potass -0.66867383 0.222146469 -1.278002e-01
vitamins 0.01591208 -0.003684911 -6.034371e-02
shelf 0.02296900 0.020642042 -1.633608e-09
weight -0.06087022 -0.266099498 -3.411092e-09
cups 0.03401393 0.007559801 1.692284e-09
rating 0.27592100 -0.178577824 -7.408338e-01
> summary(pca)
Importance of components:
PC1 PC2 PC3 PC4 PC5 PC6 PC7
Standard deviation 1.9000 1.7716 1.3479 1.03068 0.98540 0.84803 0.81930
Proportion of Variance 0.2777 0.2414 0.1398 0.08171 0.07469 0.05532 0.05163
Cumulative Proportion 0.2777 0.5191 0.6589 0.74057 0.81526 0.87058 0.92221
PC8 PC9 PC10 PC11 PC12 PC13
Standard deviation 0.6707 0.55076 0.36151 0.27035 0.23294 1.473e-08
Proportion of Variance 0.0346 0.02333 0.01005 0.00562 0.00417 0.000e+00
Cumulative Proportion 0.9568 0.98015 0.99020 0.99583 1.00000 1.000e+00
> # Menghitung nilai eigen
> eigen<-eigen(cor(data.cereal))
> eigen$values
[1] 3.609848e+00 3.138480e+00 1.816736e+00 1.062295e+00 9.710043e-01
[6] 7.191575e-01 6.712514e-01 4.498496e-01 3.033414e-01 1.306890e-01
[11] 7.308893e-02 5.425909e-02 3.075128e-16
-Hasil pada pca$rotation merupakan koefisien linear yang menghubungkan variabel dengan setiap komponen utama.
-Eigenvalues merepresentasikan jumlah variansi yang dijelaskan oleh masing-masing komponen utama.
> # Scree Plot
> fviz_eig(pca, addlabels = TRUE)
> # Kombinasi biplot dan cos2
> fviz_pca_var(pca, col.var = "cos2",
+ gradient.cols = c("black", "orange", "green"),
+ repel = TRUE)
Scree Plot
Scree plot digunakan untuk memvisualisasikan pentingnya setiap komponen utama dan dapat digunakan untuk menentukan jumlah komponen utama yang dapat digunakan. Plot ini menunjukkan eigenvalue dalam kurva menurun, dari yang tertinggi hingga yang terendah.
Kombinasi Biplot dan Cos2
Biplot dapat memvisualisasikan kemiripan dan perbedaan antara sampel, dan juga menunjukkan dampak setiap variabel pada masing-masing komponen utama. Sedangkan Cos2 untuk menentukan sejauh mana setiap variabel direpresentasikan dalam suatu komponen tertentu. Kualitas representasi tersebut disebut Cos2 dan berkaitan dengan kosinus kuadrat.
Dua hal tersebut dapat digabungkan untuk membuat satu biplot tunggal, dimana variabel dengan skor Cos2 yang serupa akan memiliki warna yang mirip.
> ggcorrplot(cor(data.cereal))
-Semakin mendekati nilai 1, dua variabel tersebut semakin berkorelasi positif (berbanding lurus).
-Semakin mendekati nilai 0, dua variabel tersebut semakin tidak berkorelasi.
-Semakin mendekati nilai 1, dua variabel tersebut semakin berkorelasi negatif (berbanding terbalik).
Proporsi Kumulatif Varians
>
> summary(pca)
Importance of components:
PC1 PC2 PC3 PC4 PC5 PC6 PC7
Standard deviation 1.9000 1.7716 1.3479 1.03068 0.98540 0.84803 0.81930
Proportion of Variance 0.2777 0.2414 0.1398 0.08171 0.07469 0.05532 0.05163
Cumulative Proportion 0.2777 0.5191 0.6589 0.74057 0.81526 0.87058 0.92221
PC8 PC9 PC10 PC11 PC12 PC13
Standard deviation 0.6707 0.55076 0.36151 0.27035 0.23294 1.473e-08
Proportion of Variance 0.0346 0.02333 0.01005 0.00562 0.00417 0.000e+00
Cumulative Proportion 0.9568 0.98015 0.99020 0.99583 1.00000 1.000e+00
Dari proporsi kumulatif varians, akan diguakan 4 komponen utama karena telah mewakili total keragaman data sebanyak 74%. Proposi keragaman dianggap cukup mewakili total keragaman data jika nilai Proporsi kumulatif variansnya minimal 70%-80%.
Nilai Eigen
>
> eigen$values
[1] 3.609848e+00 3.138480e+00 1.816736e+00 1.062295e+00 9.710043e-01
[6] 7.191575e-01 6.712514e-01 4.498496e-01 3.033414e-01 1.306890e-01
[11] 7.308893e-02 5.425909e-02 3.075128e-16
Penentuan banyaknya komponen utama dapat menggunakan nilai eigen dengan memilih komponen utama yang memiliki nilai eigen ≥1. Pada hasil di atas, 4 komponen utama pertama memiliki nilai eigen ≥1, sehingga digunakan 4 komponen utama.
Scree Plot
> fviz_eig(pca, addlabels = TRUE)
Pada scree plot, banyaknya komponen utama yang diambil adalah titik dimana sebelum titik tersebut terdapat penurunan yang tajam, dan setelah titik tersebut penurunannya tidak tajam. Dari hasil di atas, titik yang berada pada situasi tersebut adalah titik ke-4. Artinya diambil 4 komponen utama untuk digunakan.
> pca$rotation[,1:4]
PC1 PC2 PC3 PC4
calories 0.33325770 0.3540139 -0.07308253 0.310355769
protein -0.30350996 0.1840913 -0.21402139 0.487982044
fat 0.06117068 0.3334252 0.27702228 0.364438411
sodium 0.21498742 0.1289957 -0.39268086 -0.023246751
fiber -0.42768885 0.2366169 -0.10160606 -0.093597811
carbo 0.19454080 -0.1558489 -0.55656859 0.111598513
sugars 0.26823424 0.3185932 0.31783521 -0.203435176
potass -0.35969408 0.3494167 -0.08431129 -0.007793219
vitamins 0.15038361 0.1745444 -0.40671499 -0.438602292
shelf -0.11360533 0.2795025 -0.04010916 -0.483363806
weight 0.09400496 0.4417863 -0.24306975 0.119565685
cups 0.27161796 -0.2508459 -0.14300053 0.160753010
rating -0.45456749 -0.2059514 -0.20769280 0.058186320
Nilai masing-masing komponen utama merupakan kombinasi linier dari setiap variabel, dimana koefisiennya seperti pada hasil di atas.
Misalnya untuk komponen utama ke-1:
PC1 = 0.33calories - 0.30protein + 0.06fat + 0.21sodium - 0.43fiber + 0.19carbo + 0.27sugars - 0.36potass + 0.15vitamins - 0.11shelf + 0.09weight + 0.27cups - 0.45ratings
dan begitu seterusnya hingga komponen utama ke-4.
> fviz_pca_var(pca, col.var = "cos2",
+ gradient.cols = c("black", "orange", "green"),
+ repel = TRUE)
Variabel-variabel yang dikelompokkan bersama masing-masingnya berkorelasi secara positif, seperti variabel fat, weight, vitamins, sugars, calories, dan sodium.
Semakin jauh jarak antara variabel dengan asalnya (titik 0.0), semakin baik variabel tersebut direpresentasikan. Contohnya calories, weight, sugars, dan fat memiliki magnitudo yang lebih tinggi dibandingkan dengan vitamins dan sodium. Artinya calories, weight, sugars, dan fat direpresentasikan lebih baik daripada vitamins dan sodium.
Variabel yang berkorelasi negatif ditampilkan di sisi yang berlawanan dengan asal biplot.
Fiber, potass, calories, dan rating memiliki nilai Cos2 yang tinggi mendekati 1. Protein, weight, sugars dan cup memiliki nilai Cos2 yang sedang di sekitar 0,5. Sedangkan shelf, fat, vitamins, sodium, dan carbo memiliki nilai Cos2 yang rendah mendekati 0.