Seorang peneliti ingin menganalisis faktor-faktor yang mempengaruhi nilai ujian mahasiswa (Y). Diduga bahwa nilai ujian dipengaruhi oleh: X1 = jumlah jam belajar (jam/minggu) X2 = tingkat kehadiran (%) Peneliti mengumpulkan data dari 10 mahasiswa sebagai berikut:

# --- INPUT DATA ---
# Membuat data frame berdasarkan tabel pada soal
data_ujian <- data.frame(
  No = 1:10,
  Y = c(65, 70, 75, 80, 85, 78, 72, 90, 88, 95),
  X1 = c(2, 3, 4, 5, 6, 5, 3, 7, 6, 8),
  X2 = c(60, 65, 70, 75, 80, 72, 68, 85, 83, 90)
)

# Menampilkan data untuk memastikan input benar
print("--- Data Penelitian ---")
## [1] "--- Data Penelitian ---"
print(data_ujian)
##    No  Y X1 X2
## 1   1 65  2 60
## 2   2 70  3 65
## 3   3 75  4 70
## 4   4 80  5 75
## 5   5 85  6 80
## 6   6 78  5 72
## 7   7 72  3 68
## 8   8 90  7 85
## 9   9 88  6 83
## 10 10 95  8 90

PERTANYAAN:

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

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

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

  4. Bandingkan hasil no 1 s.d 3 dengan fungsi lm.

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

# ==============================================================================
# SOAL 1: ESTIMASI MODEL OLS BERBASIS MATRIKS
# ==============================================================================
# a. Menyiapkan Matriks
n <- nrow(data_ujian) # Jumlah observasi
ones <- rep(1, n)      # Vektor satuan untuk intercept
X_mat <- as.matrix(cbind(ones, data_ujian[, c("X1", "X2")]))
Y_vec <- as.matrix(data_ujian$Y)

# b. Menghitung koefisien (beta) menggunakan rumus: beta = (X'X)^-1 * X'Y
XtX <- t(X_mat) %*% X_mat
XtY <- t(X_mat) %*% Y_vec
XtX_inv <- solve(XtX) # Menghitung invers
beta <- XtX_inv %*% XtY

# Menamai baris koefisien agar jelas
rownames(beta) <- c("b0 (Intercept)", "b1 (X1)", "b2 (X2)")

# c. Menampilkan Hasil Estimasi
print("Koefisien Regresi (beta):")
## [1] "Koefisien Regresi (beta):"
print(beta)
##                      [,1]
## b0 (Intercept) 16.1360113
## b1 (X1)         1.1698379
## b2 (X2)         0.7744891

Berdasarkan perhitungan manual menggunakan matriks, diperoleh model regresi linier berganda: \(Y = 16.136 + 1.170 X_1 + 0.774 X_2\). Nilai konstanta sebesar 16.136 menunjukkan perkiraan nilai ujian jika variabel jam belajar dan kehadiran dianggap nol. Secara spesifik, setiap penambahan satu jam belajar per minggu (\(X_1\)) diprediksi akan meningkatkan nilai ujian sebesar 1.17 poin, dengan catatan tingkat kehadiran tetap. Di sisi lain, setiap kenaikan 1% tingkat kehadiran (\(X_2\)) berkontribusi pada peningkatan nilai ujian sebesar 0.77 poin, dengan asumsi jam belajar tidak berubah.

# ==============================================================================
# SOAL 2 & 3: HITUNG UJI F, UJI t, R2, DAN ADJUSTED R2 SECARA MANUAL
# ==============================================================================

# --- Persiapan Perhitungan (Manual) ---
k <- ncol(X_mat) - 1 # Jumlah variabel independen
dfr <- k             # Derajat bebas regresi
dfe <- n - k - 1     # Derajat bebas error
dft <- n - 1         # Derajat bebas total

# Prediksi (Y_topi) dan Residual (e)
Y_hat <- X_mat %*% beta
residuals <- Y_vec - Y_hat

# Menghitung Sum of Squares
SSR <- sum((Y_hat - mean(Y_vec))^2) # Sum of Squares Regression
SSE <- sum(residuals^2)             # Sum of Squares Error (Residual)
SST <- sum((Y_vec - mean(Y_vec))^2)  # Sum of Squares Total

# Variansi dan Standar Error Koefisien
MSE <- SSE / dfe
var_beta <- MSE * XtX_inv # Matriks varians-kovarians
se_beta <- sqrt(diag(var_beta))

# --- SOAL 2: Uji F dan Uji t Manual ---
print("--- Perhitungan Uji F Manual ---")
## [1] "--- Perhitungan Uji F Manual ---"
MSR <- SSR / dfr
F_hitung <- MSR / MSE
p_val_F <- 1 - pf(F_hitung, dfr, dfe) # F-distribution p-value

cat("F-hitung:", F_hitung, "\n")
## F-hitung: 5172.116
cat("p-value F:", p_val_F, "\n")
## p-value F: 8.042123e-12
cat("Interpretasi Uji F:\n")
## Interpretasi Uji F:
print("--- Perhitungan Uji t Manual ---")
## [1] "--- Perhitungan Uji t Manual ---"
t_hitung <- beta / se_beta
# Menghitung p-value dua arah (two-tailed)
p_val_t <- 2 * (1 - pt(abs(t_hitung), dfe))

hasil_t <- data.frame(
  Koefisien = rownames(beta),
  Estimate = beta,
  Std_Error = se_beta,
  t_value = t_hitung,
  p_value = p_val_t
)
rownames(hasil_t) <- NULL # hapus rownames df agar rapi
print(hasil_t)
##        Koefisien   Estimate  Std_Error   t_value      p_value
## 1 b0 (Intercept) 16.1360113 2.83677490  5.688154 7.444177e-04
## 2        b1 (X1)  1.1698379 0.27843551  4.201468 4.028204e-03
## 3        b2 (X2)  0.7744891 0.05571759 13.900261 2.357834e-06

Melalui pengujian statistik, terbukti bahwa jumlah jam belajar dan tingkat kehadiran secara bersama-sama (simultan) berpengaruh sangat signifikan terhadap nilai ujian, yang ditunjukkan oleh nilai F-hitung (5172) yang sangat besar dengan p-value yang jauh di bawah 0.05. Secara individu (Uji t), kedua variabel juga terbukti signifikan secara statistik (p-value \(X_1 = 0.004\) dan \(X_2 \approx 0\)). Hal ini memberikan bukti kuat bahwa baik usaha belajar mandiri maupun kehadiran di kelas merupakan faktor nyata yang menentukan tinggi rendahnya nilai ujian mahasiswa.

# --- SOAL 3: R2 dan Adjusted R2 Manual ---
print("--- Perhitungan R2 dan Adjusted R2 Manual ---")
## [1] "--- Perhitungan R2 dan Adjusted R2 Manual ---"
R2 <- SSR / SST
R2_adj <- 1 - ((SSE / dfe) / (SST / dft))

cat("R-squared (R2):", R2, "\n")
## R-squared (R2): 0.9993238
cat("Adjusted R-squared:", R2_adj, "\n")
## Adjusted R-squared: 0.9991305

Model ini memiliki tingkat akurasi yang sangat tinggi, dengan nilai koefisien determinasi (\(R^2\)) sebesar 99.93%. Artinya, variasi nilai ujian mahasiswa hampir seluruhnya dapat dijelaskan oleh variasi jam belajar dan tingkat kehadiran. Hanya sebesar 0.07% saja yang dipengaruhi oleh faktor lain di luar model. Nilai Adjusted R-squared yang mencapai 99.91% juga mengonfirmasi bahwa model ini sangat stabil dan sangat cocok untuk menggambarkan data yang diteliti.

# ==============================================================================
# SOAL 4: BANDINGKAN HASIL MANUAL DENGAN FUNGSI lm()
# ==============================================================================

# Membuat model menggunakan fungsi bawaan R
model_lm <- lm(Y ~ X1 + X2, data = data_ujian)

# Menampilkan ringkasan model
print("--- Output Fungsi summary(lm(...)) ---")
## [1] "--- Output Fungsi summary(lm(...)) ---"
ringkasan_lm <- summary(model_lm)
print(ringkasan_lm)
## 
## Call:
## lm(formula = Y ~ X1 + X2, data = data_ujian)
## 
## 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
# Ekstrak nilai-nilai kunci untuk perbandingan langsung
manual_vals <- c(beta[1], beta[2], beta[3], R2, R2_adj, F_hitung)
lm_vals <- c(coef(model_lm), ringkasan_lm$r.squared, ringkasan_lm$adj.r.squared, ringkasan_lm$fstatistic[1])
names_compare <- c("Intercept", "X1", "X2", "R2", "Adj_R2", "F_Stat")

print("--- Perbandingan Langsung (Manual vs lm) ---")
## [1] "--- Perbandingan Langsung (Manual vs lm) ---"
perbandingan <- data.frame(
  Metode_Manual = manual_vals,
  Fungsi_lm = lm_vals,
  Selisih = manual_vals - lm_vals
)
rownames(perbandingan) <- names_compare
print(perbandingan)
##           Metode_Manual    Fungsi_lm       Selisih
## Intercept    16.1360113   16.1360113  1.865175e-11
## X1            1.1698379    1.1698379  1.304512e-12
## X2            0.7744891    0.7744891 -1.983969e-13
## R2            0.9993238    0.9993238  1.233458e-13
## Adj_R2        0.9991305    0.9991305  1.110223e-16
## F_Stat     5172.1157895 5172.1157895  5.484253e-10

Hasil perbandingan menunjukkan bahwa perhitungan manual menggunakan metode matriks menghasilkan angka yang identik (sama persis) dengan fungsi lm() bawaan R. Selisih angka yang muncul sangat kecil (dalam orde \(10^{-11}\) hingga \(10^{-16}\)), yang merupakan hal wajar dalam komputasi digital karena pembulatan presisi mesin. Hal ini memvalidasi bahwa langkah-langkah perhitungan manual yang dilakukan sudah benar dan sesuai dengan standar algoritma statistik profesional.

# ==============================================================================
# SOAL 5: PREDIKSI NILAI UJIAN MAHASISWA BARU
# ==============================================================================

# Data mahasiswa baru: X1 = 1 jam/minggu, X2 = 100%
X1_baru <- 1
X2_baru <- 100

# Menggunakan koefisien dari hasil manual (atau lm)
b0 <- beta[1]
b1 <- beta[2]
b2 <- beta[3]

# Cara 1: Hitung manual menggunakan rumus model
Y_prediksi_manual <- b0 + (b1 * X1_baru) + (b2 * X2_baru)

# Cara 2: Menggunakan fungsi predict() di R
data_baru <- data.frame(X1 = X1_baru, X2 = X2_baru)
Y_prediksi_lm <- predict(model_lm, newdata = data_baru)

cat("Prediksi Nilai Ujian (Manual):", Y_prediksi_manual, "\n")
## Prediksi Nilai Ujian (Manual): 94.75476
cat("Prediksi Nilai Ujian (predict fungsi):", Y_prediksi_lm, "\n")
## Prediksi Nilai Ujian (predict fungsi): 94.75476

Apabila model ini digunakan untuk memprediksi nilai mahasiswa yang hanya belajar 1 jam per minggu namun memiliki tingkat kehadiran 100%, maka estimasi nilai ujian yang akan diperoleh adalah 94.75. Meskipun waktu belajarnya sangat rendah, kehadiran yang sempurna mampu mendongkrak nilai secara signifikan dalam model ini.