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.
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.
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:
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)\]
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.
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.
| 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.
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).
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.
| 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).
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.
| 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 |
class (fungsi knn()),
caret (fungsi confusionMatrix()),
mlbench (data), ggplot2 (visualisasi), dan
knitr (tabel).BreastCancer dan memeriksa struktur serta
sebaran kelas.Id, mengubah prediktor menjadi numerik, dan menghapus
observasi yang memiliki nilai hilang.set.seed(12325).knn().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).
## '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 ...
## 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.
##
## benign malignant
## 458 241
##
## 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).
## 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().
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
##
## 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.
## 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).
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"
)| 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%.
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.
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.
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
## 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%.
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
## 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%.
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
## 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%.
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
## 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%.
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%.
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")| 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.
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")| 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.
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
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
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.
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")| 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.
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
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.
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.
##
## 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.
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
## Dimensi Data Uji (Test) : 45 baris, 4 fitur
## [1] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
## Levels: setosa versicolor virginica
## 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.
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")| 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
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).
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.
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.
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