Logo

Laporan Analisis dan Pemodelan Prediktif – Perbandingan Ensamble Models

1. Pengenalan Ensemble Models

Ensemble learning adalah pendekatan dalam machine learning yang menggabungkan beberapa model (biasanya model lemah/weak learners) untuk menghasilkan model prediktif yang lebih kuat, stabil, dan akurat. Konsep utamanya: “menggabungkan banyak pikiran lebih baik daripada satu.” Dalam konteks penelitian ini, pendekatan ensemble dipilih karena mampu menangani data dengan kompleksitas tinggi, hubungan non-linear, serta performanya yang terbukti lebih baik dibanding model tunggal.

Ensemble methods secara umum terbagi menjadi dua kategori utama:

  1. Bagging (Bootstrap Aggregating) → fokus mengurangi variance
  2. Boosting → fokus mengurangi bias secara bertahap

Tiga model yang digunakan dalam penelitian ini mewakili dua pendekatan tersebut:

  • Random Forest → bagging
  • GBM → boosting dasar
  • XGBoost → boosting modern yang dioptimasi

Di bawah ini penjelasan tiap model.


1.1 Random Forest

Random Forest adalah metode ensemble berbasis bagging yang menggabungkan banyak pohon keputusan (decision tree) yang dilatih pada sampel bootstrap. Setiap pohon hanya melihat sebagian fitur untuk membuat split, sehingga menghasilkan variasi antar pohon dan menurunkan risiko overfitting.

1. Rumus Dasar Random Forest

1. Hasilkan sampel bootstrap B dari data pelatihan.

2. Latih Pohon Keputusan pada setiap sampel:

  • Pada setiap pemisahan, pertimbangkan subset fitur acak (\(m dari p\)).

3. Gabungkan prediksi:

• Klasifikasi

\[ \hat{y} = \text{mode}{T_1(x), T_2(x), \ldots, T_B(x)} \]

Penjelasan variabel:

  • (\(\hat{y}\)) : Prediksi akhir.
  • (\(T_b(x)\)) : Prediksi dari pohon ke-b untuk input (x).
  • (\(B\)) : Jumlah pohon (bootstrap samples).
  • mode{…} : Nilai yang paling sering muncul (mayoritas suara).

• Regresi

\[ \hat{y} = \frac{1}{B} \sum_{b=1}^{B} T_b(x) \]

Penjelasan variabel:

  • (\(\hat{y}\)) : Prediksi akhir (nilai rata-rata).

  • (\(T_b(x)\)) : Prediksi dari pohon ke-b untuk input (x).

  • (\(B\)) : Jumlah pohon yang digunakan dalam ensemble.

  • (\(\frac{1}{B} \sum\)) : Rata-rata prediksi seluruh pohon. Karakteristik Utama

  • Termasuk metode bagging

  • Menggunakan bootstrap sampling

  • Mengambil subset acak fitur di setiap split

  • Hasil prediksi berdasarkan majority voting (klasifikasi) atau rata-rata (regresi)

Kelebihan

  • Tahan terhadap overfitting
  • Stabil meskipun data memiliki noise
  • Dapat menangani data numerik maupun kategorik
  • Menyediakan feature importance

Kelemahan

  • Interpretabilitas rendah (karena gabungan banyak pohon)
  • Waktu komputasi bisa meningkat jika jumlah pohon terlalu besar

1.2 Gradient Boosting Machines (GBM)

GBM adalah metode boosting yang membangun model secara bertahap. Setiap pohon baru berusaha memperbaiki kesalahan dari pohon sebelumnya dengan gradient descent pada fungsi loss. Berbeda dengan Random Forest, pohon tidak dibuat secara paralel tetapi berurutan.

Rumus Dasar GBM (Regresi)

  • 1. Inisialisasi Model Awal

Model pertama adalah nilai konstanta yang meminimalkan fungsi loss:

\[ F_0(x) = \arg\min_{\gamma} \sum_{i=1}^{n} L(y_i, \gamma) \]

Untuk regresi MSE, nilai ini adalah rata-rata target:

\[ F_0(x) = \bar{y} \]


  • 2. Untuk Setiap Iterasi (m = 1, 2, , M)

(a) Hitung Negative Gradient (Residual)

Residual mewakili seberapa besar kesalahan model sebelumnya:

\[ r_{im} = -\left[ \frac{\partial L(y_i, F(x_i))}{\partial F(x_i)} \right] {F(x_i)=F*{m-1}(x_i)} \]

Untuk regresi MSE:

\[ r_{im} = y_i - F_{m-1}(x_i) \]

(b) Latih Pohon Ke-m Menggunakan Residual

\[ h_m(x) \approx r_{im} \]

Pohon regresi dilatih untuk memprediksi residual tersebut.

(c) Hitung Optimal Weight (Shrinkage Factor)

Untuk setiap leaf terminal (j):

\[ \gamma_{jm} = \arg\min_{\gamma} \sum_{x_i \in R_{jm}} L\big(y_i,; F_{m-1}(x_i) + \gamma \big) \]

Untuk regresi MSE:

\[ \gamma_{jm} = \frac{\sum_{x_i \in R_{jm}} r_{im}}{|R_{jm}|} \]

(d) Update Model

\[ F_m(x) = F_{m-1}(x) + \nu \sum_{j=1}^{J_m} \gamma_{jm} \mathbf{1}(x \in R_{jm}) \]

Di mana:

  • (\(\nu\)) = learning rate

  • (\(J_m\)) = jumlah leaf pada pohon ke-m

3. Model Akhir

\[ F_M(x) = F_0(x) + \sum_{m=1}^{M} \nu \cdot h_m(x) \]

Karakteristik Utama

  • Menggunakan boosting sekuensial
  • Tiap model baru memperbaiki residual error model sebelumnya
  • Menggunakan gradient descent untuk optimasi

Kelebihan

  • Akurasi tinggi pada berbagai jenis permasalahan
  • Mampu menangani hubungan non-linear
  • Mendukung berbagai loss function

Kelemahan

  • Rentan overfitting jika parameter tidak diatur dengan baik
  • Training lebih lambat karena sifatnya sekuensial
  • Sensitif terhadap outlier

1.3 Extreme Gradient Boosting (XGBoost)

XGBoost (Extreme Gradient Boosting) merupakan pengembangan dari GBM yang lebih efisien, cepat, dan akurat. XGBoost menambahkan regularisasi L1 dan L2 untuk mengurangi overfitting dan mempercepat komputasi menggunakan teknik optimasi canggih serta pemrosesan paralel.

  • 1. Fungsi Tujuan (Objective Function)

XGBoost meminimalkan:

\[ \mathcal{L} = \sum_{i=1}^{n} l\left(y_i,; \hat{y}*i^{(t)}\right) + \sum*{k=1}^{t} \Omega(f_k) \]

Dimana:

  1. = loss function (misal: squared error, logistic loss) (\(\hat{y}_i^{(t)}\)) = prediksi di iterasi ke-(t) (\(f_k\)) = pohon keputusan ke-(k) (\(\Omega(f_k)\)) = regularisasi kompleksitas pohon
  • 2. Regularisasi (Pembeda utama XGBoost)

\[ \Omega(f) = \gamma T + \frac{1}{2} \lambda \sum_{j=1}^{T} w_j^2 \]

Di mana:

\((T)\) = jumlah daun (leaves) \((w_j)\) = nilai prediksi pada leaf (j) \((\gamma)\) = penalti membuat leaf baru \((\lambda)\) = penalti L2 untuk bobot leaf

Tujuan: mencegah overfitting dan mempercepat model.

  • 3. Additive Model (Boosting)

Model dibangun secara bertahap:

\[ \hat{y}_i^{(t)} = \hat{y}_i^{(t-1)} + \eta f_t(x_i) \]

\((f_t)\) = pohon baru yang dilatih pada iterasi ke-t \((\eta)\) = learning rate (shrinkage)

  • 4. Gradient & Hessian

XGBoost menggunakan pendekatan second-order Taylor expansion.

Untuk setiap data titik (i):

\[ g_i = \frac{\partial l(y_i,\hat{y}_i^{(t-1)})}{\partial \hat{y}_i^{(t-1)}} \]

\[ h_i = \frac{\partial^2 l(y_i,\hat{y}_i^{(t-1)})}{\partial (\hat{y}_i^{(t-1)})^2} \]

\((g_i)\) = first derivative (gradient) \((h_i)\) = second derivative (hessian)

Ini membuat XGBoost lebih akurat dan stabil dibanding GBM biasa.

  • 5. Scoring Function untuk Node / Split

Gain ketika memecah node:

\[ \text{Gain} = \frac{1}{2} \left( \frac{G_L^2}{H_L + \lambda} + \frac{G_R^2}{H_R + \lambda} - \frac{(G_L + G_R)^2}{H_L + H_R + \lambda} \right) - \gamma \]

Dimana:

\((G_L = \sum_{i \in L} g_i)\) \((H_L = \sum_{i \in L} h_i)\) \((G_R, H_R) untuk sisi kanan\) \((\gamma) = penalti leaf baru\)

Split dipilih jika Gain > 0.

  • 6. Nilai Leaf Optimal

Untuk setiap leaf (j):

\[ w_j^* = -\frac{G_j}{H_j + \lambda} \]

Model prediksi pohon:

\[ f_t(x) = w_j^* \quad \text{jika } x \text{ jatuh pada leaf } j \]

  • 7. Prediksi Akhir

Untuk regresi:

\[ \hat{y}(x) = \sum_{t=1}^{T} \eta f_t(x) \]

Karakteristik Utama

  • Versi “tuned and optimized” dari GBM
  • Mendukung regularisasi (L1, L2) → mencegah overfitting
  • Optimasi komputasi: parallelization, cache awareness, dan tree pruning
  • Mendukung sparse data

Kelebihan

  • Kinerja prediktif sangat kuat
  • Lebih cepat dibanding GBM biasa
  • Mendukung fitur-fitur lanjutan: early stopping, handling missing value, weighted data
  • Cocok untuk dataset besar dan kompleks

Kelemahan

  • Relatif lebih rumit dalam tuning hyperparameter
  • Konsumsi memori lebih besar pada dataset sangat besar

Ringkasan Perbedaan Ketiga Model

Model Metode Kekuatan Kekurangan
Random Forest Bagging Stabil, tahan overfitting Tidak sekuat boosting untuk pola kompleks
GBM Boosting sekuensial Akurasi tinggi Training lebih lambat, butuh tuning hati-hati
XGBoost Boosting + optimasi Paling akurat, cepat, ada regularisasi Parameter lebih kompleks

2. Identifikasi Masalah

Penelitian ini bertujuan untuk membangun model prediksi berbasis ensemble learning guna mengklasifikasikan apakah seseorang berpotensi mengalami penyakit jantung berdasarkan berbagai parameter fisiologis. Identifikasi masalah pada penelitian ini dijelaskan sebagai berikut.

2.1 Apa yang Ingin Diprediksi

Penelitian ini ingin memprediksi status penyakit jantung (HeartDisease), yaitu kondisi apakah seseorang memiliki indikasi penyakit jantung atau tidak.

Prediksi HeartDisease penting karena:

  • Dapat membantu deteksi dini risiko penyakit jantung,
  • Membantu pengambilan keputusan medis,
  • Mendukung tindakan pencegahan secara lebih cepat dan tepat.

2.2 Variabel Target

Variabel target dalam penelitian ini adalah:

HeartDisease (0 atau 1)

  • 0 → tidak memiliki penyakit jantung
  • 1 → memiliki penyakit jantung

Variabel ini berupa data kategorik biner, sehingga jenis prediksi adalah klasifikasi, bukan regresi.

HeartDisease akan diprediksi menggunakan 11 variabel fitur:

  • Age
  • Sex
  • ChestPainType
  • RestingBP
  • Cholesterol
  • FastingBS
  • RestingECG
  • MaxHR
  • ExerciseAngina
  • Oldpeak
  • ST_Slope

Fitur terdiri dari gabungan variabel numerik dan kategorik.

2.3 Alasan Menggunakan Ensemble Learning

Pemilihan metode ensemble learning didasarkan pada beberapa keunggulan yang relevan untuk kasus klasifikasi kesehatan:

  1. Akurasi lebih tinggi dibanding model tunggal, karena prediksi dibuat dari kombinasi banyak pohon.

  2. Mampu menangani hubungan non-linear antar variabel fisiologis seperti tekanan darah, kolesterol, atau detak jantung.

  3. Lebih robust terhadap outlier dan noise, terutama pada algoritma Random Forest dan XGBoost.

  4. Mengurangi bias dan variance melalui pendekatan yang berbeda:

    • Random Forest (bagging) → menurunkan variance
    • GBM (boosting) → menurunkan bias
    • XGBoost → boosting dengan regularisasi → lebih stabil dan tidak mudah overfitting

Dengan karakteristik tersebut, ensemble learning dinilai sesuai untuk permasalahan prediksi risiko penyakit jantung.

2.4 Tujuan Perbandingan Tiga Model Ensemble

Penelitian ini bertujuan untuk membangun dan membandingkan tiga algoritma ensemble learning, yaitu:

  1. Random Forest Classifier
  2. Gradient Boosting Classifier (GBM)
  3. Extreme Gradient Boosting (XGBoost)

Tujuan dari perbandingan adalah:

  • Menentukan model mana yang memberikan performa terbaik untuk klasifikasi HeartDisease.
  • Mengamati perbedaan akurasi, recall, precision, F1-score, dan AUC dari masing-masing model.
  • Melihat bagaimana boosting modern (XGBoost) dibandingkan dengan metode bagging (RF) dan boosting klasik (GBM).
  • Memberikan rekomendasi model terbaik untuk deteksi risiko penyakit jantung.

3. Data Understanding

Bagian ini menjelaskan sumber data, struktur dataset, serta penjelasan setiap variabel yang digunakan dalam penelitian. Pemahaman awal terhadap data menjadi langkah penting sebelum melakukan analisis maupun pemodelan ensemble.

3.1 Sumber Data

Dataset yang digunakan berasal dari platform Kaggle dengan nama file heart.csv, yaitu dataset medis modern yang memuat informasi demografis, gejala klinis, serta hasil pemeriksaan kardiovaskular. Dataset ini umum digunakan dalam pemodelan prediksi risiko penyakit jantung, namun formatnya adalah versi yang telah diperbarui menjadi kategori berbentuk string, bukan kode numerik.

3.2 Jumlah Baris dan Kolom

Berdasarkan hasil pemeriksaan:

  • 918 baris (observations)
  • 12 kolom (11 features + 1 target)

Dataset ini memiliki variabel target biner, sehingga sesuai untuk tugas klasifikasi menggunakan metode ensemble.

3.3 Tipe Data

Dataset memiliki dua jenis tipe data utama:

Numerik

  • Age
  • RestingBP
  • Cholesterol
  • FastingBS
  • MaxHR
  • Oldpeak
  • HeartDisease

Kategorikal (String/Object)

  • Sex
  • ChestPainType
  • RestingECG
  • ExerciseAngina
  • ST_Slope

Kombinasi tipe numerik dan kategorikal ini berpengaruh terhadap metode encoding serta pemilihan model, terutama pada algoritma seperti XGBoost yang tidak menerima fitur kategorik secara langsung.

3.4 Penjelasan Variabel

Variabel Tipe Deskripsi
Age Integer Usia pasien (tahun).
Sex Object Jenis kelamin: M = Male, F = Female.
ChestPainType Object Tipe nyeri dada (ATA, NAP, ASY, TA).
RestingBP Integer Tekanan darah istirahat (mmHg).
Cholesterol Integer Kadar kolesterol total (mg/dl).
FastingBS Integer Gula darah puasa > 120 mg/dl (1 = ya, 0 = tidak).
RestingECG Object Hasil ECG istirahat (Normal, ST, LVH).
MaxHR Integer Detak jantung maksimum yang dicapai.
ExerciseAngina Object Angina akibat olahraga (Y = ya, N = tidak).
Oldpeak Float Perubahan pola detak jantung ketika olahraga
ST_Slope Object Pola detak jantung ketika capek (Up, Flat, Down)
HeartDisease Integer Target: 1 = ada penyakit jantung, 0 = tidak ada.

3.5 Distribusi Kelas Target (Wajib untuk Klasifikasi)

Berdasarkan eksplorasi awal dataset:

  • HeartDisease = 1 (Ada penyakit jantung) → sekitar 55%
  • HeartDisease = 0 (Tidak ada penyakit jantung) → sekitar 45%

Distribusi kelas tergolong cukup seimbang, sehingga metrik seperti Accuracy, Precision, Recall, dan F1-score masih relevan digunakan tanpa perlu teknik penyeimbangan data seperti SMOTE.


4. Exploratory Data Analysis (EDA)

EDA dilakukan untuk memahami karakteristik awal dataset sebelum proses preprocessing dan pemodelan ensemble dilakukan. Bagian ini mencakup statistik deskriptif, pemeriksaan nilai ekstrem, serta interpretasi awal terhadap pola data.

4.1 Statistik Deskriptif

Statistik deskriptif digunakan untuk memahami karakteristik awal dari variabel numerik dalam dataset, antara lain:

  • Age
  • RestingBP
  • Cholesterol
  • FastingBS
  • MaxHR
  • Oldpeak

Analisis ini mencakup nilai minimum, maksimum, mean, median, serta kuartil. Statistik deskriptif membantu:

  • Mengidentifikasi nilai ekstrem (outlier) seperti kolesterol 0 atau tekanan darah abnormal.
  • Melihat distribusi usia pasien.
  • Menilai kecenderungan detak jantung maksimum.
  • Memahami variasi kondisi fisiologis pasien sebelum pemodelan.
## 'data.frame':    918 obs. of  12 variables:
##  $ Age           : int  40 49 37 48 54 39 45 54 37 48 ...
##  $ Sex           : chr  "M" "F" "M" "F" ...
##  $ ChestPainType : chr  "ATA" "NAP" "ATA" "ASY" ...
##  $ RestingBP     : int  140 160 130 138 150 120 130 110 140 120 ...
##  $ Cholesterol   : int  289 180 283 214 195 339 237 208 207 284 ...
##  $ FastingBS     : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ RestingECG    : chr  "Normal" "Normal" "ST" "Normal" ...
##  $ MaxHR         : int  172 156 98 108 122 170 170 142 130 120 ...
##  $ ExerciseAngina: chr  "N" "N" "N" "Y" ...
##  $ Oldpeak       : num  0 1 0 1.5 0 0 0 0 1.5 0 ...
##  $ ST_Slope      : chr  "Up" "Flat" "Up" "Flat" ...
##  $ HeartDisease  : int  0 1 0 1 0 0 0 0 1 0 ...
##       Age            Sex            ChestPainType        RestingBP    
##  Min.   :28.00   Length:918         Length:918         Min.   :  0.0  
##  1st Qu.:47.00   Class :character   Class :character   1st Qu.:120.0  
##  Median :54.00   Mode  :character   Mode  :character   Median :130.0  
##  Mean   :53.51                                         Mean   :132.4  
##  3rd Qu.:60.00                                         3rd Qu.:140.0  
##  Max.   :77.00                                         Max.   :200.0  
##   Cholesterol      FastingBS       RestingECG            MaxHR      
##  Min.   :  0.0   Min.   :0.0000   Length:918         Min.   : 60.0  
##  1st Qu.:173.2   1st Qu.:0.0000   Class :character   1st Qu.:120.0  
##  Median :223.0   Median :0.0000   Mode  :character   Median :138.0  
##  Mean   :198.8   Mean   :0.2331                      Mean   :136.8  
##  3rd Qu.:267.0   3rd Qu.:0.0000                      3rd Qu.:156.0  
##  Max.   :603.0   Max.   :1.0000                      Max.   :202.0  
##  ExerciseAngina        Oldpeak          ST_Slope          HeartDisease   
##  Length:918         Min.   :-2.6000   Length:918         Min.   :0.0000  
##  Class :character   1st Qu.: 0.0000   Class :character   1st Qu.:0.0000  
##  Mode  :character   Median : 0.6000   Mode  :character   Median :1.0000  
##                     Mean   : 0.8874                      Mean   :0.5534  
##                     3rd Qu.: 1.5000                      3rd Qu.:1.0000  
##                     Max.   : 6.2000                      Max.   :1.0000

Interpretasi Statistik Deskriptif

Berdasarkan hasil eksplorasi statistik deskriptif, beberapa karakteristik penting dari data dapat diinterpretasikan sebagai berikut:

1. Usia Pasien (Age)

Usia pasien berada pada rentang 28 hingga 77 tahun, dengan rata-rata 53.51 tahun. Nilai median sebesar 54 tahun menunjukkan bahwa sebagian besar pasien berada pada kelompok usia paruh baya hingga lanjut. Rentang kuartil (47–60 tahun) mengindikasikan konsentrasi utama usia berada di sekitar masa risiko penyakit jantung.

2. Tekanan Darah Istirahat (RestingBP)

RestingBP memiliki nilai minimum 0 mmHg, yang merupakan nilai tidak realistis dan mengindikasikan adanya outlier atau data error. Nilai maksimum mencapai 200 mmHg, dengan rata-rata 132.4 mmHg, dan mayoritas data berada pada rentang 120–140 mmHg (Q1–Q3). Hal ini menunjukkan adanya variasi tekanan darah antar pasien, termasuk potensi hipertensi pada sebagian besar pasien.

3. Kadar Kolesterol (Cholesterol)

Rentang kolesterol berada antara 0 hingga 603 mg/dl, dengan nilai 0 menandakan adanya missing value yang direpresentasikan secara salah atau anomalous input. Rata-rata 198.8 mg/dl menunjukkan bahwa banyak pasien memiliki kolesterol pada tingkat borderline hingga tinggi. Kuartil ketiga (267 mg/dl) mengindikasikan bahwa sebagian besar pasien memiliki kadar kolesterol cukup tinggi, yang menjadi faktor risiko signifikan penyakit jantung.

4. Gula Darah Puasa (FastingBS)

Variabel biner ini memiliki rata-rata 0.233, yang berarti sekitar 23.3% pasien memiliki kadar gula darah puasa di atas 120 mg/dl. Persentase ini menunjukkan sebagian kecil pasien memiliki potensi risiko diabetes yang dapat berkontribusi terhadap penyakit jantung.

5. Detak Jantung Maksimal (MaxHR)

MaxHR berada dalam rentang 60 hingga 202 bpm, dengan rata-rata 136.8 bpm. Kuartil ketiga sebesar 156 bpm menandakan bahwa sebagian besar pasien masih mampu mencapai detak jantung relatif tinggi saat aktivitas fisik, yang menggambarkan kapasitas kardiovaskular yang cukup baik bagi sebagian besar pasien.

6. Oldpeak

Oldpeak memiliki nilai minimum –2.6 hingga maksimum 6.2, dengan rata-rata 0.887. Mayoritas nilai berada pada kisaran 0 hingga 1.5, yang menunjukkan adanya variasi depresi segmen ST pada EKG akibat aktivitas fisik. Nilai negatif pada variabel ini kemungkinan merupakan hasil perhitungan tertentu atau measurement artifact, sehingga perlu diperhatikan pada tahap preprocessing.

7. Variabel Kategorikal

Variabel seperti Sex, ChestPainType, RestingECG, ExerciseAngina, dan ST_Slope semuanya bertipe karakter. Variabel-variabel ini menggambarkan kondisi klinis dan gejala pasien, seperti jenis kelamin, tipe nyeri dada, kondisi EKG, serta karakteristik segmen ST. Distribusi kategori ini penting dianalisis lebih lanjut pada tahap visualisasi untuk memahami persebaran dan potensi hubungan terhadap penyakit jantung.

8. Variabel Target (HeartDisease)

Rata-rata variabel target sebesar 0.553 menunjukkan bahwa 55.3% pasien pada dataset tercatat memiliki penyakit jantung. Hal ini menandakan dataset cenderung sedikit tidak seimbang, namun perbedaannya tidak terlalu signifikan sehingga masih aman untuk digunakan dalam pemodelan tanpa penyesuaian besar. Distribusi target ini juga mengindikasikan bahwa prevalensi penyakit jantung pada populasi data cukup tinggi.

Kesimpulan Singkat

Secara keseluruhan, statistik deskriptif menunjukkan:

  • Populasi pasien didominasi usia paruh baya–lanjut.
  • Terdapat outlier pada RestingBP dan Cholesterol yang perlu penanganan.
  • Beberapa faktor risiko seperti kolesterol tinggi, depresi ST, dan FastingBS > 120 muncul cukup jelas pada data.
  • Variabel target memiliki distribusi yang cukup seimbang untuk pemodelan klasifikasi.

4.2 Korelasi Antar Variabel

Interpretasi Visual Heatmap Korelasi

Heatmap korelasi di atas menggambarkan hubungan linear antar variabel numerik dalam dataset heart.csv. Nilai korelasi berada pada rentang –1 sampai +1, di mana:

  • Mendekati +1 → hubungan positif kuat (jika satu naik, yang lain ikut naik)
  • Mendekati –1 → hubungan negatif kuat (jika satu naik, yang lain turun)
  • Mendekati 0 → hampir tidak ada hubungan linear

Secara umum, hubungan antar variabel numerik pada dataset ini relatif lemah–sedang, yang berarti setiap fitur memiliki kontribusi unik terhadap prediksi HeartDisease (tidak banyak multikolinearitas).

1. Korelasi yang Paling Relevan Dengan HeartDisease

(a) MaxHR vs HeartDisease — korelasi negatif sedang (~–0.40)

  • Semakin tinggi detak jantung maksimum (MaxHR), semakin kecil kemungkinan seseorang mengalami penyakit jantung.
  • Ini sesuai literatur: pasien dengan penyakit jantung sering mengalami keterbatasan mencapai detak jantung optimal.

(b) Oldpeak vs HeartDisease — korelasi positif (~0.40)

  • Semakin besar nilai Oldpeak (depresi ST saat olahraga), semakin besar risiko HeartDisease.
  • Ini merupakan indikator klinis penting pada analisis stres jantung.

(c) FastingBS vs HeartDisease — korelasi positif lemah (~0.27)

  • Pasien dengan gula darah puasa tinggi lebih berisiko, tetapi kekuatannya tidak besar.

(d) Age vs HeartDisease — korelasi positif lemah (~0.28)

  • Usia yang lebih tua sedikit lebih berkorelasi dengan risiko penyakit jantung.
  • Korelasi lemah menunjukkan faktor usia saja tidak cukup untuk prediksi—perlu kombinasi fitur lain.

Kesimpulan sementara terkait target

Fitur numerik yang paling informatif secara korelasi adalah MaxHR, Oldpeak, diikuti Age dan FastingBS.

2. Korelasi Antar Fitur Lainnya

(a) Age vs MaxHR — korelasi negatif sedang (~–0.38)

  • Semakin tua usia, semakin rendah detak jantung maksimum yang dapat dicapai.
  • Ini adalah hubungan fisiologis normal.

(b) Age vs Oldpeak — positif lemah (~0.26)

  • Usia lebih tua sedikit lebih rentan mengalami depresi ST.

(c) RestingBP vs Cholesterol — hampir tidak ada hubungan (≈0.07)

  • Tekanan darah tidak linear berhubungan dengan kadar kolesterol.

(d) RestingBP vs HeartDisease — sangat lemah (~0.11)

  • RestingBP bukan prediktor kuat secara korelasi sederhana.
  • Namun bisa tetap penting secara non-linear dalam model ensemble.

(e) Cholesterol vs HeartDisease — sangat lemah (~0.23)

  • Korelasi ini rendah karena dataset Kaggle memiliki banyak pasien dengan kolesterol rendah tetapi terdiagnosis penyakit jantung, yang membuat hubungan linear melemah.

3. Tidak Ada Multikolinearitas Serius

  • Tidak ada pasangan fitur dengan korelasi > 0.8.
  • Artinya dataset aman untuk model seperti GBM atau XGBoost tanpa risiko fitur redundan berlebihan.

HeartDisease (Target)

Berikut ringkasan hubungan paling penting dengan penyakit jantung:

Variabel Jenis hubungan Penjelasan
Oldpeak Positif sedang Oldpeak naik → risiko naik
MaxHR Negatif sedang MaxHR turun → risiko naik
Age Positif lemah Semakin tua → sedikit lebih berisiko
FastingBS Positif lemah Gula darah puasa tinggi → sedikit berisiko
Cholesterol Negatif lemah Kadar tinggi tidak selalu berarti risiko tinggi
RestingBP Positif sangat lemah Hampir tidak berpengaruh

4.3 Distribusi Variabel

4.3.1 Distribusi Variable Numerik (Histogram)

Interpretasi Distribusi Variabel Numerik

Distribusi seluruh variabel numerik divisualisasikan menggunakan histogram. Dari grafik tersebut, dapat dilihat pola sebaran data sebagai berikut:

1. Age

  • Distribusi usia cenderung mendekati normal, namun sedikit condong ke arah usia menengah–lanjut.
  • Terlihat bahwa sebagian besar responden berada pada kisaran 45–65 tahun, dengan frekuensi paling tinggi sekitar usia 50–60 tahun.

2. RestingBP

  • Nilai Resting Blood Pressure menunjukkan distribusi yang cenderung menyebar, tanpa puncak yang terlalu dominan.
  • Namun sebagian besar data berkumpul pada rentang 120–140, yang merupakan tekanan darah istirahat umum pada orang dewasa.

3. Cholesterol

  • Distribusi kolesterol tampak skewed (condong ke kanan), di mana sebagian besar responden memiliki kolesterol dalam rentang 200–260, namun terdapat beberapa nilai lebih tinggi.
  • Hal ini menunjukkan adanya kemungkinan outlier kolesterol tinggi.

4. FastingBS

  • Variabel ini bersifat biner (0/1), sehingga histogram menunjukkan dua batang frekuensi.
  • Mayoritas nilai adalah 0, yang berarti kebanyakan responden tidak memiliki kadar gula puasa yang tinggi.

5. MaxHR

  • Distribusi Maximum Heart Rate cenderung membentuk puncak di tengah, dengan frekuensi terbesar pada rentang 120–150.
  • Nilai ini menunjukkan fungsi kardiovaskular yang umum pada populasi usia pertengahan.

6. Oldpeak

  • Distribusinya tampak condong ke kanan (positively skewed), dengan sebagian besar nilai berada di sekitar 0–1.
  • Hanya sedikit responden yang memiliki nilai Oldpeak tinggi, yang dapat mengindikasikan respon stres atau iskemia pada sebagian kecil individu.

7. HeartDisease

  • Variabel target ini juga biner (0/1).
  • Histogram menunjukkan bahwa frekuensi nilai 0 dan 1 cukup berimbang (atau sesuai kondisi dataset kamu).
  • Hal ini penting untuk ketepatan model klasifikasi, karena distribusi target tidak terlalu timpang.

4.3.2 Distribusi Variable Kategorikal (Bar Chart)

Interpretasi Distribusi Variabel Kategorikal

Distribusi seluruh variabel kategorikal divisualisasikan menggunakan bar chart. Dari grafik tersebut, dapat dilihat pola distribusi sebagai berikut:

1. Sex

Distribusi jenis kelamin menunjukkan:

  • Male (M): 725 orang
  • Female (F): 193 orang

Artinya, sekitar 79% data berasal dari laki-laki. Kondisi ini menunjukkan dataset didominasi oleh pasien laki-laki, yang sesuai dengan fakta epidemiologi bahwa penyakit jantung lebih umum pada pria. Namun, ketidakseimbangan ini juga perlu diperhatikan pada proses modelling karena bisa mempengaruhi pola pembelajaran model.

2. ChestPainType

Distribusi tipe nyeri dada:

  • ASY (Asymptomatic): 496
  • NAP (Non-Anginal Pain): 203
  • ATA (Atypical Angina): 173
  • TA (Typical Angina): 46

Kategori ASY (asymptomatic) adalah yang paling dominan. Hal ini penting karena pasien tanpa gejala khas justru sering memiliki risiko penyakit jantung yang lebih tinggi. Distribusi ini mengindikasikan bahwa banyak pasien tidak menunjukkan nyeri dada khas, sehingga model perlu mempelajari pola lain untuk prediksi.

3. RestingECG

Distribusi hasil pemeriksaan ECG saat istirahat:

  • Normal: 552
  • LVH (Left Ventricular Hypertrophy): 188
  • ST: 178

Mayoritas pasien memiliki hasil ECG Normal, sedangkan sisanya menunjukkan indikasi kelainan (LVH atau kelainan segmen ST). Meskipun sebagian besar normal, keberadaan kategori abnormal tetap penting karena berkaitan langsung dengan risiko kardiovaskular.

4. ExerciseAngina

Distribusi angina yang muncul saat berolahraga:

  • N (Tidak ada angina): 547
  • Y (Mengalami angina): 371

Sebagian besar tidak mengalami angina, namun jumlah pasien yang mengalami angina saat olahraga juga cukup besar. Karena angina saat aktivitas fisik adalah indikator signifikan penyakit jantung, variabel ini dapat menjadi prediktor kuat dalam model.

5. ST_Slope

Distribusi kemiringan segmen ST:

  • Flat: 460
  • Up: 395
  • Down: 63

Kategori Flat dan Up mendominasi, sedangkan Down relatif jarang. Meskipun minoritas, kategori ST_Slope = Down memiliki hubungan yang kuat dengan penyakit jantung iskemik sehingga tetap penting dipertahankan dalam model.

4.4 Deteksi Outlier

Interpretasi Outlier

Hasil eksplorasi distribusi menunjukkan beberapa variabel memiliki outlier yang perlu diperhatikan sebelum pemodelan:

1. RestingBP

  • Terdapat nilai 0 mmHg, yang tidak mungkin secara medis. Ini jelas merupakan data error atau missing value yang salah input.

2. Cholesterol

  • Nilai 0 mg/dl dan nilai sangat tinggi (>500 mg/dl) muncul sebagai outlier.
  • Nilai 0 adalah tidak valid, sedangkan nilai ekstrem mencerminkan kondisi klinis berat namun jarang.

3. Oldpeak

  • Terdapat nilai negatif serta nilai sangat tinggi (>4).
  • Nilai negatif kemungkinan measurement artifact, dan nilai sangat tinggi menjadi outlier klinis.

4. MaxHR

  • Beberapa nilai sangat rendah (<70 bpm) dan sangat tinggi (>190 bpm) muncul sebagai outlier fisiologis, meski masih mungkin secara klinis.

5. Age

  • Tidak menunjukkan outlier ekstrem; seluruh rentang usia berada dalam batas wajar.

Kesimpulan Singkat

Outlier utama ditemukan pada RestingBP, Cholesterol, Oldpeak, dan MaxHR. Beberapa nilai merupakan anomali tidak valid (nilai 0), dan sebagian lainnya ekstrem namun mungkin secara klinis. Perlu dilakukan penanganan pada tahap preprocessing agar model lebih stabil.

4.5 Insight Utama

Bagian EDA ini memberikan gambaran utama tentang kondisi data sebelum masuk ke tahap pemodelan. Berikut ringkasan insight penting dan alasan kenapa hal ini berpengaruh untuk Random Forest, Boosting, dan XGBoost.

1. Outlier pada Beberapa Variabel

Temuan EDA:

  • RestingBP memiliki nilai 0 (tidak valid secara medis).
  • Cholesterol punya nilai 0 dan nilai sangat tinggi.
  • Oldpeak punya nilai negatif dan sangat tinggi.
  • MaxHR terdapat nilai terlalu rendah/tinggi.

Kenapa penting untuk ensemble:

  • Model seperti XGBoost sangat sensitif terhadap outlier, bisa menyebabkan model salah belajar.
  • Random Forest lebih tahan, tetapi outlier ekstrem tetap bisa membuat split tidak optimal.

Outlier perlu ditangani agar model stabil dan tidak bias.

2. Distribusi Variabel Banyak yang Tidak Normal (Skewed)

Temuan EDA:

  • Cholesterol dan Oldpeak condong ke kanan (right-skew).
  • MaxHR cenderung mendekati normal.

Kenapa penting untuk ensemble:

  • Skewness bisa membuat model sulit mengenali kelompok risiko tertentu.
  • Tree-based model tidak butuh normalitas, tapi tetap butuh data yang representatif.

Distribusi skew memberi sinyal bahwa perlu cek nilai ekstrem dan mungkin perlu transformasi.

3. Variabel Kategorikal Tidak Seimbang

Temuan EDA:

  • Sex → Male mendominasi (≈79%).
  • ChestPainType → ASY paling banyak.
  • ST_Slope → kategori Down sangat sedikit.

Kenapa penting untuk ensemble:

  • Ketidakseimbangan kategori bisa membuat model hanya “menghafal” kategori mayoritas.
  • XGBoost bisa overfit pada kategori minor jika jumlahnya sangat sedikit.

Perlu encoding yang benar dan kontrol agar model tidak bias pada kategori besar.

4. Korelasi Antar Variabel Lemah–Sedang

Temuan utama terkait target (HeartDisease):

  • MaxHR → negatif sedang (semakin rendah, risiko naik).
  • Oldpeak → positif sedang (semakin tinggi, risiko naik).
  • Age & FastingBS → positif lemah.
  • Cholesterol & RestingBP → korelasi sangat lemah.

Kenapa penting untuk ensemble:

  • Korelasi rendah berarti pola hubungan non-linear sangat dominan.
  • Model ensemble (RF, GBM, XGBoost) sangat cocok untuk kasus non-linear.
  • Tidak ada multikolinearitas berlebihan, sehingga fitur aman dipakai semua.

Dataset ideal untuk ensemble karena pola hubungan tidak linear.

5. Target (HeartDisease) Cukup Seimbang

Temuan EDA:

  • Kelas 0 ≈ 45%
  • Kelas 1 ≈ 55%

Kenapa penting untuk ensemble:

  • Model tidak perlu penyesuaian berlebihan seperti SMOTE atau oversampling.
  • Evaluasi lebih stabil karena kelas relatif seimbang.

Model ensemble akan belajar dengan baik tanpa harus memperbaiki imbalance.

6. Pola Klinis Penting Terlihat Jelas

Temuan EDA:

  • Usia banyak pada 40–60 → usia risiko.
  • Oldpeak tinggi dan MaxHR rendah → pola kuat pada kasus HeartDisease.
  • Banyak pasien ASY → tidak bergejala, jadi butuh fitur lain untuk prediksi.

Kenapa penting untuk ensemble:

  • Model ensemble mampu menangkap interaksi variabel yang kompleks, misalnya:

    • Age × Oldpeak
    • MaxHR × ExerciseAngina
    • ChestPainType × ST_Slope
  • Pola ini sulit ditangkap oleh model linear biasa.

EDA membuktikan bahwa ensemble mampu mempelajari pola klinis kompleks.

7. Kesimpulan Utama EDA

Secara keseluruhan, EDA menunjukkan:

  1. Ada outlier dan nilai tidak valid → perlu diperhatikan.
  2. Banyak variabel distribusinya tidak normal → penting untuk pahami pola ekstrem.
  3. Variabel kategorikal tidak seimbang → perlu encoding hati-hati.
  4. Korelasi lemah → pola non-linear dominan.
  5. Target seimbang → model bisa belajar tanpa koreksi besar.
  6. Pola klinis sesuai fakta medis → fitur relevan dan informatif.

8. Kenapa EDA Penting untuk Ensemble Learning?

EDA dibutuhkan agar model Random Forest, Gradient Boosting, dan XGBoost:

  • Belajar dari data yang bersih dan_valid_.
  • Tidak terganggu oleh error outlier.
  • Tidak bias terhadap kategori mayoritas.
  • Bisa menangkap pola non-linear dengan optimal.
  • Menghasilkan akurasi dan generalisasi yang lebih baik.

Singkatnya: EDA memastikan kualitas data optimal agar model ensemble dapat bekerja maksimal dan menghasilkan prediksi penyakit jantung yang akurat.


5. Data Preprocessing

Tahap ini dilakukan untuk memastikan data dalam kondisi siap digunakan untuk pemodelan.

5.1 Pemeriksaan Missing Values

##            Age            Sex  ChestPainType      RestingBP    Cholesterol 
##              0              0              0              0              0 
##      FastingBS     RestingECG          MaxHR ExerciseAngina        Oldpeak 
##              0              0              0              0              0 
##       ST_Slope   HeartDisease 
##              0              0

Hasil: Seluruh kolom memiliki nilai 0 missing values. Dengan demikian, dataset tidak membutuhkan imputasi.


5.2 Penanganan Outlier

Outlier diamati melalui boxplot:

Hasil inspeksi menunjukkan:

  • RestingBP → terdapat nilai 0, tidak realistis secara medis.
  • Cholesterol → terdapat nilai 0, juga tidak realistis.
  • Oldpeak → seluruh nilai berada pada rentang 0 – 6.2, tidak ditemukan nilai negatif.
  • MaxHR → seluruh nilai berada pada rentang fisiologis normal (60 – 202), tidak ada outlier ekstrim.

Keputusan Penanganan Outlier

Outlier tidak dihapus, dengan pertimbangan:

  1. Model ensemble (Random Forest, GBM, XGBoost) tahan terhadap outlier.
  2. Nilai ekstrem dapat mencerminkan kondisi fisiologis tertentu yang relevan.
  3. Menghapus data dapat mengurangi variasi dan mengubah distribusi asli.

Namun, nilai RestingBP = 0 dan Cholesterol = 0 tetap ditandai sebagai anomali medis, tetapi tetap digunakan untuk menjaga kesesuaian dengan dataset sumber.


5.3 Encoding Variabel Kategorikal

Dataset memiliki lima variabel kategorikal:

  • Sex
  • ChestPainType
  • RestingECG
  • ExerciseAngina
  • ST_Slope

Variabel-variabel ini diubah menjadi factor, lalu dikonversi menggunakan One-Hot Encoding.

One-Hot Encoding

library(DT)

# ================================
# 1. Load Data
# ================================
data_healt <- read.csv("heart.csv")

# ================================
# 2. Ubah Variabel Kategorikal Menjadi Faktor
# ================================
cat_cols <- c("Sex", "ChestPainType", "RestingECG",
              "ExerciseAngina", "ST_Slope")

data_healt[cat_cols] <- lapply(data_healt[cat_cols], factor)

# ================================
# 3. One-Hot Encoding dengan caret
# ================================
library(caret)
## Loading required package: lattice
## 
## Attaching package: 'caret'
## The following object is masked from 'package:purrr':
## 
##     lift
# Membuat dummy variables
dummies <- dummyVars(" ~ .", data = data_healt)

# Menghasilkan dataset baru yang sudah encoding
data_encoded <- data.frame(predict(dummies, newdata = data_healt))

# ================================
# 4. Tampilkan Data yang Sudah Di-encoding
# ================================
datatable(data_encoded)

One-Hot Encoding dipilih karena menghasilkan fitur biner (0/1) dan kompatibel dengan model ensemble.

5.4 Splitting Dataset

Dataset dibagi menjadi 80% training dan 20% testing menggunakan stratified sampling berdasarkan variabel target.

set.seed(123)

train_index <- createDataPartition(data_encoded$HeartDisease, p = 0.8, list = FALSE)
train_data <- data_encoded[train_index, ]
test_data  <- data_encoded[-train_index, ]

Stratifikasi menjamin proporsi kelas HeartDisease tetap terjaga pada kedua subset.

Hasil Pembagian Data (80% Train – 20% Test)

Training set (80%): - HeartDisease = 1 → 406 - data HeartDisease = 0 → 328

Data Testing set (20%): - HeartDisease = 1 → 102 - data HeartDisease = 0 → 82 data


5.5 Penyeimbangan Kelas

Distribusi variabel target diperiksa:

## 
##   0   1 
## 410 508
## 
##         0         1 
## 0.4466231 0.5533769

Hasil real dataset:

  • Kelas 1 (penyakit jantung): 55.47%
  • Kelas 0 (tidak ada penyakit jantung): 44.53%

Perbedaan proporsi relatif kecil, sehingga dataset dianggap cukup seimbang, dan:

  • Oversampling/undersampling tidak dilakukan.

Model seperti XGBoost dan GBM tetap dapat menerapkan class weight jika diperlukan.


6. Ensemble Modelling

Bagian ini menjelaskan proses pembangunan tiga model ensemble learning yang digunakan untuk memprediksi variabel target HeartDisease berdasarkan fitur–fitur fisiologis dan klinis pada dataset heart.csv. Seluruh proses pemodelan dilakukan setelah melalui tahapan preprocessing, yaitu pengecekan missing values, penanganan outlier, encoding variabel kategorikal, standardisasi fitur numerik, serta pembagian data menjadi 80% training dan 20% testing.

Tiga algoritma ensemble yang digunakan dalam penelitian ini adalah:

  1. Random Forest Classifier (metode bagging)
  2. Gradient Boosting Classifier (GBM) (metode boosting klasik)
  3. XGBoost Classifier (Extreme Gradient Boosting, metode boosting modern)

Pemilihan ketiga model ini didasarkan pada karakteristiknya yang mampu:

  • Menangani kombinasi fitur numerik dan kategorikal yang telah diencoding,
  • Mengatasi hubungan non-linear antar variabel,
  • Mengurangi bias dan variance melalui proses ensemble,
  • Memberikan performa tinggi pada permasalahan klasifikasi medis.

Untuk perbandingan yang adil, seluruh model dibangun menggunakan parameter dasar (default) dengan sedikit penyesuaian pada parameter inti guna meningkatkan stabilitas hasil. Selanjutnya, performa model dievaluasi menggunakan data testing.

Rumus Evaluasi Model

Evaluasi model klasifikasi pada penelitian ini menggunakan metrik berikut: Accuracy, Sensitivity (Recall), Specificity, Precision, dan F1-score.

Semua metrik didasarkan pada Confusion Matrix, dengan notasi:

Aktual Positif Aktual Negatif
Prediksi Positif True Positive (TP) False Positive (FP)
Prediksi Negatif False Negative (FN) True Negative (TN)

Berikut rumus setiap metrik:

1. Accuracy

Mengukur proporsi prediksi yang benar dari seluruh prediksi.

\[ \text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN} \]

2. Sensitivity (Recall / True Positive Rate)

Kemampuan model mendeteksi pasien yang benar-benar memiliki penyakit.

\[ \text{Sensitivity} = \frac{TP}{TP + FN} \]

3. Specificity (True Negative Rate)

Kemampuan model mengidentifikasi individu yang benar-benar tidak memiliki penyakit.

\[ \text{Specificity} = \frac{TN}{TN + FP} \]

4. Precision (Positive Predictive Value)

Proporsi prediksi positif yang benar-benar positif.

\[ \text{Precision} = \frac{TP}{TP + FP} \]

5. F1-score

Menggabungkan precision dan recall secara harmonis.

\[ \text{F1-score} = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}} \]

6.1 Random Forest

Random Forest adalah metode bagging yang membangun banyak decision tree secara paralel. Setiap pohon dilatih pada subset acak data dan subset acak fitur, kemudian hasil voting digunakan untuk menentukan prediksi akhir.

Kelebihan Random Forest pada kasus kesehatan:

  • stabil terhadap noise dan outlier,
  • tidak terlalu sensitif terhadap scaling,
  • mampu menangkap interaksi non-linear antar variabel fisik,
  • bekerja baik pada dataset dengan banyak variabel hasil encoding.

Code Proses Random Forest

## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  0  1
##          0 70  8
##          1 15 90
##                                           
##                Accuracy : 0.8743          
##                  95% CI : (0.8174, 0.9186)
##     No Information Rate : 0.5355          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.746           
##                                           
##  Mcnemar's Test P-Value : 0.2109          
##                                           
##             Sensitivity : 0.8235          
##             Specificity : 0.9184          
##          Pos Pred Value : 0.8974          
##          Neg Pred Value : 0.8571          
##              Prevalence : 0.4645          
##          Detection Rate : 0.3825          
##    Detection Prevalence : 0.4262          
##       Balanced Accuracy : 0.8709          
##                                           
##        'Positive' Class : 0               
## 

Evaluasi Model Random Forest

## === Evaluasi Random Forest ===
## Accuracy    : 0.8743
## Sensitivity : 0.8235
## Specificity : 0.9184
## Precision   : 0.8974
## F1-score    : 0.8589

Interpretasi Model Random Forest

Berikut hasil evaluasi terbaru untuk model Random Forest:

  • Accuracy : 0.8743
  • Sensitivity : 0.8235
  • Specificity : 0.9184
  • Precision : 0.8974
  • F1-score : 0.8589

Model Random Forest menunjukkan performa yang baik dalam memprediksi penyakit jantung dengan akurasi 87.43%, yang berarti model mampu memberikan prediksi benar pada sebagian besar data uji. Sebagai metode bagging, Random Forest membangun banyak pohon keputusan secara acak sehingga menghasilkan model yang stabil dan cukup tahan terhadap noise.

1. Sensitivity = 0.8235

Sensitivity mengukur kemampuan model mendeteksi kelas positif (pasien dengan penyakit jantung).

Nilai 82.35% menunjukkan bahwa Random Forest dapat mengidentifikasi sebagian besar pasien yang benar-benar memiliki penyakit jantung, meskipun performanya masih lebih rendah dibandingkan GBM dan XGBoost. Ini berarti masih terdapat sejumlah kasus positif yang tidak terdeteksi (false negative).

2. Specificity = 0.9184

Specificity adalah kemampuan model mengenali pasien yang tidak memiliki penyakit jantung (kelas negatif).

Dengan nilai 91.84%, Random Forest termasuk sangat baik dalam menghindari kesalahan menandai pasien sehat sebagai pasien penyakit jantung. Ini menjadikan Random Forest kuat dalam meminimalkan false positive.

3. Precision = 0.8974

Precision menggambarkan akurasi model ketika memprediksi kelas positif.

Dengan nilai 89.74%, sebagian besar prediksi positif yang diberikan model memang benar-benar pasien dengan penyakit jantung. Hal ini menunjukkan kualitas prediksi positif yang cukup tinggi.

4. F1-score = 0.8589

F1-score menggabungkan precision dan sensitivity dalam satu ukuran keseimbangan.

Nilai 85.89% menunjukkan bahwa Random Forest memiliki keseimbangan performa yang baik antara mendeteksi pasien positif dan menghasilkan prediksi positif yang akurat. Namun performanya masih di bawah GBM yang memiliki F1-score lebih tinggi.

5. Balanced Accuracy = 0.8709

Balanced accuracy menghitung rata-rata dari sensitivity dan specificity.

Nilai 87.09% menunjukkan bahwa model tidak bias terhadap salah satu kelas, dan mampu memprediksi kedua kelas dengan cukup seimbang.

Kesimpulan Interpretasi Random Forest

Secara keseluruhan, Random Forest adalah model yang kuat dalam mengenali pasien yang sehat (specificity tinggi) dan menghasilkan prediksi positif yang cukup akurat (precision tinggi). Namun model ini kurang optimal dalam mendeteksi pasien yang benar-benar memiliki penyakit jantung karena sensitivity-nya lebih rendah dibanding GBM dan XGBoost.

Dengan tujuan penelitian yaitu:

  1. memprediksi penyakit jantung, serta
  2. menentukan model ensemble terbaik,

maka Random Forest tetap merupakan model kompetitif, namun tidak menjadi yang terbaik karena kemampuan pendeteksian pasien positif (sensitivity) dan keseimbangan keseluruhan performanya masih lebih rendah dibanding GBM.

6.2 Gradient Boosting (GBM)

Gradient Boosting Machine (GBM) merupakan metode boosting klasik yang membangun model secara bertahap, di mana setiap tree berikutnya fokus untuk memperbaiki kesalahan dari tree sebelumnya. Berbeda dengan Random Forest yang menggunakan pendekatan bagging, GBM mengoptimalkan prediksi secara berurutan sehingga mampu mempelajari pola kompleks dan hubungan non-linear pada data.

Model GBM sangat cocok digunakan untuk dataset medis karena:

  • mampu menangani fitur numerik dan kategorikal hasil encoding,
  • sensitif terhadap pola interaksi antar-variabel,
  • mampu memberikan performa tinggi pada dataset berukuran sedang.

Pada penelitian ini, model GBM dibangun menggunakan parameter dasar dengan beberapa penyesuaian untuk menjaga stabilitas proses boosting.

Kode Proses GBM

## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  0  1
##          0 69  6
##          1 16 92
##                                           
##                Accuracy : 0.8798          
##                  95% CI : (0.8237, 0.9231)
##     No Information Rate : 0.5355          
##     P-Value [Acc > NIR] : < 2e-16         
##                                           
##                   Kappa : 0.7564          
##                                           
##  Mcnemar's Test P-Value : 0.05501         
##                                           
##             Sensitivity : 0.9388          
##             Specificity : 0.8118          
##          Pos Pred Value : 0.8519          
##          Neg Pred Value : 0.9200          
##              Prevalence : 0.5355          
##          Detection Rate : 0.5027          
##    Detection Prevalence : 0.5902          
##       Balanced Accuracy : 0.8753          
##                                           
##        'Positive' Class : 1               
## 

Evaluasi Model GBM

Tambahkan kode ini untuk ekstraksi metrik evaluasi:

## === Evaluasi Gradient Boosting (GBM) ===
## Accuracy    : 0.8798
## Sensitivity : 0.9388
## Specificity : 0.8118
## Precision   : 0.8519
## F1-score    : 0.8932

Interpretasi Model Gradient Boosting (GBM)

Model GBM menghasilkan Confusion Matrix dan metrik evaluasi sebagai berikut.

Confusion Matrix

Reference 0 Reference 1
Prediction 0 69 6
Prediction 1 16 92

Ringkasan Evaluasi

  • Accuracy: 0.8798
  • Sensitivity: 0.9388
  • Specificity: 0.8118
  • Precision: 0.8519
  • F1-score: 0.8932
  • Negative Predictive Value: 0.9200
  • Balanced Accuracy: 0.8753

Model Gradient Boosting menunjukkan performa yang kuat dengan accuracy sebesar 87.98 persen. Sebagai teknik boosting yang membangun model secara bertahap untuk memperbaiki kesalahan sebelumnya, GBM mampu mengenali pola data yang lebih kompleks dibandingkan metode ensemble sederhana.

Model ini tetap menjadi salah satu kandidat terbaik dalam klasifikasi penyakit jantung.

1. Sensitivity = 0.9388

Sensitivity sebesar 93.88 persen menunjukkan bahwa GBM sangat efektif dalam mendeteksi pasien yang benar-benar menderita penyakit jantung. Nilai ini termasuk tinggi, sehingga risiko terjadinya false negative relatif rendah. Dalam konteks kesehatan, ini berarti model jarang melewatkan pasien yang seharusnya terdeteksi sebagai positif.

2. Specificity = 0.8118

Specificity sebesar 81.18 persen menunjukkan bahwa model cukup baik dalam mengenali pasien yang tidak memiliki penyakit jantung. Meski tidak setinggi sensitivity, nilainya tetap memadai dan tidak mengindikasikan bias yang berlebihan pada salah satu kelas.

3. Precision = 0.8519

Precision sebesar 85.19 persen menunjukkan bahwa sebagian besar prediksi positif benar adanya. Artinya, ketika model menyatakan seorang pasien memiliki penyakit jantung, prediksi tersebut cukup dapat dipercaya. Nilai precision ini sedikit lebih rendah dibandingkan model sebelumnya tetapi masih berada pada kategori baik.

4. F1-score = 0.8932

F1-score sebesar 89.32 persen menunjukkan keseimbangan yang baik antara precision dan recall. F1-score yang tinggi menandakan bahwa model stabil dan konsisten dalam memprediksi kelas positif, tanpa terlalu banyak kesalahan.

5. Negative Predictive Value = 0.9200

NPV sebesar 92.00 persen mengindikasikan bahwa prediksi pasien tidak memiliki penyakit jantung sebagian besar benar. Hal ini menunjukkan bahwa model jarang membuat kesalahan dalam mengklasifikasi pasien sehat.

6. Balanced Accuracy = 0.8753

Balanced accuracy sebesar 87.53 persen menunjukkan bahwa model bekerja baik pada kedua kelas, baik positif maupun negatif. Ini penting terutama ketika distribusi kelas tidak seimbang, karena balanced accuracy memberi gambaran performa yang adil pada kedua kelompok.

Kesimpulan untuk Model Gradient Boosting

Model Gradient Boosting menunjukkan performa yang solid dengan:

  1. Sensitivity yang sangat tinggi, membuatnya efektif dalam mendeteksi pasien dengan penyakit jantung.
  2. F1-score yang tinggi, menandakan kombinasi yang baik antara akurasi dan stabilitas prediksi.
  3. Balanced accuracy yang kuat, menunjukkan kemampuan model dalam menangani kedua kelas secara seimbang.

Meskipun accuracy model ini sedikit lebih rendah dibandingkan versi sebelumnya yang kamu uji, GBM tetap merupakan model dengan performa unggul dan layak dipertimbangkan sebagai kandidat model terbaik untuk prediksi penyakit jantung.

6.3 XGBoost (Extreme Gradient Boosting)

XGBoost merupakan algoritma boosting modern yang dikembangkan untuk memberikan performa tinggi melalui optimasi berbasis regularisasi, penanganan missing value internal, paralelisasi, serta efisiensi komputasi. Dibandingkan GBM klasik, XGBoost menggunakan teknik yang lebih maju seperti shrinkage, column subsampling, dan L1/L2 regularization untuk mencegah overfitting.

Dengan kemampuan menangani hubungan non-linear, fitur biner hasil encoding, serta kestabilan yang tinggi, XGBoost menjadi salah satu model paling populer dalam kompetisi machine learning dan sangat sesuai untuk prediksi risiko medis seperti penyakit jantung.

Pada penelitian ini, XGBoost dibangun menggunakan parameter umum dan jumlah tree yang moderat agar hasilnya adil untuk dibandingkan dengan Random Forest dan GBM.

Kode Proses XGBoost

## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  0  1
##          0 70  8
##          1 15 90
##                                           
##                Accuracy : 0.8743          
##                  95% CI : (0.8174, 0.9186)
##     No Information Rate : 0.5355          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.746           
##                                           
##  Mcnemar's Test P-Value : 0.2109          
##                                           
##             Sensitivity : 0.9184          
##             Specificity : 0.8235          
##          Pos Pred Value : 0.8571          
##          Neg Pred Value : 0.8974          
##              Prevalence : 0.5355          
##          Detection Rate : 0.4918          
##    Detection Prevalence : 0.5738          
##       Balanced Accuracy : 0.8709          
##                                           
##        'Positive' Class : 1               
## 

Evaluasi Model XGBoost

## === Evaluasi XGBoost ===
## Accuracy    : 0.8743
## Sensitivity : 0.9184
## Specificity : 0.8235
## Precision   : 0.8571
## F1-score    : 0.8867

Interpretasi Model XGBoost

Model XGBoost menghasilkan Confusion Matrix dan metrik evaluasi sebagai berikut.

Confusion Matrix

Reference 0 Reference 1
Prediction 0 70 8
Prediction 1 15 90

Ringkasan Evaluasi

  • Accuracy: 0.8743
  • Sensitivity: 0.9184
  • Specificity: 0.8235
  • Precision: 0.8571
  • F1-score: 0.8867
  • Negative Predictive Value: 0.8974
  • Balanced Accuracy: 0.8709

Model XGBoost menunjukkan performa yang kuat dengan accuracy sebesar 87.43 persen. Sebagai pengembangan lanjutan dari metode boosting, XGBoost mampu menangani interaksi fitur yang kompleks dan melakukan regularisasi untuk mencegah overfitting. Hal ini menjadikannya salah satu model ensemble yang umum digunakan dalam berbagai tugas klasifikasi.

Meskipun performanya sedikit berada di bawah GBM, model ini tetap memberikan prediksi yang stabil dan akurat.

1. Sensitivity = 0.9184

Sensitivity sebesar 91.84 persen menunjukkan kemampuan XGBoost dalam mengenali pasien dengan penyakit jantung secara efektif. Nilai ini cukup tinggi dan menunjukkan bahwa XGBoost mampu mendeteksi sebagian besar kasus positif, meskipun masih lebih rendah dibandingkan GBM.

2. Specificity = 0.8235

Specificity sebesar 82.35 persen menunjukkan bahwa model cukup baik dalam mengidentifikasi pasien yang tidak memiliki penyakit jantung. Performa pada kelas negatif relatif seimbang dan menunjukkan tidak adanya bias yang terlalu kuat terhadap kelas tertentu.

3. Precision = 0.8571

Precision sebesar 85.71 persen menunjukkan bahwa sebagian besar prediksi positif yang diberikan model adalah benar. Artinya, tingkat kesalahan dalam memprediksi seseorang memiliki penyakit jantung berada pada tingkat yang cukup rendah.

4. F1-score = 0.8867

F1-score sebesar 88.67 persen menandakan bahwa XGBoost memiliki keseimbangan yang baik antara precision dan recall. Nilai ini mendukung bahwa model memiliki prediksi yang stabil dan tidak terlalu condong ke salah satu metrik saja.

5. Negative Predictive Value = 0.8974

NPV sebesar 89.74 persen menunjukkan bahwa model cukup akurat dalam memprediksi pasien yang tidak memiliki penyakit jantung. Kesalahan klasifikasi pada kelas negatif relatif rendah.

6. Balanced Accuracy = 0.8709

Balanced accuracy sebesar 87.09 persen menunjukkan performa model yang seimbang pada kedua kelas. Nilai ini cukup tinggi dan mengindikasikan bahwa model tetap mampu bekerja dengan baik meski data memiliki distribusi kelas yang tidak sepenuhnya seimbang.

Kesimpulan untuk Model XGBoost

Model XGBoost menunjukkan performa yang kuat dengan:

  1. Sensitivity tinggi dalam mendeteksi pasien dengan penyakit jantung.
  2. Precision dan F1-score yang stabil, menandakan kualitas prediksi yang baik.
  3. Balanced accuracy yang tinggi, menunjukkan kemampuan menangani prediksi untuk kedua kelas secara proporsional.

Secara keseluruhan, XGBoost menjadi model dengan performa kompetitif dan memberikan hasil yang konsisten. Meskipun berada sedikit di bawah GBM dalam beberapa metrik kunci, XGBoost tetap layak dipertimbangkan sebagai model yang kuat dan andal untuk klasifikasi penyakit jantung.

7. Visualisasi Hasil

Visualisasi digunakan untuk memahami seberapa baik model memprediksi kelas HeartDisease serta melihat pola residual untuk mengidentifikasi kesalahan model. Dua bentuk visualisasi yang digunakan yaitu:

  1. Plot Perbandingan Prediksi vs Aktual
  2. Residual Plot (Error vs Fitted)

Di bagian ini digunakan hasil dari model terbaik atau model yang ingin dianalisis lebih dalam.

Berikut menggunakan prediksi XGBoost (variabel: xgb_pred dan xgb_pred_prob), namun dapat diganti dengan rf_pred, gbm_pred, dst.

7.1 Visualisasi Prediksi vs Aktual

Plot ini menunjukkan sebaran prediksi model dibandingkan data aktual untuk melihat pola kesalahan.

library(ggplot2)

pred_actual_df <- data.frame(
  Actual = factor(test_label, levels = c(0,1)),
  Predicted = factor(xgb_pred, levels = c(0,1))
)

ggplot(pred_actual_df, aes(x = Actual, fill = Predicted)) +
  geom_bar(position = "fill") +
  labs(
    title = "Perbandingan Prediksi vs Aktual",
    x = "Aktual (HeartDisease)",
    y = "Proporsi",
    fill = "Prediksi"
  ) +
  scale_y_continuous(labels = scales::percent) +
  theme_minimal()

Interpretasi Grafik Perbandingan Prediksi vs Aktual

Grafik ini menunjukkan bagaimana model memprediksi dua kelas yaitu tidak mengalami penyakit jantung dan mengalami penyakit jantung, dibandingkan dengan data aktualnya.

Untuk kelas aktual 0 (tidak memiliki penyakit jantung)

  • Hampir seluruh bagian grafik untuk kelas ini didominasi oleh warna merah yang menunjukkan prediksi 0. Hanya sebagian kecil saja yang berwarna biru yang menunjukkan prediksi 1.

Interpretasinya:

  • Model mampu mengenali individu yang tidak memiliki penyakit jantung dengan sangat baik. Kesalahan prediksi pada kelas ini relatif kecil. Ini berarti false positive rendah.

Untuk kelas aktual 1 (memiliki penyakit jantung)

  • Sebagian besar grafik untuk kelas ini berwarna biru yang menunjukkan prediksi 1, namun masih ada bagian berwarna merah yang menunjukkan prediksi 0.

Interpretasinya:

  • Model cukup baik dalam mendeteksi individu yang benar-benar memiliki penyakit jantung. Namun masih terdapat sejumlah kasus di mana model salah memprediksi pasien positif sebagai negatif. Inilah yang disebut false negative, dan dalam konteks kesehatan, kesalahan tipe ini cukup penting untuk diperhatikan karena pasien yang seharusnya terdeteksi malah tidak teridentifikasi.

**Kesimpulan Umum*8

  • Model bekerja sangat baik untuk mendeteksi kelas 0 dan cukup baik untuk kelas 1. Namun masih perlu perbaikan agar false negative dapat ditekan sehingga deteksi penyakit jantung menjadi lebih akurat.

7.2 Residual Plot (Error vs Fitted)

Untuk klasifikasi biner, residual dihitung sebagai: \[ \text{Residual} = Actual - PredictedProbability \]

Residual yang dekat nol menunjukkan prediksi probabilitas yang akurat.

# Hitung residual
residual_df <- data.frame(
  Fitted = xgb_pred_prob,
  Actual = test_label,
  Residual = test_label - xgb_pred_prob
)

ggplot(residual_df, aes(x = Fitted, y = Residual)) +
  geom_point(alpha = 0.5) +
  geom_hline(yintercept = 0, color = "red", linetype = "dashed") +
  labs(
    title = "Residual Plot (Actual - Predicted Probability)",
    x = "Predicted Probability (Fitted)",
    y = "Residual"
  ) +
  theme_minimal()

Interpretasi Residual Plot

(Actual − Predicted Probability)

Residual plot ini menunjukkan selisih antara nilai aktual dan probabilitas prediksi dari model, diplot terhadap probabilitas prediksi tersebut. Grafik ini membantu menilai apakah model membuat kesalahan secara acak atau ada pola tertentu yang menandakan kelemahan model.

Pola Residual

  1. Penyebaran residual tampak membentuk pola diagonal, bukan acak.

    • Titik pada probabilitas rendah cenderung memiliki residual positif.
    • Titik pada probabilitas tinggi cenderung memiliki residual negatif.

    Ini menunjukkan bahwa model cenderung terlalu percaya diri pada kedua sisi:

    • Pada kasus yang seharusnya positif, model memprediksi probabilitas yang terlalu rendah.
    • Pada kasus yang seharusnya negatif, model memprediksi probabilitas yang terlalu tinggi.
  2. Tidak ada penyebaran residual yang simetris di sekitar garis nol. Idealnya, residual perlu menyebar acak di sekitar garis nol. Di grafik ini, justru terlihat pola yang jelas sehingga menandakan bias model.

  3. Tidak terlihat outlier ekstrem yang berbahaya, meskipun ada beberapa titik jauh dari garis nol. Ini berarti model masih stabil, hanya saja cenderung kurang presisi dalam memetakan probabilitas.

Makna untuk Model

  • Model cukup baik dalam memisahkan kelas, tetapi kurang akurat dalam menentukan seberapa yakin probabilitasnya.
  • Terjadi kecenderungan underestimasi pada sebagian kasus positif dan overestimasi pada sebagian kasus negatif.
  • Hal ini umum pada model ensemble (seperti Random Forest atau GBM) karena mereka bukan model yang secara alami terkalibrasi.

Kesimpulan

Residual plot ini menunjukkan bahwa:

  • Model mampu membuat prediksi yang benar, tetapi probabilitasnya tidak sepenuhnya akurat.

  • Terdapat pola yang menunjukkan bahwa model perlu kalibrasi probabilitas, misalnya dengan metode:

    • Platt scaling
    • Isotonic regression

7.3 Variabel Paling Berpengaruh

Feature importance digunakan untuk mengetahui variabel mana yang paling berpengaruh dalam proses prediksi penyakit jantung. Analisis ini membantu memahami bagaimana model mengambil keputusan, serta memastikan bahwa fitur yang digunakan memang relevan secara klinis.

Pada penelitian ini,feature importance ditampilkan menggunakan model Gradient Boosting Machine (GBM), karena GBM memiliki performa terbaik dibanding Random Forest dan XGBoost disinggung pada sub bab sebelumnya.

# Feature Importance GBM
library(gbm)
library(ggplot2)

# Mengambil nilai importance dari model GBM
gbm_imp <- summary(gbm_model, plotit = FALSE)

# Visualisasi
ggplot(gbm_imp, aes(x = reorder(var, rel.inf), y = rel.inf)) +
  geom_bar(stat = "identity") +
  coord_flip() +
  labs(
    title = "Feature Importance – GBM Model",
    x = "Fitur",
    y = "Relative Influence"
  ) +
  theme_minimal()

Interpretasi Feature Importance (GBM Model)

Grafik tersebut menunjukkan seberapa besar pengaruh setiap fitur dalam membantu model Gradient Boosting Machine (GBM) memprediksi apakah seseorang memiliki penyakit jantung.

1. Fitur yang Paling Berpengaruh

Fitur dengan relative influence paling tinggi artinya fitur tersebut paling sering digunakan model untuk membuat keputusan.

Fitur teratas:

  1. ST_Slope.UpPengaruh paling besar. Artinya perubahan kemiringan segmen ST saat tes olahraga adalah indikator sangat kuat untuk mendeteksi penyakit jantung.

  2. ChestPainType.ASY (Nyeri dada tipe asimptomatik) Orang tanpa gejala nyeri dada khas justru memiliki risiko tinggi dan model menangkap pola ini dengan kuat.

  3. Cholesterol Tingkat kolesterol sangat berperan sebagai prediktor penyakit jantung.

  4. Oldpeak (depresi ST setelah olahraga) Perubahan ST setelah aktivitas fisik menjadi salah satu penentu utama kondisi jantung.

  5. MaxHR (Detak jantung maksimum) dan Age Faktor usia dan respon denyut jantung saat olahraga juga berpengaruh besar.

*2. Fitur dengan Pengaruh Menengah**

Fitur seperti RestingBP, ST_Slope.Flat, Sex.M (pria), dan ExerciseAngina.N memiliki kontribusi moderat—tetap penting, tetapi tidak sebesar lima fitur teratas.

*3. Fitur dengan Pengaruh Rendah**

Beberapa fitur seperti:

  • RestingECG.Normal
  • ChestPainType.ATA
  • ChestPainType.NAP
  • ST_Slope.Down
  • RestingECG.ST

Pengaruhnya kecil, artinya model jarang membutuhkan fitur ini untuk membuat keputusan. Bukan berarti tidak penting, tetapi kontribusinya relatif kecil dibanding fitur lain.

Kesimpulan Utama pengaruh setiap fitur * Model GBM paling banyak mengandalkan informasi yang berkaitan dengan segmen ST, jenis nyeri dada, dan profil kolesterol dalam memprediksi risiko penyakit jantung. * Faktor olahraga (Oldpeak, MaxHR) dan usia tetap menjadi prediktor kuat. * Fitur lain seperti beberapa kategori EKG atau jenis nyeri dada yang lebih jarang muncul memberikan pengaruh kecil.

8. Kesimpulan

Bagian ini merangkum hasil pembangunan model prediksi penyakit jantung menggunakan tiga metode ensemble: Random Forest, Gradient Boosting (GBM), dan XGBoost. Evaluasi dilakukan menggunakan metrik akurasi, sensitivitas, spesifisitas, precision, dan F1-score.

8.1 Model Ensemble Terbaik

Berdasarkan keseluruhan hasil evaluasi, model terbaik adalah Gradient Boosting (GBM). Model ini memiliki performa tertinggi pada metrik utama, terutama dalam mendeteksi pasien berisiko (kelas positif).

Kinerja terbaik GBM:

  • Accuracy: 0.8798
  • Sensitivity: 0.9388
  • Specificity: 0.8118
  • Precision: 0.8519
  • F1-score: 0.8932

Perbandingan Ketiga Model

Model Accuracy Sensitivity Specificity Precision F1-score
Random Forest 0.8743 0.8235 0.9184 0.8974 0.8589
GBM 0.8798 0.9388 0.8118 0.8519 0.8932
XGBoost 0.8743 0.9184 0.8235 0.8571 0.8867

Ringkasan Temuan

  • Akurasi tertinggi: GBM
  • Sensitivitas tertinggi (deteksi positif terbaik): GBM
  • F1-score tertinggi (keseimbangan terbaik precision–recall): GBM
  • Spesifisitas tertinggi: Random Forest
  • Precision tertinggi: Random Forest

Kesimpulan Utama

GBM adalah model paling unggul secara keseluruhan karena:

  • mampu mendeteksi pasien penyakit jantung dengan sangat baik
  • memberikan F1-score tertinggi
  • memiliki akurasi paling tinggi
  • performanya paling seimbang di seluruh metrik

Random Forest tetap kuat dalam specificity dan precision, tetapi performanya dalam mendeteksi pasien sakit lebih rendah daripada GBM.

8.2 Kenapa GBM Menang?

Beberapa alasan teknis mengapa GBM tampil paling baik pada dataset ini:

1. Sensitivitas paling tinggi

GBM mengidentifikasi 93.88 persen pasien yang memiliki penyakit jantung. Ini berarti jumlah false negative paling kecil dibanding dua model lain. Dalam konteks medis, ini sangat penting karena kasus positif tidak boleh terlewat.

2. Mekanisme boosting yang stabil

GBM memperbaiki kesalahan secara bertahap sehingga:

  • lebih stabil pada dataset kecil–menengah
  • tidak mudah overfitting
  • mampu mempelajari pola data secara lebih mendalam

3. Lebih efektif pada pola non-linear

Dataset penyakit jantung memiliki interaksi fitur yang kompleks, terutama pada:

  • MaxHR
  • Oldpeak
  • ST_Slope

GBM lebih efektif menangkap pola non-linear ini dibanding Random Forest.

4. Performa paling seimbang

Walaupun Random Forest unggul pada spesifisitas dan precision, performanya tidak selengkap GBM. GBM adalah satu–satunya model yang kuat di semua metrik utama secara bersamaan.

8.3 Variabel Paling Berpengaruh

Berdasarkan feature importance pada model GBM, terdapat lima fitur utama yang paling menentukan prediksi penyakit jantung:

  1. ST_Slope.Up Fitur paling berpengaruh. Perubahan kemiringan segmen ST saat tes olahraga menjadi indikator kuat adanya gangguan aliran darah ke jantung.

  2. ChestPainType.ASY Nyeri dada tanpa gejala khas menjadi sinyal kuat risiko penyakit jantung, sehingga sering digunakan model sebagai pembeda utama.

  3. Cholesterol Tingkat kolesterol tinggi berperan besar dalam memprediksi penyumbatan pembuluh jantung.

  4. Oldpeak Depresi segmen ST setelah aktivitas fisik menunjukkan stres jantung, sehingga menjadi indikator klinis yang penting bagi model.

  5. MaxHR Detak jantung maksimum menggambarkan kemampuan jantung saat bekerja; nilai yang lebih rendah sering terkait risiko lebih tinggi.

Model GBM paling mengandalkan fitur-fitur yang menggambarkan fungsi jantung saat aktivitas fisik dan kondisi pembuluh darah, sehingga mampu membedakan pasien dengan dan tanpa penyakit jantung secara akurat.