Name : Naufal Akmal Rizqulloh
NIM : G6401231065
Day, Date (PRactice) : Wednesday, 23 September 2026
(4)
Teacher : Dr. Bagus Sartono, S.Si, M.Si
Grade :
Memuat package dan data yang diperlukan, serta menangani missing values.
library(ISLR2)
library(tidyverse)
library(broom)
library(car)
library(leaps)
data("Hitters")
hitters <- Hitters %>% drop_na()
Membuat model regresi linear berganda dengan semua prediktor yang ada
pada dataset hitters.
mod_full_all <- lm(Salary ~ ., data = hitters)
summary(mod_full_all)
##
## Call:
## lm(formula = Salary ~ ., data = hitters)
##
## Residuals:
## Min 1Q Median 3Q Max
## -907.62 -178.35 -31.11 139.09 1877.04
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 163.10359 90.77854 1.797 0.073622 .
## AtBat -1.97987 0.63398 -3.123 0.002008 **
## Hits 7.50077 2.37753 3.155 0.001808 **
## HmRun 4.33088 6.20145 0.698 0.485616
## Runs -2.37621 2.98076 -0.797 0.426122
## RBI -1.04496 2.60088 -0.402 0.688204
## Walks 6.23129 1.82850 3.408 0.000766 ***
## Years -3.48905 12.41219 -0.281 0.778874
## CAtBat -0.17134 0.13524 -1.267 0.206380
## CHits 0.13399 0.67455 0.199 0.842713
## CHmRun -0.17286 1.61724 -0.107 0.914967
## CRuns 1.45430 0.75046 1.938 0.053795 .
## CRBI 0.80771 0.69262 1.166 0.244691
## CWalks -0.81157 0.32808 -2.474 0.014057 *
## LeagueN 62.59942 79.26140 0.790 0.430424
## DivisionW -116.84925 40.36695 -2.895 0.004141 **
## PutOuts 0.28189 0.07744 3.640 0.000333 ***
## Assists 0.37107 0.22120 1.678 0.094723 .
## Errors -3.36076 4.39163 -0.765 0.444857
## NewLeagueN -24.76233 79.00263 -0.313 0.754218
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 315.6 on 243 degrees of freedom
## Multiple R-squared: 0.5461, Adjusted R-squared: 0.5106
## F-statistic: 15.39 on 19 and 243 DF, p-value: < 2.2e-16
Melakukan backward selection menggunakan fungsi
regsubsets dengan kriteria evaluasi model hingga 19
prediktor (maksimal).
reg_backward_all <- regsubsets(Salary ~ ., data = hitters, method = "backward", nvmax = 19)
summary_backward_all <- summary(reg_backward_all)
Melakukan forward selection menggunakan fungsi
regsubsets.
reg_forward_all <- regsubsets(Salary ~ ., data = hitters, method = "forward", nvmax = 19)
summary_forward_all <- summary(reg_forward_all)
Mencari jumlah variabel dengan nilai BIC terkecil untuk masing-masing metode (backward dan forward).
# Backward Selection berdasarkan BIC terkecil
best_backward_all <- which.min(summary_backward_all$bic)
cat("Jumlah prediktor terbaik (Backward):", best_backward_all, "\n")
## Jumlah prediktor terbaik (Backward): 8
coef(reg_backward_all, id = best_backward_all)
## (Intercept) AtBat Hits Walks CRuns CRBI
## 117.1520434 -2.0339209 6.8549136 6.4406642 0.7045391 0.5273238
## CWalks DivisionW PutOuts
## -0.8066062 -123.7798366 0.2753892
# Forward Selection berdasarkan BIC terkecil
best_forward_all <- which.min(summary_forward_all$bic)
cat("Jumlah prediktor terbaik (Forward):", best_forward_all, "\n")
## Jumlah prediktor terbaik (Forward): 6
coef(reg_forward_all, id = best_forward_all)
## (Intercept) AtBat Hits Walks CRBI DivisionW
## 91.5117981 -1.8685892 7.6043976 3.6976468 0.6430169 -122.9515338
## PutOuts
## 0.2643076
Berdasarkan hasil pemodelan menggunakan kriteria nilai BIC terkecil, dapat dilihat perbandingan variabel yang terpilih:
AtBat, Hits, Walks,
CRBI, DivisionW, PutOuts.AtBat, Hits, Walks,
CRuns, CRBI, CWalks,
DivisionW, PutOuts.Keduanya memilih variabel utama yang sama, namun backward
selection menyertakan 2 variabel ekstra yaitu CRuns
dan CWalks. Hal ini bisa terjadi karena metode komputasinya
yang berbeda arah dalam mengeliminasi/menambahkan variabel.
Kita akan menggunakan model dari hasil Backward Selection (8 prediktor) untuk melakukan uji diagnostik.
# Membangun ulang model regresi linear berdasarkan hasil backward selection (8 prediktor)
mod_final <- lm(Salary ~ AtBat + Hits + Walks + CRuns + CRBI + CWalks + Division + PutOuts, data = hitters)
# Menampilkan 4 plot asumsi dasar secara simultan
par(mfrow = c(2, 2))
plot(mod_final)
par(mfrow = c(1, 1))
Uji normalitas sisaan menggunakan uji Shapiro-Wilk.
shapiro.test(residuals(mod_final))
shapiro.test(residuals(mod_final))
##
## Shapiro-Wilk normality test
##
## data: residuals(mod_final)
## W = 0.91571, p-value = 5.075e-11
Melihat plot dari sisaan terhadap nilai dugaan (fitted values) untuk melihat pola variansinya.
plot(
fitted(mod_final),
residuals(mod_final),
xlab = "Fitted Value",
ylab = "Residual"
)
abline(h = 0, lty = 2)
Mengidentifikasi amatan amatan yang berpengaruh kuat menggunakan nilai Cook’s Distance.
cook_final <- cooks.distance(mod_final)
plot(
cook_final,
type = "h",
ylab = "Cook's Distance"
)
abline(
h = 4 / nrow(hitters),
lty = 2
)
# Menampilkan 5 amatan dengan nilai Cook's distance terbesar
order(cook_final, decreasing = TRUE)[1:5]
## [1] 173 189 201 21 77
Interpretasi Hasil Analisis:
AtBat,
Hits, Walks, CRBI,
DivisionW, dan PutOuts.Kesimpulan / Tindakan Lanjutan: Mengingat asumsi
klasik regresi linear berganda (Normalitas dan Homoskedastisitas) gagal
terpenuhi secara cukup berat akibat keberadaan nilai ekstrem,
model ini belum ideal/layak digunakan. Langkah
perbaikan yang direkomendasikan adalah melakukan transformasi matematik
pada variabel respon (contohnya melakukan log(Salary)
mengingat ini berkaitan dengan rentang besaran gaji uang), atau beralih
menggunakan pendekatan Robust Regression.