library(corrplot)
library(ggplot2)
library(knitr)
data <- read.csv("Maternal Health Risk Data Set.csv")
data <- data[, sapply(data, is.numeric)]
head(data)
## Age SystolicBP DiastolicBP BS BodyTemp HeartRate
## 1 25 130 80 15.00 98 86
## 2 35 140 90 13.00 98 70
## 3 29 90 70 8.00 100 80
## 4 30 140 85 7.00 98 70
## 5 35 120 60 6.10 98 76
## 6 23 140 80 7.01 98 70
Dataset Maternal Health Risk ini berisi data kesehatan ibu hamil dengan 6 variabel numerik: Age (umur), SystolicBP (tekanan darah sistolik), DiastolicBP (tekanan darah diastolik), BS (gula darah), BodyTemp (suhu tubuh), dan HeartRate (detak jantung).
corr_matrix <- cor(data)
kable(round(corr_matrix, 4), caption = "Tabel Correlation Matrix")
| Age | SystolicBP | DiastolicBP | BS | BodyTemp | HeartRate | |
|---|---|---|---|---|---|---|
| Age | 1.0000 | 0.4160 | 0.3980 | 0.4733 | -0.2553 | 0.0798 |
| SystolicBP | 0.4160 | 1.0000 | 0.7870 | 0.4252 | -0.2866 | -0.0231 |
| DiastolicBP | 0.3980 | 0.7870 | 1.0000 | 0.4238 | -0.2575 | -0.0462 |
| BS | 0.4733 | 0.4252 | 0.4238 | 1.0000 | -0.1035 | 0.1429 |
| BodyTemp | -0.2553 | -0.2866 | -0.2575 | -0.1035 | 1.0000 | 0.0988 |
| HeartRate | 0.0798 | -0.0231 | -0.0462 | 0.1429 | 0.0988 | 1.0000 |
corrplot(corr_matrix, method = "color", addCoef.col = "black",
tl.col = "black", tl.srt = 45)
Dari hasil analisis correlation matrix, terlihat bahwa tekanan darah sistolik dan diastolik memiliki korelasi positif yang sangat kuat yaitu 0.787, ini menunjukkan bahwa kedua variabel ini bergerak bersamaan dan saling mempengaruhi. Kemudian umur ibu hamil menunjukkan korelasi sedang dengan gula darah sebesar 0.473 dan dengan tekanan sistolik sebesar 0.416, yang berarti ibu hamil yang lebih tua cenderung memiliki gula darah dan tekanan darah yang lebih tinggi. Sementara itu, suhu tubuh menunjukkan korelasi negatif kecil dengan hampir semua variabel lainnya sekitar -0.25, mengindikasikan bahwa suhu tubuh relatif independen dan tidak banyak dipengaruhi oleh faktor-faktor kesehatan lainnya. Visualisasi heatmap juga memperjelas temuan ini dengan menampilkan warna biru dominan pada pasangan tekanan darah yang menunjukkan korelasi tertinggi.
cov_matrix <- cov(data)
kable(round(cov_matrix, 4), caption = "Tabel Variance-Covariance Matrix")
| Age | SystolicBP | DiastolicBP | BS | BodyTemp | HeartRate | |
|---|---|---|---|---|---|---|
| Age | 181.5591 | 103.1715 | 74.4717 | 21.0036 | -4.7180 | 8.6972 |
| SystolicBP | 103.1715 | 338.7040 | 201.1218 | 25.7713 | -7.2338 | -3.4399 |
| DiastolicBP | 74.4717 | 201.1218 | 192.8153 | 19.3829 | -4.9042 | -5.1835 |
| BS | 21.0036 | 25.7713 | 19.3829 | 10.8474 | -0.4674 | 3.8060 |
| BodyTemp | -4.7180 | -7.2338 | -4.9042 | -0.4674 | 1.8807 | 1.0956 |
| HeartRate | 8.6972 | -3.4399 | -5.1835 | 3.8060 | 1.0956 | 65.4271 |
Berdasarkan matrix yang dihasilkan, elemen diagonal menunjukkan variance dari setiap variabel. Tekanan darah sistolik memiliki variance paling besar yaitu 328.70, yang berarti variabilitas pengukuran tekanan darah sistolik paling tinggi antar individu. Sebaliknya, suhu tubuh memiliki variance terkecil yaitu 7.25, mengindikasikan suhu tubuh relatif stabil dan tidak banyak bervariasi antar individu. Variabel lainnya seperti tekanan diastolik (201.12), umur (161.59), detak jantung (65.43), dan gula darah (25.77) menunjukkan tingkat variabilitas yang berada di antara keduanya. Elemen off-diagonal menunjukkan covariance antar variabel, di mana nilai positif seperti covariance antara tekanan sistolik dan diastolik sebesar 201.12 mengindikasikan kedua variabel bergerak searah, sedangkan nilai negatif menunjukkan pergerakan berlawanan.
eigen_result <- eigen(corr_matrix)
eigen_table <- data.frame(
Komponen = 1:length(eigen_result$values),
Eigenvalue = round(eigen_result$values, 4),
Proporsi = round(eigen_result$values/sum(eigen_result$values)*100, 2),
Kumulatif = round(cumsum(eigen_result$values/sum(eigen_result$values))*100, 2)
)
kable(eigen_table, caption = "Tabel Eigen Values")
| Komponen | Eigenvalue | Proporsi | Kumulatif |
|---|---|---|---|
| 1 | 2.6079 | 43.46 | 43.46 |
| 2 | 1.1444 | 19.07 | 62.54 |
| 3 | 0.8370 | 13.95 | 76.49 |
| 4 | 0.7063 | 11.77 | 88.26 |
| 5 | 0.4925 | 8.21 | 96.47 |
| 6 | 0.2118 | 3.53 | 100.00 |
plot(eigen_result$values, type = "b", main = "Scree Plot",
xlab = "Komponen", ylab = "Eigenvalue",
col = "darkblue", pch = 19, lwd = 2, cex = 1.5)
abline(h = 1, col = "red", lty = 2, lwd = 2)
text(1:6, eigen_result$values + 0.15, round(eigen_result$values, 2), cex = 0.8)
grid()
eigen_vectors <- as.data.frame(round(eigen_result$vectors, 4))
colnames(eigen_vectors) <- paste0("PC", 1:ncol(eigen_vectors))
rownames(eigen_vectors) <- colnames(data)
kable(eigen_vectors, caption = "Tabel Eigen Vectors")
| PC1 | PC2 | PC3 | PC4 | PC5 | PC6 | |
|---|---|---|---|---|---|---|
| Age | -0.4361 | 0.1729 | 0.2404 | -0.5551 | 0.6432 | 0.0169 |
| SystolicBP | -0.5296 | -0.1129 | -0.2416 | 0.3634 | 0.0939 | -0.7124 |
| DiastolicBP | -0.5226 | -0.1230 | -0.2991 | 0.3544 | 0.0781 | 0.7004 |
| BS | -0.4255 | 0.3529 | -0.1154 | -0.4254 | -0.7071 | -0.0106 |
| BodyTemp | 0.2735 | 0.4293 | -0.8093 | -0.1305 | 0.2607 | -0.0291 |
| HeartRate | -0.0200 | 0.7958 | 0.3550 | 0.4860 | 0.0586 | 0.0240 |
Dari analisis eigen values, komponen pertama memiliki eigenvalue sebesar 2.6079 yang menjelaskan 43.46% dari total varians data, sedangkan komponen kedua memiliki eigenvalue 1.1442 yang menjelaskan 19.07% varians. Ketika digabungkan, kedua komponen pertama ini menjelaskan 62.53% dari total varians, yang sudah cukup signifikan untuk merepresentasikan data. Menggunakan Kaiser Criterion yang menetapkan eigenvalue > 1 sebagai standar signifikansi, hanya dua komponen pertama yang memenuhi kriteria ini, memberikan kesempatan untuk melakukan reduksi dimensi dari 6 variabel asli menjadi hanya 2 komponen utama. Scree plot menunjukkan penurunan yang sangat tajam dari komponen 1 ke 2, kemudian mulai landai setelah itu, yang mengkonfirmasi bahwa komponen 3 sampai 6 memberikan kontribusi yang relatif kecil.
Dari eigen vectors, komponen utama pertama (PC1) didominasi oleh tekanan darah sistolik dan diastolik dengan loading sebesar 0.5096 dan 0.5226, diikuti oleh gula darah (0.4525) dan umur (0.4361), sementara suhu tubuh memberikan kontribusi negatif kecil (-0.2730). Pola loading ini menunjukkan bahwa PC1 dapat diinterpretasikan sebagai dimensi “Kesehatan Kardiovaskular dan Metabolik” karena didominasi oleh variabel tekanan darah dan gula darah. Komponen kedua (PC2) menunjukkan pola yang berbeda dengan umur sebagai variabel dominan yang memiliki loading 0.6893, mencerminkan bahwa PC2 merepresentasikan dimensi usia. Analisis ini memungkinkan peneliti untuk menyederhanakan data kompleks sambil mempertahankan informasi penting, sangat berguna untuk visualisasi data, clustering, atau analisis multivariat lanjutan lainnya.
Secara keseluruhan, analisis matrix algebra pada dataset Maternal Health Risk menunjukkan beberapa temuan penting. Correlation matrix mengungkapkan bahwa tekanan darah sistolik dan diastolik memiliki hubungan yang sangat kuat, sementara suhu tubuh cenderung independen dari variabel lain. Variance-covariance matrix mengidentifikasi bahwa tekanan darah sistolik memiliki variabilitas tertinggi dan suhu tubuh memiliki stabilitas paling besar. Melalui eigen analysis, ditemukan bahwa data 6-dimensi dapat secara efektif direduksi menjadi 2 komponen utama yang bersama-sama menjelaskan 62.53% dari total varians, di mana PC1 merepresentasikan aspek kesehatan kardiovaskular-metabolik dan PC2 terkait dengan faktor usia. Hasil analisis ini membuka peluang untuk penerapan teknik-teknik analisis multivariat yang lebih lanjut seperti Principal Component Regression, clustering berbasis komponen utama, atau klasifikasi status risiko kesehatan ibu hamil dengan efisiensi dimensionalitas yang lebih baik.