Tugas ini merupakan bagian dari mata kuliah Pengantar Analisis Multivariat yang bertujuan untuk:
Saya menggunakan dataset Hepatitis C Virus (HCV). Dataset ini berisi informasi tentang pasien dengan berbagai kondisi kesehatan hati, mulai dari donor darah yang sehat hingga pasien dengan Hepatitis C, Fibrosis, dan Sirosis. Dataset terdiri dari 615 observasi dengan 11 variabel numerik dan 3 variabel kategorik. Analisis multivariat dilakukan hanya pada variabel numerik, karena correlation, covariance, dan eigen analysis tidak dapat diterapkan pada data kategorik.
Variabel kategorik:
Variabel numerik yang dianalisis:
Langkah pertama adalah mengimport dataset ke dalam R.
# Set working directory (sesuaikan dengan folder Anda)
# setwd("~/R/tugas anmul")
# Import data
data <- read.csv("hcvdat0.csv", header = TRUE)
# Melihat struktur data
str(data)
## 'data.frame': 615 obs. of 14 variables:
## $ X : int 1 2 3 4 5 6 7 8 9 10 ...
## $ Category: chr "0=Blood Donor" "0=Blood Donor" "0=Blood Donor" "0=Blood Donor" ...
## $ Age : int 32 32 32 32 32 32 32 32 32 32 ...
## $ Sex : chr "m" "m" "m" "m" ...
## $ ALB : num 38.5 38.5 46.9 43.2 39.2 41.6 46.3 42.2 50.9 42.4 ...
## $ ALP : num 52.5 70.3 74.7 52 74.1 43.3 41.3 41.9 65.5 86.3 ...
## $ ALT : num 7.7 18 36.2 30.6 32.6 18.5 17.5 35.8 23.2 20.3 ...
## $ AST : num 22.1 24.7 52.6 22.6 24.8 19.7 17.8 31.1 21.2 20 ...
## $ BIL : num 7.5 3.9 6.1 18.9 9.6 12.3 8.5 16.1 6.9 35.2 ...
## $ CHE : num 6.93 11.17 8.84 7.33 9.15 ...
## $ CHOL : num 3.23 4.8 5.2 4.74 4.32 6.05 4.79 4.6 4.1 4.45 ...
## $ CREA : num 106 74 86 80 76 111 70 109 83 81 ...
## $ GGT : num 12.1 15.6 33.2 33.8 29.9 91 16.9 21.5 13.7 15.9 ...
## $ PROT : num 69 76.5 79.3 75.7 68.7 74 74.5 67.1 71.3 69.9 ...
# Melihat ringkasan statistik
summary(data)
## X Category Age Sex
## Min. : 1.0 Length:615 Min. :19.00 Length:615
## 1st Qu.:154.5 Class :character 1st Qu.:39.00 Class :character
## Median :308.0 Mode :character Median :47.00 Mode :character
## Mean :308.0 Mean :47.41
## 3rd Qu.:461.5 3rd Qu.:54.00
## Max. :615.0 Max. :77.00
##
## ALB ALP ALT AST
## Min. :14.90 Min. : 11.30 Min. : 0.90 Min. : 10.60
## 1st Qu.:38.80 1st Qu.: 52.50 1st Qu.: 16.40 1st Qu.: 21.60
## Median :41.95 Median : 66.20 Median : 23.00 Median : 25.90
## Mean :41.62 Mean : 68.28 Mean : 28.45 Mean : 34.79
## 3rd Qu.:45.20 3rd Qu.: 80.10 3rd Qu.: 33.08 3rd Qu.: 32.90
## Max. :82.20 Max. :416.60 Max. :325.30 Max. :324.00
## NA's :1 NA's :18 NA's :1
## BIL CHE CHOL CREA
## Min. : 0.8 Min. : 1.420 Min. :1.430 Min. : 8.00
## 1st Qu.: 5.3 1st Qu.: 6.935 1st Qu.:4.610 1st Qu.: 67.00
## Median : 7.3 Median : 8.260 Median :5.300 Median : 77.00
## Mean : 11.4 Mean : 8.197 Mean :5.368 Mean : 81.29
## 3rd Qu.: 11.2 3rd Qu.: 9.590 3rd Qu.:6.060 3rd Qu.: 88.00
## Max. :254.0 Max. :16.410 Max. :9.670 Max. :1079.10
## NA's :10
## GGT PROT
## Min. : 4.50 Min. :44.80
## 1st Qu.: 15.70 1st Qu.:69.30
## Median : 23.30 Median :72.20
## Mean : 39.53 Mean :72.04
## 3rd Qu.: 40.20 3rd Qu.:75.40
## Max. :650.90 Max. :90.00
## NA's :1
# Memilih hanya variabel numerik
numeric_data <- data[, c("Age", "ALB", "ALP", "ALT", "AST", "BIL",
"CHE", "CHOL", "CREA", "GGT", "PROT")]
# Menghapus missing values
numeric_data <- na.omit(numeric_data)
# Melihat dimensi data
cat("Jumlah observasi setelah cleaning:", nrow(numeric_data), "\n")
## Jumlah observasi setelah cleaning: 589
cat("Jumlah variabel:", ncol(numeric_data), "\n")
## Jumlah variabel: 11
# Cek struktur data yang sudah bersih
str(numeric_data)
## 'data.frame': 589 obs. of 11 variables:
## $ Age : int 32 32 32 32 32 32 32 32 32 32 ...
## $ ALB : num 38.5 38.5 46.9 43.2 39.2 41.6 46.3 42.2 50.9 42.4 ...
## $ ALP : num 52.5 70.3 74.7 52 74.1 43.3 41.3 41.9 65.5 86.3 ...
## $ ALT : num 7.7 18 36.2 30.6 32.6 18.5 17.5 35.8 23.2 20.3 ...
## $ AST : num 22.1 24.7 52.6 22.6 24.8 19.7 17.8 31.1 21.2 20 ...
## $ BIL : num 7.5 3.9 6.1 18.9 9.6 12.3 8.5 16.1 6.9 35.2 ...
## $ CHE : num 6.93 11.17 8.84 7.33 9.15 ...
## $ CHOL: num 3.23 4.8 5.2 4.74 4.32 6.05 4.79 4.6 4.1 4.45 ...
## $ CREA: num 106 74 86 80 76 111 70 109 83 81 ...
## $ GGT : num 12.1 15.6 33.2 33.8 29.9 91 16.9 21.5 13.7 15.9 ...
## $ PROT: num 69 76.5 79.3 75.7 68.7 74 74.5 67.1 71.3 69.9 ...
## - attr(*, "na.action")= 'omit' Named int [1:26] 122 320 330 414 425 434 499 541 542 546 ...
## ..- attr(*, "names")= chr [1:26] "122" "320" "330" "414" ...
Dari 615 observasi awal, saya menghapus missing values, dan tersisa hanya 589 observasi yang siap untuk dianalisis. Missing values tersebut dihapus karena dapat mengganggu perhitungan statistik dan menghasilkan bias dalam analisis.
# Menghitung matriks korelasi
cor_matrix <- cor(numeric_data, use = "complete.obs")
print(round(cor_matrix, 4))
## Age ALB ALP ALT AST BIL CHE CHOL CREA
## Age 1.0000 -0.1911 0.1777 -0.0406 0.0727 0.0397 -0.0759 0.1247 -0.0251
## ALB -0.1911 1.0000 -0.1461 0.0395 -0.1776 -0.1696 0.3609 0.2104 0.0014
## ALP 0.1777 -0.1461 1.0000 0.2216 0.0670 0.0584 0.0295 0.1259 0.1539
## ALT -0.0406 0.0395 0.2216 1.0000 0.1987 -0.1068 0.2243 0.1500 -0.0361
## AST 0.0727 -0.1776 0.0670 0.1987 1.0000 0.3096 -0.1973 -0.2012 -0.0179
## BIL 0.0397 -0.1696 0.0584 -0.1068 0.3096 1.0000 -0.3207 -0.1816 0.0199
## CHE -0.0759 0.3609 0.0295 0.2243 -0.1973 -0.3207 1.0000 0.4280 -0.0121
## CHOL 0.1247 0.2104 0.1259 0.1500 -0.2012 -0.1816 0.4280 1.0000 -0.0515
## CREA -0.0251 0.0014 0.1539 -0.0361 -0.0179 0.0199 -0.0121 -0.0515 1.0000
## GGT 0.1434 -0.1476 0.4613 0.2197 0.4778 0.2106 -0.0957 0.0088 0.1254
## PROT -0.1598 0.5707 -0.0631 0.0168 0.0174 -0.0526 0.3063 0.2450 -0.0301
## GGT PROT
## Age 0.1434 -0.1598
## ALB -0.1476 0.5707
## ALP 0.4613 -0.0631
## ALT 0.2197 0.0168
## AST 0.4778 0.0174
## BIL 0.2106 -0.0526
## CHE -0.0957 0.3063
## CHOL 0.0088 0.2450
## CREA 0.1254 -0.0301
## GGT 1.0000 -0.0371
## PROT -0.0371 1.0000
library(corrplot)
## corrplot 0.95 loaded
# Visualisasi dengan corrplot
corrplot(cor_matrix,
method = "color",
type = "upper",
tl.col = "black",
tl.srt = 40,
addCoef.col = "black",
number.cex = 0.7,
title = "Correlation Matrix - HCV Dataset",
mar = c(0,0,3,0))
Correlation matrix menunjukkan hubungan linear antar variabel dengan nilai berkisar antara -1 hingga 1. Secara umum, sebagian besar pasangan variabel menunjukkan korelasi lemah hingga sedang, yang mengindikasikan bahwa setiap variabel membawa informasi yang relatif berbeda. Namun, terdapat beberapa hubungan yang cukup menonjol :
Beberapa pasangan variabel menunjukkan korelasi positif sedang hingga cukup kuat, seperti ALB–PROT (0.5707), AST–GGT (0.4778), dan ALP–GGT (0.4613). Hal ini menunjukkan adanya keterkaitan fungsional antar parameter biokimia yang berkaitan dengan metabolisme protein serta fungsi hati dan sistem empedu.
Terdapat pula korelasi negatif, misalnya antara BIL dan CHE (−0.3207) serta ALB dan Age (−0.1911), yang mengindikasikan bahwa peningkatan indikator gangguan hati atau usia cenderung diikuti oleh penurunan fungsi sintesis protein.
Sebagian besar pasangan variabel lainnya memiliki nilai korelasi yang sangat kecil atau mendekati nol (misalnya sekitar −0.03, 0.02, dan −0.01). Hal ini menunjukkan bahwa tidak terdapat hubungan linear yang signifikan antara variabel-variabel tersebut, sehingga perubahan pada satu variabel tidak diikuti oleh perubahan linier pada variabel lainnya.
Kondisi ini mengindikasikan bahwa struktur hubungan antar variabel bersifat heterogen, di mana hanya beberapa variabel tertentu yang saling berkaitan, sementara sebagian besar variabel lainnya relatif independen secara linear.
# Menghitung matriks varian-kovarian
cov_matrix <- cov(numeric_data, use = "complete.obs")
print(round(cov_matrix, 4))
## Age ALB ALP ALT AST BIL CHE CHOL
## Age 98.6314 -10.9348 45.7505 -8.4074 23.7428 6.8552 -1.6508 1.3986
## ALB -10.9348 33.1983 -21.8233 4.7479 -33.6342 -17.0095 4.5564 1.3687
## ALP 45.7505 -21.8233 671.9019 119.8417 57.1010 26.3375 1.6744 3.6843
## ALT -8.4074 4.7479 119.8417 435.2698 136.2207 -38.7838 10.2554 3.5330
## AST 23.7428 -33.6342 57.1010 136.2207 1080.2312 177.1104 -14.2062 -7.4660
## BIL 6.8552 -17.0095 26.3375 -38.7838 177.1104 302.9887 -12.2317 -3.5681
## CHE -1.6508 4.5564 1.6744 10.2554 -14.2062 -12.2317 4.8008 1.0588
## CHOL 1.3986 1.3687 3.6843 3.5330 -7.4660 -3.5681 1.0588 1.2745
## CREA -12.6588 0.4187 202.2549 -38.1887 -29.9060 17.5695 -1.3463 -2.9455
## GGT 77.3238 -46.1805 649.3151 248.9098 852.7066 199.0315 -11.3884 0.5409
## PROT -8.4867 17.5893 -8.7467 1.8733 3.0596 -4.8950 3.5896 1.4798
## CREA GGT PROT
## Age -12.6588 77.3238 -8.4867
## ALB 0.4187 -46.1805 17.5893
## ALP 202.2549 649.3151 -8.7467
## ALT -38.1887 248.9098 1.8733
## AST -29.9060 852.7066 3.0596
## BIL 17.5695 199.0315 -4.8950
## CHE -1.3463 -11.3884 3.5896
## CHOL -2.9455 0.5409 1.4798
## CREA 2570.1849 345.0942 -8.1652
## GGT 345.0942 2948.7514 -10.7838
## PROT -8.1652 -10.7838 28.6105
Variance mengukur seberapa tersebar data dari rata-ratanya. Semakin besar variance, semakin heterogen datanya.
GGT (2948.75): Memiliki variabilitas paling tinggi, range datanya sangat lebar (4.5-650.9), dan menunjukkan bahwa GGT sangat bervariasi antar pasien.
CREA (2570.18): Variabilitas sangat tinggi, creatinine bervariasi luas antar pasien, dan mungkin ada pasien dengan gangguan ginjal yang ekstrem.
AST (1080.23): Enzim hati ini juga sangat bervariasi, dan terindikasi memiliki beragam tingkat kerusakan hati di dataset.
ALP (671.90): Alkaline Phosphatase memiliki variabilitas tinggi, menunjukkan perbedaan yang signifikan dalam kondisi saluran empedu dan tulang antar pasien.
ALT (435.27): Alanine Transaminase bervariasi cukup tinggi, mengindikasikan berbagai tingkat kerusakan hepatosit pada pasien.
BIL (302.99): Bilirubin memiliki variabilitas sedang hingga tinggi, menunjukkan perbedaan dalam fungsi pemrosesan hemoglobin oleh hati antar pasien.
Age (98.63): Usia pasien bervariasi dengan standard deviation sekitar 10 tahun, menunjukkan dataset mencakup berbagai kelompok usia.
ALB (33.20): Albumin memiliki variabilitas sedang, menunjukkan perbedaan dalam produksi protein hati antar pasien.
PROT (28.61): Total Protein memiliki variabilitas relatif rendah, menunjukkan nilai protein darah yang cukup konsisten antar pasien.
CHE (4.80): Cholinesterase relatif stabil dengan variabilitas rendah, menunjukkan produksi enzim yang cukup konsisten.
CHOL (1.27): Kolesterol memiliki variabilitas paling rendah, relatif stabil antar pasien, dan tidak memiliki banyak variasi ekstrem.
Covariance mengukur bagaimana dua variabel berubah bersama-sama.
AST dan GGT (852.71): Kedua enzim hati ini meningkat bersama-sama, semakin tinggi AST maka semakin tinggi pula GGT. Ini menunjukkan pola kerusakan hati yang seragam.
ALP dan GGT (649.32): Juga menunjukkan pola peningkatan bersama, mengindikasikan bahwa gangguan pada saluran empedu sering disertai dengan peningkatan GGT.
CREA dan ALP (202.25): Creatinine dan ALP meningkat bersama, mengindikasikan komplikasi ginjal-hati pada beberapa pasien.
ALT dan GGT (248.91): Kedua enzim hati ini juga berkorelasi positif, menunjukkan aktivitas enzim hati yang meningkat bersamaan.
AST dan BIL (177.11): Ketika kerusakan hati meningkat (AST tinggi), bilirubin juga cenderung meningkat karena gangguan pemrosesan.
ALB dan AST (-33.63): Ketika AST meningkat (kerusakan hati) maka Albumin cenderung menurun, pola ini konsisten dengan disfungsi hati yang menurunkan produksi protein.
ALB dan GGT (-46.18): Albumin menurun ketika GGT meningkat, menunjukkan hubungan terbalik antara produksi protein dan aktivitas enzim pada kerusakan hati.
ALB dan ALP (-21.82): Pola yang sama, albumin menurun saat ALP meningkat, konsisten dengan gangguan fungsi hati.
BIL dan CHE (-12.23): Bilirubin tinggi (gangguan hati) berbanding terbalik dengan Cholinesterase, menunjukkan penurunan produksi enzim saat fungsi hati menurun.
ALB dan BIL (-17.01): Albumin menurun ketika bilirubin meningkat, mengindikasikan hubungan terbalik antara produksi protein dan akumulasi bilirubin pada disfungsi hati.
# Menghitung eigenvalue dan eigenvector dari correlation matrix
eigen_cor <- eigen(cor_matrix)
# Menampilkan eigenvalue
print(round(eigen_cor$values, 4))
## [1] 2.4545 1.8566 1.3530 1.0825 1.0271 0.7338 0.6696 0.5823 0.5002 0.4230
## [11] 0.3175
# Menampilkan eigenvector
print(round(eigen_cor$vectors, 4))
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
## [1,] 0.1722 -0.1417 0.4085 0.1710 0.5929 -0.5123 0.0238 0.3470 0.1118
## [2,] -0.4463 -0.1042 -0.3534 -0.1195 0.1439 -0.1064 0.2154 0.3399 -0.0164
## [3,] 0.1778 -0.4729 0.2429 -0.2491 0.0254 0.4391 0.4227 0.1678 0.1365
## [4,] -0.0244 -0.4412 0.0137 0.2816 -0.5481 -0.0778 -0.2411 0.5398 -0.2008
## [5,] 0.3379 -0.2591 -0.4314 0.2459 -0.0360 -0.3941 -0.1045 -0.2907 0.0360
## [6,] 0.3306 0.0096 -0.3739 -0.0187 0.3555 0.4561 -0.5142 0.3077 0.2188
## [7,] -0.4281 -0.2867 0.1122 0.0385 -0.0860 -0.0420 -0.2561 -0.2155 0.7720
## [8,] -0.3123 -0.3325 0.2673 0.1040 0.3082 0.2175 -0.4165 -0.3153 -0.5061
## [9,] 0.0656 -0.0980 0.0249 -0.8571 -0.0940 -0.3362 -0.3376 0.0375 -0.0918
## [10,] 0.3150 -0.4930 -0.1328 -0.0687 0.0352 -0.0035 0.2218 -0.3414 -0.0313
## [11,] -0.3621 -0.1955 -0.4699 -0.0506 0.2943 -0.0449 0.1966 0.0381 -0.1326
## [,10] [,11]
## [1,] 0.0064 0.0817
## [2,] -0.5626 -0.3742
## [3,] 0.2706 -0.3627
## [4,] 0.0361 0.1665
## [5,] 0.1987 -0.5285
## [6,] -0.0761 0.0576
## [7,] 0.0116 0.0565
## [8,] -0.0529 -0.1883
## [9,] 0.0717 -0.0053
## [10,] -0.4891 0.4776
## [11,] 0.5624 0.3803
# Menghitung proporsi varians
prop_var <- eigen_cor$values / sum(eigen_cor$values)
print(round(prop_var, 4))
## [1] 0.2231 0.1688 0.1230 0.0984 0.0934 0.0667 0.0609 0.0529 0.0455 0.0385
## [11] 0.0289
print(round(cumsum(prop_var), 4))
## [1] 0.2231 0.3919 0.5149 0.6133 0.7067 0.7734 0.8343 0.8872 0.9327 0.9711
## [11] 1.0000
# Membuat tabel ringkasan
variance_explained <- data.frame(
Komponen = 1:length(eigen_cor$values),
Eigenvalue = round(eigen_cor$values, 4),
Proporsi_Persen = round(prop_var * 100, 2),
Kumulatif_Persen = round(cumsum(prop_var) * 100, 2)
)
print(variance_explained)
## Komponen Eigenvalue Proporsi_Persen Kumulatif_Persen
## 1 1 2.4545 22.31 22.31
## 2 2 1.8566 16.88 39.19
## 3 3 1.3530 12.30 51.49
## 4 4 1.0825 9.84 61.33
## 5 5 1.0271 9.34 70.67
## 6 6 0.7338 6.67 77.34
## 7 7 0.6696 6.09 83.43
## 8 8 0.5823 5.29 88.72
## 9 9 0.5002 4.55 93.27
## 10 10 0.4230 3.85 97.11
## 11 11 0.3175 2.89 100.00
# Membuat scree plot
plot(eigen_cor$values,
type = "b",
main = "Scree Plot - Eigenvalues dari Correlation Matrix",
xlab = "Komponen Utama",
ylab = "Eigenvalue",
col = "darkblue",
pch = 19,
lwd = 2,
cex = 1.2)
# Garis referensi Kaiser criterion (eigenvalue = 1)
abline(h = 1, col = "red", lty = 2, lwd = 2)
text(8, 1.3, "Kaiser Criterion (eigenvalue = 1)", col = "red", cex = 0.9)
# Grid untuk memudahkan pembacaan
grid()
Eigenvalue diinterpretasikan dalam bentuk proporsi persen agar lebih mudah dipahami seberapa besar kontribusi setiap komponen terhadap total variasi data. Proporsi persen membantu menentukan berapa komponen yang cukup untuk merepresentasikan data secara efisien :
Eigenvector menunjukkan kontribusi setiap variabel terhadap komponen utama. Saya akan menjelaskan eigenvector PC1 hingga PC5 karena kelima komponen ini memiliki eigenvalue > 1 (Kaiser Criterion) dan menjelaskan 70.67% total variasi.
# Membuat data frame untuk loading 3 komponen pertama
loadings_pc <- data.frame(
Variabel = names(numeric_data),
PC1 = round(eigen_cor$vectors[, 1], 4),
PC2 = round(eigen_cor$vectors[, 2], 4),
PC3 = round(eigen_cor$vectors[, 3], 4),
PC4 = round(eigen_cor$vectors[, 4], 4),
PC5 = round(eigen_cor$vectors[, 5], 4)
)
print(loadings_pc)
## Variabel PC1 PC2 PC3 PC4 PC5
## 1 Age 0.1722 -0.1417 0.4085 0.1710 0.5929
## 2 ALB -0.4463 -0.1042 -0.3534 -0.1195 0.1439
## 3 ALP 0.1778 -0.4729 0.2429 -0.2491 0.0254
## 4 ALT -0.0244 -0.4412 0.0137 0.2816 -0.5481
## 5 AST 0.3379 -0.2591 -0.4314 0.2459 -0.0360
## 6 BIL 0.3306 0.0096 -0.3739 -0.0187 0.3555
## 7 CHE -0.4281 -0.2867 0.1122 0.0385 -0.0860
## 8 CHOL -0.3123 -0.3325 0.2673 0.1040 0.3082
## 9 CREA 0.0656 -0.0980 0.0249 -0.8571 -0.0940
## 10 GGT 0.3150 -0.4930 -0.1328 -0.0687 0.0352
## 11 PROT -0.3621 -0.1955 -0.4699 -0.0506 0.2943