1. Pendahuluan / Deskripsi Data

Regresi linear sederhana merupakan salah satu metode statistik yang digunakan untuk menganalisis hubungan antara satu variabel prediktor dengan satu variabel respon.

Pada analisis ini digunakan dataset bawaan R, yaitu cars. Dataset tersebut berisi data mengenai kecepatan kendaraan (speed) dan jarak berhenti kendaraan (dist).

Tujuan dari analisis ini adalah untuk mengetahui hubungan antara kecepatan kendaraan sebagai variabel prediktor dengan jarak berhenti kendaraan sebagai variabel respon, sekaligus melakukan pengujian asumsi klasik, deteksi outlier, prediksi, dan perbandingan model agar analisis lebih komprehensif.

Variabel yang digunakan dalam analisis adalah sebagai berikut:

Variabel Keterangan Peran
speed Kecepatan kendaraan Prediktor (X)
dist Jarak berhenti kendaraan Respon (Y)

Dataset cars terdiri dari 50 observasi dengan dua variabel utama, yaitu speed dan dist.


2. Eksplorasi Data

2.1 Tampilan Data

Berikut adalah sepuluh observasi pertama dari dataset cars.

head(cars, 10) %>%
  kable(
    caption = "Tabel 1. Sepuluh Observasi Pertama Dataset Cars",
    col.names = c(
      "Kecepatan (speed)",
      "Jarak Berhenti (dist)"
    ),
    digits = 2
  ) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    position = "center"
  )
Tabel 1. Sepuluh Observasi Pertama Dataset Cars
Kecepatan (speed) Jarak Berhenti (dist)
4 2
4 10
7 4
7 22
8 16
9 10
10 18
10 26
10 34
11 17

2.2 Statistik Deskriptif

Untuk memahami karakteristik data, dilakukan perhitungan statistik deskriptif berupa nilai minimum, maksimum, rata-rata, median, dan standar deviasi.

deskriptif <- data.frame(
  Variabel = c("Speed", "Dist"),
  Minimum = c(min(cars$speed), min(cars$dist)),
  Maksimum = c(max(cars$speed), max(cars$dist)),
  Rata_rata = c(mean(cars$speed), mean(cars$dist)),
  Median = c(median(cars$speed), median(cars$dist)),
  Standar_Deviasi = c(sd(cars$speed), sd(cars$dist))
)

deskriptif %>%
  mutate(across(where(is.numeric), ~ round(.x, digits = 2))) %>%
  kable(
    caption = "Tabel 2. Statistik Deskriptif Dataset Cars",
    col.names = c(
      "Variabel", "Minimum", "Maksimum",
      "Rata-rata", "Median", "Standar Deviasi"
    )
  ) %>%
    kable_styling(
    latex_options = c("striped", "hold_position"),
    full_width = FALSE,
    position = "center"
  )
Tabel 2. Statistik Deskriptif Dataset Cars
Variabel Minimum Maksimum Rata-rata Median Standar Deviasi
Speed 4 25 15.40 15 5.29
Dist 2 120 42.98 36 25.77

Berdasarkan statistik deskriptif tersebut, dapat diperoleh gambaran umum mengenai karakteristik dan sebaran data kecepatan kendaraan serta jarak berhenti kendaraan.

2.3 Distribusi Data (Histogram & Density Plot)

Sebelum masuk ke pemodelan, penting untuk melihat bentuk distribusi masing-masing variabel guna mendeteksi kemencengan (skewness) atau pola tidak normal sejak awal.

p_hist_speed <- ggplot(cars, aes(x = speed)) +
  geom_histogram(aes(y = after_stat(density)), bins = 10,
                  fill = warna_utama, alpha = 0.75, color = "white") +
  geom_density(color = warna_aksen, linewidth = 1) +
  labs(title = "Distribusi Speed", x = "Speed", y = "Density") +
  theme_minimal(base_size = 12)

p_hist_dist <- ggplot(cars, aes(x = dist)) +
  geom_histogram(aes(y = after_stat(density)), bins = 10,
                  fill = warna_utama, alpha = 0.75, color = "white") +
  geom_density(color = warna_aksen, linewidth = 1) +
  labs(title = "Distribusi Dist", x = "Dist", y = "Density") +
  theme_minimal(base_size = 12)

p_hist_speed + p_hist_dist

Dari histogram dan kurva kepadatan di atas dapat dilihat apakah variabel speed dan dist cenderung simetris atau menceng ke salah satu sisi.

2.4 Boxplot Speed dan Dist

Boxplot digunakan untuk mengidentifikasi keberadaan outlier pada masing-masing variabel secara terpisah, sebelum melihat pengaruhnya terhadap model.

p_box_speed <- ggplot(cars, aes(y = speed)) +
  geom_boxplot(fill = warna_sekunder, alpha = 0.7, outlier.color = warna_aksen, outlier.size = 2) +
  labs(title = "Boxplot Speed", y = "Speed") +
  theme_minimal(base_size = 12) +
  theme(axis.text.x = element_blank(), axis.ticks.x = element_blank())

p_box_dist <- ggplot(cars, aes(y = dist)) +
  geom_boxplot(fill = warna_sekunder, alpha = 0.7, outlier.color = warna_aksen, outlier.size = 2) +
  labs(title = "Boxplot Dist", y = "Dist") +
  theme_minimal(base_size = 12) +
  theme(axis.text.x = element_blank(), axis.ticks.x = element_blank())

p_box_speed + p_box_dist

2.5 Uji Korelasi Pearson

Sebelum membangun model regresi, kekuatan hubungan linear antara speed dan dist diuji secara formal menggunakan korelasi Pearson.

korelasi <- cor.test(cars$speed, cars$dist, method = "pearson")

data.frame(
  Statistik = c("Koefisien Korelasi (r)", "t-statistic", "df", "p-value",
                "CI 95% Batas Bawah", "CI 95% Batas Atas"),
  Nilai = c(
    round(korelasi$estimate, 4),
    round(korelasi$statistic, 4),
    korelasi$parameter,
    format.pval(korelasi$p.value, digits = 4),
    round(korelasi$conf.int[1], 4),
    round(korelasi$conf.int[2], 4)
  )
) %>%
  kable(caption = "Tabel 2a. Hasil Uji Korelasi Pearson (Speed vs Dist)") %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    position = "center"
  )
Tabel 2a. Hasil Uji Korelasi Pearson (Speed vs Dist)
Statistik Nilai
Koefisien Korelasi (r) 0.8069
t-statistic 9.464
df 48
p-value 1.49e-12
CI 95% Batas Bawah 0.6816
CI 95% Batas Atas 0.8862

Nilai koefisien korelasi sebesar 0.8069 menunjukkan kekuatan dan arah hubungan linear antara speed dan dist, dengan p-value 1.49e-12 yang mengindikasikan apakah hubungan tersebut signifikan secara statistik.


3. Visualisasi Hubungan Speed dan Dist

3.1 Scatter Plot dengan Garis Regresi

Scatter plot digunakan untuk melihat pola hubungan antara variabel prediktor speed dengan variabel respon dist.

p_scatter <- ggplot(cars, aes(x = speed, y = dist)) +
  geom_point(size = 3, alpha = 0.75, color = warna_utama) +
  geom_smooth(method = "lm", se = TRUE, linewidth = 1, color = warna_aksen) +
  labs(
    title = "Hubungan Kecepatan Kendaraan dan Jarak Berhenti",
    subtitle = "Scatter plot dengan garis regresi linear",
    x = "Kecepatan Kendaraan (speed)",
    y = "Jarak Berhenti (dist)",
    caption = "Sumber: Dataset bawaan R - cars"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold"),
    plot.subtitle = element_text(size = 11),
    plot.caption = element_text(hjust = 0)
  )

p_scatter

Berdasarkan scatter plot, terlihat adanya kecenderungan hubungan positif antara kecepatan kendaraan dan jarak berhenti kendaraan. Secara umum, semakin tinggi kecepatan kendaraan, maka jarak berhenti kendaraan juga cenderung meningkat.

3.2 Scatter Plot Interaktif

Untuk eksplorasi lebih lanjut, berikut versi interaktif dari scatter plot di atas — arahkan kursor ke setiap titik untuk melihat nilai persisnya.

p_interaktif <- ggplot(cars, aes(x = speed, y = dist)) +
  geom_point(size = 2, alpha = 0.75, color = warna_utama) +
  geom_smooth(method = "lm", se = TRUE, color = warna_aksen, linewidth = 0.8) +
  labs(title = "Scatter Plot Interaktif: Speed vs Dist", x = "Speed", y = "Dist") +
  theme_minimal(base_size = 12)

ggplotly(p_interaktif)

4. Pembentukan Model Regresi Linear Sederhana

Model regresi linear sederhana secara umum dapat dituliskan sebagai:

\[ Y_i = \beta_0 + \beta_1X_i + \varepsilon_i \]

Pada analisis ini, variabel respon adalah dist dan variabel prediktor adalah speed, sehingga model dapat dituliskan sebagai:

\[ dist_i = \beta_0 + \beta_1(speed_i) + \varepsilon_i \]

dengan:

  • \(dist_i\) = jarak berhenti kendaraan
  • \(speed_i\) = kecepatan kendaraan
  • \(\beta_0\) = intercept
  • \(\beta_1\) = koefisien regresi
  • \(\varepsilon_i\) = error atau galat

Model regresi linear sederhana dibentuk menggunakan fungsi lm() sebagai berikut.

model <- lm(dist ~ speed, data = cars)

5. Hasil Estimasi Model

5.1 Estimasi Koefisien Regresi

Berikut merupakan hasil estimasi parameter dari model regresi linear sederhana.

hasil_model <- summary(model)

tabel_koef <- as.data.frame(hasil_model$coefficients)
tabel_koef$Variabel <- rownames(tabel_koef)
rownames(tabel_koef) <- NULL

tabel_koef <- tabel_koef %>%
  select(Variabel, Estimate, `Std. Error`, `t value`, `Pr(>|t|)`) %>%
  mutate(across(where(is.numeric), ~ round(.x, digits = 4)))

tabel_koef %>%
  kable(
    caption = "Tabel 3. Hasil Estimasi Koefisien Regresi",
    col.names = c("Variabel", "Estimasi", "Standard Error", "t-value", "p-value")
  ) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    position = "center"
  )
Tabel 3. Hasil Estimasi Koefisien Regresi
Variabel Estimasi Standard Error t-value p-value
(Intercept) -17.5791 6.7584 -2.6011 0.0123
speed 3.9324 0.4155 9.4640 0.0000

5.2 Uji F Keseluruhan Model (ANOVA)

Selain menguji signifikansi tiap koefisien, perlu juga dilakukan uji F untuk menguji signifikansi model secara keseluruhan.

anova_model <- anova(model)

as.data.frame(anova_model) %>%
  mutate(Sumber_Variasi = rownames(anova_model), .before = 1) %>%
  mutate(across(where(is.numeric), ~ round(.x, 4))) %>%
  kable(
    caption = "Tabel 3a. Tabel ANOVA Regresi",
    col.names = c("Sumber Variasi", "Df", "Sum Sq", "Mean Sq", "F value", "Pr(>F)"),
    row.names = FALSE
  ) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    position = "center"
  )
Tabel 3a. Tabel ANOVA Regresi
Sumber Variasi Df Sum Sq Mean Sq F value Pr(>F)
speed 1 21185.46 21185.4589 89.5671 0
Residuals 48 11353.52 236.5317 NA NA
f_stat   <- hasil_model$fstatistic
f_value  <- unname(f_stat["value"])
df1      <- unname(f_stat["numdf"])
df2      <- unname(f_stat["dendf"])
f_pvalue <- pf(f_value, df1, df2, lower.tail = FALSE)

data.frame(
  Statistik = c("F-value", "df1 (numerator)", "df2 (denominator)", "p-value"),
  Nilai = c(round(f_value, 4), df1, df2, format.pval(f_pvalue, digits = 4))
) %>%
  kable(caption = "Tabel 3b. Ringkasan Uji F Keseluruhan Model") %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    position = "center"
  )
Tabel 3b. Ringkasan Uji F Keseluruhan Model
Statistik Nilai
F-value 89.5671
df1 (numerator) 1
df2 (denominator) 48
p-value 1.49e-12

Nilai F sebesar 89.5671 dengan p-value 1.49e-12 menunjukkan apakah model secara keseluruhan (bukan hanya koefisien speed sendiri) signifikan dalam menjelaskan variasi dist.

5.3 Kebaikan Model

Nilai koefisien determinasi digunakan untuk mengetahui seberapa besar variasi pada variabel respon dapat dijelaskan oleh variabel prediktor.

r_squared      <- hasil_model$r.squared
adj_r_squared  <- hasil_model$adj.r.squared
residual_se    <- hasil_model$sigma
jumlah_observasi <- nrow(cars)

tabel_kebaikan_model <- data.frame(
  Indikator = c("R-squared", "Adjusted R-squared", "Residual Standard Error", "Jumlah Observasi"),
  Nilai = c(round(r_squared, 4), round(adj_r_squared, 4), round(residual_se, 4), jumlah_observasi)
)

tabel_kebaikan_model %>%
  kable(caption = "Tabel 4. Ringkasan Kebaikan Model") %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    position = "center"
  )
Tabel 4. Ringkasan Kebaikan Model
Indikator Nilai
R-squared 0.6511
Adjusted R-squared 0.6438
Residual Standard Error 15.3796
Jumlah Observasi 50.0000

6. Model Regresi Akhir

Berdasarkan hasil estimasi regresi linear sederhana, diperoleh nilai parameter sebagai berikut.

\[\hat{dist} = -17.5791 + 3.9324(speed)\]

Dengan demikian, persamaan regresi linear sederhana yang diperoleh dapat digunakan untuk memprediksi nilai jarak berhenti kendaraan berdasarkan kecepatan kendaraan.


7. Uji Asumsi Klasik Regresi (Diagnostik Model)

Sebuah model regresi linear baru dapat dipercaya hasilnya apabila memenuhi asumsi klasik: linearitas, normalitas residual, homoskedastisitas, dan independensi residual. Bagian ini menguji keempat asumsi tersebut secara visual maupun statistik.

diag_data <- broom::augment(model)

7.1 Linearitas — Residuals vs Fitted

ggplot(diag_data, aes(x = .fitted, y = .resid)) +
  geom_point(alpha = 0.7, color = warna_utama) +
  geom_hline(yintercept = 0, linetype = "dashed", color = warna_aksen) +
  geom_smooth(method = "loess", se = FALSE, color = warna_sekunder, linewidth = 0.8) +
  labs(title = "Residuals vs Fitted", subtitle = "Uji Linearitas",
       x = "Fitted Values", y = "Residuals") +
  theme_minimal(base_size = 12)

Jika titik-titik residual tersebar acak di sekitar garis nol tanpa membentuk pola melengkung, maka asumsi linearitas terpenuhi. Pola berbentuk kurva (seperti corong atau parabola) mengindikasikan hubungan non-linear yang belum tertangkap oleh model.

7.2 Normalitas Residual — Q-Q Plot & Uji Shapiro-Wilk

ggplot(diag_data, aes(sample = .std.resid)) +
  stat_qq(color = warna_utama, alpha = 0.7) +
  stat_qq_line(color = warna_aksen, linetype = "dashed") +
  labs(title = "Normal Q-Q Plot", subtitle = "Uji Normalitas Residual",
       x = "Theoretical Quantiles", y = "Standardized Residuals") +
  theme_minimal(base_size = 12)

shapiro_result <- shapiro.test(residuals(model))

data.frame(
  Statistik = c("W statistic", "p-value"),
  Nilai = c(round(shapiro_result$statistic, 4), format.pval(shapiro_result$p.value, digits = 4))
) %>%
  kable(caption = "Tabel 5. Hasil Uji Shapiro-Wilk untuk Normalitas Residual") %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    position = "center"
  )
Tabel 5. Hasil Uji Shapiro-Wilk untuk Normalitas Residual
Statistik Nilai
W W statistic 0.9451
p-value 0.02152

Karena p-value lebih kecil dari 0,05, maka residual model tidak berdistribusi normal pada tingkat signifikansi 5%.

7.3 Homoskedastisitas — Scale-Location Plot & Uji Breusch-Pagan

ggplot(diag_data, aes(x = .fitted, y = sqrt(abs(.std.resid)))) +
  geom_point(alpha = 0.7, color = warna_utama) +
  geom_smooth(method = "loess", se = FALSE, color = warna_sekunder, linewidth = 0.8) +
  labs(title = "Scale-Location Plot", subtitle = "Uji Homoskedastisitas",
       x = "Fitted Values", y = "sqrt(|Standardized Residuals|)") +
  theme_minimal(base_size = 12)

bp_result <- lmtest::bptest(model)

data.frame(
  Statistik = c("BP statistic", "df", "p-value"),
  Nilai = c(round(bp_result$statistic, 4), bp_result$parameter, format.pval(bp_result$p.value, digits = 4))
) %>%
  kable(caption = "Tabel 6. Hasil Uji Breusch-Pagan untuk Homoskedastisitas") %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    position = "center"
  )
Tabel 6. Hasil Uji Breusch-Pagan untuk Homoskedastisitas
Statistik Nilai
BP BP statistic 3.2149
df df 1
p-value 0.07297

Karena p-value lebih besar dari 0,05, maka tidak terdapat indikasi heteroskedastisitas, sehingga asumsi homoskedastisitas terpenuhi.

7.4 Independensi Residual (Autokorelasi) — Durbin-Watson & ACF/PACF

Catatan penting: Dataset cars bukan merupakan data deret waktu (time series), sehingga konsep autokorelasi “antar waktu” secara ketat tidak berlaku. Namun, uji Durbin-Watson dan plot ACF/PACF berikut tetap disertakan sebagai diagnostik pelengkap untuk melihat apakah terdapat pola sistematis pada residual berdasarkan urutan observasi dalam dataset — hal ini umum dilakukan untuk memeriksa independensi error secara lebih menyeluruh, meskipun bukan pengujian utama pada regresi cross-sectional seperti ini.

dw_result <- lmtest::dwtest(model)

data.frame(
  Statistik = c("Durbin-Watson statistic", "p-value"),
  Nilai = c(round(dw_result$statistic, 4), format.pval(dw_result$p.value, digits = 4))
) %>%
  kable(caption = "Tabel 7. Hasil Uji Durbin-Watson untuk Autokorelasi Residual") %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    position = "center"
  )
Tabel 7. Hasil Uji Durbin-Watson untuk Autokorelasi Residual
Statistik Nilai
DW Durbin-Watson statistic 1.6762
p-value 0.09522
par(mfrow = c(1, 2))
acf(residuals(model), main = "ACF Residual")
pacf(residuals(model), main = "PACF Residual")

par(mfrow = c(1, 1))

Nilai statistik Durbin-Watson mendekati 2 mengindikasikan tidak adanya autokorelasi pada residual. Plot ACF dan PACF yang menunjukkan sebagian besar batang berada dalam pita signifikansi (garis putus-putus biru) juga mendukung kesimpulan bahwa residual tidak memiliki pola autokorelasi yang berarti.

7.5 Ringkasan Uji Asumsi

ringkasan_asumsi <- data.frame(
  Asumsi = c("Normalitas Residual (Shapiro-Wilk)",
             "Homoskedastisitas (Breusch-Pagan)",
             "Independensi Residual (Durbin-Watson)"),
  Statistik = c(round(shapiro_result$statistic, 4),
                round(bp_result$statistic, 4),
                round(dw_result$statistic, 4)),
  P_value = c(format.pval(shapiro_result$p.value, digits = 4),
              format.pval(bp_result$p.value, digits = 4),
              format.pval(dw_result$p.value, digits = 4)),
  Kesimpulan = c(
    ifelse(shapiro_result$p.value < 0.05, "Tidak Normal", "Normal"),
    ifelse(bp_result$p.value < 0.05, "Heteroskedastis", "Homoskedastis"),
    ifelse(dw_result$p.value < 0.05, "Ada Autokorelasi", "Tidak Ada Autokorelasi")
  )
)

ringkasan_asumsi %>%
  kable(
    caption = "Tabel 8. Ringkasan Hasil Uji Asumsi Klasik",
    col.names = c("Asumsi", "Statistik Uji", "p-value", "Kesimpulan")
  ) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    position = "center"
  )
Tabel 8. Ringkasan Hasil Uji Asumsi Klasik
Asumsi Statistik Uji p-value Kesimpulan
W Normalitas Residual (Shapiro-Wilk) 0.9451 0.02152 Tidak Normal
BP Homoskedastisitas (Breusch-Pagan) 3.2149 0.07297 Homoskedastis
DW Independensi Residual (Durbin-Watson) 1.6762 0.09522 Tidak Ada Autokorelasi

8. Deteksi Outlier dan Observasi Berpengaruh

Selain asumsi klasik, penting juga untuk memeriksa apakah ada observasi tertentu yang secara tidak proporsional memengaruhi hasil model (observasi outlier atau high-leverage/influential points).

8.1 Leverage

rata_leverage <- mean(diag_data$.hat)

ggplot(diag_data, aes(x = seq_along(.hat), y = .hat)) +
  geom_point(color = warna_utama, alpha = 0.8) +
  geom_hline(yintercept = 2 * rata_leverage, linetype = "dashed", color = warna_aksen) +
  labs(title = "Leverage per Observasi",
       subtitle = "Garis putus-putus = ambang batas 2x rata-rata leverage",
       x = "Index Observasi", y = "Leverage (Hat Value)") +
  theme_minimal(base_size = 12)

8.2 Cook’s Distance

ambang_cooksd <- 4 / nrow(cars)

ggplot(diag_data, aes(x = seq_along(.cooksd), y = .cooksd)) +
  geom_col(fill = warna_utama, alpha = 0.75) +
  geom_hline(yintercept = ambang_cooksd, linetype = "dashed", color = warna_aksen) +
  labs(title = "Cook's Distance per Observasi",
       subtitle = paste0("Garis putus-putus = ambang batas 4/n (", round(ambang_cooksd, 4), ")"),
       x = "Index Observasi", y = "Cook's Distance") +
  theme_minimal(base_size = 12)

8.3 Observasi Paling Berpengaruh

diag_data %>%
  mutate(Index = row_number()) %>%
  select(Index, speed, dist, .fitted, .resid, .std.resid, .hat, .cooksd) %>%
  arrange(desc(.cooksd)) %>%
  head(5) %>%
  mutate(across(where(is.numeric), ~ round(.x, 4))) %>%
  kable(
    caption = "Tabel 9. Lima Observasi dengan Cook's Distance Tertinggi",
    col.names = c("Index", "Speed", "Dist", "Fitted", "Residual",
                  "Std. Residual", "Leverage", "Cook's D")
  ) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    position = "center"
  )
Tabel 9. Lima Observasi dengan Cook’s Distance Tertinggi
Index Speed Dist Fitted Residual Std. Residual Leverage Cook’s D
49 24 120 76.7987 43.2013 2.9191 0.0740 0.3404
23 14 80 37.4746 42.5254 2.7952 0.0214 0.0856
39 20 32 61.0691 -29.0691 -1.9245 0.0354 0.0681
45 23 54 72.8663 -18.8663 -1.2667 0.0622 0.0532
35 18 84 53.2043 30.7957 2.0278 0.0249 0.0526

Sebagai aturan praktis (rule of thumb), observasi dengan leverage di atas \(2 \times\) rata-rata leverage atau Cook’s Distance di atas \(4/n\) patut mendapat perhatian lebih, meskipun tidak serta-merta harus dibuang dari analisis tanpa alasan substantif.


9. Prediksi Nilai Baru dan Interval

Model yang telah dibentuk dapat digunakan untuk memprediksi jarak berhenti kendaraan pada nilai kecepatan tertentu, lengkap dengan interval kepercayaan (confidence interval) dan interval prediksi (prediction interval).

speed_baru <- data.frame(speed = c(5, 10, 15, 20, 25))

prediksi_ci <- predict(model, newdata = speed_baru, interval = "confidence", level = 0.95)
prediksi_pi <- predict(model, newdata = speed_baru, interval = "prediction", level = 0.95)

tabel_prediksi <- data.frame(
  Speed = speed_baru$speed,
  Prediksi_Dist = round(prediksi_ci[, "fit"], 2),
  CI_Bawah = round(prediksi_ci[, "lwr"], 2),
  CI_Atas = round(prediksi_ci[, "upr"], 2),
  PI_Bawah = round(prediksi_pi[, "lwr"], 2),
  PI_Atas = round(prediksi_pi[, "upr"], 2)
)

tabel_prediksi %>%
  kable(
    caption = "Tabel 10. Prediksi Dist dengan Confidence Interval dan Prediction Interval (95%)",
    col.names = c("Speed", "Prediksi Dist", "CI 95% Bawah", "CI 95% Atas", "PI 95% Bawah", "PI 95% Atas")
  ) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    position = "center"
  )
Tabel 10. Prediksi Dist dengan Confidence Interval dan Prediction Interval (95%)
Speed Prediksi Dist CI 95% Bawah CI 95% Atas PI 95% Bawah PI 95% Atas
5 2.08 -7.64 11.81 -30.33 34.50
10 21.74 15.46 28.03 -9.81 53.30
15 41.41 37.02 45.79 10.17 72.64
20 61.07 55.25 66.89 29.60 92.54
25 80.73 71.60 89.87 48.49 112.97
pred_range <- data.frame(speed = seq(min(cars$speed), max(cars$speed), length.out = 100))

ci_band <- predict(model, newdata = pred_range, interval = "confidence", level = 0.95)
pi_band <- predict(model, newdata = pred_range, interval = "prediction", level = 0.95)

plot_data <- pred_range %>%
  mutate(
    fit = ci_band[, "fit"],
    ci_lwr = ci_band[, "lwr"],
    ci_upr = ci_band[, "upr"],
    pi_lwr = pi_band[, "lwr"],
    pi_upr = pi_band[, "upr"]
  )

ggplot() +
  geom_ribbon(data = plot_data, aes(x = speed, ymin = pi_lwr, ymax = pi_upr),
              fill = warna_aksen, alpha = 0.15) +
  geom_ribbon(data = plot_data, aes(x = speed, ymin = ci_lwr, ymax = ci_upr),
              fill = warna_sekunder, alpha = 0.35) +
  geom_line(data = plot_data, aes(x = speed, y = fit), color = warna_utama, linewidth = 1) +
  geom_point(data = cars, aes(x = speed, y = dist), alpha = 0.7, color = warna_utama) +
  labs(
    title = "Confidence Interval vs Prediction Interval",
    subtitle = "Pita biru = CI 95% (rata-rata prediksi), Pita merah = PI 95% (nilai individu)",
    x = "Speed", y = "Dist"
  ) +
  theme_minimal(base_size = 12)

Pita CI (biru) menggambarkan ketidakpastian terhadap rata-rata nilai dist pada suatu nilai speed tertentu, sedangkan pita PI (merah) yang lebih lebar menggambarkan ketidakpastian terhadap nilai individu dist yang mungkin diamati — PI selalu lebih lebar dari CI karena turut memperhitungkan variabilitas error individual.


10. Perbandingan Model: Linear vs Kuadratik

Untuk memastikan bahwa model linear sederhana sudah memadai (dan bukan karena hubungan sebenarnya berbentuk kurva), dilakukan perbandingan dengan model kuadratik \(dist = \beta_0 + \beta_1(speed) + \beta_2(speed)^2 + \varepsilon\).

model_kuadratik <- lm(dist ~ speed + I(speed^2), data = cars)
summary_kuadratik <- summary(model_kuadratik)
perbandingan <- data.frame(
  Model = c("Linear", "Kuadratik"),
  R_squared = c(round(r_squared, 4), round(summary_kuadratik$r.squared, 4)),
  Adj_R_squared = c(round(adj_r_squared, 4), round(summary_kuadratik$adj.r.squared, 4)),
  AIC = c(round(AIC(model), 2), round(AIC(model_kuadratik), 2)),
  BIC = c(round(BIC(model), 2), round(BIC(model_kuadratik), 2))
)

perbandingan %>%
  kable(
    caption = "Tabel 11. Perbandingan Model Linear vs Kuadratik",
    col.names = c("Model", "R-squared", "Adjusted R-squared", "AIC", "BIC")
  ) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    position = "center"
  )
Tabel 11. Perbandingan Model Linear vs Kuadratik
Model R-squared Adjusted R-squared AIC BIC
Linear 0.6511 0.6438 419.16 424.89
Kuadratik 0.6673 0.6532 418.77 426.42
anova_perbandingan <- anova(model, model_kuadratik)

as.data.frame(anova_perbandingan) %>%
  mutate(Model = c("Linear", "Linear + Kuadratik"), .before = 1) %>%
  mutate(across(where(is.numeric), ~ round(.x, 4))) %>%
  kable(
    caption = "Tabel 12. Uji F Perbandingan Model Bersarang (Nested F-Test)",
    row.names = FALSE
  ) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    position = "center"
  )
Tabel 12. Uji F Perbandingan Model Bersarang (Nested F-Test)
Model Res.Df RSS Df Sum of Sq F Pr(>F)
Linear 48 11353.52 NA NA NA NA
Linear + Kuadratik 47 10824.72 1 528.8051 2.296 0.1364
ggplot(cars, aes(x = speed, y = dist)) +
  geom_point(alpha = 0.7, color = warna_utama) +
  geom_smooth(method = "lm", formula = y ~ x, se = FALSE,
              aes(color = "Linear"), linewidth = 1) +
  geom_smooth(method = "lm", formula = y ~ x + I(x^2), se = FALSE,
              aes(color = "Kuadratik"), linewidth = 1) +
  scale_color_manual(name = "Model", values = c("Linear" = warna_sekunder, "Kuadratik" = warna_aksen)) +
  labs(title = "Perbandingan Kurva Model Linear vs Kuadratik",
       x = "Speed", y = "Dist") +
  theme_minimal(base_size = 12)

Uji F perbandingan model bersarang menghasilkan p-value 0.1364 (> 0,05), yang berarti penambahan suku kuadratik tidak memberikan perbaikan yang signifikan terhadap model. Dengan demikian, model linear sederhana sudah memadai dan lebih dipilih karena lebih sederhana (prinsip parsimoni).


11. Interpretasi Model

11.1 Interpretasi Intercept

Nilai intercept yang diperoleh dari model regresi adalah sebesar -17.5791.

Secara matematis, nilai tersebut menunjukkan perkiraan jarak berhenti kendaraan ketika nilai kecepatan kendaraan (speed) sama dengan 0.

Namun, interpretasi intercept perlu dilakukan secara hati-hati karena kondisi kecepatan kendaraan sebesar 0 belum tentu berada dalam konteks utama pengamatan yang digunakan pada dataset.

11.2 Interpretasi Koefisien Speed

Nilai koefisien regresi untuk variabel speed adalah sebesar 3.9324.

Artinya, setiap kenaikan 1 satuan kecepatan kendaraan diperkirakan akan meningkatkan rata-rata jarak berhenti kendaraan sebesar 3.9324 satuan.

Karena nilai koefisien regresi bernilai positif, maka hubungan antara kecepatan kendaraan dan jarak berhenti kendaraan bersifat positif.

Dengan demikian, semakin tinggi kecepatan kendaraan, maka jarak berhenti kendaraan cenderung semakin besar.

11.3 Interpretasi Koefisien Determinasi

Nilai R-squared yang diperoleh adalah sebesar 0.6511 atau sekitar 65.11%.

Artinya, sekitar 65.11% variasi pada jarak berhenti kendaraan (dist) dapat dijelaskan oleh variabel kecepatan kendaraan (speed).

Sementara itu, sekitar 34.89% variasi lainnya dijelaskan oleh faktor lain yang tidak dimasukkan ke dalam model regresi.

11.4 Interpretasi Signifikansi Variabel

Nilai p-value untuk variabel speed adalah sebesar 1.49e-12.

Karena nilai p-value lebih kecil dari 0,05, maka variabel speed memiliki pengaruh yang signifikan secara statistik terhadap dist pada tingkat signifikansi 5%.


12. Kesimpulan

Berdasarkan hasil analisis regresi linear sederhana menggunakan dataset cars, dapat disimpulkan bahwa:

  1. Terdapat hubungan antara kecepatan kendaraan (speed) dengan jarak berhenti kendaraan (dist), dengan koefisien korelasi Pearson sebesar 0.8069.

  2. Model regresi linear sederhana yang diperoleh adalah:

\[ \hat{dist} = -17.5791 + 3.9324 (speed) \]

  1. Variabel speed memiliki hubungan positif terhadap dist. Artinya, semakin tinggi kecepatan kendaraan, maka jarak berhenti kendaraan cenderung semakin besar.

  2. Variabel speed mampu menjelaskan sekitar 65.11% variasi pada jarak berhenti kendaraan, dengan model secara keseluruhan signifikan berdasarkan uji F (p-value = 1.49e-12).

  3. Berdasarkan hasil pengujian statistik, hubungan antara speed dan dist dinyatakan signifikan secara statistik pada tingkat signifikansi 5%.

  4. Hasil uji asumsi klasik menunjukkan residual tidak berdistribusi normal (Shapiro-Wilk), bersifat homoskedastis (Breusch-Pagan), dan tidak menunjukkan indikasi autokorelasi (Durbin-Watson).

  5. Deteksi outlier menggunakan Cook’s Distance dan leverage mengidentifikasi beberapa observasi yang berpotensi berpengaruh besar terhadap model, sebagaimana ditunjukkan pada Tabel 9, meskipun tidak serta-merta perlu dikeluarkan dari analisis.

  6. Perbandingan dengan model kuadratik menunjukkan bahwa penambahan suku kuadratik tidak memberikan perbaikan yang signifikan terhadap model, sehingga model linear sederhana tetap menjadi pilihan yang memadai.

Secara keseluruhan, model regresi linear sederhana menunjukkan bahwa kecepatan kendaraan memiliki hubungan yang signifikan dalam menjelaskan perubahan jarak berhenti kendaraan pada dataset cars, dengan asumsi klasik dan diagnostik model yang telah diperiksa secara menyeluruh.