Garis ŷ = 54.38 + 5.29·x sudah berdiri, koefisiennya masuk akal, asumsinya telah diperiksa. Pertanyaan terakhir sebelum model dipakai untuk keputusan: seberapa baik ia bekerja? “Baik” pada regresi punya beberapa wajah — seberapa banyak variasi nilai yang berhasil dijelaskan, seberapa besar galat tipikal prediksinya dalam satuan asli, apakah modelnya signifikan secara statistik, dan yang paling menegangkan: apakah kinerjanya bertahan pada data yang belum pernah dilihatnya. Chapter penutup section ini merakit satu kerangka evaluasi lengkap, semuanya dihitung nyata pada model enam siswa dan model dua prediktor dari chapter Multiple Linear Regression.
Dekomposisi Variasi: SST = SSR + SSE #
Seluruh metrik kecocokan berakar pada satu pemisahan elegan. Setiap observasi menyimpang dari mean ȳ sebesar (y − ȳ); model menjelaskan sebagian dari penyimpangan itu melalui prediksinya. Deviasi observasi pun dapat diurai menjadi dua:
y - ȳ = (ŷ - ȳ) + (y - ŷ)
bagian + bagian
dijelaskan tersisa (residual)Mengkuadratkan dan menjumlahkan seluruh observasi (hasil silangnya saling meniadakan — buah dari rumus least squares) menghasilkan identitas:
SST = SSR + SSE
SST = Σ(y - ȳ)² variasi total pada data (Sum of Squares Total)
SSR = Σ(ŷ - ȳ)² variasi yang dijelaskan model (Sum of Squares Regression)
SSE = Σ(y - ŷ)² variasi galat yang tidak dijelaskan (Sum of Squares Error)Peran ketiganya mudah dibayangkan: SST mengukur seberapa jauh nilai siswa menyebar dari ȳ = 78.17 — tantangan asli yang harus dijelaskan siapa pun. SSR mengukur seberapa banyak dari penyebaran itu berhasil dilacak garis prediksi. SSE adalah sisa yang garis gagal jelaskan. Pada model enam siswa: SST = 490.83, SSR = 488.93, dan SSE = 1.90 (dibulatkan ke dua desimal) — garis kita menjelaskan hampir seluruh tantangannya.
R²: Proporsi Variasi yang Dijelaskan #
Koefisien determinasi R² membaca dekomposisi di atas sebagai proporsi:
R² = SSR / SST = 1 - SSE / SSTUntuk model enam siswa: R² = 488.93/490.83 = 0.9961 — 99.61% variasi nilai ulangan dijelaskan oleh jam belajar, dan hanya 0.39% yang tersisa sebagai galat. Pada regresi sederhana, R² selalu sama dengan kuadrat korelasi: r = 0.9981, dan 0.9981² = 0.9961 — dua angka yang tampak berbeda itu satu benda yang sama dilihat dari dua sisi. Interpretasinya perlu kalimat yang tepat: R² bicara tentang variasi keseluruhan, bukan presisi tiap prediksi — R² tinggi tidak menjamin setiap prediksi presisi, karena galat bisa menumpuk pada wilayah rentang x tertentu.
Adjusted R²: Menghukum Prediktor Pembonceng #
Kelemahan R² sudah disinggung pada chapter Multiple Linear Regression: menambah prediktor apa pun tidak pernah menurunkannya, sehingga model dengan nomor absen pun tampak “lebih baik” dari model tanpa nomor absen. Adjusted R² membebankan penalti sebesar jumlah prediktor:
R2-adj = 1 - (1 - R²) · (n - 1) / (n - k - 1)dengan k jumlah prediktor dan n jumlah observasi. Penerapannya pada dua model nyata kita: model dua prediktor delapan siswa (belajar dan tidur) memiliki R² = 0.9740 dan R2-adj = 0.9636 — keduanya tinggi karena kedua prediktor benar-benar bekerja. Pada model enam siswa, menambahkan nomor absen sebagai prediktor kedua menaikkan R² dari 0.9961 ke 0.9969, tetapi R2-adj justru turun dari 0.9951 ke 0.9948 — penalti melebihi sumbangan prediktornya, dan kesimpulan yang jujur adalah prediktor pembonceng itu tidak berguna. Inilah angka yang dipakai ketika membandingkan model dengan jumlah prediktor berbeda.
RMSE, RSE, dan MAE: Galat dalam Satuan Asli #
R² bebas satuan — kekuatan sekaligus kelemahannya, karena “99.61%” tidak memberi tahu berapa poin galat model per prediksi. Tiga metrik melengkapinya dalam satuan y:
RMSE = √(SSE / n)
RSE = √(SSE / (n - k - 1))
MAE = Σ|y - ŷ| / nRMSE (root mean squared error) adalah akar dari rata-rata kuadrat galat: 0.56 poin nilai untuk model kita — galat prediksi model ini secara khas hanya setengah poin. RSE (residual standard error) memakai pembagi derajat kebebasan n − k − 1, versi taksir-parameter yang menjadi fondasi standard error dan confidence interval koefisien: 0.69 poin (SSE 1.9048 dibagi df = 4 lalu diakarkan). MAE (mean absolute error) merata-ratakan galat mutlak tanpa pengkuadratan: 0.41 poin. Ketiganya dibulatkan ke dua desimal.
Perbedaan RMSE (0.56) dan MAE (0.41) pada data yang sama bukan kebetulan: pengkuadratan memberi galat besar bobot berlebih, dan residual terbesar kita (1.19 poin pada Rina) menarik RMSE naik lebih tinggi daripada MAE. Pemilihannya mengikuti kebutuhan:
| Aspek | MAE | RMSE |
|---|---|---|
| Bobot galat besar | proporsional (linear) | dikuadratkan — jauh lebih berat |
| Sensitivitas outlier | moderat | tinggi |
| Interpretasi angka | galat tipikal “apa adanya” | menghukum galat besar lebih keras |
| Cocok ketika | satu galat ekstrem tidak boleh mendominasi penilaian | galat besar harus terasa dalam evaluasi |
Evaluasi Out-of-Sample: Train/Test Split #
Seluruh metrik di atas dihitung pada data yang dipakai membangun model — evaluasi in-sample. Kelemahannya mendasar: model bisa menghafal kekhasan data itu sendiri, dan hafalan menyamar sebagai kinerja. Fenomena ini bernama overfitting: semakin banyak prediktor (atau semakin lentur modelnya), semakin besar ruang bagi model mengejar galat kecil pada data pelatihan dengan pola yang tidak berlaku di tempat lain — galat in-sample terus turun sementara galat pada data baru justru naik.
Obatnya adalah menguji pada data yang tidak pernah dilihat model: bagi data secara acak menjadi subset pelatihan (train) untuk membangun model dan subset pengujian (test) untuk mengukurnya. Kinerja pada test set adalah taksiran jujur kinerja di masa depan, karena di sana model tidak punya kesempatan menghafal. Praktik umumnya 70-80% train dan 20-30% test, atau k-fold cross-validation yang memutar peran tiap bagian. Perlu jujur pada dataset kita: enam observasi terlalu kecil untuk displit — galat evaluasi pada split begitu besar sehingga hasilnya tidak informatif; prinsipnya tetap wajib dipahami sekarang dan dipraktikkan begitu data membesar.
F-Test: Uji Signifikansi Keseluruhan Model #
Uji terakhir menanyakan: apakah model keseluruhannya signifikan, atau semua slope itu sebenarnya nol? Statistik ujinya membandingkan variasi per derajat kebebasan yang dijelaskan model dengan yang tersisa:
F = MSR / MSE = (SSR / k) / (SSE / (n - k - 1))Untuk model enam siswa: MSR = 488.93/1 = 488.93 dan MSE = 1.9048/4 = 0.4762, sehingga F = 1026.75 dengan derajat kebebasan (1, 4) dan p-value 0.0000057. Tabel ANOVA-nya merapikan seluruh angka itu — struktur yang persis sekeluarga dengan tabel ANOVA pada chapter ANOVA di Section Pengujian Hipotesis:
| Sumber variasi | SS | df | MS | F |
|---|---|---|---|---|
| Regresi | 488.93 | 1 | 488.93 | 1026.75 |
| Residual | 1.90 | 4 | 0.4762 | |
| Total | 490.83 | 5 |
Pada regresi sederhana, F ini adalah kuadrat dari uji-t slope: t = 32.0429 dari chapter Korelasi, dan 32.0429² = 1026.75 — keduanya menguji satu slope yang sama sehingga p-value-nya identik. Pada regresi berganda keduanya berbeda peran: F menguji “apakah minimal satu prediktor berguna”, sedangkan uji-t per koefisien menguji “apakah prediktor ini yang berguna” — perbedaan yang menjadi penting justru ketika multikolinearitas membuat jawaban individual kabur.
Ringkasan: Memilih Metrik yang Tepat #
| Metrik | Pertanyaan yang dijawab | Nilai model kita | Catatan pemakaian |
|---|---|---|---|
| R² | berapa proporsi variasi y dijelaskan | 0.9961 | naik otomatis saat prediktor bertambah |
| R2-adj | idem, dengan penalti jumlah prediktor | 0.9951 | untuk membandingkan model berbeda k |
| RMSE | galat prediksi tipikal (satuan y) | 0.56 poin | sensitif terhadap galat besar |
| MAE | galat mutlak rata-rata (satuan y) | 0.41 poin | lebih tahan galat ekstrem |
| RSE | galat versi taksiran (satuan y) | 0.69 poin | fondasi standard error koefisien |
| F | apakah model keseluruhan signifikan | 1026.75 | dibaca bersama tabel ANOVA |
Aturan kasarnya: R² dan R2-adj untuk membandingkan dan mengomunikasikan kekuatan model, RMSE atau MAE untuk berbicara tentang besarnya galat dalam satuan asli, F untuk signifikansi keseluruhan, dan test set untuk klaim kinerja di masa depan.
Menghitung Evaluasi Model dengan Python #
Seluruh dekomposisi dihitung dari definisinya, lalu perbandingan R² vs adjusted R² dikerjakan dengan NumPy pada model dengan dan tanpa prediktor pembonceng:
import math
import statistics
jam = [2, 3, 4, 5, 6, 7]
nilai = [65, 70, 75, 82, 86, 91]
n = len(jam)
model = statistics.linear_regression(jam, nilai)
ybar = sum(nilai) / n
yhat = [model.intercept + model.slope * x for x in jam]
SSR = sum((yh - ybar) ** 2 for yh in yhat)
SSE = sum((y - yh) ** 2 for y, yh in zip(nilai, yhat))
SST = SSR + SSE
R2 = SSR / SST
RMSE = math.sqrt(SSE / n)
print(f"SST = {SST:.2f} SSR = {SSR:.2f} SSE = {SSE:.2f}")
print(f"R2 = {R2:.4f}")
print(f"RMSE = {RMSE:.2f} poin nilai")Output yang Dihasilkan:
SST = 490.83 SSR = 488.93 SSE = 1.90
R2 = 0.9961
RMSE = 0.56 poin nilaiUji prediktor pembonceng memakai numpy.linalg.lstsq:
import numpy as np
jam = [2, 3, 4, 5, 6, 7]
absen = [3, 1, 4, 1, 5, 2]
nilai = [65, 70, 75, 82, 86, 91]
n = 6
def fit(prediktor):
X = np.column_stack([np.ones(n)] + prediktor)
koef, *_ = np.linalg.lstsq(X, np.array(nilai), rcond=None)
SSE = float(((np.array(nilai) - X @ koef) ** 2).sum())
SST = float(((np.array(nilai) - np.mean(nilai)) ** 2).sum())
k = len(prediktor)
r2 = 1 - SSE / SST
adj = 1 - (1 - r2) * (n - 1) / (n - k - 1)
return k, r2, adj
for label, preds in [("jam belajar saja", [jam]), ("jam + nomor absen", [jam, absen])]:
k, r2, adj = fit(preds)
print(f"{label:18s} k = {k} R2 = {r2:.4f} R2-adj = {adj:.4f}")Output yang Dihasilkan:
jam belajar saja k = 1 R2 = 0.9961 R2-adj = 0.9951
jam + nomor absen k = 2 R2 = 0.9969 R2-adj = 0.9948Mari kita bedah kode di atas:
- Baris 11-13 (dekomposisi): SSR menjumlahkan kuadrat (ŷ − ȳ), SSE menjumlahkan kuadrat residual, dan keduanya bertambah tepat menjadi SST = 490.83 — identitas dekomposisi terbukti secara numerik.
- Baris 14-15 (dua metrik): R² = 488.93/490.83 = 0.9961 dan RMSE = √(1.90/6) = 0.56 poin — proporsi variasi dan galat tipikal dalam satu snippet.
- Snippet kedua (
fit): function yang sama dipakai dua model; menambah nomor absen menaikkan R2 dari 0.9961 ke 0.9969 tetapi R2-adj turun dari 0.9951 ke 0.9948 — deteksi prediktor tidak berguna lewat satu baris perbandingan.
Dokumentasi numpy.linalg.lstsq dan operasi statistik NumPy tersedia di dokumentasi NumPy
; teori dekomposisi variasi, ANOVA regresi, dan evaluasi model dibahas di Penn State STAT 500
, NIST/SEMATECH e-Handbook
, dan OpenIntro Statistics
.
Kerangka korelasi dan regresi kini lengkap: mengukur arah lewat kovarians, kekuatan lewat korelasi, kehati-hatian kausal pada tiga jalur alternatif, model linear sederhana dan berganda, asumsi yang menopangnya, dan metrik untuk menilainya. Satu bentuk data yang belum kita sentuh adalah data yang berurutan dalam waktu — harga harian, curah hujan bulanan, kunjungan situs per jam — tempat observasi saling terkait dan residual antar periode berkorelasi. Menganalisisnya menuntut perangkat baru yang dibangun di atas regresi: itulah wilayah Section Analisis Deret Waktu berikutnya.