# Load Data
data <- read.csv("dataset1.csv")
# Cek data
head(data)
## N P K pH EC OC S Zn Fe Cu Mn B Output
## 1 138 8.6 560 7.46 0.62 0.70 5.9 0.24 0.31 0.77 8.71 0.11 0
## 2 213 7.5 338 7.62 0.75 1.06 25.4 0.30 0.86 1.54 2.89 2.29 0
## 3 163 9.6 718 7.59 0.51 1.11 14.3 0.30 0.86 1.57 2.70 2.03 0
## 4 157 6.8 475 7.64 0.58 0.94 26.0 0.34 0.54 1.53 2.65 1.82 0
## 5 270 9.9 444 7.63 0.40 0.86 11.8 0.25 0.76 1.69 2.43 2.26 1
## 6 220 8.6 444 7.43 0.65 0.72 11.7 0.37 0.66 0.90 2.19 1.82 0
# Cek jumlah baris
nrow(data)
## [1] 880
# Cek nama kolom
names(data)
## [1] "N" "P" "K" "pH" "EC" "OC" "S" "Zn"
## [9] "Fe" "Cu" "Mn" "B" "Output"
# Tampilkan seluruh isi
View(data) # Tampil di jendela baru
library(caTools) #library untuk pembagian dataset
## Warning: package 'caTools' was built under R version 4.4.3
set.seed(123)
# Split data: 80% training, 20% testing
split <- sample.split(data, SplitRatio = 0.8)
training_set <- subset(data,split==TRUE) # Dataset Training
test_set <- subset(data,split==FALSE) # Datset Testing
dim(training_set) # Dimensi data training
## [1] 677 13
dim(test_set) # Dimensi data testing
## [1] 203 13
topredict_set<-test_set[, -13] # Menghapus Target Output
dim(topredict_set)
## [1] 203 12
library(randomForest)
## Warning: package 'randomForest' was built under R version 4.4.3
## randomForest 4.7-1.2
## Type rfNews() to see new features/changes/bug fixes.
#Mengubah data output sebagai faktor untuk klasifikasi dengan ketentuan, 0 = rendah, 1 = sedang, 2 = baik
training_set$Output <- as.factor(training_set$Output)
test_set$Output <- as.factor(test_set$Output)
# Cek distribusi kelas di training set
table(training_set$Output)
##
## 0 1 2
## 316 326 35
# Cek distribusi kelas di test set
table(test_set$Output)
##
## 0 1 2
## 85 114 4
#Dari hasil distribusi kelas, terlihat bahwa jumlah data variabel “2” tidak seimbang sehingga perlu menyeimbangkan jumlah data
library(dplyr)
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:randomForest':
##
## combine
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
# Pisahkan setiap kelas
class_0 <- training_set %>% filter(Output == 0)
class_1 <- training_set %>% filter(Output == 1)
class_2 <- training_set %>% filter(Output == 2)
# Tentukan berapa banyak data yang ingin diubah ke kelas 2
n_to_convert <- 300 # misalnya ambil 100 dari kelas 0 dan 100 dari kelas 1
# Ambil data dari kelas 0 dan 1
set.seed(123)
class_0_to_2 <- class_0 %>% slice_sample(n = 150)
class_1_to_2 <- class_1 %>% slice_sample(n = 150)
# Ubah label menjadi 2
class_0_to_2$Output <- 2
class_1_to_2$Output <- 2
class_0$Output <- as.factor(class_0$Output)
class_0_to_2$Output <- as.factor(class_0_to_2$Output)
class_1$Output <- as.factor(class_1$Output)
class_1_to_2$Output <- as.factor(class_1_to_2$Output)
# Buat ulang kelas 0 dan 1 tanpa yang sudah diambil
class_0_remain <- anti_join(class_0, class_0_to_2)
## Joining with `by = join_by(N, P, K, pH, EC, OC, S, Zn, Fe, Cu, Mn, B, Output)`
class_1_remain <- anti_join(class_1, class_1_to_2)
## Joining with `by = join_by(N, P, K, pH, EC, OC, S, Zn, Fe, Cu, Mn, B, Output)`
# Gabungkan semua jadi dataset baru
training_balanced <- bind_rows(class_0_remain, class_1_remain, class_2, class_0_to_2, class_1_to_2)
# Cek distribusi setelah penyesuaian
table(training_balanced$Output)
##
## 0 1 2
## 316 326 335
model_rf <- randomForest(Output ~ ., data = training_balanced, importance=TRUE, ntree = 100) # Implementasi Random Forest
preds_rf <- predict(model_rf, topredict_set)
(conf_matrix_forest <- table(preds_rf, test_set$Output))
##
## preds_rf 0 1 2
## 0 83 9 0
## 1 2 100 3
## 2 0 5 1
#Dari hasil Confusion Matrix menunjukkan bahwa pengklasifikasian menggunakan Random Forest memprediksi 83 kasus kualitas tanah rendah dengan benar dan 9 prediksi salah. Demikian pula, Random Forest memprediksi 100 kasus kualitas tanah cukup dengan benar dan 2 prediksi salah sebenarnya kualitas tanah rendah, serta 3 prediksi salah sebenarnya kualitas tanah baik. Kemudian Random Forest memprediksi 1 kasus kualitas tanah baik dengan benar dan 5 prediksi salah sebenarnya kualitas tanah cukup.
#Berikut adalah script untuk mengetahui akurasi dari Metode Klasifikasi Random Forest.
library(caret)
## Warning: package 'caret' was built under R version 4.4.3
## Loading required package: ggplot2
##
## Attaching package: 'ggplot2'
## The following object is masked from 'package:randomForest':
##
## margin
## Loading required package: lattice
confusionMatrix(conf_matrix_forest)
## Confusion Matrix and Statistics
##
##
## preds_rf 0 1 2
## 0 83 9 0
## 1 2 100 3
## 2 0 5 1
##
## Overall Statistics
##
## Accuracy : 0.9064
## 95% CI : (0.8577, 0.9427)
## No Information Rate : 0.5616
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 0.8197
##
## Mcnemar's Test P-Value : NA
##
## Statistics by Class:
##
## Class: 0 Class: 1 Class: 2
## Sensitivity 0.9765 0.8772 0.250000
## Specificity 0.9237 0.9438 0.974874
## Pos Pred Value 0.9022 0.9524 0.166667
## Neg Pred Value 0.9820 0.8571 0.984772
## Prevalence 0.4187 0.5616 0.019704
## Detection Rate 0.4089 0.4926 0.004926
## Detection Prevalence 0.4532 0.5172 0.029557
## Balanced Accuracy 0.9501 0.9105 0.612437
#Hasil menunjukkan untuk keakuratan metode Random Forest untuk memprediksi kualitas tanah sebesar 90.64%