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.
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"
)| 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 |
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"
)| 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.
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_distDari histogram dan kurva kepadatan di atas dapat dilihat apakah
variabel speed dan dist cenderung simetris
atau menceng ke salah satu sisi.
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_distSebelum 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"
)| 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.
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_scatterBerdasarkan 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.
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)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:
Model regresi linear sederhana dibentuk menggunakan fungsi
lm() sebagai berikut.
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"
)| 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 |
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"
)| 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"
)| 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.
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"
)| Indikator | Nilai |
|---|---|
| R-squared | 0.6511 |
| Adjusted R-squared | 0.6438 |
| Residual Standard Error | 15.3796 |
| Jumlah Observasi | 50.0000 |
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.
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.
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.
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"
)| 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%.
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"
)| 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.
Catatan penting: Dataset
carsbukan 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"
)| 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")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.
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"
)| 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 |
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).
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)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)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"
)| 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.
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"
)| 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.
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"
)| 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"
)| 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).
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.
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.
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.
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%.
Berdasarkan hasil analisis regresi linear sederhana menggunakan
dataset cars, dapat disimpulkan bahwa:
Terdapat hubungan antara kecepatan kendaraan
(speed) dengan jarak berhenti kendaraan
(dist), dengan koefisien korelasi Pearson sebesar
0.8069.
Model regresi linear sederhana yang diperoleh adalah:
\[ \hat{dist} = -17.5791 + 3.9324 (speed) \]
Variabel speed memiliki hubungan positif terhadap
dist. Artinya, semakin tinggi kecepatan kendaraan, maka
jarak berhenti kendaraan cenderung semakin besar.
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).
Berdasarkan hasil pengujian statistik, hubungan antara
speed dan dist dinyatakan signifikan
secara statistik pada tingkat signifikansi 5%.
Hasil uji asumsi klasik menunjukkan residual tidak berdistribusi normal (Shapiro-Wilk), bersifat homoskedastis (Breusch-Pagan), dan tidak menunjukkan indikasi autokorelasi (Durbin-Watson).
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.
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.