library(ISLR)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.1 ✔ stringr 1.5.2
## ✔ ggplot2 4.0.0 ✔ tibble 3.3.0
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ✔ purrr 1.1.0
## ── 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(caret)
## Loading required package: lattice
##
## Attaching package: 'caret'
##
## The following object is masked from 'package:purrr':
##
## lift
# Pilih variabel horsepower dan mpg
data("Auto")
df <- Auto %>% select(horsepower, mpg)
# Cek data
head(df)
## horsepower mpg
## 1 130 18
## 2 165 15
## 3 150 18
## 4 150 16
## 5 140 17
## 6 198 15
summary(df)
## horsepower mpg
## Min. : 46.0 Min. : 9.00
## 1st Qu.: 75.0 1st Qu.:17.00
## Median : 93.5 Median :22.75
## Mean :104.5 Mean :23.45
## 3rd Qu.:126.0 3rd Qu.:29.00
## Max. :230.0 Max. :46.60
# Cek missing values
sum(is.na(df))
## [1] 0
# Scatter plot
ggplot(df, aes(x = horsepower, y = mpg)) +
geom_point(color = "blue") +
theme_minimal() +
labs(title = "Scatter Plot: Horsepower vs MPG", x = "Horsepower", y = "MPG")
Scatter plot menunjukkan hubungan negatif antara horsepower dan MPG. Semakin besar tenaga mesin, efisiensi bahan bakar cenderung menurun. Polanya tampak tidak linier, sehingga model linier sederhana mungkin kurang sesuai.
set.seed(1401231100) # ganti sesuai NIM kamu
train_index <- createDataPartition(df$mpg, p = 0.8, list = FALSE)
train <- df[train_index, ]
test <- df[-train_index, ]
Kode ini membagi dataset menjadi 80% data latih dan 20% data uji secara acak namun replikasi hasil tetap sama berkat set.seed(). Data latih digunakan untuk membangun model, sedangkan data uji digunakan untuk menguji kemampuan generalisasi model. Pembagian ini penting agar evaluasi model tidak overfitting terhadap data latih.
lm_fit <- lm(mpg ~ horsepower, data = train)
summary(lm_fit)
##
## Call:
## lm(formula = mpg ~ horsepower, data = train)
##
## Residuals:
## Min 1Q Median 3Q Max
## -13.5510 -3.3702 -0.4572 2.8237 16.9505
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 39.849626 0.814433 48.93 <2e-16 ***
## horsepower -0.156925 0.007322 -21.43 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5.012 on 313 degrees of freedom
## Multiple R-squared: 0.5947, Adjusted R-squared: 0.5935
## F-statistic: 459.4 on 1 and 313 DF, p-value: < 2.2e-16
# Prediksi & evaluasi
pred_lm <- predict(lm_fit, newdata = test)
mse_lm <- mean((test$mpg - pred_lm)^2)
mse_lm
## [1] 19.77691
Model ini menunjukkan adanya hubungan linier antara mpg dan horsepower. Hasil ringkasan biasanya memperlihatkan koefisien regresi bernilai negatif pada variabel horsepower, yang mengindikasikan bahwa setiap peningkatan satu unit tenaga mesin akan menurunkan nilai mpg. Nilai R² menggambarkan proporsi variasi mpg yang dapat dijelaskan oleh horsepower. Jika hasilnya signifikan, maka hubungan linier antara keduanya dapat dianggap cukup kuat.
poly2 <- lm(mpg ~ poly(horsepower, 2), data = train)
poly3 <- lm(mpg ~ poly(horsepower, 3), data = train)
poly4 <- lm(mpg ~ poly(horsepower, 4), data = train)
poly2
##
## Call:
## lm(formula = mpg ~ poly(horsepower, 2), data = train)
##
## Coefficients:
## (Intercept) poly(horsepower, 2)1 poly(horsepower, 2)2
## 23.48 -107.43 42.22
poly3
##
## Call:
## lm(formula = mpg ~ poly(horsepower, 3), data = train)
##
## Coefficients:
## (Intercept) poly(horsepower, 3)1 poly(horsepower, 3)2
## 23.48 -107.43 42.22
## poly(horsepower, 3)3
## -6.46
poly4
##
## Call:
## lm(formula = mpg ~ poly(horsepower, 4), data = train)
##
## Coefficients:
## (Intercept) poly(horsepower, 4)1 poly(horsepower, 4)2
## 23.477 -107.428 42.223
## poly(horsepower, 4)3 poly(horsepower, 4)4
## -6.460 -3.557
Model polinomial digunakan untuk menangkap pola hubungan yang tidak linier antara horsepower dan mpg. Dengan menambah orde polinomial, model dapat menyesuaikan bentuk kurva yang lebih kompleks. Jika model berorde lebih tinggi menghasilkan galat lebih kecil dibanding regresi linier, maka dapat disimpulkan bahwa hubungan antara horsepower dan mpg memang bersifat melengkung, bukan sekadar garis lurus.
make_step_model <- function(train, n_cuts, method = "quantile") {
if (method == "quantile") {
cuts <- quantile(train$horsepower, probs = seq(0, 1, length.out = n_cuts + 1))
} else {
cuts <- seq(min(train$horsepower), max(train$horsepower), length.out = n_cuts + 1)
}
train$hp_cut <- cut(train$horsepower, breaks = cuts, include.lowest = TRUE)
model <- lm(mpg ~ hp_cut, data = train)
#Return list berisi model dan breaks agar bisa dipakai di test set
list(model = model, cuts = cuts)
}
#Contoh step function dengan 5 cutpoints
step5_list <- make_step_model(train, 5, method = "quantile")
step5 <- step5_list$model
cuts5 <- step5_list$cuts
# Lihat isi list-nya
step5_list
## $model
##
## Call:
## lm(formula = mpg ~ hp_cut, data = train)
##
## Coefficients:
## (Intercept) hp_cut(72,88] hp_cut(88,100] hp_cut(100,141]
## 32.612 -5.399 -10.325 -12.961
## hp_cut(141,230]
## -18.441
##
##
## $cuts
## 0% 20% 40% 60% 80% 100%
## 46 72 88 100 141 230
# Lihat model regresinya
summary(step5_list$model)
##
## Call:
## lm(formula = mpg ~ hp_cut, data = train)
##
## Residuals:
## Min 1Q Median 3Q Max
## -17.6121 -2.7124 -0.2121 2.2185 14.2873
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 32.6121 0.5662 57.593 < 2e-16 ***
## hp_cut(72,88] -5.3994 0.7866 -6.865 3.64e-11 ***
## hp_cut(88,100] -10.3255 0.8206 -12.583 < 2e-16 ***
## hp_cut(100,141] -12.9612 0.8399 -15.432 < 2e-16 ***
## hp_cut(141,230] -18.4407 0.8103 -22.759 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4.6 on 310 degrees of freedom
## Multiple R-squared: 0.6619, Adjusted R-squared: 0.6576
## F-statistic: 151.7 on 4 and 310 DF, p-value: < 2.2e-16
# Atau hanya koefisiennya
coef(step5_list$model)
## (Intercept) hp_cut(72,88] hp_cut(88,100] hp_cut(100,141] hp_cut(141,230]
## 32.612121 -5.399445 -10.325455 -12.961212 -18.440693
# Lihat batas-batas potong (breaks) yang dipakai
step5_list$cuts
## 0% 20% 40% 60% 80% 100%
## 46 72 88 100 141 230
Model fungsi tangga dengan 5 interval (berdasarkan kuantil) menunjukkan bahwa rata-rata MPG menurun tajam seiring bertambahnya horsepower. Kelompok mobil dengan horsepower ≤72 memiliki efisiensi bahan bakar tertinggi (sekitar 32,6 MPG). Ketika horsepower meningkat hingga kisaran 141–230, MPG turun hingga sekitar 14 unit lebih rendah. Semua koefisien negatif dan signifikan secara statistik (p < 0,001), menegaskan bahwa peningkatan tenaga mesin secara konsisten berkorelasi dengan penurunan efisiensi bahan bakar. Nilai R² sebesar 0,66 menunjukkan bahwa model ini mampu menjelaskan sekitar 66% variasi MPG, yang berarti fungsi tangga cukup baik menggambarkan pola hubungan nonlinier antara horsepower dan MPG.