Seorang peneliti ingin menganalisis faktor-faktor yang mempengaruhi nilai ujian mahasiswa (Y). Diduga bahwa nilai ujian dipengaruhi oleh:

Data dikumpulkan dari 10 mahasiswa.

Input Data

# 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 %)"))
Data Nilai Ujian Mahasiswa
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

Pertanyaan 1: Estimasikan model regresi linier berganda menggunakan metode OLS berbasis matriks dan interpretasikan hasilnya?

Rumus OLS

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}\]

Perhitungan Manual Matriks

# 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

Model Persamaan Regresi

\[\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.

Pertanyaan 2: Hitung Uji F dan uji t secara manual dan interpretasikan hasilnya?

Hitung Nilai-Nilai Dasar

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

Uji F (Uji Simultan)

Hipotesis:

  • H₀: β₁ = β₂ = 0 (model tidak signifikan)
  • H₁: minimal ada satu βⱼ ≠ 0 (model signifikan)

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)
Tabel ANOVA Regresi Linier Berganda
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.

Uji t (Uji Parsial)

Hipotesis:

  • H₀: βⱼ = 0 (variabel Xⱼ tidak berpengaruh signifikan)
  • H₁: βⱼ ≠ 0 (variabel Xⱼ berpengaruh signifikan)
# 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"))
Hasil Uji t Parsial
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.

Pertanyaan 3: Hitung nilai R² dan Adjusted R² secara manual dan interpretasikan hasilnya?

Koefisien Determinasi (R²)

\[R^2 = \frac{JKR}{JKT} = 1 - \frac{JKG}{JKT}\]

Adjusted R²

\[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.

Pertanyaan 4: Bandingkan hasil no 1 s.d 3 dengan Fungsi 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

Tabel Perbandingan Hasil

# 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"))
Perbandingan Hasil: Manual vs fungsi lm()
Metode b0 b1 (X1) b2 (X2) 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.

Pertanyaan 5: Prediksikan nilai ujian mahasiswa jika jumlah jam belajar 1 jam/minggu namun kehadirannya 100%?

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.

Kesimpulan

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.