Seorang peneliti ingin menganalisis faktor-faktor yang mempengaruhi nilai ujian mahasiswa (Y). Diduga bahwa nilai ujian dipengaruhi oleh:
Data dikumpulkan dari 10 mahasiswa.
# Variabel dependen
Y <- matrix(c(65, 70, 75, 80, 85, 78, 72, 90, 88, 95), ncol = 1)
# Variabel independen
X1 <- c(2, 3, 4, 5, 6, 5, 3, 7, 6, 8)
X2 <- c(60, 65, 70, 75, 80, 72, 68, 85, 83, 90)
# Matriks X dengan kolom intercept
X <- cbind(1, X1, X2)
# Tampilkan data lengkap
data_mahasiswa <- data.frame(
No = 1:10,
Y = as.vector(Y),
X1 = X1,
X2 = X2
)
knitr::kable(data_mahasiswa,
caption = "Data Nilai Ujian Mahasiswa",
align = "c",
col.names = c("No", "Y (Nilai Ujian)", "X1 (Jam Belajar)", "X2 (Kehadiran %)"))
| No | Y (Nilai Ujian) | X1 (Jam Belajar) | X2 (Kehadiran %) |
|---|---|---|---|
| 1 | 65 | 2 | 60 |
| 2 | 70 | 3 | 65 |
| 3 | 75 | 4 | 70 |
| 4 | 80 | 5 | 75 |
| 5 | 85 | 6 | 80 |
| 6 | 78 | 5 | 72 |
| 7 | 72 | 3 | 68 |
| 8 | 90 | 7 | 85 |
| 9 | 88 | 6 | 83 |
| 10 | 95 | 8 | 90 |
Model regresi linier berganda dalam bentuk matriks:
\[\mathbf{Y} = \mathbf{X}\boldsymbol{\beta} + \boldsymbol{\varepsilon}\]
Penduga OLS (Ordinary Least Squares):
\[\hat{\boldsymbol{\beta}} = (\mathbf{X'X})^{-1} \mathbf{X'Y}\]
# Hitung X'X
XtX <- t(X) %*% X
print(XtX)
## X1 X2
## 10 49 748
## X1 49 273 3827
## X2 748 3827 56772
# Hitung invers (X'X)^-1
XtX_inv <- solve(XtX)
print(round(XtX_inv, 6))
## X1 X2
## 100.167606 9.486493 -1.959244
## X1 9.486493 0.964999 -0.190040
## X2 -1.959244 -0.190040 0.038642
# Hitung X'Y
XtY <- t(X) %*% Y
print(XtY)
## [,1]
## 798
## X1 4074
## X2 60516
# Estimasi koefisien beta
cat("\n=== Estimasi Koefisien Beta ===\n")
##
## === Estimasi Koefisien Beta ===
beta_hat <- XtX_inv %*% XtY
cat("b0 (Intercept) =", round(beta_hat[1], 4), "\n")
## b0 (Intercept) = 16.136
cat("b1 (X1) =", round(beta_hat[2], 4), "\n")
## b1 (X1) = 1.1698
cat("b2 (X2) =", round(beta_hat[3], 4), "\n")
## b2 (X2) = 0.7745
\[\hat{Y} = 16.136 + 1.1698 X_1 + 0.7745 X_2\]
Interpretasi: Berdasarkan hasil estimasi regresi linier berganda menggunakan metode OLS, diperoleh bahwa variabel jam belajar (X1) dan tingkat kehadiran (X2) memiliki pengaruh positif terhadap nilai ujian mahasiswa (Y). Setiap peningkatan 1 jam belajar per minggu akan meningkatkan nilai ujian sebesar 1.1698, sedangkan setiap peningkatan 1% kehadiran akan meningkatkan nilai ujian sebesar 0.7745, dengan asumsi variabel lain konstan. Hal ini menunjukkan bahwa semakin tinggi intensitas belajar dan kehadiran mahasiswa, maka nilai ujian cenderung meningkat.
n <- nrow(X) # jumlah observasi = 10
k <- 2 # jumlah variabel independen
# Prediksi Y
Y_hat <- X %*% beta_hat
# Residual
e <- Y - Y_hat
# Rata-rata Y
Y_mean <- mean(Y)
# JKT = Total Sum of Squares
JKT <- sum((Y - Y_mean)^2)
# JKG = Error Sum of Squares (Jumlah Kuadrat Galat)
JKG <- sum(e^2)
# JKR = Regression Sum of Squares (Jumlah Kuadrat Regresi)
JKR <- JKT - JKG
cat("n (jumlah observasi) =", n, "\n")
## n (jumlah observasi) = 10
cat("k (jumlah var. independen) =", k, "\n\n")
## k (jumlah var. independen) = 2
cat("JKT (Total Sum of Squares) =", round(JKT, 4), "\n")
## JKT (Total Sum of Squares) = 831.6
cat("JKR (Regression Sum of Squares) =", round(JKR, 4), "\n")
## JKR (Regression Sum of Squares) = 831.0376
cat("JKG (Error Sum of Squares) =", round(JKG, 4), "\n")
## JKG (Error Sum of Squares) = 0.5624
Hipotesis:
Tabel ANOVA:
# Komponen ANOVA
db_regresi <- k
db_galat <- n - k - 1
db_total <- n - 1
KTR <- JKR / db_regresi # Kuadrat Tengah Regresi
KTG <- JKG / db_galat # Kuadrat Tengah Galat
F_hitung <- KTR / KTG
F_tabel <- qf(0.95, df1 = db_regresi, df2 = db_galat)
p_value_F <- pf(F_hitung, df1 = db_regresi, df2 = db_galat, lower.tail = FALSE)
# Tampilkan tabel ANOVA
tabel_anova <- data.frame(
Sumber = c("Regresi", "Galat", "Total"),
db = c(db_regresi, db_galat, db_total),
JK = c(round(JKR, 4), round(JKG, 4), round(JKT, 4)),
KT = c(round(KTR, 4), round(KTG, 4), NA),
F_hitung = c(round(F_hitung, 4), NA, NA)
)
knitr::kable(tabel_anova,
caption = "Tabel ANOVA Regresi Linier Berganda",
col.names = c("Sumber Keragaman", "db", "JK", "KT", "F hitung"),
align = "c",
na.rm = TRUE)
| Sumber Keragaman | db | JK | KT | F hitung |
|---|---|---|---|---|
| Regresi | 2 | 831.0376 | 415.5188 | 5172.116 |
| Galat | 7 | 0.5624 | 0.0803 | NA |
| Total | 9 | 831.6000 | NA | NA |
cat("\n=== Hasil Uji F ===\n")
##
## === Hasil Uji F ===
cat("F hitung =", round(F_hitung, 4), "\n")
## F hitung = 5172.116
cat("F tabel =", round(F_tabel, 4), "(α = 0.05, db1 =", db_regresi, ", db2 =", db_galat, ")\n")
## F tabel = 4.7374 (α = 0.05, db1 = 2 , db2 = 7 )
cat("p-value =", format(p_value_F, scientific = TRUE), "\n")
## p-value = 8.042129e-12
cat("\nKesimpulan: ")
##
## Kesimpulan:
if (F_hitung > F_tabel) {
cat("F hitung > F tabel → TOLAK H₀\n")
cat("Model regresi SIGNIFIKAN secara simultan (α = 5%).\n")
} else {
cat("F hitung ≤ F tabel → GAGAL TOLAK H₀\n")
}
## F hitung > F tabel → TOLAK H₀
## Model regresi SIGNIFIKAN secara simultan (α = 5%).
Interpretasi Uji F: Berdasarkan hasil uji F pada model regresi linier berganda, diperoleh nilai F hitung = 5172.116 > F tabel = 4.7374 pada taraf signifikan 5%. Selain itu, nilai p-value sebesar 8.04 × 10⁻¹² < 0.05. Hal ini menunjukkan bahwa H₀ ditolak, sehingga model regresi yang digunakan signifikan secara simultan. Artinya, variabel jam belajar (X1) dan tingkat kehadiran (X2) secara bersama-sama berpengaruh terhadap nilai ujian mahasiswa (Y). Dengan demikian, model yang dibangun dapat digunakan untuk menjelaskan hubungan antara variabel independen dan variabel dependen.
Hipotesis:
# Varians koefisien: S²(b) = KTG * (X'X)^-1
S2_b <- KTG * XtX_inv
# Standar error masing-masing koefisien (akar diagonal)
SE_b <- sqrt(diag(S2_b))
# t hitung
t_hitung <- beta_hat / SE_b
# t tabel (uji dua arah, α = 0.05)
t_tabel <- qt(0.975, df = db_galat)
# p-value
p_value_t <- 2 * pt(abs(t_hitung), df = db_galat, lower.tail = FALSE)
# Tabel hasil uji t
tabel_t <- data.frame(
Koefisien = c("b0 (Intercept)", "b1 (X1)", "b2 (X2)"),
Estimasi = round(beta_hat, 4),
Std_Error = round(SE_b, 4),
t_hitung = round(t_hitung, 4),
t_tabel = round(t_tabel, 4),
p_value = round(p_value_t, 6),
Keputusan = ifelse(abs(t_hitung) > t_tabel, "Tolak H₀ *", "Gagal Tolak H₀")
)
knitr::kable(tabel_t,
caption = "Hasil Uji t Parsial",
align = "c",
col.names = c("Koefisien", "Estimasi", "Std. Error",
"t hitung", "t tabel", "p-value", "Keputusan"))
| Koefisien | Estimasi | Std. Error | t hitung | t tabel | p-value | Keputusan | |
|---|---|---|---|---|---|---|---|
| b0 (Intercept) | 16.1360 | 2.8368 | 5.6882 | 2.3646 | 0.000744 | Tolak H₀ * | |
| X1 | b1 (X1) | 1.1698 | 0.2784 | 4.2015 | 2.3646 | 0.004028 | Tolak H₀ * |
| X2 | b2 (X2) | 0.7745 | 0.0557 | 13.9003 | 2.3646 | 0.000002 | Tolak H₀ * |
cat("\nt tabel (α=0.05, df =", db_galat, ") =", round(t_tabel, 4), "\n")
##
## t tabel (α=0.05, df = 7 ) = 2.3646
Interpretasi Uji t:
b1 (X1 - Jam Belajar): t hitung = 4.2015 > t tabel = 2.3646 menunjukkan hasil yang signifikan. Jumlah jam belajar berpengaruh nyata terhadap nilai ujian.
b2 (X2 - Kehadiran): t hitung = 13.9003 > t tabel = 2.3646 menunjukkan hasil yang signifikan. Tingkat kehadiran berpengaruh nyata terhadap nilai ujian.
Dengan demikian, kedua variabel secara parsial memiliki pengaruh signifikan terhadap nilai ujian mahasiswa.
\[R^2 = \frac{JKR}{JKT} = 1 - \frac{JKG}{JKT}\]
\[R^2_{adj} = 1 - \frac{JKG/(n-p)}{JKT/(n-1)} = 1 - \frac{n-1}{n-p}(1 - R^2)\]
di mana \(p = k + 1\) (jumlah parameter termasuk intercept)
# R Square
R2 <- JKR / JKT
# Adjusted R Square
Adj_R2 <- 1 - ((JKG / (n - k - 1)) / (JKT / (n - 1)))
cat("=== Koefisien Determinasi ===\n")
## === Koefisien Determinasi ===
cat("JKR =", round(JKR, 4), "\n")
## JKR = 831.0376
cat("JKT =", round(JKT, 4), "\n")
## JKT = 831.6
cat("JKG =", round(JKG, 4), "\n\n")
## JKG = 0.5624
cat("R² =", round(R2, 6), "→", paste0(round(R2 * 100, 2), "%"), "\n")
## R² = 0.999324 → 99.93%
cat("Adjusted R² =", round(Adj_R2, 6), "→", paste0(round(Adj_R2 * 100, 2), "%"), "\n")
## Adjusted R² = 0.999131 → 99.91%
Interpretasi:
R² = 99.93%: Variabel jumlah jam belajar (X1) dan tingkat kehadiran (X2) mampu menjelaskan 99.93% keragaman nilai ujian mahasiswa (Y). Sisanya (0.07%) dijelaskan oleh variabel lain di luar model.
Adjusted R² = 99.91%: Setelah dikoreksi terhadap jumlah variabel dan ukuran sampel, model masih mampu menjelaskan 99.91% variasi Y. Nilai ini lebih konservatif dan lebih tepat digunakan untuk membandingkan model.
lm()# Model dengan fungsi lm
model_lm <- lm(Y ~ X1 + X2)
summary_lm <- summary(model_lm)
cat("=== Output fungsi lm() ===\n")
## === Output fungsi lm() ===
print(summary_lm)
##
## Call:
## lm(formula = Y ~ X1 + X2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.31078 -0.14588 -0.05074 0.04440 0.56237
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 16.13601 2.83677 5.688 0.000744 ***
## X1 1.16984 0.27844 4.201 0.004028 **
## X2 0.77449 0.05572 13.900 2.36e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2834 on 7 degrees of freedom
## Multiple R-squared: 0.9993, Adjusted R-squared: 0.9991
## F-statistic: 5172 on 2 and 7 DF, p-value: 8.042e-12
# Ambil nilai dari lm
koef_lm <- coef(model_lm)
R2_lm <- summary_lm$r.squared
AdjR2_lm <- summary_lm$adj.r.squared
F_lm <- summary_lm$fstatistic[1]
# Tabel perbandingan
perbandingan <- data.frame(
Metode = c("Manual (Matriks OLS)", "Fungsi lm()"),
b0 = c(as.numeric(beta_hat[1]), as.numeric(koef_lm[1])),
b1 = c(as.numeric(beta_hat[2]), as.numeric(koef_lm[2])),
b2 = c(as.numeric(beta_hat[3]), as.numeric(koef_lm[3])),
R2 = c(R2, R2_lm),
Adj_R2 = c(Adj_R2, AdjR2_lm),
F_stat = c(F_hitung, as.numeric(F_lm))
)
# Bulatkan setelah jadi data frame
perbandingan[, -1] <- round(perbandingan[, -1], 6)
knitr::kable(perbandingan,
caption = "Perbandingan Hasil: Manual vs fungsi lm()",
align = "c",
col.names = c("Metode", "b0", "b1 (X1)", "b2 (X2)",
"R²", "Adj. R²", "F Statistik"))
| Metode | b0 | b1 (X1) | b2 (X2) | R² | Adj. R² | F Statistik |
|---|---|---|---|---|---|---|
| Manual (Matriks OLS) | 16.13601 | 1.169838 | 0.774489 | 0.999324 | 0.999131 | 5172.116 |
| Fungsi lm() | 16.13601 | 1.169838 | 0.774489 | 0.999324 | 0.999131 | 5172.116 |
Kesimpulan: Hasil perhitungan manual berbasis
matriks OLS identik dengan hasil fungsi lm() di R yang
membuktikan kebenaran perhitungan manual.
X1 = 1 jam/minggu (jumlah jam belajar)
X2 = 100% (tingkat kehadiran)
X1_new <- 1
X2_new <- 100
# Vektor prediktor baru (termasuk intercept)
x_new <- matrix(c(1, X1_new, X2_new), nrow = 1)
# Prediksi
Y_pred <- x_new %*% beta_hat
cat("=== Prediksi Nilai Ujian ===\n")
## === Prediksi Nilai Ujian ===
cat("Kondisi : X1 =", X1_new, "jam/minggu, X2 =", X2_new, "%\n\n")
## Kondisi : X1 = 1 jam/minggu, X2 = 100 %
cat("Model : Ŷ =", round(beta_hat[1], 4),
"+", round(beta_hat[2], 4), "×", X1_new,
"+", round(beta_hat[3], 4), "×", X2_new, "\n")
## Model : Ŷ = 16.136 + 1.1698 × 1 + 0.7745 × 100
cat("Prediksi : Ŷ =", round(Y_pred, 4), "\n\n")
## Prediksi : Ŷ = 94.7548
# Konfirmasi dengan fungsi predict
Y_pred_lm <- predict(model_lm, newdata = data.frame(X1 = X1_new, X2 = X2_new))
cat("Konfirmasi via predict() :", round(Y_pred_lm, 4), "\n")
## Konfirmasi via predict() : 94.7548
Interpretasi: Seorang mahasiswa yang belajar 1 jam per minggu dengan tingkat kehadiran 100% diprediksi memperoleh nilai ujian sebesar 94.75. Hal ini menunjukkan bahwa tingkat kehadiran memiliki pengaruh yang cukup besar terhadap nilai ujian, meskipun waktu belajar relatif sedikit. Namun, hasil ini tetap perlu diinterpretasikan dengan hati-hati karena dalam kondisi nyata, kombinasi antara jam belajar yang cukup dan kehadiran yang tinggi biasanya memberikan hasil yang lebih optimal.
Berdasarkan hasil analisis menggunakan metode OLS, variabel jumlah jam belajar (X1) dan tingkat kehadiran (X2) berpengaruh positif dan signifikan terhadap nilai ujian mahasiswa (Y), baik secara simultan maupun parsial. Nilai R² yang sangat tinggi menunjukkan bahwa model mampu menjelaskan hampir seluruh variasi nilai ujian, dan hasil perhitungan manual yang konsisten dengan fungsi lm() di R menunjukkan bahwa perhitungan sudah benar. Dengan demikian, semakin tinggi jam belajar dan kehadiran, maka nilai ujian cenderung meningkat, serta model dapat digunakan untuk prediksi dengan baik.