Perkembangan teknologi informasi mendorong pemanfaatan data dalam berbagai bidang untuk mendukung proses analisis dan pengambilan keputusan. Salah satu metode yang digunakan dalam pengolahan data adalah klasifikasi, yaitu proses mengelompokkan objek ke dalam kelas tertentu berdasarkan karakteristik yang dimiliki. Klasifikasi dapat dilakukan menggunakan berbagai algoritma machine learning, salah satunya adalah K-Nearest Neighbor (K-NN) (Daulay, 2024).
K-Nearest Neighbor merupakan metode klasifikasi nonparametrik yang menentukan kelas suatu objek berdasarkan mayoritas kelas dari sejumlah \(k\) tetangga terdekat pada data latih. Kedekatan antarobjek ditentukan melalui perhitungan jarak, salah satunya menggunakan jarak Euclidean. Metode ini memiliki konsep yang sederhana dan relatif mudah diterapkan, tetapi hasil klasifikasinya dipengaruhi oleh pemilihan nilai \(k\), ukuran jarak, serta skala variabel yang digunakan (Permatasari & Suliadi, 2024).
Pemilihan nilai \(k\) menjadi salah satu aspek penting dalam penerapan K-NN karena dapat memengaruhi hasil klasifikasi. Nilai \(k\) yang terlalu kecil dapat menyebabkan model sensitif terhadap noise, sedangkan nilai \(k\) yang terlalu besar dapat mengurangi kemampuan model dalam mengenali pola lokal data. Selain itu, perbedaan skala antarvariabel dapat memengaruhi perhitungan jarak sehingga diperlukan tahap preprocessing, seperti standardisasi data, sebelum pemodelan dilakukan (Hadi dkk., 2024).
Berdasarkan latar belakang tersebut, rumusan masalah dalam praktikum ini adalah sebagai berikut:
Bagaimana cara memahami konsep fundamental, formulasi matematis, dan prinsip kerja algoritma K-Nearest Neighbors (KNN) sebagai metode non-parametrik supervised learning?
Bagaimana cara memahami pentingnya penskalaan fitur (feature scaling) dalam komputasi berbasis metrik jarak (distance metrics)?
Bagaimana cara mengimplementasikan algoritma KNN secara terstruktur dan mandiri menggunakan bahasa pemrograman R dengan pustaka class dan caret?
Bagaimana cara mengevaluasi performa model klasifikasi menggunakan Confusion Matrix, Akurasi (Accuracy), Sensitivitas (Sensitivity), Spesifisitas (Specificity), dan Positive Predictive Value?
Bagaimana cara melakukan eksplorasi optimasi hiperparameter nilai 𝑘 (hyperparameter tuning) serta memvisualisasikan kurva performanya menggunakan paket ggplot2?
Tujuan yang ingin dicapai dalam praktikum ini adalah sebagai berikut:
Memahami konsep fundamental, formulasi matematis, dan prinsip kerja algoritma K-Nearest Neighbors (KNN) sebagai metode non-parametrik supervised learning.
Memahami pentingnya penskalaan fitur (feature scaling) dalam komputasi berbasis metrik jarak (distance metrics).
Mengimplementasikan algoritma KNN secara terstruktur dan mandiri menggunakan bahasa pemrograman R dengan pustaka class dan caret.
Mengevaluasi performa model klasifikasi menggunakan Confusion Matrix, Akurasi (Accuracy), Sensitivitas (Sensitivity), Spesifisitas (Specificity), dan Positive Predictive Value.
Melakukan eksplorasi optimasi hiperparameter nilai 𝑘 (hyperparameter tuning) serta memvisualisasikan kurva performanya menggunakan paket ggplot2.
K-Nearest Neighbor (KNN) merupakan algoritma klasifikasi dalam metode supervised learning yang menentukan kelas suatu data berdasarkan mayoritas kelas dari K tetangga terdekat pada data pelatihan (training data). Proses klasifikasi dilakukan dengan menghitung jarak antara data pengujian (testing data) dan data pelatihan, kemudian mengurutkan jarak dari yang terkecil hingga memilih K tetangga terdekat. Kelas data ditentukan berdasarkan kelas yang paling banyak muncul dari tetangga tersebut. Pemilihan nilai K berpengaruh terhadap hasil klasifikasi sehingga perlu disesuaikan dengan karakteristik data (Cholil dkk., 2021).
Pemilihan nilai hiperparameter 𝑘 memegang peranan krusial dalam mengendalikan keseimbangan antara bias dan varians (Fransiska, 2026):
Nilai 𝑘 Kecil (misalnya 𝑘=1): Model memiliki fleksibilitas tinggi dan batas keputusan (decision boundary) yang sangat rumit. Karakteristik ini menghasilkan bias yang sangat rendah, namun varians yang sangat tinggi. Model menjadi sangat sensitif terhadap derau (noise) dan rentan mengalami overfitting.
Nilai 𝑘 Besar (misalnya 𝑘→𝑛): Batas keputusan menjadi sangat halus (oversmoothing). Karakteristik ini menghasilkan varians yang rendah, namun bias yang tinggi. Jika 𝑘 terlalu besar, model berpotensi mengalami underfitting karena keputusan lokal akan terdistorsi oleh prevalensi kelas mayoritas secara global.
Metrik jarak (distance metrics) merupakan ukuran matematis untuk menghitung kedekatan antara dua objek berdasarkan atribut yang dimiliki. Dalam algoritma K-Nearest Neighbor (KNN), metrik jarak digunakan untuk menentukan kedekatan data pengujian (testing data) dengan data pelatihan (training data) sehingga diperoleh \(K\) tetangga terdekat. Pemilihan metrik jarak dapat memengaruhi hasil klasifikasi. Beberapa metrik yang umum digunakan adalah sebagai berikut (Firdaus dan Sirodj, 2022):
Jarak Euclidean merupakan metode pengukuran jarak yang menghitung jarak lurus antara dua titik dalam ruang berdimensi tertentu. Metrik ini merupakan salah satu metode yang umum digunakan dalam algoritma KNN. Perhitungan jarak Euclidean dilakukan dengan mencari akar kuadrat dari jumlah kuadrat selisih setiap atribut antara dua objek.
Manhattan Distance merupakan metode pengukuran jarak yang menghitung jumlah nilai absolut dari selisih setiap atribut antara dua objek. Metode ini menggambarkan jarak yang ditempuh melalui pergerakan sepanjang sumbu-sumbu koordinat, bukan melalui garis lurus seperti pada Euclidean Distance.
Minkowski Distance merupakan metrik jarak yang bersifat umum karena dapat digunakan untuk membentuk beberapa jenis pengukuran jarak berdasarkan nilai parameter \(r\). Metrik ini merupakan bentuk generalisasi dari Euclidean Distance dan Manhattan Distance.
Chebyshev Distance merupakan metode pengukuran jarak yang ditentukan berdasarkan nilai absolut terbesar dari selisih atribut antara dua objek. Berbeda dengan Euclidean dan Manhattan Distance yang mempertimbangkan seluruh selisih atribut, Chebyshev Distance hanya mengambil selisih atribut dengan nilai terbesar.
Jenis data yang digunakan dalam praktikum ini adalah data kategorik. Data kategorik adalah tipe data yang merepresentasikan karakteristik atau atribut dari objek yang diklasifikasikan ke dalam kategori tertentu. Sumber data yang digunakan merupakan data sekunder, yaitu data yang telah tersedia dan diperoleh melalui sumber yang sudah ada. Data yang digunakan adalah dataset BreastCancer dari package mlbench pada program R.
Variabel penelitian adalah segala sesuatu yang menjadi objek pengamatan dalam suatu penelitian. Variabel penelitian yang digunakan berasal dari dataset BreastCancer dengan jumlah 699 observasi dan 11 variabel. Variabel Class digunakan sebagai variabel respons dengan kategori benign dan malignant, sedangkan sembilan variabel prediktor yang digunakan adalah Clump Thickness, Uniformity of Cell Size, Uniformity of Cell Shape, Marginal Adhesion, Single Epithelial Cell Size, Bare Nuclei, Bland Chromatin, Normal Nucleoli dan Mitoses. Variabel Sample code number tidak digunakan dalam pemodelan karena hanya berfungsi sebagai identitas sampel.
Langkah-langkah analisis data pada penelitian ini adalah sebagai berikut:
Menyiapkan data yang akan dianalisis.
Melakukan preprocessing data.
Membagi data menjadi 80% data latih dan 20% data uji.
Melakukan standardisasi variabel prediktor.
Membangun model klasifikasi KNN dengan variasi nilai \(k=3,5,7,9,11\).
Mengevaluasi model menggunakan Confusion Matrix, Accuracy, Sensitivity dan Specificity.
Menentukan model optimal berdasarkan nilai Sensitivity dan Accuracy tertinggi.
Menarik kesimpulan hasil analisis.
Package yang digunakan adalah mlbench, randomForest, ggplot2 dan knitr. Package mlbench menyediakan dataset BreastCancer, randomForest digunakan untuk membangun model Random Forest, ggplot2 digunakan untuk visualisasi hasil analisis dan knitr digunakan untuk menampilkan hasil evaluasi dalam bentuk tabel.
## Loading required package: ggplot2
## Loading required package: lattice
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
Tahap preprocessing dilakukan untuk mempersiapkan data sebelum digunakan dalam pemodelan KNN. Proses ini meliputi penghapusan variabel identitas, perubahan tipe data, penanganan missing value dan penyesuaian variabel respons menjadi faktor.
# Data yang digunakan
data("BreastCancer", package = "mlbench")
# Menghapus variabel ID
data_bc <- BreastCancer %>%
select(-Id)
# Mengubah seluruh variabel prediktor menjadi numerik
kolom_numerik <- setdiff(names(data_bc), "Class")
data_bc[kolom_numerik] <- lapply(
data_bc[kolom_numerik],
function(x) as.numeric(as.character(x))
)
# Mengatasi missing value dengan median
data_bc$Bare.nuclei[is.na(data_bc$Bare.nuclei)] <-
median(data_bc$Bare.nuclei, na.rm = TRUE)
# Mengubah variabel Class menjadi faktor
data_bc$Class <- factor(
data_bc$Class,
levels = c("benign", "malignant")
)
# Memeriksa data setelah preprocessing
str(data_bc)## 'data.frame': 699 obs. of 10 variables:
## $ Cl.thickness : num 5 5 3 6 4 8 1 2 2 4 ...
## $ Cell.size : num 1 4 1 8 1 10 1 1 1 2 ...
## $ Cell.shape : num 1 4 1 8 1 10 1 2 1 1 ...
## $ Marg.adhesion : num 1 5 1 1 3 8 1 1 1 1 ...
## $ Epith.c.size : num 2 7 2 3 2 7 2 2 2 2 ...
## $ Bare.nuclei : num 1 10 2 4 1 10 10 1 1 1 ...
## $ Bl.cromatin : num 3 3 3 3 3 9 3 3 1 2 ...
## $ Normal.nucleoli: num 1 2 1 7 1 7 1 1 1 1 ...
## $ Mitoses : num 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 ...
## Cl.thickness Cell.size Cell.shape Marg.adhesion
## Min. : 1.000 Min. : 1.000 Min. : 1.000 Min. : 1.000
## 1st Qu.: 2.000 1st Qu.: 1.000 1st Qu.: 1.000 1st Qu.: 1.000
## Median : 4.000 Median : 1.000 Median : 1.000 Median : 1.000
## Mean : 4.418 Mean : 3.134 Mean : 3.207 Mean : 2.807
## 3rd Qu.: 6.000 3rd Qu.: 5.000 3rd Qu.: 5.000 3rd Qu.: 4.000
## Max. :10.000 Max. :10.000 Max. :10.000 Max. :10.000
## Epith.c.size Bare.nuclei Bl.cromatin Normal.nucleoli
## Min. : 1.000 Min. : 1.000 Min. : 1.000 Min. : 1.000
## 1st Qu.: 2.000 1st Qu.: 1.000 1st Qu.: 2.000 1st Qu.: 1.000
## Median : 2.000 Median : 1.000 Median : 3.000 Median : 1.000
## Mean : 3.216 Mean : 3.486 Mean : 3.438 Mean : 2.867
## 3rd Qu.: 4.000 3rd Qu.: 5.000 3rd Qu.: 5.000 3rd Qu.: 4.000
## Max. :10.000 Max. :10.000 Max. :10.000 Max. :10.000
## Mitoses Class
## Min. : 1.000 benign :458
## 1st Qu.: 1.000 malignant:241
## Median : 1.000
## Mean : 1.589
## 3rd Qu.: 1.000
## Max. :10.000
## Cl.thickness Cell.size Cell.shape Marg.adhesion Epith.c.size
## 0 0 0 0 0
## Bare.nuclei Bl.cromatin Normal.nucleoli Mitoses Class
## 0 0 0 0 0
Dataset terdiri dari 699 observasi dan 10 variabel setelah Id dihapus. Sembilan prediktor telah diubah menjadi numerik, sedangkan Class memiliki 458 kategori benign dan 241 malignant. Sebanyak 16 missing value pada Bare.nuclei telah ditangani menggunakan imputasi median, sehingga tidak terdapat lagi nilai hilang.
Data dibagi menjadi 80% data training dan 20% data testing. Data training digunakan untuk membangun model, sedangkan data testing digunakan untuk mengevaluasi kemampuan prediksi model pada data yang tidak digunakan selama pelatihan.
# Inisialisasi random seed
set.seed(12326)
# Pembagian data stratified
index <- createDataPartition(
data_bc$Class,
p = 0.80,
list = FALSE
)
# Data latih
train_data <- data_bc[index, ]
# Data uji
test_data <- data_bc[-index, ]
# Memeriksa jumlah data
nrow(train_data)## [1] 560
## [1] 139
##
## benign malignant
## 367 193
##
## benign malignant
## 91 48
Pembagian data dilakukan dengan proporsi 80:20. Dari total 699 observasi, sebanyak 560 observasi digunakan sebagai data training dan 139 observasi sebagai data testing. Penggunaan stratified sampling bertujuan mempertahankan proporsi kategori benign dan malignant pada kedua kelompok data sehingga pembagian kelas lebih representatif.
Standardisasi dilakukan agar skala variabel lebih seragam dan proses pelatihan ANN lebih stabil. Parameter standardisasi dihitung hanya dari data training, kemudian diterapkan pada data testing untuk mencegah kebocoran informasi.
# Memisahkan variabel prediktor dan respon
X_train <- train_data %>%
select(-Class)
X_test <- test_data %>%
select(-Class)
y_train <- train_data$Class
y_test <- test_data$Class
# Menghitung parameter standardisasi dari data latih
preproc <- preProcess(
X_train,
method = c("center", "scale")
)
# Standardisasi data latih
X_train_scaled <- predict(preproc, X_train)
# Standardisasi data uji
X_test_scaled <- predict(preproc, X_test)
# Memeriksa hasil standardisasi
summary(X_train_scaled)## Cl.thickness Cell.size Cell.shape Marg.adhesion
## Min. :-1.2098 Min. :-0.6965 Min. :-0.7420 Min. :-0.6412
## 1st Qu.:-0.8526 1st Qu.:-0.6965 1st Qu.:-0.7420 1st Qu.:-0.6412
## Median :-0.1384 Median :-0.6965 Median :-0.4080 Median :-0.6412
## Mean : 0.0000 Mean : 0.0000 Mean : 0.0000 Mean : 0.0000
## 3rd Qu.: 0.5759 3rd Qu.: 0.3760 3rd Qu.: 0.5941 3rd Qu.: 0.3986
## Max. : 2.0044 Max. : 2.2735 Max. : 2.2641 Max. : 2.4781
## Epith.c.size Bare.nuclei Bl.cromatin Normal.nucleoli
## Min. :-1.0044 Min. :-0.6958 Min. :-1.0008 Min. :-0.6099
## 1st Qu.:-0.5577 1st Qu.:-0.6958 1st Qu.:-0.5973 1st Qu.:-0.6099
## Median :-0.5577 Median :-0.6958 Median :-0.1938 Median :-0.6099
## Mean : 0.0000 Mean : 0.0000 Mean : 0.0000 Mean : 0.0000
## 3rd Qu.: 0.3359 3rd Qu.: 0.7337 3rd Qu.: 0.6131 3rd Qu.: 0.3650
## Max. : 3.0165 Max. : 1.7547 Max. : 2.6305 Max. : 2.3150
## Mitoses
## Min. :-0.3353
## 1st Qu.:-0.3353
## Median :-0.3353
## Mean : 0.0000
## 3rd Qu.:-0.3353
## Max. : 5.0118
Berdasarkan hasil standardisasi, seluruh sembilan variabel prediktor memiliki nilai rata-rata mendekati 0. Hal ini menunjukkan bahwa proses centering dan scaling berhasil dilakukan. Parameter standardisasi dihitung dari data latih, kemudian diterapkan pada data latih dan data uji agar skala seluruh variabel sebanding.
Pemodelan KNN dilakukan menggunakan lima variasi nilai \(K\), yaitu 3, 5, 7, 9, dan 11. Variasi tersebut digunakan untuk mengetahui pengaruh jumlah tetangga terdekat terhadap hasil klasifikasi. Penentuan kelas dilakukan berdasarkan mayoritas kelas dari tetangga terdekat.
# Menentukan nilai k
nilai_k <- c(3, 5, 7, 9, 11)
# Menyiapkan tempat hasil prediksi
hasil_prediksi <- list()
# Melakukan klasifikasi K-NN
for (k in nilai_k) {
prediksi <- knn(
train = X_train_scaled,
test = X_test_scaled,
cl = y_train,
k = k
)
hasil_prediksi[[as.character(k)]] <- prediksi
}
# Melihat hasil prediksi untuk k = 3
head(hasil_prediksi[["3"]])## [1] malignant benign malignant malignant benign benign
## Levels: benign malignant
Klasifikasi KNN dilakukan menggunakan lima nilai k, yaitu 3, 5, 7, 9 dan 11. Hasil prediksi disimpan dalam hasil_prediksi untuk setiap nilai k. Pada nilai k=3, enam data pertama diprediksi ke dalam kategori benign dan malignant.
Evaluasi model dilakukan menggunakan confusion matrix untuk memperoleh nilai Accuracy, Sensitivity dan Specificity.
# Menyiapkan tabel hasil evaluasi
hasil_evaluasi <- data.frame(
k = integer(),
Accuracy = numeric(),
Sensitivity = numeric(),
Specificity = numeric()
)
# Evaluasi setiap nilai k
for (k in nilai_k) {
prediksi <- hasil_prediksi[[as.character(k)]]
# Confusion matrix
cm <- confusionMatrix(
data = prediksi,
reference = y_test,
positive = "malignant"
)
# Mengambil nilai metrik
accuracy <- cm$overall["Accuracy"]
sensitivity <- cm$byClass["Sensitivity"]
specificity <- cm$byClass["Specificity"]
# Menyimpan hasil evaluasi
hasil_evaluasi <- rbind(
hasil_evaluasi,
data.frame(
k = k,
Accuracy = as.numeric(accuracy),
Sensitivity = as.numeric(sensitivity),
Specificity = as.numeric(specificity)
)
)
}
# Menampilkan tabel evaluasi
hasil_evaluasi## k Accuracy Sensitivity Specificity
## 1 3 0.9424460 0.9166667 0.956044
## 2 5 0.9568345 0.9375000 0.967033
## 3 7 0.9640288 0.9583333 0.967033
## 4 9 0.9640288 0.9583333 0.967033
## 5 11 0.9640288 0.9583333 0.967033
Berdasarkan hasil evaluasi, nilai k = 7, 9 dan 11 menghasilkan performa terbaik dengan accuracy sebesar 96,40%, sensitivity sebesar 95,83% dan specificity sebesar 96,70%. Ketiga nilai k tersebut memiliki hasil evaluasi yang sama dan lebih baik dibandingkan nilai k lainnya.
Model optimal ditentukan berdasarkan nilai Sensitivity tertinggi dengan mempertimbangkan Accuracy sebagai kriteria berikutnya. Pemilihan Sensitivity sebagai kriteria utama bertujuan meminimalkan kesalahan dalam mengidentifikasi tumor ganas (False Negative).
# Mengurutkan model berdasarkan Sensitivity
hasil_evaluasi %>%
arrange(desc(Sensitivity), desc(Accuracy))## k Accuracy Sensitivity Specificity
## 1 7 0.9640288 0.9583333 0.967033
## 2 9 0.9640288 0.9583333 0.967033
## 3 11 0.9640288 0.9583333 0.967033
## 4 5 0.9568345 0.9375000 0.967033
## 5 3 0.9424460 0.9166667 0.956044
# Model dengan Sensitivity tertinggi
model_optimal <- hasil_evaluasi %>%
arrange(desc(Sensitivity), desc(Accuracy)) %>%
slice(1)
model_optimal## k Accuracy Sensitivity Specificity
## 1 7 0.9640288 0.9583333 0.967033
Berdasarkan pengurutan nilai sensitivity dan accuracy, model optimal diperoleh pada k=7. Model ini memiliki accuracy sebesar 96,40%, sensitivity sebesar 95,83% dan specificity sebesar 96,70%. Nilai k=7 dipilih karena menjadi model pertama dengan performa tertinggi berdasarkan kriteria evaluasi yang digunakan.
Algoritma K-Nearest Neighbors (KNN) merupakan metode klasifikasi nonparametrik dalam supervised learning yang menentukan kelas suatu data berdasarkan mayoritas kelas dari \(k\) tetangga terdekat. Proses klasifikasi dilakukan dengan menghitung jarak antara data uji dan data latih.
Feature scaling penting dilakukan karena KNN menggunakan perhitungan jarak. Standardisasi dengan metode centering dan scaling membuat setiap variabel prediktor memiliki skala yang sebanding sehingga tidak ada variabel dengan rentang nilai besar yang mendominasi perhitungan jarak.
Implementasi KNN menggunakan bahasa R dilakukan melalui tahapan preprocessing data, pembagian data latih dan data uji, standardisasi, pemodelan, serta penyimpanan hasil prediksi untuk setiap nilai \(k\).
Evaluasi model dilakukan menggunakan Confusion Matrix dengan metrik Accuracy, Sensitivity, Specificity dan Positive Predictive Value (PPV). Metrik tersebut digunakan untuk mengukur ketepatan model dalam mengklasifikasikan data.
Optimasi hiperparameter dilakukan dengan menguji beberapa nilai \(k\) untuk memperoleh konfigurasi model yang sesuai. Performa setiap nilai \(k\) dapat dibandingkan melalui metrik evaluasi dan divisualisasikan menggunakan paket ggplot2 untuk melihat perubahan kinerja model.
Berdasarkan hasil analisis menggunakan metode K-Nearest Neighbor (KNN), diperoleh model optimal pada nilai k=7 dengan accuracy sebesar 96,40%, sensitivity sebesar 95,83% dan specificity sebesar 96,70%. Hasil tersebut menunjukkan bahwa model mampu mengklasifikasikan data ke dalam kategori benign dan malignant dengan tingkat ketepatan yang tinggi. Dengan demikian, nilai k=7 dipilih sebagai model terbaik dalam klasifikasi dataset BreastCancer.
Fransiska, H. (2026). Modul Praktikum Machine Learning and Modern Prediction. Laboratorium Matematika Universitas Bengkulu.
Cholil, S. R., Handayani, T., Prathivi, R., & Ardianita, T. (2021). Implementasi algoritma klasifikasi K-Nearest Neighbor (KNN) untuk klasifikasi seleksi penerima beasiswa. Indonesian Journal on Computer and Information Technology.
Daulay, R. S. A. (2024). Analisis kritis dan pengembangan algoritma K-Nearest Neighbor (KNN): Sebuah tinjauan literatur. Jurnal Pendidikan Sains dan Komputer.
Firdaus, A., & Sirodj, D. A. N. (2022). Perbandingan ukuran jarak pada algoritma K-Nearest Neighbor dalam analisis sentimen. Jurnal Statistika dan Matematika (Statmat).
Hadi, R., Suwirmayanti, N. L. G. P., Kusuma, I. G. N. A., Saryanti, I. G. A. D., & Novayanti, P. D. (2024). Implementasi metode normalisasi dan seleksi fitur dalam optimasi algoritma K-Nearest Neighbor (KNN) untuk klasifikasi data bank. Jurnal Nasional Komputasi dan Teknologi Informasi. ojs.serambimekkah.ac.id.
Permatasari, D., & Suliadi. (2024). Algoritma pemilihan variabel untuk klasifikasi dan penerapannya pada klasifikasi desa-kelurahan. Jurnal Riset Statistika.