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)
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.
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.
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.