Latihan S3
# Membuat data
Tanaman <- c("A","A","A","B","B","C","C")
X1 <- c(6,8,5,2,2,1,3)
X2 <- c(2,3,2,4,5,6,7)
X3 <- c(7,6,9,1,2,5,8)
data <- data.frame(Tanaman, X1, X2, X3)
data
## Tanaman X1 X2 X3
## 1 A 6 2 7
## 2 A 8 3 6
## 3 A 5 2 9
## 4 B 2 4 1
## 5 B 2 5 2
## 6 C 1 6 5
## 7 C 3 7 8
# Data ekstrak yang akan diklasifikasikan
data_baru <- data.frame(X1 = 4, X2 = 3, X3 = 8)
# Menghitung jarak Euclidean
jarak <- sqrt(
(data$X1 - data_baru$X1)^2 +
(data$X2 - data_baru$X2)^2 +
(data$X3 - data_baru$X3)^2
)
# Membuat tabel jarak
hasil_jarak <- data.frame(
Tanaman = data$Tanaman,
X1 = data$X1,
X2 = data$X2,
X3 = data$X3,
Jarak = jarak
)
# Mengurutkan jarak dari yang terkecil
hasil_jarak <- hasil_jarak[order(hasil_jarak$Jarak), ]
hasil_jarak
## Tanaman X1 X2 X3 Jarak
## 3 A 5 2 9 1.732051
## 1 A 6 2 7 2.449490
## 7 C 3 7 8 4.123106
## 2 A 8 3 6 4.472136
## 6 C 1 6 5 5.196152
## 5 B 2 5 2 6.633250
## 4 B 2 4 1 7.348469
# Bagian (a)
# KNN dengan k = 3
# Mengambil 3 tetangga terdekat
tetangga_3 <- hasil_jarak[1:3, ]
tetangga_3
## Tanaman X1 X2 X3 Jarak
## 3 A 5 2 9 1.732051
## 1 A 6 2 7 2.449490
## 7 C 3 7 8 4.123106
# Menentukan kelas berdasarkan suara terbanyak
table(tetangga_3$Tanaman)
##
## A C
## 2 1
hasil_a <- names(
which.max(table(tetangga_3$Tanaman))
)
hasil_a
## [1] "A"
# Bagian (b)
# Menentukan nilai k optimum
# Menguji nilai k = 1 sampai 6
akurasi <- numeric(6)
for (k in 1:6) {
prediksi <- character(7)
for (i in 1:7) {
data_train <- data[-i, ]
data_test <- data[i, ]
jarak_train <- sqrt(
(data_train$X1 - data_test$X1)^2 +
(data_train$X2 - data_test$X2)^2 +
(data_train$X3 - data_test$X3)^2
)
urutan <- order(jarak_train)
tetangga <- data_train$Tanaman[urutan[1:k]]
prediksi[i] <- names(
which.max(table(tetangga))
)
}
akurasi[k] <- mean(prediksi == data$Tanaman)
}
# Menampilkan akurasi setiap k
hasil_k <- data.frame(
k = 1:6,
Akurasi = akurasi
)
hasil_k
## k Akurasi
## 1 1 0.8571429
## 2 2 0.7142857
## 3 3 0.4285714
## 4 4 0.4285714
## 5 5 0.4285714
## 6 6 0.4285714
# Menentukan k optimum
k_optimum <- which.max(akurasi)
k_optimum
## [1] 1
# Mengklasifikasikan data baru dengan k optimum
urutan_baru <- order(jarak)
tetangga_optimum <- data$Tanaman[
urutan_baru[1:k_optimum]
]
tetangga_optimum
## [1] "A"
# Menentukan hasil klasifikasi
hasil_b <- names(
which.max(table(tetangga_optimum))
)
hasil_b
## [1] "A"