CDSS Stunting
Studi Kasus Klasifikasi Risiko Stunting

Memahami KNN, Naive Bayes, dan Support Vector Machine

Panduan komprehensif yang membedah teori, analogi sederhana, dan perhitungan manual langkah-demi-langkah hingga angka terakhir untuk studi kasus prediksi risiko stunting ibu hamil.

0

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.

Catatan penting soal data: Skripsi asli menggunakan data rekam medik elektronik (RME) sungguhan dari Poli KIA Puskesmas Kintamani I sebanyak 671 baris, 7 fitur, diproses lewat pipeline lengkap (Data Cleaning → Label Encoding → Split 80:20 Stratified → StandardScaler + SMOTE khusus data latih → GridSearchCV + Stratified 10-Fold Cross Validation). Menghitung manual 671 baris data jelas tidak mungkin dan tidak perlu.

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.

1

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
Tabel 1. Dataset Latih (Data Dummy, 12 baris, seimbang 4:4:4)
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.

Tabel 2. Data Uji (Pasien Baru yang Ingin Diprediksi)
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

Live CDSS

Input Parameter Ibu Hamil

22 tahun
1 kali
10 bulan
150 cm
46 kg
22.3 cm
10.7 g/dL
STATUS DIAGNOSIS

Konsensus Model

K-Nearest Neighbors
Gaussian Naive Bayes
SVM (One-vs-One)

Input pasien baru distandardisasi dan jarak Euclidean dihitung ke 12 data latih:

Rank ID Kelas Asli Jarak Euclidean Status Tetangga
2

Bagian 1: K-Nearest Neighbors (KNN)

Jarak Terdekat

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:

  1. Mengukur jarak data baru itu ke semua data latih.
  2. Mengambil K data terdekat (K adalah angka yang kita tentukan, misalnya 3 atau 5).
  3. 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):

$$d(x, y) = \sqrt{(x_1-y_1)^2 + (x_2-y_2)^2 + \dots + (x_n-y_n)^2}$$

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:

$$z = \frac{x - \mu}{\sigma}$$
dimana:
• $x$ = nilai asli
• $\mu$ (mu) = rata-rata (mean) fitur tersebut di seluruh data latih
• $\sigma$ (sigma) = standar deviasi fitur tersebut di seluruh data latih

Setelah distandardisasi, semua fitur punya rata-rata 0 dan skala yang sebanding, sehingga adil dibandingkan.

Catatan teknis (konsisten dengan skripsi): standar deviasi $\sigma$ di sini dihitung sebagai standar deviasi populasi (pembagi $n$, bukan $n-1$), karena inilah cara 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):

$$\sigma = \sqrt{\frac{\sum (x_i - \mu)^2}{n}} = \sqrt{\frac{(27-27.5833)^2+(24-27.5833)^2+\dots+(40-27.5833)^2}{12}} = 7.8471$$

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
Data uji setelah distandardisasi:

(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
Jumlah kuadrat selisih $= 0.0162+0.0000+0.0458+0.0452+0.0223+0.0240+0.0572 = 0.2107$
$$d(\text{Uji}, B3) = \sqrt{0.2107} = 0.4590$$
Tabel 4. Seluruh Jarak Euclidean (Diurutkan dari Terdekat)
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

Untuk K = 3

Mengambil 3 tetangga terdekat: B3, B1, B4 (semuanya Berpotensi Stunting).

Kelas Suara
Berpotensi Stunting 3 (100%)
Stunting 0
Sehat 0
Prediksi K=3: Berpotensi Stunting
Untuk K = 5

Mengambil 5 tetangga terdekat: B3, B1, B4, T3, T1.

Kelas Suara
Berpotensi Stunting 3 (B3, B1, B4)
Stunting 2 (T3, T1)
Sehat 0
Prediksi K=5: Berpotensi Stunting

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.

3

Bagian 2: Naive Bayes (Gaussian Naive Bayes)

Peluang Probabilistik

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:

$$P(\text{Kelas}\mid \text{Data}) = \frac{P(\text{Data}\mid \text{Kelas}) \times P(\text{Kelas})}{P(\text{Data})}$$

Dalam bahasa sederhana:

$$\text{Peluang akhir} = \frac{\text{Seberapa cocok data ini dengan pola kelas} \times \text{Seberapa umum kelas ini}}{\text{Angka pembagi (sama untuk semua kelas)}}$$

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)

$$f(x) = \frac{1}{\sqrt{2\pi}\,\sigma} \exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)$$

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

Contoh perhitungan lengkap — fitur Hb, kelas Berpotensi Stunting:

Data uji Hb $=10.7$; kelas Berpotensi Stunting punya $\mu=10.975$, $\sigma=0.1479$.

$$f(10.7) = \frac{1}{\sqrt{2\pi}\times 0.1479}\exp\left(-\frac{(10.7-10.975)^2}{2\times 0.1479^2}\right)$$ $$= \frac{1}{0.3709}\times\exp\left(-\frac{0.075625}{0.04375}\right) = 2.6960 \times \exp(-1.7286) = 2.6960 \times 0.1776 = 0.4789$$

Nilai likelihood-nya cukup besar (0.4789) — artinya nilai Hb=10.7 sangat "wajar"/khas untuk kelas Berpotensi Stunting.


Sebagai pembanding, fitur Hb, kelas Sehat:

$\mu=12.625$, $\sigma=0.3031$.

$$f(10.7) = \frac{1}{\sqrt{2\pi}\times 0.3031}\exp\left(-\frac{(10.7-12.625)^2}{2\times 0.3031^2}\right) = 1.3159\times\exp\left(-\frac{3.705625}{0.18374}\right)$$ $$=1.3159\times\exp(-20.1667) = 1.3159 \times 0.00000000174 \approx 0.0000000023$$

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 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
Produk Likelihood (kalikan semua 7 PDF): 1.0917 × 10⁻⁶
Perhatikan: Semua nilai produk likelihood ini sangat kecil — itu wajar, karena mengalikan 7 angka pecahan (semuanya < 1) pasti menghasilkan angka yang jauh lebih kecil lagi. Yang penting bukan besar-kecilnya angka secara mutlak, melainkan perbandingan relatif antar kelas — dan di situ terlihat jelas produk Berpotensi Stunting ($10^{-6}$) jauh lebih besar dibanding Sehat ($10^{-33}$) maupun Stunting ($10^{-16}$).

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:

$$\text{Total} = 1.5241\times10^{-33} + 3.6390\times10^{-7} + 8.2419\times10^{-17} \approx 3.6390\times10^{-7}$$

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.

4

Bagian 3: Support Vector Machine (SVM)

Batas Pemisah Margin

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:

$$w = k(x^+ - x^-), \quad k = \frac{2}{\lVert x^+-x^-\rVert^2}, \quad b = 1 - w\cdot x^+$$

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.

Catatan Simplifikasi: Karena kernel RBF melibatkan optimisasi numerik berdimensi tinggi yang tidak bisa dihitung dengan tangan, contoh perhitungan manual di bagian ini akan memakai pendekatan yang disederhanakan: kernel linear, dan hanya 2 fitur (LiLA & Hb, dua fitur yang paling berpengaruh berdasarkan Bagian 2), supaya proses hitungnya bisa ditelusuri penuh sambil tetap menunjukkan logika inti SVM.

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$:

  1. Sehat vs Berpotensi Stunting
  2. Sehat vs Stunting
  3. 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)

Data uji (2 kolom): LiLA = 22.3, Hb = 10.7

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):

$$\lVert S2-T4\rVert=\sqrt{(24.5-21.2)^2+(12.8-10.0)^2}=\sqrt{3.3^2+2.8^2}=\sqrt{18.73}=4.3278$$

Langkah 2 — Hitung vektor arah $w$.

$$\text{diff}=S2-T4=(3.3,\ 2.8), \quad k=\frac{2}{18.73}=0.10678$$ $$w=k\times\text{diff}=0.10678\times(3.3,\ 2.8)=(0.3524,\ 0.2990)$$

Langkah 3 — Hitung bias $b$ (memakai syarat $f(x^+)=+1$):

$$b=1-w\cdot S2 = 1-(0.3524\times24.5+0.2990\times12.8)=-11.4602$$

Sehingga persamaan hyperplane pemisah:

$$f(x)=0.3524\,x_{\text{LiLA}}+0.2990\,x_{\text{Hb}}-11.4602$$

Langkah 4 — Cek lebar margin.

$$\text{Lebar margin}=\frac{2}{\lVert w\rVert}=\frac{2}{\sqrt{0.3524^2+0.2990^2}}=4.3278$$

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)

$$f(\text{uji})=0.3524\times22.3+0.2990\times10.7-11.4602$$ $$=7.8585+3.1993-11.4602 = -0.4024 \approx -0.4031$$
Karena $f(\text{uji}) < 0$ → pemenang: Stunting
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.

5

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:

METODE 1

KNN (K = 3)

Berpotensi Stunting

3 dari 3 tetangga terdekat (B3, B1, B4) berkelas sama.

METODE 2

KNN (K = 5)

Berpotensi Stunting

Menang mayoritas suara bulat 3 lawan 2.

METODE 3

Naive Bayes

Berpotensi Stunting

Posterior ≈ 99.9999%, mengungguli mutlak kelas lain.

METODE 4

SVM (OvO)

Berpotensi Stunting

Menang 2 dari 3 pertandingan klasifikasi biner.

Kesimpulan Konsensus

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
Formula berhasil disalin ke papan klip!