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:
Tiga model yang digunakan dalam penelitian ini mewakili dua pendekatan tersebut:
Di bawah ini penjelasan tiap model.
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. Hasilkan sampel bootstrap B dari data pelatihan.
2. Latih Pohon Keputusan pada setiap sampel:
3. Gabungkan prediksi:
• Klasifikasi
\[ \hat{y} = \text{mode}{T_1(x), T_2(x), \ldots, T_B(x)} \]
Penjelasan variabel:
• 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
Kelemahan
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)
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} \]
(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
Kelebihan
Kelemahan
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.
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:
\[ \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.
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)
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.
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.
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 \]
Untuk regresi:
\[ \hat{y}(x) = \sum_{t=1}^{T} \eta f_t(x) \]
Karakteristik Utama
Kelebihan
Kelemahan
| 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 |
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.
Penelitian ini ingin memprediksi status penyakit jantung (HeartDisease), yaitu kondisi apakah seseorang memiliki indikasi penyakit jantung atau tidak.
Prediksi HeartDisease penting karena:
Variabel target dalam penelitian ini adalah:
HeartDisease (0 atau 1)
Variabel ini berupa data kategorik biner, sehingga jenis prediksi adalah klasifikasi, bukan regresi.
HeartDisease akan diprediksi menggunakan 11 variabel fitur:
Fitur terdiri dari gabungan variabel numerik dan kategorik.
Pemilihan metode ensemble learning didasarkan pada beberapa keunggulan yang relevan untuk kasus klasifikasi kesehatan:
Akurasi lebih tinggi dibanding model tunggal, karena prediksi dibuat dari kombinasi banyak pohon.
Mampu menangani hubungan non-linear antar variabel fisiologis seperti tekanan darah, kolesterol, atau detak jantung.
Lebih robust terhadap outlier dan noise, terutama pada algoritma Random Forest dan XGBoost.
Mengurangi bias dan variance melalui pendekatan yang berbeda:
Dengan karakteristik tersebut, ensemble learning dinilai sesuai untuk permasalahan prediksi risiko penyakit jantung.
Penelitian ini bertujuan untuk membangun dan membandingkan tiga algoritma ensemble learning, yaitu:
Tujuan dari perbandingan adalah:
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.
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.
Berdasarkan hasil pemeriksaan:
Dataset ini memiliki variabel target biner, sehingga sesuai untuk tugas klasifikasi menggunakan metode ensemble.
Dataset memiliki dua jenis tipe data utama:
Numerik
Kategorikal (String/Object)
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.
| 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. |
Berdasarkan eksplorasi awal dataset:
Distribusi kelas tergolong cukup seimbang, sehingga metrik seperti Accuracy, Precision, Recall, dan F1-score masih relevan digunakan tanpa perlu teknik penyeimbangan data seperti SMOTE.
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.
Statistik deskriptif digunakan untuk memahami karakteristik awal dari variabel numerik dalam dataset, antara lain:
Analisis ini mencakup nilai minimum, maksimum, mean, median, serta kuartil. Statistik deskriptif membantu:
## '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:
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:
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)
(b) Oldpeak vs HeartDisease — korelasi positif (~0.40)
(c) FastingBS vs HeartDisease — korelasi positif lemah (~0.27)
(d) Age vs HeartDisease — korelasi positif lemah (~0.28)
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)
(b) Age vs Oldpeak — positif lemah (~0.26)
(c) RestingBP vs Cholesterol — hampir tidak ada hubungan (≈0.07)
(d) RestingBP vs HeartDisease — sangat lemah (~0.11)
(e) Cholesterol vs HeartDisease — sangat lemah (~0.23)
3. Tidak Ada Multikolinearitas Serius
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 |
Interpretasi Distribusi Variabel Numerik
Distribusi seluruh variabel numerik divisualisasikan menggunakan histogram. Dari grafik tersebut, dapat dilihat pola sebaran data sebagai berikut:
1. Age
2. RestingBP
3. Cholesterol
4. FastingBS
5. MaxHR
6. Oldpeak
7. HeartDisease
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:
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:
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:
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:
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:
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.
Interpretasi Outlier
Hasil eksplorasi distribusi menunjukkan beberapa variabel memiliki outlier yang perlu diperhatikan sebelum pemodelan:
1. RestingBP
2. Cholesterol
3. Oldpeak
4. MaxHR
5. Age
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.
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:
Kenapa penting untuk ensemble:
Outlier perlu ditangani agar model stabil dan tidak bias.
2. Distribusi Variabel Banyak yang Tidak Normal (Skewed)
Temuan EDA:
Kenapa penting untuk ensemble:
Distribusi skew memberi sinyal bahwa perlu cek nilai ekstrem dan mungkin perlu transformasi.
3. Variabel Kategorikal Tidak Seimbang
Temuan EDA:
Kenapa penting untuk ensemble:
Perlu encoding yang benar dan kontrol agar model tidak bias pada kategori besar.
4. Korelasi Antar Variabel Lemah–Sedang
Temuan utama terkait target (HeartDisease):
Kenapa penting untuk ensemble:
Dataset ideal untuk ensemble karena pola hubungan tidak linear.
5. Target (HeartDisease) Cukup Seimbang
Temuan EDA:
Kenapa penting untuk ensemble:
Model ensemble akan belajar dengan baik tanpa harus memperbaiki imbalance.
6. Pola Klinis Penting Terlihat Jelas
Temuan EDA:
Kenapa penting untuk ensemble:
Model ensemble mampu menangkap interaksi variabel yang kompleks, misalnya:
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:
8. Kenapa EDA Penting untuk Ensemble Learning?
EDA dibutuhkan agar model Random Forest, Gradient Boosting, dan XGBoost:
Singkatnya: EDA memastikan kualitas data optimal agar model ensemble dapat bekerja maksimal dan menghasilkan prediksi penyakit jantung yang akurat.
Tahap ini dilakukan untuk memastikan data dalam kondisi siap digunakan untuk pemodelan.
## 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.
Outlier diamati melalui boxplot:
Hasil inspeksi menunjukkan:
Keputusan Penanganan Outlier
Outlier tidak dihapus, dengan pertimbangan:
Namun, nilai RestingBP = 0 dan Cholesterol = 0 tetap ditandai sebagai anomali medis, tetapi tetap digunakan untuk menjaga kesesuaian dengan dataset sumber.
Dataset memiliki lima variabel kategorikal:
Variabel-variabel ini diubah menjadi factor, lalu dikonversi menggunakan 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.
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
Distribusi variabel target diperiksa:
##
## 0 1
## 410 508
##
## 0 1
## 0.4466231 0.5533769
Hasil real dataset:
Perbedaan proporsi relatif kecil, sehingga dataset dianggap cukup seimbang, dan:
Model seperti XGBoost dan GBM tetap dapat menerapkan class weight jika diperlukan.
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:
Pemilihan ketiga model ini didasarkan pada karakteristiknya yang mampu:
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}} \]
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:
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:
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:
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.
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:
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
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:
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.
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
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:
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.
Visualisasi digunakan untuk memahami seberapa baik model memprediksi kelas HeartDisease serta melihat pola residual untuk mengidentifikasi kesalahan model. Dua bentuk visualisasi yang digunakan yaitu:
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.
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)
Interpretasinya:
Untuk kelas aktual 1 (memiliki penyakit jantung)
Interpretasinya:
**Kesimpulan Umum*8
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
Penyebaran residual tampak membentuk pola diagonal, bukan acak.
Ini menunjukkan bahwa model cenderung terlalu percaya diri pada kedua sisi:
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.
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
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:
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:
ST_Slope.Up → Pengaruh paling besar. Artinya perubahan kemiringan segmen ST saat tes olahraga adalah indikator sangat kuat untuk mendeteksi penyakit jantung.
ChestPainType.ASY (Nyeri dada tipe asimptomatik) Orang tanpa gejala nyeri dada khas justru memiliki risiko tinggi dan model menangkap pola ini dengan kuat.
Cholesterol Tingkat kolesterol sangat berperan sebagai prediktor penyakit jantung.
Oldpeak (depresi ST setelah olahraga) Perubahan ST setelah aktivitas fisik menjadi salah satu penentu utama kondisi jantung.
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:
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.
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.
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:
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
Kesimpulan Utama
GBM adalah model paling unggul secara keseluruhan karena:
Random Forest tetap kuat dalam specificity dan precision, tetapi performanya dalam mendeteksi pasien sakit lebih rendah daripada GBM.
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:
3. Lebih efektif pada pola non-linear
Dataset penyakit jantung memiliki interaksi fitur yang kompleks, terutama pada:
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.
Berdasarkan feature importance pada model GBM, terdapat lima fitur utama yang paling menentukan prediksi penyakit jantung:
ST_Slope.Up Fitur paling berpengaruh. Perubahan kemiringan segmen ST saat tes olahraga menjadi indikator kuat adanya gangguan aliran darah ke jantung.
ChestPainType.ASY Nyeri dada tanpa gejala khas menjadi sinyal kuat risiko penyakit jantung, sehingga sering digunakan model sebagai pembeda utama.
Cholesterol Tingkat kolesterol tinggi berperan besar dalam memprediksi penyumbatan pembuluh jantung.
Oldpeak Depresi segmen ST setelah aktivitas fisik menunjukkan stres jantung, sehingga menjadi indikator klinis yang penting bagi model.
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.