Packages

library(readr)
library(MASS)
library(neuralnet)
library(nnet)
library(e1071)

Membuat Dataset

Dataset yang digunakan ini adalah Dataset penguins size sumbernya dari kaggle. Dataset ini berisi informasi tentang karakteristik fisik dari penguin yang ditemukan di beberapa pulau, Berikut adalah rincian dari tiap kolomnya:

  1. species: Spesies penguin (contoh: Adelie, Chinstrap, Gentoo).

  2. island: Nama pulau tempat penguin ditemukan (contoh: Torgersen, Biscoe, Dream).

  3. culmen_length_mm: Panjang paruh penguin dalam milimeter.

  4. culmen_depth_mm: Kedalaman paruh penguin dalam milimeter.

  5. flipper_length_mm: Panjang sirip penguin dalam milimeter.

  6. body_mass_g: Berat tubuh penguin dalam gram.

  7. sex: Jenis kelamin penguin (MALE atau FEMALE).

Label dalam dataset ini adalah “species”, karena merupakan kategori yang ingin diprediksi jika dataset digunakan untuk klasifikasi. Kolom ini berisi jenis spesies penguin, yaitu:

# Memanggil Data
penguins <- read.csv("C:/Users/priya/Downloads/penguins_size.csv", na.strings = c(".", "NA"))
View(penguins)

# Memindahkan Kolom Species ke Kolom Terakhir
penguins <- penguins[, c(setdiff(names(penguins), "species"), "species")]

# Cek data apakah ada missing value
colSums(is.na(penguins))
##            island  culmen_length_mm   culmen_depth_mm flipper_length_mm 
##                 0                 2                 2                 2 
##       body_mass_g               sex           species 
##                 2                11                 0
# Menghapus baris yang memiliki missing value di kolom sex
penguins <- penguins[!is.na(penguins$sex), ]
str(penguins)
## 'data.frame':    333 obs. of  7 variables:
##  $ island           : chr  "Torgersen" "Torgersen" "Torgersen" "Torgersen" ...
##  $ culmen_length_mm : num  39.1 39.5 40.3 36.7 39.3 38.9 39.2 41.1 38.6 34.6 ...
##  $ culmen_depth_mm  : num  18.7 17.4 18 19.3 20.6 17.8 19.6 17.6 21.2 21.1 ...
##  $ flipper_length_mm: int  181 186 195 193 190 181 195 182 191 198 ...
##  $ body_mass_g      : int  3750 3800 3250 3450 3650 3625 4675 3200 3800 4400 ...
##  $ sex              : chr  "MALE" "FEMALE" "FEMALE" "FEMALE" ...
##  $ species          : chr  "Adelie" "Adelie" "Adelie" "Adelie" ...

Pra-pemrosesan data untuk Machine Learning

Pada proses ini mengubah type data label ke numeric, untuk train data type data diubah ke factor supaya lebih optimal dalam menangani variabel kategori dalam bentuk factor dibandingkan numerik dan untuk test data type data dibuah ke numeric karena labelnya numeric dan supaya mempermudah perbandingan Y aktual dan Y predik.

set.seed(8758)
# Mengonversi label target menjadi numerik
penguins$species<- as.numeric(as.factor(penguins$species)) - 1

# Membagi data menjadi training dan testing
train_idx <- sample(1:nrow(penguins), 0.8 * nrow(penguins)) 
train_data <- penguins[train_idx, ] 
test_data <- penguins[-train_idx, ] 

head(train_data)
##        island culmen_length_mm culmen_depth_mm flipper_length_mm body_mass_g
## 324    Biscoe             49.1            15.0               228        5500
## 67     Biscoe             35.5            16.2               195        3350
## 129 Torgersen             39.0            17.1               191        3050
## 130 Torgersen             44.1            18.0               210        4000
## 60     Biscoe             37.6            19.1               194        3750
## 53     Biscoe             35.0            17.9               190        3450
##        sex species
## 324   MALE       2
## 67  FEMALE       0
## 129 FEMALE       0
## 130   MALE       0
## 60    MALE       0
## 53  FEMALE       0
head(test_data)
##       island culmen_length_mm culmen_depth_mm flipper_length_mm body_mass_g
## 1  Torgersen             39.1            18.7               181        3750
## 19 Torgersen             34.4            18.4               184        3325
## 22    Biscoe             37.7            18.7               180        3600
## 28    Biscoe             40.5            17.9               187        3200
## 32     Dream             37.2            18.1               178        3900
## 40     Dream             39.8            19.1               184        4650
##       sex species
## 1    MALE       0
## 19 FEMALE       0
## 22   MALE       0
## 28 FEMALE       0
## 32   MALE       0
## 40   MALE       0
train_data$species <- as.factor(train_data$species)
test_data$species <- as.numeric(as.character(test_data$species))

Membuat Model Neural Network

Membuat model NN dan menggunakannya untuk mengklasifikasikan spesies penguin berdasarkan fitur seperti panjang paruh, panjang sirip, dan berat tubuh

# Membuat model Neural Network
nn_model <- nnet(species~., data=train_data, size=5, decay=0.01, maxit=200)
## # weights:  58
## initial  value 285.513533 
## iter  10 value 280.344350
## iter  20 value 280.335010
## iter  30 value 268.201616
## iter  40 value 118.072041
## iter  50 value 111.746170
## iter  60 value 107.252303
## iter  70 value 69.220538
## iter  80 value 32.924455
## iter  90 value 11.909298
## iter 100 value 3.228946
## iter 110 value 2.179430
## iter 120 value 2.041640
## iter 130 value 2.022952
## iter 140 value 1.919427
## iter 150 value 1.732817
## iter 160 value 1.695771
## iter 170 value 1.694747
## iter 180 value 1.694623
## iter 190 value 1.694528
## iter 200 value 1.694521
## final  value 1.694521 
## stopped after 200 iterations
# size=5: Jumlah neuron dalam hidden layer
# decay=0.01: Regularisasi untuk menghindari overfitting
# maxit=200: Jumlah iterasi maksimum

# Melakukan prediksi pada data testing
predictions <- predict(nn_model, test_data[, -7], type = "class")

Membandingkan Y aktual dengan Y prediksi

Mengevaluasi hasil prediksi model NN dengan membandingkan label target (test_data$species) dengan hasil prediksi (predictions).

# Menampilkan hasil prediksi dalam bentuk tabel perbandingan dengan label asli
table(test_data$species, predictions)
##    predictions
##      0  1  2
##   0 28  0  0
##   1  1 12  0
##   2  0  0 26
compare <- data.frame(
  species = as.numeric(test_data$species), 
  predictions = as.numeric(predictions), 
  kategori = ifelse(test_data$species == predictions, "correct", "incorrect")
)
compare
##    species predictions  kategori
## 1        0           0   correct
## 2        0           0   correct
## 3        0           0   correct
## 4        0           0   correct
## 5        0           0   correct
## 6        0           0   correct
## 7        0           0   correct
## 8        0           0   correct
## 9        0           0   correct
## 10       0           0   correct
## 11       0           0   correct
## 12       0           0   correct
## 13       0           0   correct
## 14       0           0   correct
## 15       0           0   correct
## 16       0           0   correct
## 17       0           0   correct
## 18       0           0   correct
## 19       0           0   correct
## 20       0           0   correct
## 21       0           0   correct
## 22       0           0   correct
## 23       0           0   correct
## 24       0           0   correct
## 25       0           0   correct
## 26       0           0   correct
## 27       0           0   correct
## 28       0           0   correct
## 29       1           1   correct
## 30       1           1   correct
## 31       1           1   correct
## 32       1           1   correct
## 33       1           1   correct
## 34       1           1   correct
## 35       1           1   correct
## 36       1           1   correct
## 37       1           1   correct
## 38       1           1   correct
## 39       1           0 incorrect
## 40       1           1   correct
## 41       1           1   correct
## 42       2           2   correct
## 43       2           2   correct
## 44       2           2   correct
## 45       2           2   correct
## 46       2           2   correct
## 47       2           2   correct
## 48       2           2   correct
## 49       2           2   correct
## 50       2           2   correct
## 51       2           2   correct
## 52       2           2   correct
## 53       2           2   correct
## 54       2           2   correct
## 55       2           2   correct
## 56       2           2   correct
## 57       2           2   correct
## 58       2           2   correct
## 59       2           2   correct
## 60       2           2   correct
## 61       2           2   correct
## 62       2           2   correct
## 63       2           2   correct
## 64       2           2   correct
## 65       2           2   correct
## 66       2           2   correct
## 67       2           2   correct
akurasi <- sum(compare$kategori == "correct") / nrow(compare) * 100
akurasi
## [1] 98.50746

Membuat Model Support Vector Machines(SVM)

svm_model <- svm(species~., data = train_data, cost = 100, gamma = 1)
svm_pred <- predict(svm_model, test_data[,-7])

table(pred = svm_pred, true = test_data[,7])
##     true
## pred  0  1  2
##    0 27  0  0
##    1  1 13  0
##    2  0  0 26
compare1 <- data.frame(
  species = as.numeric(test_data$species),
  predictions = as.numeric(svm_pred) -1,
  kategori = ifelse(test_data$species == svm_pred, "correct", "incorrect")
)
compare1
##    species predictions  kategori
## 1        0           0   correct
## 2        0           0   correct
## 3        0           0   correct
## 4        0           0   correct
## 5        0           0   correct
## 6        0           0   correct
## 7        0           0   correct
## 8        0           0   correct
## 9        0           0   correct
## 10       0           0   correct
## 11       0           0   correct
## 12       0           0   correct
## 13       0           0   correct
## 14       0           0   correct
## 15       0           0   correct
## 16       0           0   correct
## 17       0           0   correct
## 18       0           0   correct
## 19       0           0   correct
## 20       0           0   correct
## 21       0           0   correct
## 22       0           0   correct
## 23       0           0   correct
## 24       0           0   correct
## 25       0           0   correct
## 26       0           1 incorrect
## 27       0           0   correct
## 28       0           0   correct
## 29       1           1   correct
## 30       1           1   correct
## 31       1           1   correct
## 32       1           1   correct
## 33       1           1   correct
## 34       1           1   correct
## 35       1           1   correct
## 36       1           1   correct
## 37       1           1   correct
## 38       1           1   correct
## 39       1           1   correct
## 40       1           1   correct
## 41       1           1   correct
## 42       2           2   correct
## 43       2           2   correct
## 44       2           2   correct
## 45       2           2   correct
## 46       2           2   correct
## 47       2           2   correct
## 48       2           2   correct
## 49       2           2   correct
## 50       2           2   correct
## 51       2           2   correct
## 52       2           2   correct
## 53       2           2   correct
## 54       2           2   correct
## 55       2           2   correct
## 56       2           2   correct
## 57       2           2   correct
## 58       2           2   correct
## 59       2           2   correct
## 60       2           2   correct
## 61       2           2   correct
## 62       2           2   correct
## 63       2           2   correct
## 64       2           2   correct
## 65       2           2   correct
## 66       2           2   correct
## 67       2           2   correct
akurasi <- sum(compare1$kategori == "correct") / nrow(compare) * 100
akurasi
## [1] 98.50746