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:
| Asumsi | Arti praktis | Gejala saat dilanggar |
|---|---|---|
| Linearitas | Hubungan tiap fitur dengan target memang kira-kira lurus | Pola residu melengkung; solusinya fitur polynomial (chapter Regresi Polynomial) |
| Independensi sampel | Satu baris data tidak menentukan baris lain | Estimasi terlalu percaya diri; umum pada data deret waktu |
| Homoskedastisitas | Sebaran derau kira-kira sama di semua tingkat prediksi | Galat melebar di harga tinggi; pertimbangkan transformasi log target |
| Multikolinearitas minim | Fitur-fitur tidak saling berkorelasi kuat | Koefisien 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.
# 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:
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:
- Baris 7–8 (
rng,n): generatordefault_rng(42)membuat seluruh data sintetis — dan urutan pemanggilan pada baris 12–16 menentukan angkanya, sehingga mengubah satu baris mengubah semuanya. - 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.
- Baris 19 (
np.column_stack): tiga vektor panjang 40 dilem menjadi matriks(40, 3)— inilah desain matriks yang dibahas di awal chapter. - Baris 22–29 (model 1 + prediksi):
coef_kini punya tiga entri yang dipetakan ke nama fitur lewatzip. Rumah 85 m², 8 km, 3 kamar diprediksi 758,4 juta; hitung manual8,44×85 − 11,24×8 + 25,49×3 + 54,30menghasilkan angka yang sama. - Baris 34–36 (fitur duplikat):
luas_duplikatsengaja dibuat sebagai salinanluasdengan skala 1,05 dan derau sangat kecil (0,05), sehingga korelasinya 0,999998 — meniru pasangan fitur nyaris kembar pada data dunia nyata. - Baris 38–46 (model 2 + prediksi): perhatikan hasilnya: koefisien
luasmelompat dari +8,44 menjadi −9,48 (bahkan berubah tanda!),luas_duplikatmengambil +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 #
- Linear Models — scikit-learn User Guide — bagian Ordinary Least Squares membahas bentuk matriks dari regresi berganda.
- sklearn.linear_model.LinearRegression — API Reference
— perilaku
coef_berdimensi(n_targets, n_features)danintercept_. - numpy.column_stack — NumPy Documentation — fungsi penyusun desain matriks pada contoh.