Pengantar
Dokumen ini dibuat untuk menjelaskan tiga algoritma machine learning yang dipakai dalam skripsi ini — K-Nearest Neighbors (KNN), Naive Bayes, dan Support Vector Machine (SVM) — dengan bahasa yang sesederhana mungkin, disertai contoh perhitungan manual yang lengkap, langkah demi langkah, sampai ke angka terakhir.
Tujuannya sederhana: supaya saat sidang atau saat menulis BAB II/BAB IV, penulis benar-benar
paham apa yang terjadi "di dalam" algoritma, bukan sekadar tahu cara
memanggil model.fit()
di Python.
Karena itu, dokumen ini memakai dataset dummy (rekaan) berisi 12 data yang sengaja dibuat kecil dan seimbang (4 data per kelas) agar setiap langkah perhitungan bisa ditelusuri dengan tangan/kalkulator. Struktur fitur, satuan, dan logika kelasnya identik dengan skripsi asli — hanya jumlah barisnya yang dikecilkan untuk keperluan pembelajaran.
Gambaran Singkat Tiga Algoritma
| Algoritma | Cara Berpikir (Analogi) |
|---|---|
| KNN | "Lihat tetangga terdekatmu — mayoritas tetanggamu kelas apa, kemungkinan kamu juga kelas itu." |
| Naive Bayes | "Hitung peluang berdasarkan kebiasaan/pola tiap kelas, lalu pilih kelas dengan peluang tertinggi." |
| SVM | "Gambar garis pemisah (batas) yang jaraknya paling jauh dari kedua kelompok data, lalu lihat data baru jatuh di sisi mana." |
Target/kelas pada kasus ini ada tiga: Sehat, Berpotensi Stunting, dan Stunting.
Dataset Dummy yang Akan Kita Pakai
Fitur yang dipakai (sesuai dengan variabel yang diperiksa bidan pada kunjungan ibu hamil):
| Kode | Nama Fitur | Satuan | Penjelasan |
|---|---|---|---|
| Usia | Usia Ibu | tahun | Usia ibu saat hamil |
| Paritas | Paritas | kali | Jumlah persalinan sebelumnya |
| Jarak | Jarak Kehamilan | bulan | Jarak dari kehamilan sebelumnya (0 = anak pertama) |
| Tinggi | Tinggi Badan | cm | Tinggi badan ibu |
| Berat | Berat Badan | kg | Berat badan ibu saat diperiksa |
| LiLA | Lingkar Lengan Atas | cm | Indikator status gizi ibu |
| Hb | Kadar Hemoglobin | g/dL | Indikator anemia |
| ID | Usia | Paritas | Jarak | Tinggi | Berat | LiLA | Hb | Kelas |
|---|---|---|---|---|---|---|---|---|
| S1 | 27 | 1 | 24 | 158 | 58 | 25.0 | 12.5 | Sehat |
| S2 | 24 | 0 | 0 | 160 | 55 | 24.5 | 12.8 | Sehat |
| S3 | 30 | 2 | 30 | 155 | 60 | 26.0 | 13.0 | Sehat |
| S4 | 26 | 1 | 20 | 157 | 57 | 25.5 | 12.2 | Sehat |
| B1 | 19 | 0 | 0 | 150 | 48 | 22.5 | 11.2 | Berpotensi Stunting |
| B2 | 36 | 3 | 14 | 152 | 50 | 23.0 | 10.8 | Berpotensi Stunting |
| B3 | 21 | 1 | 12 | 151 | 47 | 22.0 | 11.0 | Berpotensi Stunting |
| B4 | 34 | 2 | 15 | 153 | 49 | 23.2 | 10.9 | Berpotensi Stunting |
| T1 | 17 | 0 | 0 | 145 | 40 | 20.5 | 9.5 | Stunting |
| T2 | 39 | 4 | 8 | 147 | 42 | 21.0 | 9.8 | Stunting |
| T3 | 18 | 1 | 6 | 146 | 41 | 20.0 | 9.2 | Stunting |
| T4 | 40 | 5 | 7 | 148 | 43 | 21.2 | 10.0 | Stunting |
Pola yang sengaja dibangun (mencerminkan pola medis yang wajar): semakin tua/muda usia ekstrem, paritas tinggi, jarak kehamilan pendek, tinggi/berat/LiLA/Hb rendah → semakin berisiko stunting.
| Usia | Paritas | Jarak | Tinggi | Berat | LiLA | Hb |
|---|---|---|---|---|---|---|
| 22 | 1 | 10 | 150 | 46 | 22.3 | 10.7 |
Anggap saja ini adalah ibu hamil baru yang datang periksa ke Puskesmas. Sepanjang dokumen ini, kita akan memprediksi ibu ini masuk kelas Sehat, Berpotensi Stunting, atau Stunting — menggunakan tiga algoritma yang berbeda, dan di akhir kita bandingkan hasilnya.
Simulator Diagnosis Risiko Stunting
Media Pembelajaran & Kalkulasi Real-Time Tiga Algoritma Machine Learning
Input Parameter Ibu Hamil
Konsensus Model
Input pasien baru distandardisasi dan jarak Euclidean dihitung ke 12 data latih:
| Rank | ID | Kelas Asli | Jarak Euclidean | Status Tetangga |
|---|
Bagian 1: K-Nearest Neighbors (KNN)
1.1 Analogi Sederhana
Bayangkan kamu pindah ke lingkungan baru dan ingin tahu apakah tetangga-tetanggamu ramah atau tidak. Cara paling gampang: tanya ke beberapa tetangga terdekat rumahmu, lalu ikuti pendapat mayoritas mereka.
KNN bekerja persis seperti itu. Untuk mengklasifikasikan data baru, KNN:
- Mengukur jarak data baru itu ke semua data latih.
- Mengambil K data terdekat (K adalah angka yang kita tentukan, misalnya 3 atau 5).
- Melihat kelas mana yang paling banyak muncul di antara K tetangga itu → itulah prediksinya.
Karena KNN "belajar" dengan cara mengingat semua data lalu membandingkan jarak setiap kali ada data baru (tidak membangun rumus/model eksplisit di awal), KNN sering disebut algoritma instance-based atau lazy learner.
1.2 Konsep dan Rumus Jarak Euclidean
Untuk mengukur "jarak" antar dua titik data yang punya banyak fitur, KNN memakai jarak Euclidean (jarak garis lurus, seperti mengukur jarak dengan penggaris):
Sederhananya: selisih tiap fitur dikuadratkan, dijumlahkan semua, lalu diakar-kuadratkan.
1.3 Kenapa Data Harus Distandardisasi Dulu?
Perhatikan Tabel 1: Tinggi Badan berkisar 145–160 (angka besar), sedangkan Paritas cuma berkisar 0–5 (angka kecil). Kalau langsung dihitung jarak Euclidean-nya, selisih Tinggi Badan akan mendominasi total jarak hanya karena skalanya besar — padahal belum tentu Tinggi Badan itu fitur yang paling penting secara medis. Paritas jadi seperti "tidak dianggap" walau sebenarnya penting.
Solusinya: standardisasi (menyamakan skala semua fitur), memakai rumus Z-score:
Setelah distandardisasi, semua fitur punya rata-rata 0 dan skala yang sebanding, sehingga adil dibandingkan.
StandardScaler dari
scikit-learn (dipakai di pipeline skripsi) menghitungnya secara default. Semua
angka pada bagian ini mengikuti konvensi tersebut.
1.4 Langkah 1 — Hitung Mean dan Standar Deviasi Tiap Fitur
Dihitung dari 12 data latih pada Tabel 1 (seluruh kelas digabung dulu, karena standardisasi dilakukan sebelum tahu kelasnya):
| Fitur | Mean ($\mu$) | Std Populasi ($\sigma$) |
|---|---|---|
| Usia | 27.5833 | 7.8471 |
| Paritas | 1.6667 | 1.5456 |
| Jarak | 11.3333 | 9.3482 |
| Tinggi | 151.8333 | 4.7052 |
| Berat | 49.1667 | 6.6937 |
| LiLA | 22.8667 | 1.9379 |
| Hb | 11.0750 | 1.2544 |
Contoh cara hitung mean Usia: $(27+24+30+26+19+36+21+34+17+39+18+40)/12 = 331/12 = 27.5833$
Contoh cara hitung std Usia (populasi):
1.5 Langkah 2 — Standardisasi (Z-score) Semua Data
Menerapkan $z=(x-\mu)/\sigma$ ke setiap sel. Contoh untuk S1, fitur Usia: $z = (27-27.5833)/7.8471 = -0.074$.
Tabel 3. Data Latih Setelah Standardisasi (dibulatkan 3 desimal)| ID | Usia | Paritas | Jarak | Tinggi | Berat | LiLA | Hb | Kelas |
|---|---|---|---|---|---|---|---|---|
| S1 | -0.074 | -0.431 | 1.355 | 1.311 | 1.320 | 1.101 | 1.136 | Sehat |
| S2 | -0.457 | -1.078 | -1.212 | 1.736 | 0.871 | 0.843 | 1.375 | Sehat |
| S3 | 0.308 | 0.216 | 1.997 | 0.673 | 1.618 | 1.617 | 1.535 | Sehat |
| S4 | -0.202 | -0.431 | 0.927 | 1.098 | 1.170 | 1.359 | 0.897 | Sehat |
| B1 | -1.094 | -1.078 | -1.212 | -0.390 | -0.174 | -0.189 | 0.100 | Berpotensi Stunting |
| B2 | 1.073 | 0.863 | 0.285 | 0.035 | 0.124 | 0.069 | -0.219 | Berpotensi Stunting |
| B3 | -0.839 | -0.431 | 0.071 | -0.177 | -0.324 | -0.447 | -0.060 | Berpotensi Stunting |
| B4 | 0.818 | 0.216 | 0.392 | 0.248 | -0.025 | 0.172 | -0.140 | Berpotensi Stunting |
| T1 | -1.349 | -1.078 | -1.212 | -1.452 | -1.369 | -1.221 | -1.256 | Stunting |
| T2 | 1.455 | 1.510 | -0.357 | -1.027 | -1.071 | -0.963 | -1.016 | Stunting |
| T3 | -1.221 | -0.431 | -0.571 | -1.240 | -1.220 | -1.479 | -1.495 | Stunting |
| T4 | 1.582 | 2.157 | -0.464 | -0.815 | -0.921 | -0.860 | -0.857 | Stunting |
(diambil memakai mean & std yang sama persis dari data latih — ini wajib, supaya data uji "diukur dengan penggaris yang sama"):
| Usia | Paritas | Jarak | Tinggi | Berat | LiLA | Hb |
|---|---|---|---|---|---|---|
| -0.712 | -0.431 | -0.143 | -0.390 | -0.473 | -0.292 | -0.299 |
1.6 Langkah 3 — Hitung Jarak Data Uji ke Semua Data Latih
Sekarang kita hitung jarak Euclidean dari data uji (yang sudah distandardisasi) ke setiap dari 12 data latih.
Rincian perhitungan selisih kuadrat per fitur untuk B3:
| Fitur | Data Latih (B3) | Data Uji | Selisih | Kuadrat Selisih |
|---|---|---|---|---|
| Usia | -0.839 | -0.712 | -0.127 | 0.0162 |
| Paritas | -0.431 | -0.431 | 0.000 | 0.0000 |
| Jarak | 0.071 | -0.143 | 0.214 | 0.0458 |
| Tinggi | -0.177 | -0.390 | 0.213 | 0.0452 |
| Berat | -0.324 | -0.473 | 0.149 | 0.0223 |
| LiLA | -0.447 | -0.292 | -0.155 | 0.0240 |
| Hb | -0.060 | -0.299 | 0.239 | 0.0572 |
Rincian perhitungan selisih kuadrat per fitur untuk B1:
| Fitur | Data Latih (B1) | Data Uji | Selisih | Kuadrat Selisih |
|---|---|---|---|---|
| Usia | -1.094 | -0.712 | -0.382 | 0.1459 |
| Paritas | -1.078 | -0.431 | -0.647 | 0.4186 |
| Jarak | -1.212 | -0.143 | -1.069 | 1.1428 |
| Tinggi | -0.390 | -0.390 | 0.000 | 0.0000 |
| Berat | -0.174 | -0.473 | 0.299 | 0.0894 |
| LiLA | -0.189 | -0.292 | 0.103 | 0.0106 |
| Hb | 0.100 | -0.299 | 0.399 | 0.1592 |
Rincian perhitungan selisih kuadrat per fitur untuk B4:
| Fitur | Data Latih (B4) | Data Uji | Selisih | Kuadrat Selisih |
|---|---|---|---|---|
| Usia | 0.818 | -0.712 | 1.530 | 2.3409 |
| Paritas | 0.216 | -0.431 | 0.647 | 0.4186 |
| Jarak | 0.392 | -0.143 | 0.535 | 0.2862 |
| Tinggi | 0.248 | -0.390 | 0.638 | 0.4070 |
| Berat | -0.025 | -0.473 | 0.448 | 0.2007 |
| LiLA | 0.172 | -0.292 | 0.464 | 0.2153 |
| Hb | -0.140 | -0.299 | 0.159 | 0.0253 |
Rincian perhitungan selisih kuadrat per fitur untuk S3:
| Fitur | Data Latih (S3) | Data Uji | Selisih | Kuadrat Selisih |
|---|---|---|---|---|
| Usia | 0.308 | -0.712 | 1.020 | 1.0404 |
| Paritas | 0.216 | -0.431 | 0.647 | 0.4186 |
| Jarak | 1.997 | -0.143 | 2.140 | 4.5796 |
| Tinggi | 0.673 | -0.390 | 1.063 | 1.1300 |
| Berat | 1.618 | -0.473 | 2.091 | 4.3723 |
| LiLA | 1.617 | -0.292 | 1.909 | 3.6443 |
| Hb | 1.535 | -0.299 | 1.834 | 3.3635 |
Jauh sekali dibanding B3 — masuk akal, karena S3 adalah profil ibu paling sehat di dataset sedangkan data uji punya banyak indikator berisiko.
| Peringkat | ID | Kelas | Jarak Euclidean | Keterangan Tetangga |
|---|---|---|---|---|
| 1 | B3 | Berpotensi Stunting | 0.4590 | K=3 & K=5 |
| 2 | B1 | Berpotensi Stunting | 1.4028 | K=3 & K=5 |
| 3 | B4 | Berpotensi Stunting | 1.9727 | K=3 & K=5 |
| 4 | T3 | Stunting | 2.1359 | K=5 |
| 5 | T1 | Stunting | 2.3832 | K=5 |
| 6 | B2 | Berpotensi Stunting | 2.3906 | - |
| 7 | T2 | Stunting | 3.1992 | - |
| 8 | S4 | Sehat | 3.2364 | - |
| 9 | S2 | Sehat | 3.4704 | - |
| 10 | S1 | Sehat | 3.5712 | - |
| 11 | T4 | Stunting | 3.6163 | - |
| 12 | S3 | Sehat | 4.3065 | - |
1.7 Langkah 4 — Voting
Mengambil 3 tetangga terdekat: B3, B1, B4 (semuanya Berpotensi Stunting).
| Kelas | Suara |
|---|---|
| Berpotensi Stunting | 3 (100%) |
| Stunting | 0 |
| Sehat | 0 |
Mengambil 5 tetangga terdekat: B3, B1, B4, T3, T1.
| Kelas | Suara |
|---|---|
| Berpotensi Stunting | 3 (B3, B1, B4) |
| Stunting | 2 (T3, T1) |
| Sehat | 0 |
1.8 Kesimpulan KNN
Baik dengan K=3 maupun K=5, KNN memprediksi data uji sebagai "Berpotensi Stunting". Ini masuk akal karena secara visual pun, angka-angka pada data uji (LiLA 22.3, Hb 10.7, dst.) memang paling mirip dengan kelompok B (Berpotensi Stunting), sedikit di bawah B3 dan B1.
Bagian 2: Naive Bayes (Gaussian Naive Bayes)
2.1 Analogi Sederhana
Bayangkan seorang dokter berpengalaman yang tidak membandingkan pasien baru dengan pasien-pasien lama satu per satu (seperti KNN). Sebaliknya, dokter itu sudah hafal pola umum tiap kelompok penyakit — misalnya "pasien anemia biasanya Hb-nya di kisaran segini, dengan sebaran segini" — lalu begitu ada pasien baru, dokter langsung menghitung peluang pasien itu masuk ke tiap kelompok berdasarkan pola tersebut, dan memilih kelompok dengan peluang terbesar.
Itulah cara kerja Naive Bayes: menghitung peluang (probabilitas) suatu data masuk ke tiap kelas, berdasarkan Teorema Bayes.
2.2 Teorema Bayes dan Asumsi "Naive"
Rumus dasar Teorema Bayes:
Dalam bahasa sederhana:
Karena pembilang (data) sama nilainya untuk semua kelas yang dibandingkan, dalam praktiknya kita cukup membandingkan pembilangnya saja: $P(\text{Data}\mid\text{Kelas}) \times P(\text{Kelas})$ — kelas dengan nilai ini terbesar itulah pemenangnya.
Disebut "naive" (naif) karena algoritma ini mengasumsikan setiap fitur saling bebas/independen satu sama lain (misalnya, dianggap Tinggi Badan tidak ada hubungannya dengan Berat Badan) — padahal di dunia nyata fitur-fitur kesehatan biasanya saling berkaitan. Asumsi ini "tidak realistis" tapi ternyata dalam praktik hasilnya sering tetap bagus, makanya tetap dipakai luas karena sederhana dan cepat.
Karena fitur-fitur pada kasus ini berupa angka kontinu (bukan kategori), dipakai varian Gaussian Naive Bayes — mengasumsikan setiap fitur pada tiap kelas mengikuti distribusi normal (kurva lonceng/Gaussian).
2.3 Rumus Distribusi Normal (Gaussian)
di mana $\mu$ = mean fitur tersebut khusus di kelas itu saja, dan $\sigma$ = standar deviasi fitur tersebut khusus di kelas itu saja (berbeda dengan KNN yang mean/std-nya dihitung dari semua data digabung).
2.4 Langkah 1 — Hitung Prior Tiap Kelas
Prior = peluang awal suatu kelas, sebelum melihat data sama sekali — dihitung dari proporsi jumlah data tiap kelas di data latih.
| Kelas | Jumlah Data | Prior |
|---|---|---|
| Sehat | 4 | 4/12 = 0.3333 |
| Berpotensi Stunting | 4 | 4/12 = 0.3333 |
| Stunting | 4 | 4/12 = 0.3333 |
Karena dataset dummy ini sengaja dibuat seimbang (4:4:4), ketiga prior-nya sama besar.
2.5 Langkah 2 — Hitung Mean dan Std Tiap Fitur, per Kelas
Kali ini mean and std dihitung terpisah untuk tiap kelas (bukan digabung seperti di KNN):
Tabel 5. Mean dan Standar Deviasi per Fitur, per Kelas ($\mu, \sigma$)| Fitur | Sehat ($\mu$, $\sigma$) | Berpotensi Stunting ($\mu$, $\sigma$) | Stunting ($\mu$, $\sigma$) |
|---|---|---|---|
| Usia | 26.7500, 2.1651 | 27.5000, 7.5664 | 28.5000, 11.0114 |
| Paritas | 1.0000, 0.7071 | 1.5000, 1.1180 | 2.5000, 2.0616 |
| Jarak | 18.5000, 11.2583 | 10.2500, 6.0156 | 5.2500, 3.1125 |
| Tinggi | 157.5000, 1.8028 | 151.5000, 1.1180 | 146.5000, 1.1180 |
| Berat | 57.5000, 1.8028 | 48.5000, 1.1180 | 41.5000, 1.1180 |
| LiLA | 25.2500, 0.5590 | 22.6750, 0.4657 | 20.6750, 0.4657 |
| Hb | 12.6250, 0.3031 | 10.9750, 0.1479 | 9.6250, 0.3031 |
Contoh cara hitung (Hb, kelas Sehat): data Hb kelas Sehat = 12.5, 12.8, 13.0, 12.2 → mean $=(12.5+12.8+13.0+12.2)/4=12.625$; std populasi $=\sqrt{\frac{(12.5-12.625)^2+(12.8-12.625)^2+(13.0-12.625)^2+(12.2-12.625)^2}{4}}=0.3031$.
Perhatikan pola pada Tabel 5: semakin ke kelas Stunting, mean Tinggi, Berat, LiLA, Hb semakin kecil, sedangkan mean Paritas semakin besar dan mean Jarak Kehamilan semakin kecil — konsisten dengan pola medis yang sengaja kita bangun di dataset.
2.6 Langkah 3 — Hitung Likelihood (Gaussian PDF) Tiap Fitur Data Uji
Sekarang kita masukkan nilai data uji ke rumus Gaussian, untuk setiap fitur, di setiap kelas (total 7 fitur × 3 kelas = 21 perhitungan).
Data uji Hb $=10.7$; kelas Berpotensi Stunting punya $\mu=10.975$, $\sigma=0.1479$.
Nilai likelihood-nya cukup besar (0.4789) — artinya nilai Hb=10.7 sangat "wajar"/khas untuk kelas Berpotensi Stunting.
$\mu=12.625$, $\sigma=0.3031$.
Hasilnya nyaris nol — artinya Hb=10.7 sangat tidak wajar untuk kelas Sehat (terlalu rendah dibanding profil ibu sehat).
Berikut hasil lengkap untuk seluruh 21 kombinasi fitur × kelas yang disusun ke dalam tabel collapsible:
| Fitur | x (Data Uji) | $\mu$ | $\sigma$ | Eksponen | Gaussian PDF |
|---|---|---|---|---|---|
| Usia | 22 | 26.7500 | 2.1651 | -2.4067 | 0.0166049 |
| Paritas | 1 | 1.0000 | 0.7071 | -0.0000 | 0.5641896 |
| Jarak | 10 | 18.5000 | 11.2583 | -0.2850 | 0.0266476 |
| Tinggi | 150 | 157.5000 | 1.8028 | -8.6539 | 0.0000386 |
| Berat | 46 | 57.5000 | 1.8028 | -20.3462 | 0.0000000003 |
| LiLA | 22.3 | 25.2500 | 0.5590 | -13.9240 | 0.0000006 |
| Hb | 10.7 | 12.6250 | 0.3031 | -20.1667 | 0.0000000023 |
| Fitur | x (Data Uji) | $\mu$ | $\sigma$ | Eksponen | Gaussian PDF |
|---|---|---|---|---|---|
| Usia | 22 | 27.5000 | 7.5664 | -0.2642 | 0.0404842 |
| Paritas | 1 | 1.5000 | 1.1180 | -0.1000 | 0.3228685 |
| Jarak | 10 | 10.2500 | 6.0156 | -0.0009 | 0.0662607 |
| Tinggi | 150 | 151.5000 | 1.1180 | -0.9000 | 0.1450741 |
| Berat | 46 | 48.5000 | 1.1180 | -2.5000 | 0.0292900 |
| LiLA | 22.3 | 22.6750 | 0.4657 | -0.3242 | 0.6194465 |
| Hb | 10.7 | 10.9750 | 0.1479 | -1.7286 | 0.4788803 |
| Fitur | x (Data Uji) | $\mu$ | $\sigma$ | Eksponen | Gaussian PDF |
|---|---|---|---|---|---|
| Usia | 22 | 28.5000 | 11.0114 | -0.1742 | 0.0304371 |
| Paritas | 1 | 2.5000 | 2.0616 | -0.2647 | 0.1485099 |
| Jarak | 10 | 5.2500 | 3.1125 | -1.1645 | 0.0400001 |
| Tinggi | 150 | 146.5000 | 1.1180 | -4.9000 | 0.0026571 |
| Berat | 46 | 41.5000 | 1.1180 | -8.1000 | 0.0001083 |
| LiLA | 22.3 | 20.6750 | 0.4657 | -6.0879 | 0.0019448 |
| Hb | 10.7 | 9.6250 | 0.3031 | -6.2891 | 0.0024433 |
2.7 & 2.8 Langkah 4 & 5 — Kalikan dengan Prior & Normalisasi
$$Posterior = Produk\,Likelihood \times Prior$$
| Kelas | Produk Likelihood | Prior | Posterior (Sebelum Normalisasi) | Posterior Ternormalisasi (Peluang Akhir) |
|---|---|---|---|---|
| Sehat | 4.5722 × 10⁻³³ | 0.3333 | 1.5241 × 10⁻³³ | ~ 0% (4.19 × 10⁻²⁷) |
| Berpotensi Stunting | 1.0917 × 10⁻⁶ | 0.3333 | 3.6390 × 10⁻⁷ | ≈ 99.9999% |
| Stunting | 2.4726 × 10⁻¹⁶ | 0.3333 | 8.2419 × 10⁻¹⁷ | ~ 0% (2.27 × 10⁻¹⁰) |
Untuk normalisasi, tiap posterior dibagi dengan total ketiga posterior:
2.9 Kesimpulan Naive Bayes
Prediksi Naive Bayes: Berpotensi Stunting, dengan tingkat keyakinan yang sangat tinggi (praktis mendekati 100%). Ini terjadi karena nilai LiLA (22.3) dan Hb (10.7) pada data uji sangat pas dengan kurva Gaussian kelas Berpotensi Stunting (lihat likelihood LiLA=0.619 dan Hb=0.479 di Tabel 6b — jauh lebih besar dibanding likelihood fitur yang sama di dua kelas lain), sehingga kelas ini "menang telak" begitu semua fitur dikalikan.
Bagian 3: Support Vector Machine (SVM)
3.1 Analogi Sederhana
Bayangkan dua kelompok anak sedang berbaris di lapangan — kelompok A di kiri, kelompok B di kanan — dan kamu diminta menarik satu garis lurus yang memisahkan keduanya. Ada banyak garis yang bisa memisahkan mereka, tapi SVM mencari garis yang paling "adil": garis yang jaraknya sama jauh dan semaksimal mungkin dari anak-anak terdekat di kedua kelompok.
Anak-anak yang posisinya paling dekat dengan garis pemisah itulah yang disebut support vector — merekalah yang benar-benar "menentukan" posisi garis. Anak-anak lain yang berdiri jauh di belakang tidak berpengaruh sama sekali terhadap posisi garis.
3.2 Konsep Hyperplane, Margin, dan Support Vector
- Hyperplane — garis (pada 2 dimensi) atau bidang pemisah (pada dimensi lebih tinggi) yang memisahkan dua kelas. Rumusnya: $f(x) = w \cdot x + b$, di mana data diklasifikasikan positif jika $f(x) \geq 0$ dan negatif jika $f(x) < 0$.
- Margin — "lorong kosong" di kiri-kanan hyperplane, dibatasi oleh titik-titik terdekat kedua kelas. SVM berusaha membuat margin ini selebar mungkin, karena semakin lebar marginnya, semakin percaya diri (robust) modelnya dalam mengklasifikasikan data baru.
- Support Vector — titik-titik data yang letaknya tepat di tepi margin (paling dekat ke hyperplane). Hanya titik-titik inilah yang menentukan posisi dan kemiringan hyperplane.
Karena SVM mencari margin maksimal, secara matematis untuk kasus linearly separable:
di mana $x^+$ = support vector kelas positif, $x^-$ = support vector kelas negatif. Lebar margin $= 2/\lVert w\rVert$.
3.3 Kernel Trick dan Hubungannya dengan Skripsi
Di dunia nyata, data jarang bisa dipisahkan sempurna dengan garis lurus. Untuk itu SVM punya trik disebut kernel trick — mengubah data ke ruang berdimensi lebih tinggi sehingga data yang tadinya tidak bisa dipisahkan garis lurus, jadi bisa dipisahkan.
Pada skripsi ini, kernel yang digunakan adalah RBF (Radial Basis Function),
dengan parameter (C dan gamma) dicari
otomatis lewat GridSearchCV dikombinasikan Stratified 10-Fold Cross
Validation pada data latih — bukan ditebak manual.
3.4 Multi-Kelas dengan One-vs-One (OvO)
SVM aslinya dirancang untuk 2 kelas saja (biner). Karena pada skripsi ini
ada 3 kelas (Sehat, Berpotensi Stunting, Stunting), dipakai strategi
One-vs-One (OvO) — yaitu strategi default library scikit-learn (SVC)
yang juga dipakai di skripsi:
Dibuat satu classifier biner untuk setiap pasangan kelas. Dengan 3 kelas, jumlah pasangannya $=\binom{3}{2}=3$:
- Sehat vs Berpotensi Stunting
- Sehat vs Stunting
- Berpotensi Stunting vs Stunting
Data uji akan "diuji" ke ketiga classifier ini, tiap classifier memberi satu suara untuk kelas pemenang di pasangannya, lalu kelas dengan suara terbanyak menjadi prediksi akhir (majority vote).
3.5 Contoh Perhitungan Manual (Disederhanakan: Fitur LiLA & Hb)
Titik support vector terdekat lintas kelas adalah S2 (24.5, 12.8) dan B4 (23.2, 10.9).
Uji data uji:
Langkah 1 — Cari pasangan titik terdekat lintas kelas (calon support vector).
Jarak terpendek ditemukan pada S2 (24.5, 12.8) dan T4 (21.2, 10.0):
Langkah 2 — Hitung vektor arah $w$.
Langkah 3 — Hitung bias $b$ (memakai syarat $f(x^+)=+1$):
Sehingga persamaan hyperplane pemisah:
Langkah 4 — Cek lebar margin.
Langkah 5 — Validasi ke semua 8 titik data latih (syarat: $y_i \times f(x_i) \geq 1$)
| ID | $f(x)$ | $y \times f(x)$ | Status |
|---|---|---|---|
| S1 | 1.0865 | 1.0865 | ≥ 1, valid |
| S2 | 1.0000 | 1.0000 | Support Vector |
| S3 | 1.5884 | 1.5884 | ≥ 1, valid |
| S4 | 1.1730 | 1.1730 | ≥ 1, valid |
| T1 | -1.3962 | 1.3962 | ≥ 1, valid |
| T2 | -1.1303 | 1.1303 | ≥ 1, valid |
| T3 | -1.6620 | 1.6620 | ≥ 1, valid |
| T4 | -1.0000 | 1.0000 | Support Vector |
Langkah 6 — Klasifikasikan data uji (LiLA=22.3, Hb=10.7)
Titik support vector terdekat lintas kelas adalah B3 (22.0, 11.0) dan T4 (21.2, 10.0).
Uji data uji:
| Pasangan | Hasil $f(\text{uji})$ | Pemenang |
|---|---|---|
| Sehat vs Berpotensi Stunting | −1.5849 | Berpotensi Stunting |
| Sehat vs Stunting | −0.4031 | Stunting |
| Berpotensi Stunting vs Stunting | +0.9268 | Berpotensi Stunting |
Rekap suara:
| Kelas | Jumlah Kemenangan |
|---|---|
| Berpotensi Stunting | 2 |
| Stunting | 1 |
| Sehat | 0 |
Berpotensi Stunting menang 2 dari 3 pertandingan → Prediksi akhir SVM: Berpotensi Stunting
3.6 Kesimpulan SVM
Melalui skema One-vs-One yang disederhanakan (2 fitur, kernel linear), SVM memprediksi data uji sebagai "Berpotensi Stunting", unggul 2 kemenangan berbanding 1. Perlu ingat, pada skripsi aslinya SVM memakai kernel RBF dengan parameter hasil tuning GridSearchCV dan seluruh 7 fitur — pendekatan manual di atas adalah versi sederhana untuk keperluan pemahaman konsep, bukan pengganti proses komputasi sesungguhnya.
Bagian 4: Membandingkan Ketiga Metode
4.1 Tabel Perbandingan Karakteristik
| Aspek | KNN | Naive Bayes | SVM |
|---|---|---|---|
| Dasar Perhitungan | Jarak antar data (Euclidean) | Peluang (Teorema Bayes + Gaussian) | Batas pemisah dengan margin maksimal |
| Standardisasi Fitur? | Wajib (sensitif skala) | Tidak wajib (dilakukan di skripsi agar konsisten) | Wajib (sensitif skala) |
| Parameter Utama | K (jumlah tetangga) | Tidak ada parameter khusus | C, gamma (untuk RBF) |
| Cara Kerja saat Prediksi | Simpan seluruh data, hitung jarak baru | Hitung peluang berdasarkan mean/std kelas | Bergantung pada support vector |
| Kelebihan Utama | Simpel, intuitif, bebas asumsi distribusi | Cepat, ringan, baik untuk data sedikit | Akurat untuk data rumit, tahan outlier jauh |
| Kekurangan Utama | Lambat jika data jumbo, sensitif noise | Asumsi independensi fitur tidak realistis | Komputasi rumit, butuh tuning parameter |
4.2 Hasil Akhir: Ketiga Metode Sepakat!
Untuk data uji yang sama persis (Usia 22, Paritas 1, Jarak 10, Tinggi 150, Berat 46, LiLA 22.3, Hb 10.7), ketiga algoritma yang cara berpikirnya sama sekali berbeda (jarak vs peluang vs margin) sama-sama menghasilkan prediksi yang identik:
KNN (K = 3)
Berpotensi Stunting3 dari 3 tetangga terdekat (B3, B1, B4) berkelas sama.
KNN (K = 5)
Berpotensi StuntingMenang mayoritas suara bulat 3 lawan 2.
Naive Bayes
Berpotensi StuntingPosterior ≈ 99.9999%, mengungguli mutlak kelas lain.
SVM (OvO)
Berpotensi StuntingMenang 2 dari 3 pertandingan klasifikasi biner.
Konsistensi ini bukan kebetulan — ini menunjukkan bahwa data uji memang secara jelas memiliki karakteristik gizi dan riwayat kehamilan yang menyerupai kelompok Berpotensi Stunting (LiLA dan Hb sedikit di bawah ambang normal, namun belum separah kelompok Stunting), sehingga wajar jika tiga sudut pandang matematis yang berbeda tetap "sepakat" pada kesimpulan yang sama. Inilah salah satu alasan mengapa membandingkan beberapa algoritma (bukan hanya mengandalkan satu) berguna: ketika hasilnya konsisten, keyakinan terhadap prediksi tersebut semakin kuat.
4.3 Kaitan dengan Pipeline Skripsi Asli
Penting ditekankan bahwa contoh di atas adalah versi manual yang disederhanakan untuk keperluan pemahaman konsep. Pada skripsi aslinya, proses jauh lebih ketat:
- Data yang dipakai 671 baris (bukan 12), hasil pengambilan data rekam medik elektronik riil dari Poli KIA Puskesmas Kintamani I.
- Data dibagi 80:20 secara stratified (proporsi tiap kelas dijaga sama antara data latih dan data uji).
- StandardScaler dan SMOTE (untuk menyeimbangkan jumlah data antar kelas) diterapkan hanya pada data latih, di dalam satu pipeline, agar tidak terjadi kebocoran data (data leakage) ke data uji.
- Parameter K (untuk KNN) dan C/gamma (untuk SVM) tidak ditebak manual, melainkan dicari otomatis lewat GridSearchCV dikombinasikan Stratified 10-Fold Cross Validation pada data latih.
- Evaluasi akhir dilakukan pada data uji (20%) yang sama sekali belum pernah "dilihat" model selama proses pelatihan, memakai Confusion Matrix 3×3, Akurasi, Presisi, Recall, dan F1-Score.
Dokumen ini hanya membantu memahami logika inti di balik rumus-rumusnya — bukan menggantikan proses komputasi sesungguhnya yang dilakukan lewat Python/scikit-learn pada skripsi.
Penutup
Tiga algoritma yang dibahas di sini — KNN, Naive Bayes, dan SVM — mewakili tiga pendekatan berbeda dalam dunia klasifikasi machine learning: berbasis jarak, berbasis peluang, dan berbasis margin/pemisah geometris. Ketiganya dipakai dalam skripsi ini justru untuk dibandingkan kinerjanya secara objektif (lewat metrik evaluasi seperti akurasi, presisi, recall, F1-score), sehingga bisa ditentukan algoritma mana yang paling cocok untuk kasus prediksi risiko stunting pada data Poli KIA Puskesmas Kintamani I — yang nantinya diimplementasikan ke purwarupa aplikasi Clinical Decision Support System (CDSS) sebagai alat bantu skrining bagi tenaga kesehatan.
| Istilah | Arti Singkat |
|---|---|
| Fitur (feature) | Variabel/kolom data yang dipakai untuk memprediksi (Usia, LiLA, Hb, dst.) |
| Kelas (class/label) | Kategori target yang diprediksi (Sehat / Berpotensi Stunting / Stunting) |
| Data latih (training data) | Data yang dipakai untuk "mengajari" model mengenali pola |
| Data uji (test data) | Data baru yang polanya belum pernah dilihat model, dipakai untuk menguji prediksi |
| Standardisasi | Proses menyamakan skala semua fitur (mean=0) agar adil dibandingkan |
| Mean ($\mu$) | Nilai rata-rata |
| Standar deviasi ($\sigma$) | Ukuran seberapa tersebar/bervariasi data dari rata-ratanya |
| Prior | Peluang awal suatu kelas sebelum melihat data, berdasar proporsinya di data latih |
| Likelihood | Seberapa "cocok"/wajar suatu nilai data terhadap pola sebuah kelas |
| Posterior | Peluang akhir suatu kelas setelah mempertimbangkan data (likelihood × prior) |
| Hyperplane | Garis/bidang pemisah antar kelas pada SVM |
| Support vector | Titik data yang paling menentukan posisi hyperplane pada SVM |
| Margin | "Lorong" jarak antara hyperplane dengan titik terdekat tiap kelas |