Penyakit jantung merupakan salah satu penyebab kematian tertinggi di dunia. Faktor seperti usia, tekanan darah, kadar kolesterol, detak jantung, dan kondisi kesehatan lainnya dapat mempengaruhi kemungkinan seseorang mengalami penyakit jantung.Perkembangan data science memungkinkan proses prediksi penyakit dilakukan menggunakan teknik klasifikasi sehingga dapat membantu proses identifikasi risiko penyakit secara lebih cepat dan sistematis.
Pada analisis ini digunakan metode klasifikasi Decision Tree untuk memprediksi kemungkinan penyakit jantung berdasarkan kondisi kesehatan pasien menggunakan pendekatan CRISP-DM (Cross Industry Standard Process for Data Mining).
Tujuan analisis ini adalah membangun model klasifikasi yang mampu memprediksi kemungkinan seseorang mengalami penyakit jantung berdasarkan karakteristik kesehatan pasien.
Model diharapkan dapat membantu proses analisis kesehatan secara lebih efektif serta mengetahui variabel yang paling berpengaruh terhadap penyakit jantung.
Metode Decision Tree dipilih karena:
# Menentukan CRAN mirror
options(repos = c(CRAN = "https://cloud.r-project.org"))
# Install package jika belum tersedia
if (!requireNamespace("caret", quietly = TRUE)) {
install.packages("caret")
}
if (!requireNamespace("rpart", quietly = TRUE)) {
install.packages("rpart")
}
if (!requireNamespace("rpart.plot", quietly = TRUE)) {
install.packages("rpart.plot")
}
if (!requireNamespace("ggplot2", quietly = TRUE)) {
install.packages("ggplot2")
}
if (!requireNamespace("dplyr", quietly = TRUE)) {
install.packages("dplyr")
}
# Memanggil library
library(caret)
## Warning: package 'caret' was built under R version 4.4.3
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 4.4.3
## Loading required package: lattice
library(rpart)
## Warning: package 'rpart' was built under R version 4.4.3
library(rpart.plot)
## Warning: package 'rpart.plot' was built under R version 4.4.3
library(ggplot2)
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.3
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
Library digunakan untuk preprocessing data, visualisasi, pembangunan model Decision Tree, dan evaluasi model.
# Membaca dataset
data <- read.csv("heart.csv")
# Menampilkan data awal
head(data)
## age sex cp trestbps chol fbs restecg thalach exang oldpeak slope ca thal
## 1 52 1 0 125 212 0 1 168 0 1.0 2 2 3
## 2 53 1 0 140 203 1 0 155 1 3.1 0 0 3
## 3 70 1 0 145 174 0 1 125 1 2.6 0 0 3
## 4 61 1 0 148 203 0 1 161 0 0.0 2 1 3
## 5 62 0 0 138 294 1 1 106 0 1.9 1 3 2
## 6 58 0 0 100 248 0 0 122 0 1.0 1 0 2
## target
## 1 0
## 2 0
## 3 0
## 4 0
## 5 0
## 6 1
Dataset berisi data kesehatan pasien yang digunakan untuk memprediksi penyakit jantung.
Pastikan file heart.csv berada pada folder yang sama
dengan file .Rmd.
dim(data)
## [1] 1025 14
Output menunjukkan banyaknya jumlah observasi dan jumlah variabel pada dataset.
str(data)
## 'data.frame': 1025 obs. of 14 variables:
## $ age : int 52 53 70 61 62 58 58 55 46 54 ...
## $ sex : int 1 1 1 1 0 0 1 1 1 1 ...
## $ cp : int 0 0 0 0 0 0 0 0 0 0 ...
## $ trestbps: int 125 140 145 148 138 100 114 160 120 122 ...
## $ chol : int 212 203 174 203 294 248 318 289 249 286 ...
## $ fbs : int 0 1 0 0 1 0 0 0 0 0 ...
## $ restecg : int 1 0 1 1 1 0 2 0 0 0 ...
## $ thalach : int 168 155 125 161 106 122 140 145 144 116 ...
## $ exang : int 0 1 1 0 0 0 0 1 0 1 ...
## $ oldpeak : num 1 3.1 2.6 0 1.9 1 4.4 0.8 0.8 3.2 ...
## $ slope : int 2 0 0 2 1 1 0 1 2 1 ...
## $ ca : int 2 0 0 1 3 0 3 1 0 2 ...
## $ thal : int 3 3 3 3 2 2 1 3 3 2 ...
## $ target : int 0 0 0 0 0 1 0 0 0 0 ...
Dataset terdiri dari variabel numerik dan kategorik yang berkaitan dengan kondisi kesehatan pasien.
| Variabel | Kepanjangan | Arti Variabel | Keterangan Data |
|---|---|---|---|
| age | Age | Usia pasien | Nilai berupa umur pasien dalam tahun |
| sex | Sex | Jenis kelamin pasien | 0 = perempuan, 1 = laki-laki |
| cp | Chest Pain Type | Tipe nyeri dada | 0 = typical angina, 1 = atypical angina,
2 = non-anginal pain, 3 = asymptomatic |
| trestbps | Resting Blood Pressure | Tekanan darah saat istirahat | Satuan mmHg |
| chol | Serum Cholesterol | Kadar kolesterol dalam darah | Satuan mg/dL |
| fbs | Fasting Blood Sugar | Gula darah puasa | 1 = >120 mg/dL, 0 = ≤120 mg/dL |
| restecg | Resting Electrocardiographic Results | Hasil elektrokardiogram saat istirahat | 0 = normal, 1 = kelainan ST-T,
2 = hipertrofi ventrikel kiri |
| thalach | Maximum Heart Rate Achieved | Detak jantung maksimum yang dicapai | Nilai denyut jantung maksimum pasien |
| exang | Exercise Induced Angina | Nyeri dada akibat olahraga | 1 = ya, 0 = tidak |
| oldpeak | ST Depression Induced by Exercise | Penurunan segmen ST akibat olahraga | Nilai depresi ST pada hasil ECG |
| slope | Slope of Peak Exercise ST Segment | Kemiringan segmen ST saat olahraga | 0 = downsloping, 1 = flat,
2 = upsloping |
| ca | Number of Major Vessels Colored by Fluoroscopy | Jumlah pembuluh darah utama | Nilai antara 0–4 |
| thal | Thalassemia | Kelainan darah thalassemia | 1 = normal, 2 = fixed defect,
3 = reversible defect |
| target | Target Variable | Status penyakit jantung | 1 = memiliki penyakit jantung,
0 = tidak memiliki penyakit jantung |
Variabel target terdiri dari: -
1 = memiliki penyakit jantung -
0 = tidak memiliki penyakit jantung
colSums(is.na(data))
## age sex cp trestbps chol fbs restecg thalach
## 0 0 0 0 0 0 0 0
## exang oldpeak slope ca thal target
## 0 0 0 0 0 0
Hasil menunjukkan jumlah missing value pada setiap variabel.
Berdasarkan hasil pengecekan, terlihat bahwa dataset tidak memiliki missing value sehingga data dapat langsung digunakan dalam proses pemodelan.
data$sex <- as.factor(data$sex)
data$cp <- as.factor(data$cp)
data$fbs <- as.factor(data$fbs)
data$restecg <- as.factor(data$restecg)
data$exang <- as.factor(data$exang)
data$slope <- as.factor(data$slope)
data$thal <- as.factor(data$thal)
data$target <- as.factor(data$target)
str(data)
## 'data.frame': 1025 obs. of 14 variables:
## $ age : int 52 53 70 61 62 58 58 55 46 54 ...
## $ sex : Factor w/ 2 levels "0","1": 2 2 2 2 1 1 2 2 2 2 ...
## $ cp : Factor w/ 4 levels "0","1","2","3": 1 1 1 1 1 1 1 1 1 1 ...
## $ trestbps: int 125 140 145 148 138 100 114 160 120 122 ...
## $ chol : int 212 203 174 203 294 248 318 289 249 286 ...
## $ fbs : Factor w/ 2 levels "0","1": 1 2 1 1 2 1 1 1 1 1 ...
## $ restecg : Factor w/ 3 levels "0","1","2": 2 1 2 2 2 1 3 1 1 1 ...
## $ thalach : int 168 155 125 161 106 122 140 145 144 116 ...
## $ exang : Factor w/ 2 levels "0","1": 1 2 2 1 1 1 1 2 1 2 ...
## $ oldpeak : num 1 3.1 2.6 0 1.9 1 4.4 0.8 0.8 3.2 ...
## $ slope : Factor w/ 3 levels "0","1","2": 3 1 1 3 2 2 1 2 3 2 ...
## $ ca : int 2 0 0 1 3 0 3 1 0 2 ...
## $ thal : Factor w/ 4 levels "0","1","2","3": 4 4 4 4 3 3 2 4 4 3 ...
## $ target : Factor w/ 2 levels "0","1": 1 1 1 1 1 2 1 1 1 1 ...
Variabel kategorik diubah menjadi tipe faktor agar dapat digunakan dalam model klasifikasi Decision Tree.
summary(data)
## age sex cp trestbps chol fbs restecg
## Min. :29.00 0:312 0:497 Min. : 94.0 Min. :126 0:872 0:497
## 1st Qu.:48.00 1:713 1:167 1st Qu.:120.0 1st Qu.:211 1:153 1:513
## Median :56.00 2:284 Median :130.0 Median :240 2: 15
## Mean :54.43 3: 77 Mean :131.6 Mean :246
## 3rd Qu.:61.00 3rd Qu.:140.0 3rd Qu.:275
## Max. :77.00 Max. :200.0 Max. :564
## thalach exang oldpeak slope ca thal
## Min. : 71.0 0:680 Min. :0.000 0: 74 Min. :0.0000 0: 7
## 1st Qu.:132.0 1:345 1st Qu.:0.000 1:482 1st Qu.:0.0000 1: 64
## Median :152.0 Median :0.800 2:469 Median :0.0000 2:544
## Mean :149.1 Mean :1.072 Mean :0.7541 3:410
## 3rd Qu.:166.0 3rd Qu.:1.800 3rd Qu.:1.0000
## Max. :202.0 Max. :6.200 Max. :4.0000
## target
## 0:499
## 1:526
##
##
##
##
Statistik deskriptif memberikan gambaran umum mengenai distribusi data pada setiap variabel.
Berdasarkan hasil statistik deskriptif, terlihat adanya variasi nilai pada variabel usia, tekanan darah, kadar kolesterol, dan detak jantung pasien.
ggplot(data, aes(x = target)) +
geom_bar(fill = "steelblue") +
labs(
title = "Distribusi Status Penyakit Jantung",
x = "Status Penyakit Jantung",
y = "Jumlah Pasien"
)
Visualisasi menunjukkan jumlah pasien yang memiliki penyakit jantung dan yang tidak memiliki penyakit jantung.
Distribusi data terlihat cukup seimbang sehingga model klasifikasi dapat dibangun dengan baik.
ggplot(data, aes(x = age)) +
geom_histogram(fill = "orange", bins = 15) +
labs(
title = "Distribusi Usia Pasien",
x = "Usia",
y = "Frekuensi"
)
Histogram menunjukkan distribusi usia pasien pada dataset.
Mayoritas pasien berada pada rentang usia menengah hingga lanjut usia.
ggplot(data,
aes(x = age,
fill = target)) +
geom_histogram(
position = "identity",
alpha = 0.6,
bins = 15
) +
labs(
title = "Hubungan Usia dengan Penyakit Jantung",
x = "Usia",
y = "Frekuensi"
)
Visualisasi menunjukkan hubungan antara usia pasien dengan status penyakit jantung.
Terlihat bahwa pasien dengan usia lebih tinggi cenderung memiliki risiko penyakit jantung yang lebih besar.
set.seed(123)
index <- createDataPartition(
data$target,
p = 0.8,
list = FALSE
)
train <- data[index, ]
test <- data[-index, ]
dim(train)
## [1] 821 14
dim(test)
## [1] 204 14
Dataset dibagi menjadi:
Pembagian data dilakukan agar model dapat diuji menggunakan data baru yang belum pernah dipelajari sebelumnya.
model <- rpart(
target ~ .,
data = train,
method = "class"
)
model
## n= 821
##
## node), split, n, loss, yval, (yprob)
## * denotes terminal node
##
## 1) root 821 400 1 (0.48721072 0.51278928)
## 2) cp=0 404 100 0 (0.75247525 0.24752475)
## 4) ca>=0.5 230 12 0 (0.94782609 0.05217391) *
## 5) ca< 0.5 174 86 1 (0.49425287 0.50574713)
## 10) thal=0,3 71 10 0 (0.85915493 0.14084507) *
## 11) thal=1,2 103 25 1 (0.24271845 0.75728155)
## 22) thalach< 119.5 7 0 0 (1.00000000 0.00000000) *
## 23) thalach>=119.5 96 18 1 (0.18750000 0.81250000) *
## 3) cp=1,2,3 417 96 1 (0.23021583 0.76978417)
## 6) age>=56.5 159 69 1 (0.43396226 0.56603774)
## 12) sex=1 101 40 0 (0.60396040 0.39603960)
## 24) chol>=245.5 40 5 0 (0.87500000 0.12500000) *
## 25) chol< 245.5 61 26 1 (0.42622951 0.57377049)
## 50) oldpeak>=2.4 11 0 0 (1.00000000 0.00000000) *
## 51) oldpeak< 2.4 50 15 1 (0.30000000 0.70000000) *
## 13) sex=0 58 8 1 (0.13793103 0.86206897) *
## 7) age< 56.5 258 27 1 (0.10465116 0.89534884) *
Model Decision Tree dibangun untuk mengklasifikasikan kemungkinan penyakit jantung berdasarkan variabel kesehatan pasien.
Decision Tree bekerja dengan membentuk aturan keputusan berdasarkan variabel yang paling berpengaruh terhadap target.
rpart.plot(model)
Visualisasi pohon keputusan menunjukkan proses pengambilan keputusan model dalam melakukan klasifikasi penyakit jantung.
Cabang pohon menunjukkan variabel yang paling berpengaruh dalam proses klasifikasi.
Semakin dekat variabel ke akar pohon, maka semakin besar pengaruh variabel tersebut terhadap hasil klasifikasi.
pred <- predict(
model,
test,
type = "class"
)
head(pred)
## 1 6 13 20 26 27
## 0 1 1 1 0 1
## Levels: 0 1
Output menunjukkan hasil klasifikasi data testing ke dalam kategori:
confusionMatrix(pred, test$target)
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 79 9
## 1 20 96
##
## Accuracy : 0.8578
## 95% CI : (0.8023, 0.9027)
## No Information Rate : 0.5147
## P-Value [Acc > NIR] : < 2e-16
##
## Kappa : 0.7145
##
## Mcnemar's Test P-Value : 0.06332
##
## Sensitivity : 0.7980
## Specificity : 0.9143
## Pos Pred Value : 0.8977
## Neg Pred Value : 0.8276
## Prevalence : 0.4853
## Detection Rate : 0.3873
## Detection Prevalence : 0.4314
## Balanced Accuracy : 0.8561
##
## 'Positive' Class : 0
##
Confusion matrix digunakan untuk mengevaluasi performa model klasifikasi.
Nilai accuracy menunjukkan tingkat ketepatan model dalam memprediksi penyakit jantung berdasarkan data testing.
Selain accuracy, confusion matrix juga menunjukkan:
Semakin tinggi nilai accuracy maka semakin baik performa model klasifikasi.
Berdasarkan hasil Decision Tree, beberapa variabel kesehatan memiliki pengaruh penting terhadap kemungkinan penyakit jantung, seperti:
Visualisasi pohon keputusan menunjukkan bagaimana model membentuk aturan klasifikasi berdasarkan karakteristik pasien.
Model mampu melakukan klasifikasi dengan cukup baik berdasarkan hasil evaluasi confusion matrix.
Berdasarkan tahapan CRISP-DM, metode klasifikasi Decision Tree mampu digunakan untuk memprediksi kemungkinan penyakit jantung berdasarkan kondisi kesehatan pasien.
Tahapan preprocessing berhasil dilakukan dengan baik tanpa ditemukan missing value pada dataset.
Model Decision Tree mampu membentuk aturan klasifikasi yang mudah dipahami dan diinterpretasikan.
Hasil evaluasi menunjukkan bahwa model memiliki performa klasifikasi yang cukup baik sehingga dapat membantu proses identifikasi risiko penyakit jantung secara lebih sistematis.
Saran untuk penelitian selanjutnya adalah: