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:

Data Understanding

Install Package dan Import Library

# 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.

Import Dataset

# 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.

Dimensi Dataset

dim(data)
## [1] 1025   14

Output menunjukkan banyaknya jumlah observasi dan jumlah variabel pada dataset.

Struktur 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.

Penjelasan Variabel

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

Data Preprocessing

Mengecek Missing Value

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.

Mengubah Variabel Menjadi Faktor

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.

Statistik Deskriptif

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.

Visualisasi Data

Distribusi Target

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.

Distribusi Usia

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.

Hubungan Usia dengan Penyakit Jantung

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.

Pembagian Data Training dan Testing

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.

Pembangunan Model Decision Tree

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.

Visualisasi Decision Tree

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.

Prediksi Model

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:

Evaluasi Model

Confusion Matrix

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:

  • true positive,
  • true negative,
  • false positive,
  • false negative.

Semakin tinggi nilai accuracy maka semakin baik performa model klasifikasi.

Interpretasi Hasil

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.

Kesimpulan

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

Saran untuk penelitian selanjutnya adalah: