library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.2     ✔ tibble    3.2.1
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.0.4     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(randomForest)
## randomForest 4.7-1.2
## Type rfNews() to see new features/changes/bug fixes.
## 
## Attaching package: 'randomForest'
## 
## The following object is masked from 'package:dplyr':
## 
##     combine
## 
## The following object is masked from 'package:ggplot2':
## 
##     margin
library(caret)
## Loading required package: lattice
## 
## Attaching package: 'caret'
## 
## The following object is masked from 'package:purrr':
## 
##     lift
library(readxl)
library(randomForest) #for random forest
library(e1071) # for SVM
library(rpart) # for decision tree
data_train <- read_excel("D:/file kuliah/datatraining.xlsx")
data_test <- read_excel("D:/file kuliah/datatesting.xlsx")
str(data_train)
## tibble [200 × 11] (S3: tbl_df/tbl/data.frame)
##  $ usia                : num [1:200] 15 19 15 15 16 18 16 16 15 21 ...
##  $ jenis_kelamin       : chr [1:200] "0" "0" "0" "1" ...
##  $ nilai_rata_rata     : num [1:200] 85.2 60.9 60.5 78.6 66.2 85.9 45.2 91.6 74.1 88.2 ...
##  $ dukungan_orang_tua  : chr [1:200] "1" "2" "2" "3" ...
##  $ fasilitas_belajar   : chr [1:200] "2" "3" "1" "2" ...
##  $ jam_belajar_per_hari: num [1:200] 4.1 3.8 6.1 5.1 5.5 3.7 2.8 6.2 4.6 3 ...
##  $ kehadiran_persen    : num [1:200] 79.7 89.8 86.7 78.5 81 85.4 78.9 78.1 96.8 82.1 ...
##  $ minat_pada_pelajaran: chr [1:200] "2" "2" "1" "3" ...
##  $ kesulitan_ekonomi   : chr [1:200] "0" "1" "1" "1" ...
##  $ jarak_rumah_sekolah : num [1:200] 11.5 6.3 15.9 9.8 3.5 1 6.4 4.9 6.5 9.5 ...
##  $ motivasi_belajar    : chr [1:200] "1" "2" "1" "2" ...
str(data_test)
## tibble [15 × 10] (S3: tbl_df/tbl/data.frame)
##  $ usia                : num [1:15] 15 19 17 20 16 21 21 19 17 18 ...
##  $ jenis_kelamin       : chr [1:15] "1" "0" "0" "1" ...
##  $ nilai_rata_rata     : num [1:15] 90.2 79.6 66.9 85.6 65.9 70.8 86.3 84.3 79.5 74.4 ...
##  $ dukungan_orang_tua  : chr [1:15] "2" "1" "2" "3" ...
##  $ fasilitas_belajar   : chr [1:15] "2" "1" "3" "1" ...
##  $ jam_belajar_per_hari: num [1:15] 5.4 4.6 2.9 3.9 5.3 1.9 4.4 1.5 2 5.5 ...
##  $ kehadiran_persen    : num [1:15] 78.3 88.2 76.3 89.4 74 100 100 92.1 84.5 90.3 ...
##  $ minat_pada_pelajaran: chr [1:15] "2" "3" "1" "1" ...
##  $ kesulitan_ekonomi   : chr [1:15] "1" "0" "0" "0" ...
##  $ jarak_rumah_sekolah : num [1:15] 4.7 10.8 11.8 5.7 3.1 7.1 8.2 5.4 4.2 10.7 ...
# Ubah tipe kolom yang sesuai
factor_cols <- c("jenis_kelamin", "dukungan_orang_tua", "fasilitas_belajar", 
                 "minat_pada_pelajaran", "kesulitan_ekonomi", "motivasi_belajar")

data_train[factor_cols] <- lapply(data_train[factor_cols], as.factor)

# Untuk data testing, tanpa motivasi_belajar
factor_cols_test <- setdiff(factor_cols, "motivasi_belajar")
data_test[factor_cols_test] <- lapply(data_test[factor_cols_test], as.factor)

# Konfirmasi perubahan
str(data_train)
## tibble [200 × 11] (S3: tbl_df/tbl/data.frame)
##  $ usia                : num [1:200] 15 19 15 15 16 18 16 16 15 21 ...
##  $ jenis_kelamin       : Factor w/ 2 levels "0","1": 1 1 1 2 2 2 2 1 2 2 ...
##  $ nilai_rata_rata     : num [1:200] 85.2 60.9 60.5 78.6 66.2 85.9 45.2 91.6 74.1 88.2 ...
##  $ dukungan_orang_tua  : Factor w/ 3 levels "1","2","3": 1 2 2 3 2 2 1 2 2 3 ...
##  $ fasilitas_belajar   : Factor w/ 3 levels "1","2","3": 2 3 1 2 1 1 3 2 1 3 ...
##  $ jam_belajar_per_hari: num [1:200] 4.1 3.8 6.1 5.1 5.5 3.7 2.8 6.2 4.6 3 ...
##  $ kehadiran_persen    : num [1:200] 79.7 89.8 86.7 78.5 81 85.4 78.9 78.1 96.8 82.1 ...
##  $ minat_pada_pelajaran: Factor w/ 3 levels "1","2","3": 2 2 1 3 1 2 1 2 2 3 ...
##  $ kesulitan_ekonomi   : Factor w/ 2 levels "0","1": 1 2 2 2 2 2 1 1 1 2 ...
##  $ jarak_rumah_sekolah : num [1:200] 11.5 6.3 15.9 9.8 3.5 1 6.4 4.9 6.5 9.5 ...
##  $ motivasi_belajar    : Factor w/ 3 levels "1","2","3": 1 2 1 2 1 1 1 2 1 3 ...
library(randomForest)

# Latih model dengan semua variabel kecuali motivasi_belajar sebagai target
model_rf <- randomForest(motivasi_belajar ~ ., data = data_train, ntree = 100, importance = TRUE)

# Lihat ringkasan model
print(model_rf)
## 
## Call:
##  randomForest(formula = motivasi_belajar ~ ., data = data_train,      ntree = 100, importance = TRUE) 
##                Type of random forest: classification
##                      Number of trees: 100
## No. of variables tried at each split: 3
## 
##         OOB estimate of  error rate: 29%
## Confusion matrix:
##    1  2 3 class.error
## 1 55 26 0   0.3209877
## 2 17 87 1   0.1714286
## 3  0 14 0   1.0000000
library(e1071)

# Latih model SVM dengan kernel radial (default)
model_svm <- svm(motivasi_belajar ~ ., data = data_train, kernel = "radial")

# Lihat ringkasan model
summary(model_svm)
## 
## Call:
## svm(formula = motivasi_belajar ~ ., data = data_train, kernel = "radial")
## 
## 
## Parameters:
##    SVM-Type:  C-classification 
##  SVM-Kernel:  radial 
##        cost:  1 
## 
## Number of Support Vectors:  177
## 
##  ( 69 94 14 )
## 
## 
## Number of Classes:  3 
## 
## Levels: 
##  1 2 3
library(rpart)

# Latih model decision tree
model_dt <- rpart(motivasi_belajar ~ ., data = data_train, method = "class")

# Lihat ringkasan model
printcp(model_dt)
## 
## Classification tree:
## rpart(formula = motivasi_belajar ~ ., data = data_train, method = "class")
## 
## Variables actually used in tree construction:
## [1] dukungan_orang_tua   fasilitas_belajar    jam_belajar_per_hari
## [4] kehadiran_persen     kesulitan_ekonomi    nilai_rata_rata     
## 
## Root node error: 95/200 = 0.475
## 
## n= 200 
## 
##         CP nsplit rel error  xerror     xstd
## 1 0.178947      0   1.00000 1.00000 0.074339
## 2 0.115789      1   0.82105 1.07368 0.074417
## 3 0.052632      2   0.70526 0.84211 0.072928
## 4 0.042105      3   0.65263 0.88421 0.073473
## 5 0.015789      4   0.61053 0.89474 0.073590
## 6 0.010526      6   0.57895 0.88421 0.073473
## 7 0.010000      8   0.55789 0.88421 0.073473
# Visualisasi opsional
library(rpart.plot)
rpart.plot(model_dt)

# Mengubah kolom kategorikal menjadi factor
kategori_vars <- c("jenis_kelamin", "dukungan_orang_tua", "fasilitas_belajar", 
                   "minat_pada_pelajaran", "kesulitan_ekonomi", "motivasi_belajar")
data_train[kategori_vars] <- lapply(data_train[kategori_vars], as.factor)
data_test[kategori_vars[-6]] <- lapply(data_test[kategori_vars[-6]], as.factor)  # Tanpa motivasi_belajar
model_rf <- randomForest(motivasi_belajar ~ ., data = data_train, ntree = 100)
pred_rf <- predict(model_rf, newdata = data_test)
# Pastikan target adalah faktor
library(e1071)
model_svm <- svm(motivasi_belajar ~ ., data = data_train, kernel = "radial")
pred_svm <- predict(model_svm, newdata = data_test)
library(rpart)
model_dt <- rpart(motivasi_belajar ~ ., data = data_train, method = "class")
pred_dt <- predict(model_dt, newdata = data_test, type = "class")
hasil_prediksi <- data_test
hasil_prediksi$pred_rf <- pred_rf
hasil_prediksi$pred_svm <- pred_svm
hasil_prediksi$pred_dt <- pred_dt

# Tampilkan
print(hasil_prediksi[, c("pred_rf", "pred_svm", "pred_dt")])
## # A tibble: 15 × 3
##    pred_rf pred_svm pred_dt
##    <fct>   <fct>    <fct>  
##  1 2       2        2      
##  2 2       2        2      
##  3 1       1        1      
##  4 2       2        2      
##  5 1       1        1      
##  6 2       2        2      
##  7 2       2        2      
##  8 2       2        3      
##  9 2       2        1      
## 10 2       2        2      
## 11 1       1        2      
## 12 1       1        1      
## 13 2       2        1      
## 14 2       1        2      
## 15 1       1        1