library(mlbench)
library(rpart)
library(rpart.plot)
library(caret)
## Loading required package: ggplot2
## Loading required package: lattice
data("BostonHousing")
df <- BostonHousing

set.seed(1061)
idx <- createDataPartition(df$medv, p = 0.8, list = FALSE)
train <- df[idx, ]
test  <- df[-idx, ]
rmse <- function(y, yhat) sqrt(mean((y - yhat)^2))
mae  <- function(y, yhat) mean(abs(y - yhat))
r2   <- function(y, yhat) 1 - sum((y - yhat)^2) / sum((y - mean(y))^2)

Iterasi 1

vars1 <- c("rm", "lstat", "ptratio")

form1 <- as.formula(paste("medv ~", paste(vars1, collapse = "+")))

fit1 <- rpart(
  form1,
  data = train,
  method = "anova",
  control = rpart.control(cp = 0)
)

rpart.plot(fit1, main = "Tree Iterasi 1 - Before Pruning")

cp1 <- fit1$cptable
best_cp1 <- cp1[which.min(cp1[, "xerror"]), "CP"]

fit1_pruned <- prune(fit1, cp = best_cp1)

rpart.plot(fit1_pruned, main = "Tree Iterasi 1 - After Pruning")

pred1 <- predict(fit1_pruned, test)

data.frame(
  Iterasi = "1",
  RMSE = rmse(test$medv, pred1),
  MAE  = mae(test$medv, pred1),
  R2   = r2(test$medv, pred1)
)
##   Iterasi     RMSE     MAE        R2
## 1       1 5.385652 3.49815 0.7058459

Pada iterasi pertama, model menghasilkan kinerja terbaik dengan nilai RMSE sebesar 5,39, MAE sebesar 3,50, dan nilai R² sebesar 0,706. Hal ini menunjukkan bahwa model mampu menjelaskan sekitar 70,6% variasi data, serta memiliki kesalahan prediksi yang relatif kecil dibandingkan iterasi lainnya.

Iterasi 2

vars2 <- c("nox", "dis", "age")

form2 <- as.formula(paste("medv ~", paste(vars2, collapse = "+")))

fit2 <- rpart(
  form2,
  data = train,
  method = "anova",
  control = rpart.control(cp = 0)
)

rpart.plot(fit2, main = "Tree Iterasi 2 - Before Pruning")

cp2 <- fit2$cptable
best_cp2 <- cp2[which.min(cp2[, "xerror"]), "CP"]

fit2_pruned <- prune(fit2, cp = best_cp2)

rpart.plot(fit2_pruned, main = "Tree Iterasi 2 - After Pruning")

pred2 <- predict(fit2_pruned, test)

data.frame(
  Iterasi = "2",
  RMSE = rmse(test$medv, pred2),
  MAE  = mae(test$medv, pred2),
  R2   = r2(test$medv, pred2)
)
##   Iterasi     RMSE      MAE        R2
## 1       2 7.774333 5.155183 0.3870506

Pada iterasi kedua, kinerja model mengalami penurunan, ditandai dengan meningkatnya nilai RMSE menjadi 7,77 dan MAE menjadi 5,16, serta penurunan nilai R² menjadi 0,387. Hal ini menunjukkan bahwa kemampuan model dalam memprediksi data menurun dan kesalahan prediksi semakin besar.

Iterasi 3

vars3 <- c("tax", "rad", "crim")

form3 <- as.formula(paste("medv ~", paste(vars3, collapse = "+")))

fit3 <- rpart(
  form3,
  data = train,
  method = "anova",
  control = rpart.control(cp = 0)
)

rpart.plot(fit3, main = "Tree Iterasi 3 - Before Pruning")

cp3 <- fit3$cptable
best_cp3 <- cp3[which.min(cp3[, "xerror"]), "CP"]

fit3_pruned <- prune(fit3, cp = best_cp3)

rpart.plot(fit3_pruned, main = "Tree Iterasi 3 - After Pruning")

pred3 <- predict(fit3_pruned, test)

data.frame(
  Iterasi = "3",
  RMSE = rmse(test$medv, pred3),
  MAE  = mae(test$medv, pred3),
  R2   = r2(test$medv, pred3)
)
##   Iterasi    RMSE     MAE        R2
## 1       3 8.14454 5.57832 0.3272845

Selanjutnya, pada iterasi ketiga, performa model kembali menurun dengan nilai RMSE sebesar 8,14, MAE sebesar 5,58, dan nilai R² sebesar 0,327. Nilai ini menunjukkan bahwa hanya sekitar 32,7% variasi data yang dapat dijelaskan oleh model, sehingga akurasi prediksi menjadi yang terendah dibandingkan dua iterasi sebelumnya.

rbind(
  data.frame(Iterasi="1", RMSE=rmse(test$medv, pred1), MAE=mae(test$medv, pred1), R2=r2(test$medv, pred1)),
  data.frame(Iterasi="2", RMSE=rmse(test$medv, pred2), MAE=mae(test$medv, pred2), R2=r2(test$medv, pred2)),
  data.frame(Iterasi="3", RMSE=rmse(test$medv, pred3), MAE=mae(test$medv, pred3), R2=r2(test$medv, pred3))
)
##   Iterasi     RMSE      MAE        R2
## 1       1 5.385652 3.498150 0.7058459
## 2       2 7.774333 5.155183 0.3870506
## 3       3 8.144540 5.578320 0.3272845

Secara keseluruhan, iterasi pertama memberikan performa terbaik, ditunjukkan oleh nilai RMSE dan MAE yang paling kecil serta nilai R² yang paling besar.