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:
Estimasikan model regresi linier berganda menggunakan metode OLS berbasis matriks dan interpretasikan hasilnya?
Hitung Uji F dan uji t secara manual dan interpretasikan hasilnya?
Hitung nilai R² dan Adjusted R² secara manual dan interpretasikan hasilnya?
Bandingkan hasil no 1 s.d 3 dengan fungsi lm.
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.