Satu fitur jarang cukup untuk menjelaskan harga rumah: luas, jarak ke pusat kota, dan jumlah kamar sama-sama ikut menentukan angka akhirnya. Regresi linier berganda memperluas garis satu fitur menjadi model dengan banyak fitur sekaligus, dan perluasan itu ternyata ringkas: semua rumus yang sebelumnya memakai vektor kini memakai matriks. Chapter ini membahas pandangan matriks atas data, arti satu koefisien di tengah banyak koefisien lain, empat asumsi klasik yang menopang model, dan satu demonstrasi yang tidak akan terlupakan: apa yang terjadi pada koefisien ketika dua fitur hampir sama persis.

Dari Garis ke Bidang: Pandangan Matriks #

Model berganda ditulis ŷ = w₁x₁ + w₂x₂ + ... + wₚxₚ + b, atau dalam notasi vektor ŷ = w · x + b — sebuah dot product antara vektor bobot dan vektor fitur, ditambah intersep. Dengan satu fitur model berbentuk garis; dengan dua fitur berbentuk bidang; dengan tiga fitur atau lebih berbentuk hyperplane. Bentuknya berubah, tetapi “linier dalam parameter” tetap: setiap bobot masuk lewat perkalian skalar biasa.

Sekarang kita susun seluruh data ke dalam desain matriks X berukuran (n, p): baris ke-i adalah vektor fitur sampel ke-i, kolom ke-j adalah fitur ke-j di seluruh sampel. Target y menjadi vektor panjang n, dan bobot w menjadi vektor panjang p. Prediksi seluruh dataset sekaligus hanyalah X · w + b — perkalian matriks-vektor yang sudah kita latih di Chapter Aljabar Linear untuk Machine Learning. Solusi least squares pun naik kelas menjadi w = (XᵀX)⁻¹Xᵀy; scikit-learn menyelesaikannya dengan dekomposisi numerik yang lebih stabil, tetapi maknanya sama: satu sistem persamaan, sekali jalan.

Membaca Koefisien per Fitur #

Atribut coef_ pada model berganda berisi satu koefisien per kolom fitur, dan intercept_ tetap satu angka. Koefisien fitur ke-j terbaca sebagai: perubahan prediksi ketika fitur ke-j naik satu satuan, dengan seluruh fitur lain dipegang tetap. Kata kunci “dipegang tetap” inilah yang membuat koefisien berganda lebih tajam dari korelasi satu-satu — koefisien mencoba mengisolasi kontribusi fitur tersebut dari yang lain. Konsekuensi praktisnya dibahas mendalam di Chapter Interpretasi Koefisien Regresi; di sini kita cukup membaca tanda dan besaran kasarnya.

Empat Asumsi Klasik #

Regresi berganda bekerja paling baik ketika beberapa kondisi data terpenuhi. Keempatnya tidak perlu dihafal — cukup dipahami gejala praktisnya:

AsumsiArti praktisGejala saat dilanggar
LinearitasHubungan tiap fitur dengan target memang kira-kira lurusPola residu melengkung; solusinya fitur polynomial (chapter Regresi Polynomial)
Independensi sampelSatu baris data tidak menentukan baris lainEstimasi terlalu percaya diri; umum pada data deret waktu
HomoskedastisitasSebaran derau kira-kira sama di semua tingkat prediksiGalat melebar di harga tinggi; pertimbangkan transformasi log target
Multikolinearitas minimFitur-fitur tidak saling berkorelasi kuatKoefisien tidak stabil dan sulit ditafsirkan — demo di bawah ini

Tiga asumsi pertama menyangkut sisa galat model; asumsi keempat menyangkut hubungan antar fitur dan menjadi bintang utama contoh kode kita, karena pelanggarannya paling sering terjadi tanpa disadari pada data nyata: luas bangunan dan luas tanah, pendapatan dan pengeluaran rumah tangga, jumlah klik dan jumlah kunjungan — pasangan seperti ini nyaris selalu bergerak bersama.

Contoh Kode: Tiga Fitur Sehat vs Satu Fitur Duplikat #

File regresi-berganda.py membangun 40 rumah sintetis dari generator berseed sehingga kita tahu koefisien kebenarannya: harga = 8,5·luas − 11·jarak + 22·kamar + 60 + derau. Model pertama dilatih pada tiga fitur yang saling bebas; model kedua ditambahi luas_duplikat = 1,05·luas + derau sangat kecil — korelasi 0,999998 dengan luas.

python
# Regresi linier berganda: banyak fitur sekaligus dalam satu desain matriks,
# plus demonstrasi efek multikolinearitas ketika dua fitur hampir sama persis.

import numpy as np
from sklearn.linear_model import LinearRegression

rng = np.random.default_rng(42)
n = 40

# Data sintetis 40 rumah dengan koefisien kebenaran yang kita ketahui:
# harga = 8.5*luas - 11.0*jarak + 22.0*kamar + 60 + derau kecil.
luas = rng.uniform(40.0, 120.0, size=n)
jarak_ke_pusat = rng.uniform(2.0, 20.0, size=n)
jumlah_kamar = rng.integers(2, 6, size=n).astype(float)
derau = rng.normal(loc=0.0, scale=12.0, size=n)
harga = 8.5 * luas - 11.0 * jarak_ke_pusat + 22.0 * jumlah_kamar + 60.0 + derau

# Desain matriks X berukuran (40 baris, 3 kolom): satu baris = satu rumah.
X1 = np.column_stack([luas, jarak_ke_pusat, jumlah_kamar])
nama_fitur = ["luas", "jarak_ke_pusat", "jumlah_kamar"]

model1 = LinearRegression().fit(X1, harga)
print("Model 1 -- tiga fitur berbeda (desain matriks sehat):")
for nama, koef in zip(nama_fitur, model1.coef_):
    print(f"  koefisien {nama:<15} = {koef:8.2f}")
print(f"  intersep                  = {model1.intercept_:8.2f}")

rumah_baru = np.array([[85.0, 8.0, 3.0]])
print(f"Prediksi (luas 85, jarak 8 km, 3 kamar) = {model1.predict(rumah_baru)[0]:.1f} juta")
print()

# Sekarang tambahkan fitur keempat yang nyaris menyalin luas:
# luas_duplikat = 1.05 * luas + sedikit derau -> korelasi nyaris 1 dengan luas.
luas_duplikat = 1.05 * luas + rng.normal(loc=0.0, scale=0.05, size=n)
X2 = np.column_stack([luas, jarak_ke_pusat, jumlah_kamar, luas_duplikat])
nama_fitur2 = nama_fitur + ["luas_duplikat"]

korelasi = np.corrcoef(luas, luas_duplikat)[0, 1]
print(f"Model 2 -- ditambah luas_duplikat, korelasi dengan luas = {korelasi:.6f}")
model2 = LinearRegression().fit(X2, harga)
for nama, koef in zip(nama_fitur2, model2.coef_):
    print(f"  koefisien {nama:<15} = {koef:8.2f}")
print(f"  intersep                  = {model2.intercept_:8.2f}")

rumah_baru2 = np.array([[85.0, 8.0, 3.0, 85.0 * 1.05]])
print(f"Prediksi rumah yang sama (model 2)      = {model2.predict(rumah_baru2)[0]:.1f} juta")
print()
print("Efek multikolinearitas: koefisien luas berubah tanda,")
print("luas_duplikat mengambil perannya, tetapi prediksi tetap sama.")

Output yang Dihasilkan:

text
Model 1 -- tiga fitur berbeda (desain matriks sehat):
  koefisien luas            =     8.44
  koefisien jarak_ke_pusat  =   -11.24
  koefisien jumlah_kamar    =    25.49
  intersep                  =    54.30
Prediksi (luas 85, jarak 8 km, 3 kamar) = 758.4 juta

Model 2 -- ditambah luas_duplikat, korelasi dengan luas = 0.999998
  koefisien luas            =    -9.48
  koefisien jarak_ke_pusat  =   -11.23
  koefisien jumlah_kamar    =    25.50
  koefisien luas_duplikat   =    17.07
  intersep                  =    54.54
Prediksi rumah yang sama (model 2)      = 758.4 juta

Efek multikolinearitas: koefisien luas berubah tanda,
luas_duplikat mengambil perannya, tetapi prediksi tetap sama.

Bedah kode di atas baris demi baris:

  1. Baris 7–8 (rng, n): generator default_rng(42) membuat seluruh data sintetis — dan urutan pemanggilan pada baris 12–16 menentukan angkanya, sehingga mengubah satu baris mengubah semuanya.
  2. Baris 12–16 (data sintetis): karena koefisien kebenaran diketahui (8,5 / −11,0 / 22,0), kita bisa menilai kualitas estimasi. Model 1 menghasilkan 8,44 / −11,24 / 25,49 — dekat dengan kebenaran, selisihnya wajar untuk 40 sampel dengan derau.
  3. Baris 19 (np.column_stack): tiga vektor panjang 40 dilem menjadi matriks (40, 3) — inilah desain matriks yang dibahas di awal chapter.
  4. Baris 22–29 (model 1 + prediksi): coef_ kini punya tiga entri yang dipetakan ke nama fitur lewat zip. Rumah 85 m², 8 km, 3 kamar diprediksi 758,4 juta; hitung manual 8,44×85 − 11,24×8 + 25,49×3 + 54,30 menghasilkan angka yang sama.
  5. Baris 34–36 (fitur duplikat): luas_duplikat sengaja dibuat sebagai salinan luas dengan skala 1,05 dan derau sangat kecil (0,05), sehingga korelasinya 0,999998 — meniru pasangan fitur nyaris kembar pada data dunia nyata.
  6. Baris 38–46 (model 2 + prediksi): perhatikan hasilnya: koefisien luas melompat dari +8,44 menjadi −9,48 (bahkan berubah tanda!), luas_duplikat mengambil +17,07, padahal prediksi rumah yang sama tetap 758,4 juta.

Pelajaran dari Multikolinearitas #

Mengapa koefisien bisa berantakan sementara prediksi utuh? Karena luas dan luas_duplikat mengandung informasi yang nyaris sama, tak ada cara unik membagi kredit di antara keduanya: kombinasi −9,48·luas + 17,07·luas_duplikat menghasilkan kemiringan efektif −9,48 + 1,05×17,07 ≈ 8,44 — persis seperti model sehat. Least squares menemukan satu jawaban dari tak terhingga jawaban yang sama baiknya untuk prediksi, dan jawaban yang kebetulan terpilih bisa tampak mustahil ditafsirkan (“tiap meter persegi menurunkan harga?”).

Model yang baik dan model yang bisa ditafsirkan ternyata dua tuntutan berbeda — dan multikolinearitas hanyalah salah satu jebakannya. Sebelum membaca lebih jauh ke arah tafsiran, kita perlu alat ukur yang jujur: seberapa salahkah prediksi model ini? Pertanyaan itu dijawab oleh metrik evaluasi — MAE, MSE, RMSE, dan R² — yang menjadi isi Chapter Metrik Evaluasi Regresi.

Referensi Resmi #