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"