Library

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

Data

# 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

Eksplorasi Data

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

Split Data

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.

Pemodelan

Model 1: Regresi Linear Sederhana

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.

Regresi Polinomial (orde 2,3,4)

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.

Regresi Fungsi Tangga (Step Function)

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.