Dataset Maternal Health Risk berisi data kondisi kesehatan ibu hamil yang dikumpulkan dari beberapa rumah sakit dan klinik di daerah pedesaan Bangladesh. Jumlah data dalam dataset ini adalah 1014 data dengan 6 variabel numerik, yaitu usia (Age), tekanan darah sistolik (SystolicBP), tekanan darah diastolik (DiastolicBP), kadar gula darah (BS), suhu tubuh (BodyTemp), dan detak jantung (HeartRate). Variabel-variabel ini digunakan untuk menggambarkan kondisi fisik ibu selama kehamilan dan melihat kaitannya dengan risiko kesehatan
data <- read.csv("Maternal Health Risk Data Set.csv", stringsAsFactors = FALSE)
head(data)
## Age SystolicBP DiastolicBP BS BodyTemp HeartRate RiskLevel
## 1 25 130 80 15.00 98 86 high risk
## 2 35 140 90 13.00 98 70 high risk
## 3 29 90 70 8.00 100 80 high risk
## 4 30 140 85 7.00 98 70 high risk
## 5 35 120 60 6.10 98 76 low risk
## 6 23 140 80 7.01 98 70 high risk
Data diimpor dari file Maternal Health Risk Data Set.csv menggunakan fungsi read.csv(). Dataset ini berisi 1014 observasi dan 7 variabel, terdiri dari 6 variabel numerik (Age, SystolicBP, DiastolicBP, BS, BodyTemp, HeartRate) dan 1 variabel kategorik yaitu RiskLevel.
str(data)
## 'data.frame': 1014 obs. of 7 variables:
## $ Age : int 25 35 29 30 35 23 23 35 32 42 ...
## $ SystolicBP : int 130 140 90 140 120 140 130 85 120 130 ...
## $ DiastolicBP: int 80 90 70 85 60 80 70 60 90 80 ...
## $ BS : num 15 13 8 7 6.1 7.01 7.01 11 6.9 18 ...
## $ BodyTemp : num 98 98 100 98 98 98 98 102 98 98 ...
## $ HeartRate : int 86 70 80 70 76 70 78 86 70 70 ...
## $ RiskLevel : chr "high risk" "high risk" "high risk" "high risk" ...
summary(data)
## Age SystolicBP DiastolicBP BS
## Min. :10.00 Min. : 70.0 Min. : 49.00 Min. : 6.000
## 1st Qu.:19.00 1st Qu.:100.0 1st Qu.: 65.00 1st Qu.: 6.900
## Median :26.00 Median :120.0 Median : 80.00 Median : 7.500
## Mean :29.87 Mean :113.2 Mean : 76.46 Mean : 8.726
## 3rd Qu.:39.00 3rd Qu.:120.0 3rd Qu.: 90.00 3rd Qu.: 8.000
## Max. :70.00 Max. :160.0 Max. :100.00 Max. :19.000
## BodyTemp HeartRate RiskLevel
## Min. : 98.00 Min. : 7.0 Length:1014
## 1st Qu.: 98.00 1st Qu.:70.0 Class :character
## Median : 98.00 Median :76.0 Mode :character
## Mean : 98.67 Mean :74.3
## 3rd Qu.: 98.00 3rd Qu.:80.0
## Max. :103.00 Max. :90.0
data_numerik <- data[, sapply(data, is.numeric)]
head(data_numerik)
## 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 dibaca menggunakan read.csv() lalu dicek dengan head() untuk memastikan datanya sudah masuk dengan benar. Dari hasil str(data), terlihat bahwa data terdiri dari 1014 baris dan 7 variabel, di mana Age, SystolicBP, DiastolicBP, dan HeartRate bertipe integer, BS dan BodyTemp bertipe numerik, sedangkan RiskLevel bertipe karakter karena berisi kategori risiko. Melalui summary(data) bisa dilihat gambaran umum data, misalnya rata-rata usia ibu sekitar 29,87 tahun, rata-rata tekanan darah sistolik 113,2 dan diastolik 76,46, rata-rata kadar gula darah 8,726, suhu tubuh 98,67, serta detak jantung 74,3. Setelah itu mengambil hanya variabel numerik menggunakan sapply(data, is.numeric) karena analisis korelasi, kovarians, dan eigen hanya bisa dilakukan pada data numerik, sehingga variabel RiskLevel tidak disertakan
cor_matrix <- cor(data_numerik)
cat("Correlation Matrix \n")
## Correlation Matrix
print(cor_matrix)
## Age SystolicBP DiastolicBP BS BodyTemp
## Age 1.00000000 0.41604545 0.39802629 0.4732843 -0.25532314
## SystolicBP 0.41604545 1.00000000 0.78700648 0.4251717 -0.28661552
## DiastolicBP 0.39802629 0.78700648 1.00000000 0.4238241 -0.25753832
## BS 0.47328434 0.42517166 0.42382407 1.0000000 -0.10349336
## BodyTemp -0.25532314 -0.28661552 -0.25753832 -0.1034934 1.00000000
## HeartRate 0.07979763 -0.02310796 -0.04615057 0.1428672 0.09877104
## HeartRate
## Age 0.07979763
## SystolicBP -0.02310796
## DiastolicBP -0.04615057
## BS 0.14286723
## BodyTemp 0.09877104
## HeartRate 1.00000000
Correlation matrix digunakan untuk melihat hubungan antar variabel numerik dalam suatu data. Nilai korelasi berada pada rentang -1 sampai 1. Nilai positif menunjukkan hubungan searah, nilai negatif menunjukkan hubungan berlawanan arah, dan yang mendekati nol menunjukkan hubungan yang lemah atau tidak ada hubungan.
Berdasarkan nilai korelasi di atas, terlihat bahwa hubungan paling kuat terdapat pada SystolicBP dan DiastolicBP dengan nilai 0,787, yang berarti keduanya memiliki hubungan positif yang sangat kuat dan searah. Age juga memiliki korelasi positif sedang dengan BS (0,473) serta dengan SystolicBP (0,416) dan DiastolicBP (0,398), yang artinya semakin bertambah usia, tekanan darah dan kadar gula darah cenderung meningkat. BS sendiri memiliki hubungan positif sedang dengan tekanan darah, tetapi hubungannya dengan BodyTemp sangat lemah dan cenderung negatif (-0,103). BodyTemp justru menunjukkan korelasi negatif lemah dengan hampir semua variabel lain, terutama dengan SystolicBP (-0,286). Sementara itu, HeartRate memiliki korelasi yang sangat lemah dengan semua variabel, karena nilainya mendekati 0, sehingga bisa dikatakan tidak ada hubungan yang berarti
library(corrplot)
## corrplot 0.95 loaded
corrplot(cor_matrix,method = "color",
title = "Visualisasi Correlation Matrix",
mar = c(0,0,2,0), tl.col = "black",
addgrid.col = "black")
Pada visualisasi diatas, warna biru yang semakin gelap menunjukkan
korelasi positif yang semakin kuat, sedangkan warna yang lebih pucat
atau mendekati arah negatif menunjukkan hubungan yang lemah atau
berlawanan arah. Kotak paling gelap terlihat pada hubungan SystolicBP
dan DiastolicBP, sesuai dengan nilai korelasi tertinggi yaitu 0,787.
Warna biru dengan intensitas sedang juga terlihat pada hubungan Age
dengan BS dan tekanan darah, menandakan korelasi positif sedang.
Sementara itu, bagian BodyTemp cenderung berwarna lebih muda dan sedikit
ke arah negatif yang sesuai dengan nilai korelasinya yang lemah dan
negatif
cov_matrix <- cov(data_numerik)
cat("Variance-Covariance Matrix \n")
## Variance-Covariance Matrix
print(cov_matrix)
## Age SystolicBP DiastolicBP BS BodyTemp HeartRate
## Age 181.559065 103.171539 74.471739 21.0035619 -4.7180044 8.697168
## SystolicBP 103.171539 338.704005 201.121845 25.7712999 -7.2338429 -3.439938
## DiastolicBP 74.471739 201.121845 192.815323 19.3828770 -4.9042413 -5.183543
## BS 21.003562 25.771300 19.382877 10.8473512 -0.4674483 3.806040
## BodyTemp -4.718004 -7.233843 -4.904241 -0.4674483 1.8806951 1.095640
## HeartRate 8.697168 -3.439938 -5.183543 3.8060397 1.0956395 65.427104
Variance–Covariance Matrix digunakan untuk melihat tingkat penyebaran data (varians) dan hubungan variasi antar variabel (kovarians). Nilai varians terdapat pada diagonal matriks, sedangkan nilai di luar diagonal menunjukkan kovarians antar variabel.
Berdasarkan dari variance–covariance matrix, angka di bagian diagonal menunjukkan seberapa besar penyebaran masing-masing variabel. Yang paling besar adalah SystolicBP (338.70), lalu DiastolicBP (192.82) dan Age (181.56), artinya data tekanan darah dan usia cukup bervariasi antar individu. Di luar diagonal adalah nilai kovarians, yang menunjukkan arah hubungan perubahan antar variabel. Misalnya, kovarians antara SystolicBP dan DiastolicBP sebesar 201.12 dan bernilai positif, jadi kalau tekanan sistolik naik, diastolik juga cenderung ikut naik. Sementara itu, kovarians yang melibatkan BodyTemp cenderung kecil dan ada yang negatif seperti dengan SystolicBP (-7.23), sehingga bisa dibilang suhu tubuh tidak terlalu berpengaruh
eigen_result <- eigen(cor_matrix)
cat("Eigen Values\n")
## Eigen Values
print(eigen_result$values)
## [1] 2.6078934 1.1443812 0.8370499 0.7063345 0.4925435 0.2117975
cat("Eigen Vectors\n")
## Eigen Vectors
print(eigen_result$vectors)
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] -0.4360752 0.1729019 0.2404386 -0.5550931 -0.64321080 0.01685752
## [2,] -0.5296016 -0.1128996 -0.2415842 0.3633726 -0.09386670 -0.71243407
## [3,] -0.5225675 -0.1230416 -0.2990961 0.3544156 -0.07810122 0.70043934
## [4,] -0.4255290 0.3528904 -0.1153507 -0.4254237 0.70709921 -0.01063092
## [5,] 0.2735090 0.4293197 -0.8093439 -0.1305413 -0.26067118 -0.02914362
## [6,] -0.0200401 0.7958469 0.3549994 0.4859993 -0.05856920 0.02399757
Eigen value menunjukkan seberapa besar variasi data yang dijelaskan oleh masing-masing komponen utama, sedangkan eigen vector menunjukkan kontribusi setiap variabel terhadap komponen tersebut.
Berdasarkan hasil perhitungan eigen dari correlation matrix, diperoleh eigen value sebesar 2.6079, 1.1444, 0.8370, 0.7063, 0.4925, dan 0.2118. Correlation matrix digunakan karena setiap variabel dalam dataset memiliki skala dan satuan yang berbeda, seperti usia (tahun), tekanan darah (mmHg), gula darah, suhu tubuh, dan detak jantung. Kalau menggunakan covariance, variabel dengan angka yang lebih besar bisa terlihat lebih dominan. Dengan correlation, semua variabel sudah distandarisasi sehingga posisinya lebih seimbang. Karena jumlah variabel ada 6, maka total variasinya adalah 6. Komponen pertama memiliki eigenvalue paling besar yaitu 2.6079, yang artinya mampu menjelaskan sekitar 43% variasi data. Komponen kedua menjelaskan sekitar 19%, dan komponen ketiga sekitar 14%.
Jika dilihat dari nilai eigen vector pada komponen pertama, nilai terbesar (dilihat dari angka absolutnya) ada pada SystolicBP (-0.5296) dan DiastolicBP (-0.5226), lalu diikuti oleh Age (-0.4361) dan BS (-0.4255). Ini menunjukkan bahwa variasi terbesar dalam data paling banyak dipengaruhi oleh tekanan darah, kemudian usia dan gula darah. Sedangkan HeartRate (-0.0200) nilainya sangat kecil, jadi pengaruhnya terhadap komponen pertama hampir tidak ada. bisa disimpulkan bahwa tekanan darah menjadi faktor yang paling dominan pada analisis ini.
pca_result <- prcomp(data_numerik, scale = TRUE)
eigen_values <- pca_result$sdev^2
plot(eigen_values,
type = "b",
main = "Scree Plot Eigen Value",
xlab = "Komponen",
ylab = "Eigenvalue")
Pada scree plot terlihat bahwa Komponen 1 memiliki eigenvalue paling
tinggi sekitar 2,6. Setelah itu terjadi penurunan cukup tajam ke
Komponen 2 sekitar 1,14, lalu menurun lagi pada Komponen 3 sampai 6. Ini
menunjukkan bahwa kontribusi terbesar terhadap variasi data ada pada
Komponen 1, kemudian Komponen 2, sedangkan komponen berikutnya
kontribusinya semakin kecil.
barplot(eigen_result$vectors[,1],
main = "Eigenvector Komponen 1",
names.arg = colnames(data_numerik),
col = "blue",
las = 2)
Pada grafik eigenvector Komponen 1 batang dengan nilai paling besar adalah SystolicBP dan DiastolicBP dengan arah negatif, diikuti oleh Age dan BS yang juga bernilai negatif. BodyTemp bernilai positif tetapi lebih kecil, sedangkan HeartRate sangat kecil mendekati nol. Artinya, pada Komponen 1 variabel yang kontribusinya paling besar adalah tekanan darah, kemudian usia dan gula darah, sementara detak jantung kontribusinya paling kecil
Berdasarkan hasil analisis yang telah dilakukan, dapat disimpulkan bahwa variabel tekanan darah sistolik dan diastolik memiliki hubungan yang paling kuat dibandingkan variabel lainnya. Usia juga menunjukkan hubungan positif dengan tekanan darah dan kadar gula darah, yang berarti semakin bertambah usia ibu, maka kecenderungan tekanan darah dan gula darah juga meningkat. Sementara itu, suhu tubuh dan detak jantung memiliki hubungan yang relatif lemah terhadap variabel lain, sehingga pengaruhnya dalam pola keseluruhan data tidak terlalu besar. Dari hasil eigen value dan eigen vector, diketahui bahwa komponen utama pertama mampu menjelaskan sekitar 43% variasi data dan paling banyak dipengaruhi oleh tekanan darah, kemudian usia dan kadar gula darah. Hal ini menunjukkan bahwa tekanan darah menjadi faktor yang paling dominan dalam menggambarkan variasi kondisi kesehatan ibu hamil pada dataset ini. Secara umum, dapat dikatakan bahwa variabel tekanan darah merupakan indikator yang paling berperan dalam analisis risiko kesehatan ibu hamil berdasarkan data