Andaikan dipunyai data seperti berikut,
X1 —– X2 —– Keputusan
3 —– 4 —– Ya
1 —– 3 —– Ya
3 —– 3 —– Ya
3 —– 7 —– Ya
4 —– 1 —– Ya
6 —– 5 —– Ya
5 —– 6 —– Ya
3 —– 7 —– Ya
6 —– 2 —– Ya
7 —– 4 —– Ya
4 —– 6 —– Tidak
4 —– 4 —– Tidak
5 —– 8 —– Tidak
7 —– 8 —– Tidak
5 —– 6 —– Tidak
10 —– 5 —– Tidak
4 —– 10 —– Tidak
7 —– 6 —– Tidak
5 —– 4 —– Tidak
8 —– 5 —– Tidak
6 —– 6 —– Tidak
7 —– 4 —– Tidak
8 —– 8 —– Tidak
9 —– 7 —– Tidak
6 —– 5 —– ?
dengan baris terakhir adalah data baru yang akan dicari kelasnya.
Andaikan dipilih K= 8 (artinya akan digunakan 8 titik data persekitaran) sebagai parameter dalam algoritma ini. Kemudian dihitung jarak kuadrat antara titik data yang ditanyakan dengan seluruh data pelatihan. Contoh baris pertama adalah jarak kuadrat (3,4) ke (6,5) yakni (3-6)^2 + (4-5)^2 = 3^2 + 1^2 = 10.
Langkah berikutnya adalah mencari K= 8 titik-titik data persekitaran. Kita masukkan data pelatihan sebagai persekitaran terdekat jika jarak antara data pelatihan dengan titik data yang ditanyakan mempunyai nilai jarak terkecil yang berada dalam 8 titik persekitaran. Dengan kata lain, jarak yang mempunyai nilai terkecil akan diurutkan sampai dengan 8 titik data persekitaran.
Jarak — Keputusan
10 —– Ya
29 —– Ya
13 —– Ya
13 —– Ya
20 —– Ya
0 —– Ya (Masuk)
2 —– Ya (Masuk)
13 —– Ya
9 —– Ya
2 —– Ya (Masuk)
5 —– Tidak
5 —– Tidak
10 —– Tidak
10 —– Tidak
2 —– Tidak (Masuk)
16 —– Tidak
29 —– Tidak
2 —– Tidak (Masuk)
2 —– Tidak (Masuk)
4 —– Tidak
1 —– Tidak (Masuk)
2 —– Tidak (Masuk)
13 —– Tidak
13 —– Tidak
Hasil prediksi dari KNN didasarkan pada jumlah terbanyak yang terdapat pada 8 persekitaran tersebut, pada contoh diatas jumlah “Ya” adalah 3 dan jumlah “Tidak” adalah 5 sehingga “data baru”" yang ditanyakan ditetapkan sebagai “Tidak”.
sehingga peluang “data baru”" adalah “Tidak”" sebesar 5/8 = 0.625
Jika dimisalkan dalam 8 persekitaran mempunyai jumlah “Ya” dan “Tidak” adalah sama maka kita dapat memilih secara bebas salah satu prediksi. Dalam contoh diatas nilai dari Y memuat data kategorik dan hasil prediksi diperkirakan dengan menggunakan jumlah terbanyak dalam persekitaran tersebut. Jika nilai Y adalah kuantitatif, maka dapat kita ambil nilai rata-rata tengahnya atau median sebagai hasil prediksi.
library(class)
X1<-c(3,1,3,3,4,6,5,3,6,7,4,4,5,7,5,10,4,7,5,8,6,7,8,9)
X2<-c(4,3,3,7,1,5,6,7,2,4,6,4,8,8,6,5,10,6,4,5,6,4,8,7)
X<-cbind(X1,X2)
X
## X1 X2
## [1,] 3 4
## [2,] 1 3
## [3,] 3 3
## [4,] 3 7
## [5,] 4 1
## [6,] 6 5
## [7,] 5 6
## [8,] 3 7
## [9,] 6 2
## [10,] 7 4
## [11,] 4 6
## [12,] 4 4
## [13,] 5 8
## [14,] 7 8
## [15,] 5 6
## [16,] 10 5
## [17,] 4 10
## [18,] 7 6
## [19,] 5 4
## [20,] 8 5
## [21,] 6 6
## [22,] 7 4
## [23,] 8 8
## [24,] 9 7
kemudian kita masukkan variabel keputusan sebagai target klasifikasi
keputusan<-factor(c(rep("ya",10),rep("tidak",14)))
keputusan
## [1] ya ya ya ya ya ya ya ya ya ya tidak
## [12] tidak tidak tidak tidak tidak tidak tidak tidak tidak tidak tidak
## [23] tidak tidak
## Levels: tidak ya
kemudian kita masukkan juga data baru (6, 5)
databaru<-cbind(6,5)
databaru
## [,1] [,2]
## [1,] 6 5
hasil1<-knn(X,databaru,keputusan,k=8)
hasil1
## [1] tidak
## Levels: tidak ya
Untuk k=8 persekitaran maka didapatkan keputusannya adalah “tidak”. Untuk mengetahui besarnya probabilitas databaru dengan keputusan “tidak” digunakan tambahan peritnah (prob=T) seperti berikut,
hasil2<-knn(X,databaru,keputusan,k=8,prob=T)
hasil2
## [1] tidak
## attr(,"prob")
## [1] 0.625
## Levels: tidak ya
Didapatkan nilai probabilitas = 0.625 untuk k=8 persekitaran. sama seperti perhitungan manual diatas. Untuk nilai k persekitaran yang lain dapat kita cobakan skrip berikut, untuk k=1 persekitaran
hasil3<-knn(X,databaru,keputusan,k=1,prob=T)
hasil3
## [1] ya
## attr(,"prob")
## [1] 1
## Levels: tidak ya
Didapatkan nilai probabilitas = 1 untuk k=1 persekitaran. Hal ini dikarenakan ada nilai dalam data asli yaitu (6,5) dengan keputusan ‘Ya’ yang sama persis dengan data yang dicari yakni (6,5).
Sehingga kita bisa menentukan berapa banyak persekitaran yang akan digunakan dan besaran probabilitasnya.
Berikut akan dicobakan dengan data yang terdapat dalam R. Data yang digunakan adalah data bunga iris. (lihat help(iris)).
Data bunga iris terdiri dari 150 data bunga iris yang diukur menurut panjang dan lebar kelopak bunganya serta panjang dan lebar kuncup bunganya (sepal dan petal) dengan 3 species yang berbeda yakni 50 bunga iris ‘setosa’, 50 bunga iris ‘versicolor’ dan 50 bunga iris ‘virginica’.
iris.kelas<-c(rep("s",50),rep("c",50),rep("v",50))
perintah diatas adalah membuat terlebih dahulu kelas data sebagai targetnya.
data(iris)
head(iris)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
nampak 6 data iris perama (perintah ‘head’) terdapat 5 variabel yakni sepal.length sepal.width, petal.length petal.width serta spesiesnya masing-masing
iris.data<-data.frame(iris[,1:4],species=iris.kelas)
dalam contoh kali ini, data iris akan diambil 4 variabel pertamanya saja, sementara variabel spesiesnya diganti dengan iris.kelas
ganjil<-2*(1:75)-1
iris.latihan<-iris.data[ganjil,]
perintah diatas digunakan untuk mengambil urutan data iris bernomor ganjil saja yang akan digunakan sebagai data pelatihan
iris.uji<-iris.data[-ganjil,]
sedangkan sisanya, data bernomor genap atau (-ganjil) digunakan sebagai data uji.
hasil.iris.knn<-knn(iris.latihan[,-5],iris.uji[,-5],iris.latihan[,5],k=5)
pada perintah knn urutan syntax yang dipakai adalah
knn(data.latihan, data.uji, target.kelas, banyak.kelas, probabilitas= T atau F),
sehingga pada data latihan dan data uji tidak disertakan target spesiesnya ([,-5]), namun diletakkan tersendiri pada target.kelas yakni perintah iris.latihan[,5].
hasil.iris.knn
## [1] s s s s s s s s s s s s s s s s s s s s s s s s s c c c c c c c c c c
## [36] c c c c c c v c c c c c c c c v v v v v v v v v v v v v v v v v v v v
## [71] v v v v v
## Levels: c s v
kemudian untuk memudahkan melihat hasilnya dapat kita tampilkan dalam bentuk tabel hasil klasifikasi seperti berikut
(table(hasil.iris.knn,iris.uji[,5]))
##
## hasil.iris.knn c s v
## c 24 0 0
## s 0 25 0
## v 1 0 25
nampak bahwa terdapat satu bunga spesies c atau versicolor yang tidak sesuai dan masuk menjadi spesies v atau virginica. Dengan demikian terdapat misklasifikasi sebesar 1/75.
untuk melihat plot hasil klasifikasi dapat menggunakan perintah berikut
pairs(iris.uji[,1:4],pch=as.character(iris.uji[,5]),col=c(3,2)
[(iris.uji$species!=hasil.iris.knn)+1])
dari plot pasangan variabel diatas nampak bahwa ada satu warna merah dari spesies c atau versicolor yang tidak sesuai klasifikasinya.
semoga bermanfaat
Salam
RB Fajriya Hakim
Department of Statistics Universitas Islam Indonesia
email: hakimf@uii.ac.id