BAB I PENDAHULUAN

1.1 Latar Belakang Masalah

Kanker payudara merupakan salah satu masalah kesehatan terbesar di dunia. Estimasi GLOBOCAN 2020 menunjukkan bahwa kanker payudara pada perempuan telah menjadi jenis kanker yang paling banyak didiagnosis, yaitu sekitar 2,3 juta kasus baru atau 11,7% dari seluruh kasus kanker baru (Sung dkk., 2021). Pada kondisi ini, kemampuan membedakan tumor jinak (benign) dan ganas (malignant) secara cepat dan akurat menjadi kunci penanganan dini. Kesalahan yang paling berbahaya adalah tumor ganas yang dinyatakan jinak (false negative), karena pasien dapat terlambat memperoleh penanganan.

Pembelajaran mesin terawasi (supervised learning) banyak dimanfaatkan untuk membantu klasifikasi data medis seperti ini. Salah satu algoritma yang sederhana namun masih banyak digunakan adalah K-Nearest Neighbors (k-NN). Algoritma ini bersifat non-parametrik dan berbasis instans: model tidak dibangun secara eksplisit pada tahap pelatihan, tetapi prediksi untuk data baru ditentukan dari kedekatannya dengan data latih (Halder dkk., 2024). Pada klasifikasi, label diputuskan melalui suara terbanyak dari k tetangga terdekat (Halder dkk., 2024). Karena kesederhanaannya, k-NN banyak dipakai dalam prediksi penyakit, termasuk sebagai pembanding berbagai varian k-NN pada beberapa dataset medis (Uddin dkk., 2022).

Meskipun sederhana, kinerja k-NN sangat dipengaruhi oleh dua keputusan perancangan. Pertama, nilai k: nilai yang terlalu kecil membuat model sensitif terhadap derau dan terlalu fleksibel, sedangkan nilai yang terlalu besar menghaluskan batas keputusan sehingga berisiko underfitting (Halder dkk., 2024; James dkk., 2021). Kedua, skala fitur: karena k-NN menghitung jarak secara langsung, variabel dengan rentang besar dapat mendominasi, sehingga pemilihan teknik penskalaan terbukti berpengaruh pada kinerja klasifikasi (de Amorim dkk., 2023). Selain itu, penskalaan harus dilakukan tanpa membocorkan informasi data uji ke proses pelatihan agar evaluasi tidak terlalu optimistis (Kapoor & Narayanan, 2023).

Berdasarkan hal tersebut, praktikum ini dilakukan untuk menerapkan k-NN pada data Wisconsin Breast Cancer dengan nilai k = 3, 5, 7, 9, dan 11 menggunakan perangkat lunak R, kemudian membandingkan Accuracy, Sensitivity, dan Specificity untuk menentukan nilai k yang paling optimal dengan mempertimbangkan pentingnya meminimalkan false negative.

1.2 Rumusan Masalah

  1. Apa yang kamu ketahui mengenai konsep fundamental, formulasi matematis, dan prinsip kerja algoritma K- Nearest Neighbors (𝑘-NN) sebagai metode non-parametrik supervised learning?
  2. Apa yang kamu ketahui mengenai memahami pentingnya penskalaan fitur (feature scaling) dalam komputasi berbasis metrik jarak (distance metrics)?
  3. Bagaimaan cara mengimplementasikan algoritma 𝑘-NN secara terstruktur dan mandiri menggunakan bahasa pemrograman R dengan pustaka class dan caret?
  4. Bagaimana cara mengevaluasi performa model klasifikasi menggunakan Confusion Matrix, Akurasi (Accuracy), Sensitivitas (Sensitivity), Spesifisitas (Specificity), dan Positive Predictive Value?
  5. Bagaimana cara melakukan eksplorasi optimasi hiperparameter nilai 𝑘 (hyperparameter tuning) serta memvisualisasikan kurva performanya menggunakan paket ggplot2?

1.3 Tujuan Praktikum

  1. Mahasiswa dapat memahami konsep fundamental, formulasi matematis, dan prinsip kerja algoritma K Nearest Neighbors (𝑘-NN) sebagai metode non-parametrik supervised learning.
  2. Mahasiswa dapat memahami pentingnya penskalaan fitur (feature scaling) dalam komputasi berbasis metrik jarak (distance metrics).
  3. Mahasiswa dapat mengimplementasikan algoritma 𝑘-NN secara terstruktur dan mandiri menggunakan bahasa pemrograman R dengan pustaka class dan caret.
  4. Mahasiswa dapat mengevaluasi performa model klasifikasi menggunakan Confusion Matrix, Akurasi (Accuracy), Sensitivitas (Sensitivity), Spesifisitas (Specificity), dan Positive Predictive Value.
  5. Mahasiswa dapat melakukan eksplorasi optimasi hiperparameter nilai 𝑘 (hyperparameter tuning) serta memvisualisasikan kurva performanya menggunakan paket ggplot2.

1.4 Batasan Masalah

Adapun batasan masalah pada praktikum ini adalah penggunaan data Wisconsin Breast Cancer Database yang dimuat melalui perintah data(BreastCancer, package = "mlbench"). Data dibagi menjadi 70% data latih dan 30% data uji dengan set.seed(12325) (NPM ganjil dengan dua digit terakhir 25). Klasifikasi dilakukan dengan algoritma k-NN pada nilai k ∈ {3, 5, 7, 9, 11} dengan kelas positif malignant. Kinerja model dievaluasi menggunakan Accuracy, Sensitivity, dan Specificity, dengan perhatian khusus pada jumlah false negative.

BAB II TINJAUAN PUSTAKA

2.1 Algoritma K-Nearest Neighbors (k-NN)

k-NN adalah metode pembelajaran terawasi yang bersifat non-parametrik dan berbasis instans, serta dapat digunakan untuk klasifikasi maupun regresi. Metode ini berpegang pada prinsip bahwa data yang mirip cenderung berdekatan di ruang fitur, sehingga prediksi untuk data baru ditentukan dari kedekatannya dengan data latih (Halder dkk., 2024). Algoritma ini juga disebut lazy learning karena tidak membentuk model eksplisit pada tahap pelatihan, melainkan menyimpan seluruh data latih dan menunda komputasi hingga ada data uji yang akan diprediksi (Cunningham & Delany, 2021). Langkah-langkahnya adalah sebagai berikut:

  1. Menentukan nilai k (jumlah tetangga) dan metrik jarak.
  2. Menghitung jarak data uji terhadap seluruh data latih.
  3. Mengurutkan jarak dari yang terkecil dan memilih k tetangga terdekat.
  4. Pada klasifikasi, menentukan kelas melalui suara terbanyak dari k tetangga tersebut.

Misalkan terdapat data latih \(D=\{(x_1,y_1),\dots,(x_n,y_n)\}\) dengan \(x_i\in\mathbb{R}^p\) dan \(y_i\in\{1,\dots,C\}\). Untuk data uji \(x_0\), himpunan \(N_k(x_0)\) adalah \(k\) tetangga terdekatnya. Probabilitas posterior kelas \(j\) diestimasi sebagai proporsi kelas tersebut di antara tetangga:

\[\hat{P}(Y=j\mid X=x_0)=\frac{1}{k}\sum_{i\in N_k(x_0)} I(y_i=j)\]

dengan \(I(\cdot)\) adalah fungsi indikator. Keputusan kelas akhir diambil dengan suara terbanyak:

\[\hat{G}(x_0)=\underset{j\in\{1,\dots,C\}}{\arg\max}\ \hat{P}(Y=j\mid X=x_0)\]

2.2 Pemilihan Nilai k dan Kompromi Bias–Varians

Nilai k merupakan hiperparameter kritis yang menentukan akurasi dan kemampuan generalisasi model (Halder dkk., 2024). Nilai k yang kecil menghasilkan batas keputusan yang sangat fleksibel dengan bias rendah tetapi varians tinggi, sehingga model sensitif terhadap derau dan rentan overfitting. Sebaliknya, nilai k yang besar menghasilkan batas keputusan yang lebih halus dengan varians rendah tetapi bias tinggi, sehingga berisiko underfitting (James dkk., 2021). Pada klasifikasi dua kelas, nilai k ganjil umumnya dipilih agar suara terbanyak tidak berimbang.

2.3 Metrik Jarak

Pemilihan metrik jarak dapat memengaruhi kinerja k-NN secara signifikan, terutama terkait karakteristik data (Halder dkk., 2024). Beberapa metrik yang umum disajikan pada Tabel 1.

Tabel 1. Metrik Jarak pada Algoritma k-NN
Metrik Rumus Keterangan
Euclidean (L2) \(d=\sqrt{\sum_{i=1}^{p}(x_i-y_i)^2}\) Paling umum untuk data numerik kontinu
Manhattan (L1) \(d=\sum_{i=1}^{p}|x_i-y_i|\) Lebih tahan terhadap pencilan
Minkowski (Lm) \(d=\left(\sum_{i=1}^{p}|x_i-y_i|^m\right)^{1/m}\) m = 1 Manhattan, m = 2 Euclidean
Mahalanobis \(d=\sqrt{(x-y)^\top\Sigma^{-1}(x-y)}\) Memperhitungkan korelasi dan skala antarvariabel
Hamming \(d=\frac{1}{p}\sum_{i=1}^{p}I(x_i\neq y_i)\) Untuk data biner atau kategorik

Fungsi knn() pada paket class menggunakan jarak Euclidean, yang sesuai untuk prediktor numerik pada praktikum ini.

2.4 Penskalaan Fitur dan Kebocoran Data

Karena jarak Euclidean menghitung selisih numerik secara langsung, variabel dengan rentang nilai besar akan mendominasi perhitungan. Penskalaan fitur menyamakan rentang atribut sehingga semua variabel berkontribusi secara seimbang, dan pemilihan teknik penskalaan terbukti memengaruhi kinerja klasifikasi; pemilihan teknik yang kurang tepat bahkan bisa lebih merugikan daripada tidak melakukan penskalaan sama sekali (de Amorim dkk., 2023). Dua teknik yang umum adalah normalisasi Min-Max dan standardisasi Z-Score.

\[x_{scaled}=\frac{x-x_{min}}{x_{max}-x_{min}}\qquad\qquad z=\frac{x-\mu}{\sigma}\]

Parameter penskalaan sebaiknya dihitung hanya dari data latih, lalu diterapkan pada data uji. Jika parameter dihitung dari seluruh data, informasi data uji ikut “bocor” ke proses pelatihan (data leakage) sehingga kinerja yang dilaporkan menjadi terlalu optimistis (Kapoor & Narayanan, 2023).

2.5 Evaluasi Kinerja Model Klasifikasi

Kinerja klasifikasi biner dievaluasi menggunakan matriks konfusi (confusion matrix) yang memuat True Positive (TP), True Negative (TN), False Positive (FP), dan False Negative (FN) (Tharwat, 2021). Pada praktikum ini, kelas positif adalah malignant.

Tabel 2. Matriks Konfusi pada Klasifikasi Tumor
Aktual malignant Aktual benign
Prediksi malignant TP (ganas terdeteksi ganas) FP (jinak terdeteksi ganas)
Prediksi benign FN (ganas terdeteksi jinak) TN (jinak terdeteksi jinak)

Metrik yang digunakan dirumuskan sebagai berikut (Tharwat, 2021):

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

Accuracy menunjukkan proporsi prediksi yang benar secara keseluruhan. Sensitivity (recall) menunjukkan kemampuan model menemukan seluruh kasus ganas, sedangkan Specificity menunjukkan kemampuan model mengenali kasus jinak. Pada diagnosis kanker, Sensitivity yang tinggi (FN yang rendah) menjadi prioritas karena tumor ganas yang lolos deteksi berisiko fatal. Metrik juga perlu dipilih sesuai kebutuhan, dan penggunaan Accuracy saja dapat menyesatkan pada data yang tidak seimbang (Kapoor & Narayanan, 2023).

BAB III METODE PENELITIAN

3.1 Jenis dan Sumber Data

Jenis data yang digunakan adalah data kuantitatif sekunder berupa Wisconsin Breast Cancer Database yang dimuat melalui paket mlbench pada perangkat lunak R (Leisch & Dimitriadou, 2021). Setiap observasi merepresentasikan satu sampel tumor payudara yang dinilai berdasarkan sembilan karakteristik sel, dengan label diagnosis jinak atau ganas.

3.2 Variabel Penelitian

Tabel 3. Variabel Penelitian
No Variabel Keterangan Peran
1 Id Nomor identitas sampel (tidak digunakan sebagai prediktor) Pengenal
2 Cl.thickness Ketebalan gumpalan sel (skala 1–10) Prediktor
3 Cell.size Keseragaman ukuran sel (skala 1–10) Prediktor
4 Cell.shape Keseragaman bentuk sel (skala 1–10) Prediktor
5 Marg.adhesion Perlekatan marginal (skala 1–10) Prediktor
6 Epith.c.size Ukuran sel epitel tunggal (skala 1–10) Prediktor
7 Bare.nuclei Inti sel telanjang (skala 1–10) Prediktor
8 Bl.cromatin Kromatin halus (skala 1–10) Prediktor
9 Normal.nucleoli Nukleolus normal (skala 1–10) Prediktor
10 Mitoses Mitosis (skala 1–10) Prediktor
11 Class Diagnosis: benign (jinak) atau malignant (ganas) Respons

3.3 Langkah-langkah Analisis

  1. Memanggil paket class (fungsi knn()), caret (fungsi confusionMatrix()), mlbench (data), ggplot2 (visualisasi), dan knitr (tabel).
  2. Memuat data BreastCancer dan memeriksa struktur serta sebaran kelas.
  3. Melakukan pra-pemrosesan: memeriksa nilai hilang, membuang kolom Id, mengubah prediktor menjadi numerik, dan menghapus observasi yang memiliki nilai hilang.
  4. Membagi data menjadi 70% data latih dan 30% data uji dengan set.seed(12325).
  5. Melakukan normalisasi Min-Max dengan parameter (nilai minimum dan maksimum) yang dihitung dari data latih.
  6. Membangun model k-NN untuk k = 3, 5, 7, 9, dan 11 dengan fungsi knn().
  7. Menghitung matriks konfusi serta Accuracy, Sensitivity, dan Specificity untuk setiap k dengan kelas positif malignant.
  8. Menyusun tabel perbandingan, membuat visualisasi, dan menentukan k optimal berdasarkan jumlah false negative terkecil.
  9. Menginterpretasikan hasil dan menarik kesimpulan.

3.4 Diagram Alir Penelitian

BAB IV HASIL DAN PEMBAHASAN

4.1 Persiapan Data

Tahap awal adalah memanggil paket yang dibutuhkan, yaitu class untuk fungsi knn(), caret untuk confusionMatrix(), mlbench untuk data, ggplot2 untuk grafik, dan knitr untuk tabel. Kemudian dataset dimuat dan diperiksa strukturnya.

library(class)
library(caret)
library(mlbench)
library(ggplot2)
library(knitr)

data(BreastCancer, package = "mlbench")

dim(BreastCancer)
## [1] 699  11

Interpretasi: Data berhasil dimuat dengan 699 observasi dan 11 variabel. Variabel tersebut terdiri atas satu kolom pengenal (Id), sembilan variabel prediktor sitologi, dan satu variabel respons (Class).

str(BreastCancer)
## 'data.frame':    699 obs. of  11 variables:
##  $ Id             : chr  "1000025" "1002945" "1015425" "1016277" ...
##  $ Cl.thickness   : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 5 5 3 6 4 8 1 2 2 4 ...
##  $ Cell.size      : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 4 1 8 1 10 1 1 1 2 ...
##  $ Cell.shape     : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 4 1 8 1 10 1 2 1 1 ...
##  $ Marg.adhesion  : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 5 1 1 3 8 1 1 1 1 ...
##  $ Epith.c.size   : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 2 7 2 3 2 7 2 2 2 2 ...
##  $ Bare.nuclei    : Factor w/ 10 levels "1","2","3","4",..: 1 10 2 4 1 10 10 1 1 1 ...
##  $ Bl.cromatin    : Factor w/ 10 levels "1","2","3","4",..: 3 3 3 3 3 9 3 3 1 2 ...
##  $ Normal.nucleoli: Factor w/ 10 levels "1","2","3","4",..: 1 2 1 7 1 7 1 1 1 1 ...
##  $ Mitoses        : Factor w/ 9 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 5 1 ...
##  $ Class          : Factor w/ 2 levels "benign","malignant": 1 1 1 1 1 2 1 1 1 1 ...
head(BreastCancer)
##        Id Cl.thickness Cell.size Cell.shape Marg.adhesion Epith.c.size
## 1 1000025            5         1          1             1            2
## 2 1002945            5         4          4             5            7
## 3 1015425            3         1          1             1            2
## 4 1016277            6         8          8             1            3
## 5 1017023            4         1          1             3            2
## 6 1017122            8        10         10             8            7
##   Bare.nuclei Bl.cromatin Normal.nucleoli Mitoses     Class
## 1           1           3               1       1    benign
## 2          10           3               2       1    benign
## 3           2           3               1       1    benign
## 4           4           3               7       1    benign
## 5           1           3               1       1    benign
## 6          10           9               7       1 malignant

Interpretasi: Kolom Id bertipe karakter, sedangkan seluruh sembilan prediktor (Cl.thickness sampai Mitoses) masih bertipe factor, sebagian berupa ordered factor berskala 1–10. Karena jarak pada k-NN hanya dapat dihitung dari nilai numerik, prediktor tersebut harus dikonversi ke numerik pada tahap pra-pemrosesan. Variabel Class bertipe factor dengan dua level, yaitu benign dan malignant.

table(BreastCancer$Class)
## 
##    benign malignant 
##       458       241
round(prop.table(table(BreastCancer$Class)) * 100, 2)
## 
##    benign malignant 
##     65.52     34.48

Interpretasi: Dari 699 sampel, terdapat 458 tumor jinak (65,52%) dan 241 tumor ganas (34,48%). Perbandingan kelas jinak terhadap ganas adalah sekitar 1.90 : 1, sehingga kelas jinak lebih dominan. Karena itu, Accuracy sebaiknya dibaca bersama Sensitivity dan Specificity, bukan berdiri sendiri (Tharwat, 2021).

4.2 Pra-pemrosesan Data

4.2.1 Pemeriksaan Nilai Hilang

colSums(is.na(BreastCancer))
##              Id    Cl.thickness       Cell.size      Cell.shape   Marg.adhesion 
##               0               0               0               0               0 
##    Epith.c.size     Bare.nuclei     Bl.cromatin Normal.nucleoli         Mitoses 
##               0              16               0               0               0 
##           Class 
##               0

Interpretasi: Nilai hilang ditemukan pada kolom Bare.nuclei (16 nilai). Total terdapat 16 observasi yang memiliki setidaknya satu nilai hilang. Karena k-NN tidak dapat menghitung jarak pada data yang tidak lengkap, observasi tersebut dihapus dengan na.omit().

4.2.2 Pembersihan dan Konversi Tipe Data

bc <- BreastCancer[, -1]                                   # buang kolom Id
bc[, 1:9] <- lapply(bc[, 1:9], function(x) as.numeric(as.character(x)))
bc <- na.omit(bc)                                          # hapus baris dengan NA
bc$Class <- factor(bc$Class, levels = c("benign", "malignant"))

dim(bc)
## [1] 683  10
table(bc$Class)
## 
##    benign malignant 
##       444       239

Interpretasi: Setelah kolom Id dibuang, sembilan prediktor dikonversi ke numerik, dan observasi tidak lengkap dihapus, diperoleh 683 observasi dengan 9 prediktor (berkurang 16 observasi dari data awal). Komposisi kelas menjadi 444 jinak (65,01%) dan 239 ganas (34,99%). Urutan level Class ditetapkan benign, malignant agar kelas positif pada tahap evaluasi dapat didefinisikan secara eksplisit sebagai malignant.

4.2.3 Ringkasan Statistik Prediktor

summary(bc[, 1:9])
##   Cl.thickness      Cell.size        Cell.shape     Marg.adhesion  
##  Min.   : 1.000   Min.   : 1.000   Min.   : 1.000   Min.   : 1.00  
##  1st Qu.: 2.000   1st Qu.: 1.000   1st Qu.: 1.000   1st Qu.: 1.00  
##  Median : 4.000   Median : 1.000   Median : 1.000   Median : 1.00  
##  Mean   : 4.442   Mean   : 3.151   Mean   : 3.215   Mean   : 2.83  
##  3rd Qu.: 6.000   3rd Qu.: 5.000   3rd Qu.: 5.000   3rd Qu.: 4.00  
##  Max.   :10.000   Max.   :10.000   Max.   :10.000   Max.   :10.00  
##   Epith.c.size     Bare.nuclei      Bl.cromatin     Normal.nucleoli
##  Min.   : 1.000   Min.   : 1.000   Min.   : 1.000   Min.   : 1.00  
##  1st Qu.: 2.000   1st Qu.: 1.000   1st Qu.: 2.000   1st Qu.: 1.00  
##  Median : 2.000   Median : 1.000   Median : 3.000   Median : 1.00  
##  Mean   : 3.234   Mean   : 3.545   Mean   : 3.445   Mean   : 2.87  
##  3rd Qu.: 4.000   3rd Qu.: 6.000   3rd Qu.: 5.000   3rd Qu.: 4.00  
##  Max.   :10.000   Max.   :10.000   Max.   :10.000   Max.   :10.00  
##     Mitoses      
##  Min.   : 1.000  
##  1st Qu.: 1.000  
##  Median : 1.000  
##  Mean   : 1.603  
##  3rd Qu.: 1.000  
##  Max.   :10.000

Interpretasi: Seluruh prediktor berada pada skala yang sama, yaitu dari 1 sampai 10. Rata-rata tertinggi dimiliki Cl.thickness (4.44) dan rata-rata terendah dimiliki Mitoses (1.60). Walaupun skalanya serupa, sebaran antarvariabel berbeda (misalnya Mitoses yang sebagian besar bernilai kecil), sehingga normalisasi Min-Max tetap diterapkan agar setiap variabel berkontribusi seimbang pada jarak (de Amorim dkk., 2023).

4.2.4 Rata-rata Prediktor menurut Kelas

rata_kelas <- aggregate(. ~ Class, data = bc, FUN = mean)

# Ditransposisi (prediktor menjadi baris) agar tabel muat di dalam margin laporan
tabel4 <- data.frame(
  Prediktor = names(rata_kelas)[-1],
  Benign    = unlist(rata_kelas[rata_kelas$Class == "benign", -1]),
  Malignant = unlist(rata_kelas[rata_kelas$Class == "malignant", -1]),
  row.names = NULL
)

kable(tabel4, digits = 2, align = "lcc",
      caption = "Tabel 4. Rata-rata Setiap Prediktor menurut Kelas Diagnosis")
Tabel 4. Rata-rata Setiap Prediktor menurut Kelas Diagnosis
Prediktor Benign Malignant
Cl.thickness 2.96 7.19
Cell.size 1.31 6.58
Cell.shape 1.41 6.56
Marg.adhesion 1.35 5.59
Epith.c.size 2.11 5.33
Bare.nuclei 1.35 7.63
Bl.cromatin 2.08 5.97
Normal.nucleoli 1.26 5.86
Mitoses 1.07 2.60

Interpretasi: Berdasarkan Tabel 4, tumor ganas memiliki rata-rata skor yang lebih tinggi daripada tumor jinak pada seluruh sembilan prediktor. Selisih terbesar terdapat pada Bare.nuclei (6.28 poin), sedangkan selisih terkecil pada Mitoses (1.54 poin). Adanya perbedaan rata-rata yang jelas antara kedua kelas menunjukkan bahwa prediktor ini informatif untuk membedakan jinak dan ganas, sehingga pendekatan berbasis jarak seperti k-NN layak digunakan.

4.3 Pembagian Data Latih dan Data Uji

Karena NPM praktikan ganjil, data dibagi 70% latih dan 30% uji dengan set.seed(12325).

set.seed(12325)

idx_latih <- sample(seq_len(n), size = floor(0.70 * n))

latih <- bc[idx_latih, ]
uji   <- bc[-idx_latih, ]

train_x <- latih[, 1:9]
test_x  <- uji[, 1:9]
train_y <- latih$Class
test_y  <- uji$Class

kable(
  data.frame(
    Himpunan  = c("Latih (70%)", "Uji (30%)", "Total"),
    Observasi = c(nrow(latih), nrow(uji), n),
    Benign    = c(sum(train_y == "benign"), sum(test_y == "benign"), n_ben),
    Malignant = c(sum(train_y == "malignant"), sum(test_y == "malignant"), n_mal)
  ),
  align = "c", caption = "Tabel 5. Ringkasan Pembagian Data"
)
Tabel 5. Ringkasan Pembagian Data
Himpunan Observasi Benign Malignant
Latih (70%) 478 302 176
Uji (30%) 205 142 63
Total 683 444 239

Interpretasi: Data berhasil dibagi menjadi 478 observasi latih (70,0%) dan 205 observasi uji (30,0%). Proporsi tumor ganas pada data latih adalah 36,82%, sedangkan pada data uji 30,73%, dibandingkan 34,99% pada keseluruhan data. Kedekatan proporsi ini menunjukkan bahwa pembagian acak menghasilkan komposisi kelas yang cukup representatif. Data uji memuat 63 kasus ganas, sehingga setiap satu false negative akan menurunkan Sensitivity sekitar 1,59%.

4.4 Normalisasi Min-Max

Nilai minimum dan maksimum dihitung hanya dari data latih, kemudian diterapkan pada data latih dan data uji untuk menghindari kebocoran data (Kapoor & Narayanan, 2023).

min_latih <- sapply(train_x, min)
max_latih <- sapply(train_x, max)

skala <- function(df, mn, mx) {
  as.data.frame(mapply(function(x, a, b) (x - a) / (b - a), df, mn, mx,
                       SIMPLIFY = FALSE))
}

train_x_s <- skala(train_x, min_latih, max_latih)
test_x_s  <- skala(test_x,  min_latih, max_latih)

summary(train_x_s[, 1:4])
##   Cl.thickness      Cell.size        Cell.shape     Marg.adhesion   
##  Min.   :0.0000   Min.   :0.0000   Min.   :0.0000   Min.   :0.0000  
##  1st Qu.:0.1111   1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:0.0000  
##  Median :0.3333   Median :0.0000   Median :0.1111   Median :0.0000  
##  Mean   :0.3894   Mean   :0.2566   Mean   :0.2662   Mean   :0.2108  
##  3rd Qu.:0.5556   3rd Qu.:0.4444   3rd Qu.:0.4444   3rd Qu.:0.3333  
##  Max.   :1.0000   Max.   :1.0000   Max.   :1.0000   Max.   :1.0000

Interpretasi: Setelah normalisasi, seluruh prediktor pada data latih berada pada rentang 0.00 sampai 1.00, sedangkan pada data uji berada pada rentang 0.00 sampai 1.00. Nilai data uji tetap berada di dalam [0, 1] karena rentang skor 1–10 pada data latih sudah mencakup seluruh nilai yang mungkin. Dengan skala yang seragam, tidak ada prediktor yang mendominasi perhitungan jarak Euclidean.

4.5 Pembentukan Model k-NN

Model k-NN dibangun satu per satu untuk \(k \in \{3,5,7,9,11\}\) menggunakan fungsi knn() dari paket class sesuai sintaks pada modul praktikum, yaitu knn(train = ..., test = ..., cl = ..., k = ...). Hasil prediksi setiap model kemudian dievaluasi dengan confusionMatrix(data = ..., reference = ...) dari paket caret. Kelas positif ditetapkan sebagai malignant, sehingga Sensitivity mengukur kemampuan mendeteksi tumor ganas dan False Negative (FN) adalah tumor ganas yang salah dikenali sebagai jinak. set.seed(12325) diulang sebelum setiap pemanggilan knn() karena fungsi ini memutus seri jarak secara acak, sehingga hasil tetap dapat direproduksi.

4.5.1 Model k-NN dengan k = 3

set.seed(12325)
pred_k3 <- knn(train = train_x_s, test = test_x_s, cl = train_y, k = 3)
head(pred_k3, 10)
##  [1] benign benign benign benign benign benign benign benign benign benign
## Levels: benign malignant
cm_k3 <- confusionMatrix(data = pred_k3, reference = test_y, positive = "malignant")
print(cm_k3)
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       140         6
##   malignant      2        57
##                                          
##                Accuracy : 0.961          
##                  95% CI : (0.9246, 0.983)
##     No Information Rate : 0.6927         
##     P-Value [Acc > NIR] : <2e-16         
##                                          
##                   Kappa : 0.9067         
##                                          
##  Mcnemar's Test P-Value : 0.2888         
##                                          
##             Sensitivity : 0.9048         
##             Specificity : 0.9859         
##          Pos Pred Value : 0.9661         
##          Neg Pred Value : 0.9589         
##              Prevalence : 0.3073         
##          Detection Rate : 0.2780         
##    Detection Prevalence : 0.2878         
##       Balanced Accuracy : 0.9453         
##                                          
##        'Positive' Class : malignant      
## 

Interpretasi: Pada k = 3, model mengklasifikasikan benar 140 tumor jinak (TN) dan 57 tumor ganas (TP) dari 205 observasi uji. Terdapat 2 tumor jinak yang diprediksi ganas (FP). Sebanyak 6 tumor ganas lolos terdeteksi sebagai jinak (FN), yaitu kesalahan yang paling berbahaya secara klinis. Accuracy sebesar 96,10%, Sensitivity 90,48%, dan Specificity 98,59%.

4.5.2 Model k-NN dengan k = 5

set.seed(12325)
pred_k5 <- knn(train = train_x_s, test = test_x_s, cl = train_y, k = 5)
head(pred_k5, 10)
##  [1] benign benign benign benign benign benign benign benign benign benign
## Levels: benign malignant
cm_k5 <- confusionMatrix(data = pred_k5, reference = test_y, positive = "malignant")
print(cm_k5)
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       140         6
##   malignant      2        57
##                                          
##                Accuracy : 0.961          
##                  95% CI : (0.9246, 0.983)
##     No Information Rate : 0.6927         
##     P-Value [Acc > NIR] : <2e-16         
##                                          
##                   Kappa : 0.9067         
##                                          
##  Mcnemar's Test P-Value : 0.2888         
##                                          
##             Sensitivity : 0.9048         
##             Specificity : 0.9859         
##          Pos Pred Value : 0.9661         
##          Neg Pred Value : 0.9589         
##              Prevalence : 0.3073         
##          Detection Rate : 0.2780         
##    Detection Prevalence : 0.2878         
##       Balanced Accuracy : 0.9453         
##                                          
##        'Positive' Class : malignant      
## 

Interpretasi: Pada k = 5, model mengklasifikasikan benar 140 tumor jinak (TN) dan 57 tumor ganas (TP) dari 205 observasi uji. Terdapat 2 tumor jinak yang diprediksi ganas (FP). Sebanyak 6 tumor ganas lolos terdeteksi sebagai jinak (FN), yaitu kesalahan yang paling berbahaya secara klinis. Accuracy sebesar 96,10%, Sensitivity 90,48%, dan Specificity 98,59%.

4.5.3 Model k-NN dengan k = 7

set.seed(12325)
pred_k7 <- knn(train = train_x_s, test = test_x_s, cl = train_y, k = 7)
head(pred_k7, 10)
##  [1] benign    benign    benign    benign    benign    benign    malignant
##  [8] benign    benign    benign   
## Levels: benign malignant
cm_k7 <- confusionMatrix(data = pred_k7, reference = test_y, positive = "malignant")
print(cm_k7)
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       140         6
##   malignant      2        57
##                                          
##                Accuracy : 0.961          
##                  95% CI : (0.9246, 0.983)
##     No Information Rate : 0.6927         
##     P-Value [Acc > NIR] : <2e-16         
##                                          
##                   Kappa : 0.9067         
##                                          
##  Mcnemar's Test P-Value : 0.2888         
##                                          
##             Sensitivity : 0.9048         
##             Specificity : 0.9859         
##          Pos Pred Value : 0.9661         
##          Neg Pred Value : 0.9589         
##              Prevalence : 0.3073         
##          Detection Rate : 0.2780         
##    Detection Prevalence : 0.2878         
##       Balanced Accuracy : 0.9453         
##                                          
##        'Positive' Class : malignant      
## 

Interpretasi: Pada k = 7, model mengklasifikasikan benar 140 tumor jinak (TN) dan 57 tumor ganas (TP) dari 205 observasi uji. Terdapat 2 tumor jinak yang diprediksi ganas (FP). Sebanyak 6 tumor ganas lolos terdeteksi sebagai jinak (FN), yaitu kesalahan yang paling berbahaya secara klinis. Accuracy sebesar 96,10%, Sensitivity 90,48%, dan Specificity 98,59%.

4.5.4 Model k-NN dengan k = 9

set.seed(12325)
pred_k9 <- knn(train = train_x_s, test = test_x_s, cl = train_y, k = 9)
head(pred_k9, 10)
##  [1] benign    benign    benign    benign    benign    benign    malignant
##  [8] benign    benign    benign   
## Levels: benign malignant
cm_k9 <- confusionMatrix(data = pred_k9, reference = test_y, positive = "malignant")
print(cm_k9)
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       140         5
##   malignant      2        58
##                                           
##                Accuracy : 0.9659          
##                  95% CI : (0.9309, 0.9862)
##     No Information Rate : 0.6927          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.9187          
##                                           
##  Mcnemar's Test P-Value : 0.4497          
##                                           
##             Sensitivity : 0.9206          
##             Specificity : 0.9859          
##          Pos Pred Value : 0.9667          
##          Neg Pred Value : 0.9655          
##              Prevalence : 0.3073          
##          Detection Rate : 0.2829          
##    Detection Prevalence : 0.2927          
##       Balanced Accuracy : 0.9533          
##                                           
##        'Positive' Class : malignant       
## 

Interpretasi: Pada k = 9, model mengklasifikasikan benar 140 tumor jinak (TN) dan 58 tumor ganas (TP) dari 205 observasi uji. Terdapat 2 tumor jinak yang diprediksi ganas (FP). Sebanyak 5 tumor ganas lolos terdeteksi sebagai jinak (FN), yaitu kesalahan yang paling berbahaya secara klinis. Accuracy sebesar 96,59%, Sensitivity 92,06%, dan Specificity 98,59%.

4.5.5 Model k-NN dengan k = 11

set.seed(12325)
pred_k11 <- knn(train = train_x_s, test = test_x_s, cl = train_y, k = 11)
head(pred_k11, 10)
##  [1] benign    benign    benign    benign    benign    benign    malignant
##  [8] benign    benign    benign   
## Levels: benign malignant
cm_k11 <- confusionMatrix(data = pred_k11, reference = test_y, positive = "malignant")
print(cm_k11)
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       139         5
##   malignant      3        58
##                                          
##                Accuracy : 0.961          
##                  95% CI : (0.9246, 0.983)
##     No Information Rate : 0.6927         
##     P-Value [Acc > NIR] : <2e-16         
##                                          
##                   Kappa : 0.9075         
##                                          
##  Mcnemar's Test P-Value : 0.7237         
##                                          
##             Sensitivity : 0.9206         
##             Specificity : 0.9789         
##          Pos Pred Value : 0.9508         
##          Neg Pred Value : 0.9653         
##              Prevalence : 0.3073         
##          Detection Rate : 0.2829         
##    Detection Prevalence : 0.2976         
##       Balanced Accuracy : 0.9498         
##                                          
##        'Positive' Class : malignant      
## 

Interpretasi: Pada k = 11, model mengklasifikasikan benar 139 tumor jinak (TN) dan 58 tumor ganas (TP) dari 205 observasi uji. Terdapat 3 tumor jinak yang diprediksi ganas (FP). Sebanyak 5 tumor ganas lolos terdeteksi sebagai jinak (FN), yaitu kesalahan yang paling berbahaya secara klinis. Accuracy sebesar 96,10%, Sensitivity 92,06%, dan Specificity 97,89%.

4.5.6 Rekapitulasi Komponen Matriks Konfusi

Hasil kelima model digabungkan menjadi satu tabel agar dapat dibandingkan pada tahap berikutnya.

k_kandidat <- c(3, 5, 7, 9, 11)

tabel_hasil <- rbind(
  metrik_cm(3,  cm_k3),
  metrik_cm(5,  cm_k5),
  metrik_cm(7,  cm_k7),
  metrik_cm(9,  cm_k9),
  metrik_cm(11, cm_k11)
)

kable(tabel_hasil[, c("k", "TP", "TN", "FP", "FN")], align = "c",
      caption = "Tabel 6. Komponen Matriks Konfusi pada Setiap Nilai k")
Tabel 6. Komponen Matriks Konfusi pada Setiap Nilai k
k TP TN FP FN
3 57 140 2 6
5 57 140 2 6
7 57 140 2 6
9 58 140 2 5
11 58 139 3 5

Interpretasi: Lima model k-NN berhasil dibentuk dan masing-masing diuji pada 205 observasi uji. Pada setiap model, jumlah TP + TN + FP + FN sama dengan jumlah data uji (TRUE), sehingga seluruh data uji terklasifikasi. Jumlah false negative berkisar dari 5 (pada k = 9 dan 11) sampai 6 (pada k = 3, 5 dan 7), sedangkan false positive berkisar dari 2 sampai 3. Dengan demikian, perubahan nilai k menggeser keseimbangan antara dua jenis kesalahan, dan jenis kesalahan yang lebih berbahaya secara klinis adalah false negative.

4.6 Tabel Perbandingan Metrik Evaluasi

tampil <- tabel_hasil[, c("k", "Accuracy", "Sensitivity", "Specificity", "FN")]
tampil$Accuracy    <- sprintf("%.2f%%", tampil$Accuracy * 100)
tampil$Sensitivity <- sprintf("%.2f%%", tampil$Sensitivity * 100)
tampil$Specificity <- sprintf("%.2f%%", tampil$Specificity * 100)

kable(tampil, align = "c",
      caption = "Tabel 7. Perbandingan Metrik Evaluasi k-NN pada Data Uji")
Tabel 7. Perbandingan Metrik Evaluasi k-NN pada Data Uji
k Accuracy Sensitivity Specificity FN
3 96.10% 90.48% 98.59% 6
5 96.10% 90.48% 98.59% 6
7 96.10% 90.48% 98.59% 6
9 96.59% 92.06% 98.59% 5
11 96.10% 92.06% 97.89% 5

Interpretasi: Berdasarkan Tabel 7, Accuracy tertinggi diperoleh pada k = 9 sebesar 96,59%, sedangkan yang terendah pada k = 3, 5, 7 dan 11 sebesar 96,10%. Sensitivity tertinggi terdapat pada k = 9 dan 11 sebesar 92,06% (artinya model menemukan 92,06% dari seluruh kasus ganas pada data uji), dan terendah pada k = 3, 5 dan 7 sebesar 90,48%. Specificity tertinggi terdapat pada k = 3, 5, 7 dan 9 sebesar 98,59%. Selisih Accuracy antara nilai k terbaik dan terburuk hanya 0.49 poin persen, sehingga perbedaan kinerja antar nilai k relatif kecil. Nilai k terbaik menurut Accuracy dan Sensitivity beririsan, sehingga pilihan k relatif tidak bertentangan antarmetrik.

4.7 Visualisasi Kinerja terhadap Nilai k

long <- data.frame(
  k      = rep(tabel_hasil$k, 3),
  Metrik = rep(c("Accuracy", "Sensitivity", "Specificity"), each = nrow(tabel_hasil)),
  Nilai  = c(tabel_hasil$Accuracy, tabel_hasil$Sensitivity, tabel_hasil$Specificity)
)

ggplot(long, aes(x = k, y = Nilai, color = Metrik, group = Metrik)) +
  geom_line(linewidth = 1.1) +
  geom_point(size = 3.2) +
  scale_x_continuous(breaks = k_kandidat) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 0.1)) +
  scale_color_manual(values = c(Accuracy = pal$lavender,
                                Sensitivity = pal$peach,
                                Specificity = pal$mint)) +
  labs(title = "Kinerja Model k-NN pada Wisconsin Breast Cancer",
       subtitle = "Kelas positif: malignant",
       x = "Jumlah Tetangga Terdekat (k)", y = "Nilai Metrik", color = NULL) +
  tema_soft()
Gambar 1. Accuracy, Sensitivity, dan Specificity pada berbagai nilai k

Gambar 1. Accuracy, Sensitivity, dan Specificity pada berbagai nilai k

Interpretasi: Pada Gambar 1, ketiga metrik berada pada kisaran yang tinggi: Accuracy 96,10%–96,59%, Sensitivity 90,48%–92,06%, dan Specificity 97,89%–98,59%. Rentang yang sempit menunjukkan bahwa k-NN pada data ini cukup stabil terhadap perubahan k dalam kisaran 3 sampai 11. Kurva Specificity berada di atas kurva Sensitivity secara rata-rata (98,45% berbanding 91,11%), artinya model lebih mudah mengenali tumor jinak daripada mendeteksi tumor ganas. Hal ini sejalan dengan kelas jinak yang lebih banyak pada data latih. Karena itu, pemilihan k tidak boleh hanya melihat Accuracy.

ggplot(tabel_hasil, aes(x = factor(k), y = FN)) +
  geom_col(fill = pal$peach, width = 0.55, alpha = 0.9) +
  geom_text(aes(label = FN), vjust = -0.5, color = pal$ink, fontface = "bold") +
  scale_y_continuous(expand = expansion(mult = c(0, 0.2))) +
  labs(title = "Jumlah False Negative per Nilai k",
       subtitle = "Semakin rendah semakin aman secara klinis",
       x = "Jumlah Tetangga Terdekat (k)", y = "False Negative") +
  tema_soft()
Gambar 2. Jumlah False Negative (ganas terdeteksi sebagai jinak) per nilai k

Gambar 2. Jumlah False Negative (ganas terdeteksi sebagai jinak) per nilai k

Interpretasi: Gambar 2 memperlihatkan jumlah tumor ganas yang lolos terdeteksi (false negative) pada setiap k. Jumlah false negative paling sedikit adalah 5 kasus pada k = 9 dan 11, sedangkan paling banyak adalah 6 kasus pada k = 3, 5 dan 7. Selisih 1 kasus ini penting secara klinis, karena setiap kasus ganas yang terlewat berisiko terlambat ditangani.

4.8 Penentuan Nilai k Optimal

Karena false negative paling berbahaya, kriteria pemilihan k diurutkan sebagai berikut: (1) False Negative paling sedikit (Sensitivity tertinggi); (2) bila sama, Accuracy tertinggi; (3) bila masih sama, Specificity tertinggi; (4) bila masih sama, k terbesar (varians lebih rendah).

urut <- tabel_hasil[order(tabel_hasil$FN,
                          -tabel_hasil$Accuracy,
                          -tabel_hasil$Specificity,
                          -tabel_hasil$k), ]
k_opt     <- urut$k[1]
baris_opt <- tabel_hasil[tabel_hasil$k == k_opt, ]

kable(baris_opt, digits = 4, align = "c", row.names = FALSE,
      caption = "Tabel 8. Model dengan Nilai k Optimal")
Tabel 8. Model dengan Nilai k Optimal
k TP TN FP FN Accuracy Sensitivity Specificity
9 58 140 2 5 0.9659 0.9206 0.9859

Interpretasi: Nilai k optimal adalah 9, dengan Accuracy 96,59%, Sensitivity 92,06%, Specificity 98,59%, dan 5 kasus false negative. Terdapat beberapa nilai k dengan false negative yang sama rendah (k = 9 dan 11). Pemecahan seri dilakukan dengan Accuracy, lalu Specificity, lalu k terbesar, sehingga terpilih k = 9.

Matriks Konfusi pada k Optimal

set.seed(12325)
pred_opt <- knn(train = train_x_s, test = test_x_s, cl = train_y, k = k_opt)
cm_opt   <- confusionMatrix(pred_opt, test_y, positive = "malignant")
print(cm_opt)
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       140         5
##   malignant      2        58
##                                           
##                Accuracy : 0.9659          
##                  95% CI : (0.9309, 0.9862)
##     No Information Rate : 0.6927          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.9187          
##                                           
##  Mcnemar's Test P-Value : 0.4497          
##                                           
##             Sensitivity : 0.9206          
##             Specificity : 0.9859          
##          Pos Pred Value : 0.9667          
##          Neg Pred Value : 0.9655          
##              Prevalence : 0.3073          
##          Detection Rate : 0.2829          
##    Detection Prevalence : 0.2927          
##       Balanced Accuracy : 0.9533          
##                                           
##        'Positive' Class : malignant       
## 

Interpretasi: Pada k = 9, model mencapai Accuracy 96,59% dengan selang kepercayaan 95% sebesar 93,09% sampai 98,62%. Nilai ini lebih tinggi daripada No Information Rate (69,27%), yaitu akurasi jika seluruh data diprediksi sebagai kelas mayoritas, dengan p-value <2e-16. Nilai Kappa sebesar 0.919 menunjukkan kesesuaian antara prediksi dan kondisi aktual melebihi kebetulan. Positive Predictive Value sebesar 96,67% berarti dari seluruh sampel yang diprediksi ganas, sebesar itulah yang benar-benar ganas. Negative Predictive Value sebesar 96,55% berarti dari seluruh sampel yang diprediksi jinak, sebesar itulah yang benar-benar jinak. Balanced Accuracy sebesar 95,33% merupakan rata-rata Sensitivity dan Specificity.

cm_df <- as.data.frame(cm_opt$table)
names(cm_df) <- c("Prediksi", "Aktual", "Jumlah")

ggplot(cm_df, aes(x = Aktual, y = Prediksi, fill = Jumlah)) +
  geom_tile(color = "white", linewidth = 1.5) +
  geom_text(aes(label = Jumlah), size = 7, color = pal$ink, fontface = "bold") +
  scale_fill_gradient(low = "#f1eefc", high = pal$lavender, guide = "none") +
  labs(title = paste0("Matriks Konfusi (k = ", k_opt, ")"),
       x = "Aktual", y = "Prediksi") +
  tema_soft()
Gambar 3. Heatmap matriks konfusi pada k optimal

Gambar 3. Heatmap matriks konfusi pada k optimal

Interpretasi: Gambar 3 menunjukkan bahwa model mengklasifikasikan benar 140 tumor jinak (TN) dan 58 tumor ganas (TP). Kesalahan yang terjadi adalah 2 tumor jinak yang diprediksi ganas (FP), yang secara klinis masih dapat dikoreksi melalui pemeriksaan lanjutan seperti biopsi, serta 5 tumor ganas yang diprediksi jinak (FN), yang merupakan kesalahan paling berbahaya. Seluruh sel pada diagonal utama jauh lebih besar daripada sel di luar diagonal, yang menunjukkan bahwa model secara umum membedakan kedua kelas dengan baik.

4.9 Pembanding: Sintaks Modul pada Dataset Iris

Bagian ini mendemonstrasikan sintaks pada modul praktikum dengan dataset iris sebagai pembanding untuk kasus tiga kelas, dengan set.seed(42) dan pembagian 70:30 sesuai modul.

4.9.1 Pemuatan Data dan Normalisasi

data(iris)
table(iris$Species)
## 
##     setosa versicolor  virginica 
##         50         50         50
min_max_norm <- function(x) (x - min(x)) / (max(x) - min(x))

iris_norm <- as.data.frame(lapply(iris[1:4], min_max_norm))
iris_norm$Species <- iris$Species

summary(iris_norm)
##   Sepal.Length     Sepal.Width      Petal.Length     Petal.Width     
##  Min.   :0.0000   Min.   :0.0000   Min.   :0.0000   Min.   :0.00000  
##  1st Qu.:0.2222   1st Qu.:0.3333   1st Qu.:0.1017   1st Qu.:0.08333  
##  Median :0.4167   Median :0.4167   Median :0.5678   Median :0.50000  
##  Mean   :0.4287   Mean   :0.4406   Mean   :0.4675   Mean   :0.45806  
##  3rd Qu.:0.5833   3rd Qu.:0.5417   3rd Qu.:0.6949   3rd Qu.:0.70833  
##  Max.   :1.0000   Max.   :1.0000   Max.   :1.0000   Max.   :1.00000  
##        Species  
##  setosa    :50  
##  versicolor:50  
##  virginica :50  
##                 
##                 
## 

Interpretasi: Dataset iris memuat 150 observasi dengan tiga kelas yang seimbang, masing-masing 50 observasi. Setelah normalisasi Min-Max, seluruh empat prediktor berada pada rentang 0.00 sampai 1.00, sehingga ukuran kelopak dan sepal yang semula berskala berbeda kini setara dalam perhitungan jarak. Pada bagian ini normalisasi dilakukan pada seluruh data sesuai sintaks modul; pada kasus Breast Cancer di atas, penskalaan dibuat lebih ketat dengan parameter dari data latih saja.

4.9.2 Pembagian Data dan Model k = 5

set.seed(42)
train_indices <- sample(seq_len(nrow(iris_norm)), size = 0.70 * nrow(iris_norm))

train_xi <- iris_norm[train_indices, 1:4]
test_xi  <- iris_norm[-train_indices, 1:4]
train_yi <- iris_norm[train_indices, 5]
test_yi  <- iris_norm[-train_indices, 5]

cat("Dimensi Data Latih (Train):", nrow(train_xi), "baris,", ncol(train_xi), "fitur\n")
## Dimensi Data Latih (Train): 105 baris, 4 fitur
cat("Dimensi Data Uji (Test)   :", nrow(test_xi),  "baris,", ncol(test_xi),  "fitur\n")
## Dimensi Data Uji (Test)   : 45 baris, 4 fitur
prediksi_k5 <- knn(train = train_xi, test = test_xi, cl = train_yi, k = 5)
head(prediksi_k5, 10)
##  [1] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
## Levels: setosa versicolor virginica
evaluasi_model <- confusionMatrix(data = prediksi_k5, reference = test_yi)
print(evaluasi_model)
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         12          0         0
##   versicolor      0         15         1
##   virginica       0          0        17
## 
## Overall Statistics
##                                           
##                Accuracy : 0.9778          
##                  95% CI : (0.8823, 0.9994)
##     No Information Rate : 0.4             
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.9663          
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: setosa Class: versicolor Class: virginica
## Sensitivity                 1.0000            1.0000           0.9444
## Specificity                 1.0000            0.9667           1.0000
## Pos Pred Value              1.0000            0.9375           1.0000
## Neg Pred Value              1.0000            1.0000           0.9643
## Prevalence                  0.2667            0.3333           0.4000
## Detection Rate              0.2667            0.3333           0.3778
## Detection Prevalence        0.2667            0.3556           0.3778
## Balanced Accuracy           1.0000            0.9833           0.9722

Interpretasi: Data latih terdiri dari 105 observasi dan data uji 45 observasi. Model k-NN dengan k = 5 mencapai Accuracy 97,78%, dengan 1 observasi salah diklasifikasikan dari 45 data uji. Sensitivity per kelas adalah setosa 100,00%, versicolor 100,00% dan virginica 94,44%. Kelas dengan Sensitivity terendah adalah virginica, sehingga kelas inilah yang paling sering tertukar dengan kelas lain pada pembagian data ini.

4.9.3 Eksplorasi Nilai k (1–25)

k_values <- 1:25
akurasi_vektor <- numeric(length(k_values))

for (i in seq_along(k_values)) {
  pred_uji <- knn(train = train_xi, test = test_xi, cl = train_yi, k = k_values[i])
  akurasi_vektor[i] <- mean(pred_uji == test_yi)
}

tabel_akurasi <- data.frame(k = k_values, Akurasi = akurasi_vektor)
kable(head(tabel_akurasi, 10), digits = 4, align = "c",
      caption = "Tabel 9. Akurasi untuk 10 Nilai k Pertama pada Iris")
Tabel 9. Akurasi untuk 10 Nilai k Pertama pada Iris
k Akurasi
1 0.9778
2 0.9556
3 0.9778
4 0.9556
5 0.9778
6 0.9778
7 0.9778
8 0.9778
9 0.9778
10 0.9556

Interpretasi: Dari 25 nilai k yang diuji, Accuracy tertinggi adalah 97,78% yang dicapai pada 8 nilai k (yang terkecil adalah k = 1), sedangkan Accuracy terendah adalah 93,33% pada k = 24 dan 25. Selisih antara akurasi tertinggi dan terendah hanya 4.44 poin persen, sehingga pada data iris yang kelasnya terpisah baik, k-NN tidak terlalu sensitif terhadap pilihan k.

ggplot(tabel_akurasi, aes(x = k, y = Akurasi)) +
  geom_line(color = pal$lavender, linewidth = 1.1) +
  geom_point(color = pal$peach, size = 2.8) +
  scale_x_continuous(breaks = seq(1, 25, by = 2)) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 0.1)) +
  labs(title = "Pengaruh Hiperparameter k terhadap Akurasi Klasifikasi k-NN",
       subtitle = paste0("Evaluasi generalisasi pada data uji iris (n uji = ", nrow(test_xi), ")"),
       x = "Jumlah Tetangga Terdekat (k)", y = "Akurasi Prediksi") +
  tema_soft(11)
Gambar 4. Kurva hubungan nilai k terhadap akurasi model k-NN pada dataset iris

Gambar 4. Kurva hubungan nilai k terhadap akurasi model k-NN pada dataset iris

Interpretasi: Pada Gambar 4, kurva akurasi berfluktuasi pada nilai k kecil (akurasi k = 1 adalah 97,78%) dan cenderung lebih stabil pada nilai k yang lebih besar (akurasi k = 25 adalah 93,33%). Pola ini sesuai dengan kompromi bias–varians: k kecil menghasilkan model yang fleksibel dan sensitif terhadap data tertentu, sedangkan k besar menghasilkan batas keputusan yang lebih halus (James dkk., 2021).

BAB V KESIMPULAN DAN SARAN

5.1 Kesimpulan

K-Nearest Neighbors (k-NN) adalah metode supervised learning yang bersifat non-parametrik dan berbasis instans (lazy learning), sehingga tidak membentuk model eksplisit pada tahap pelatihan. Prinsip kerjanya adalah menghitung jarak data uji terhadap seluruh data latih, memilih k tetangga terdekat, lalu menentukan kelas melalui suara terbanyak. Probabilitas kelas diestimasi dari proporsi kelas di antara k tetangga tersebut, dan jarak yang umum dipakai adalah jarak Euclidean.

Penskalaan fitur penting karena k-NN menghitung selisih nilai secara langsung, sehingga variabel dengan rentang besar dapat mendominasi jarak. Normalisasi Min-Max menyamakan kontribusi setiap variabel, dengan nilai minimum dan maksimum yang dihitung hanya dari data latih agar tidak terjadi kebocoran data (data leakage).

Algoritma k-NN diimplementasikan di R menggunakan fungsi knn() dari paket class, confusionMatrix() dari paket caret, dan data dari paket mlbench. Langkahnya meliputi memuat data, membuang kolom Id, mengonversi prediktor menjadi numerik, menghapus nilai hilang, membagi data latih dan uji, menormalisasi, lalu membangun model untuk setiap nilai k.

Kinerja model dievaluasi menggunakan matriks konfusi (TP, TN, FP, FN) serta Accuracy, Sensitivity, Specificity, dan Positive Predictive Value dengan kelas positif malignant. Pada diagnosis kanker, Sensitivity yang tinggi atau false negative yang rendah menjadi prioritas, dan Accuracy saja dapat menyesatkan pada data yang kelasnya tidak seimbang.

Optimasi hiperparameter dilakukan dengan mencoba beberapa nilai k, membandingkan metriknya dalam tabel, dan memvisualisasikannya dengan ggplot2 melalui kurva Accuracy, Sensitivity, Specificity, serta diagram batang false negative. Nilai k yang kecil cenderung bervarians tinggi, sedangkan k yang besar cenderung bias tinggi, sehingga k dipilih berdasarkan false negative terkecil.

Pada data Wisconsin Breast Cancer yang tersisa 683 observasi (478 latih dan 205 uji), seluruh nilai k menghasilkan kinerja tinggi dengan Accuracy 96,10%–96,59%. Nilai k paling optimal adalah 9, dengan Accuracy 96,59%, Sensitivity 92,06%, Specificity 98,59%, dan 5 kasus false negative. Perbedaan kinerja antar nilai k relatif kecil dan berasal dari satu kali pembagian data.

5.2 Saran

Pada praktikum berikutnya, praktikan disarankan lebih teliti dalam pra-pemrosesan data (terutama konversi tipe data dan penanganan nilai hilang), serta konsisten menghitung parameter penskalaan dari data latih saja. Hasil pada praktikum ini diperoleh dari satu kali pembagian data (satu nilai seed), sehingga selisih kecil antar nilai k sebaiknya tidak dianggap pasti. Untuk hasil yang lebih kokoh, disarankan menggunakan k-fold cross-validation (misalnya caret::train(method = "knn")), serta mempertimbangkan penambahan metrik seperti Positive Predictive Value atau F1-score bersama Sensitivity dalam konteks diagnosis medis.

DAFTAR PUSTAKA

Cunningham, P., & Delany, S. J. (2021). k-Nearest neighbour classifiers – A tutorial. ACM Computing Surveys, 54(6), 1–25.

de Amorim, L. B. V., Cavalcanti, G. D. C., & Cruz, R. M. O. (2023). The choice of scaling technique matters for classification performance. Applied Soft Computing, 133, 109924. https://doi.org/10.1016/j.asoc.2022.109924

Fransiska, H. (2026). Modul praktikum machine learning: Pertemuan K-NN (K-Nearest Neighbor). Universitas Bengkulu.

Halder, R. K., Uddin, M. N., Uddin, M. A., Aryal, S., & Khraisat, A. (2024). Enhancing K-nearest neighbor algorithm: A comprehensive review and performance analysis of modifications. Journal of Big Data, 11, Article 113. https://doi.org/10.1186/s40537-024-00973-y

James, G., Witten, D., Hastie, T., & Tibshirani, R. (2021). An introduction to statistical learning: With applications in R (2nd ed.). Springer.

Kapoor, S., & Narayanan, A. (2023). Leakage and the reproducibility crisis in machine-learning-based science. Patterns, 4(9), 100804. https://doi.org/10.1016/j.patter.2023.100804

Kuhn, M. (2023). caret: Classification and regression training (R package version 6.0-94). https://CRAN.R-project.org/package=caret

Leisch, F., & Dimitriadou, E. (2021). mlbench: Machine learning benchmark problems (R package version 2.1-3.1). https://CRAN.R-project.org/package=mlbench

R Core Team. (2024). R: A language and environment for statistical computing. R Foundation for Statistical Computing. https://www.R-project.org/

Ripley, B., & Venables, W. (2023). class: Functions for classification (R package version 7.3-22). https://CRAN.R-project.org/package=class

Sung, H., Ferlay, J., Siegel, R. L., Laversanne, M., Soerjomataram, I., Jemal, A., & Bray, F. (2021). Global cancer statistics 2020: GLOBOCAN estimates of incidence and mortality worldwide for 36 cancers in 185 countries. CA: A Cancer Journal for Clinicians, 71(3), 209–249. https://doi.org/10.3322/caac.21660

Tharwat, A. (2021). Classification assessment methods. Applied Computing and Informatics, 17(1), 168–192.

Uddin, S., Haque, I., Lu, H., Moni, M. A., & Gide, E. (2022). Comparative performance analysis of K-nearest neighbour (KNN) algorithm and its different variants for disease prediction. Scientific Reports, 12, Article 6256. https://doi.org/10.1038/s41598-022-10358-x