Multikolinieritas
& Implikasinya
Ketika beberapa variabel prediktor saling berkorelasi tinggi satu sama lain, model regresi menjadi tidak stabil dan koefisien sulit diinterpretasikan. Ini adalah masalah multikolinieritas — salah satu jebakan terbesar dalam analisis regresi berganda.
1. Apa Itu Multikolinieritas?
Bayangkan hakim mendengar kesaksian dari 10 orang. Ternyata 7 di antaranya adalah anggota keluarga yang sama dan berkata hal yang persis sama. Menambahkan 7 saksi itu tidak memberikan informasi baru — hakim tidak bisa membedakan kontribusi masing-masing.
Begitu pula dalam regresi: jika variabel "suhu_celsius" dan "suhu_fahrenheit" keduanya dimasukkan sebagai prediktor, model tidak bisa memisahkan kontribusi masing-masing karena keduanya membawa informasi yang persis sama.
Multikolinieritas terjadi ketika dua atau lebih variabel prediktor (variabel X) dalam model regresi berkorelasi tinggi satu sama lain. Ada dua jenis:
Contoh Nyata Multikolinieritas
| Konteks | Variabel yang Berkorelasi Tinggi | Alasan |
|---|---|---|
| Prediksi harga rumah | Luas tanah ↔ Luas bangunan | Rumah besar biasanya di tanah besar |
| Prediksi nilai UAS | Jam belajar ↔ Kehadiran ↔ IPK semester lalu | Semua mencerminkan "ketekunan" mahasiswa |
| Analisis ekonomi | GDP ↔ Pendapatan per kapita ↔ Konsumsi | Semua tumbuh bersama seiring waktu |
| Kesehatan | Berat badan ↔ BMI ↔ Lingkar pinggang | Semua mengukur aspek yang sama dari obesitas |
| Cuaca | Suhu ↔ Kelembaban ↔ Indeks panas | Indeks panas dihitung dari suhu + kelembaban |
2. Dampak Multikolinieritas pada Model Regresi
Ilustrasi Dampak: Perbandingan Koefisien
ns = tidak signifikan | * p<0.05 | ** p<0.01 | *** p<0.001. "jam_belajar_2" adalah versi serupa jam_belajar yang dimasukkan ke model (r=0.91 dengan jam_belajar).
3. Cara Mendeteksi Multikolinieritas
4. VIF — Variance Inflation Factor
VIF mengukur seberapa besar variansi estimasi koefisien meningkat akibat multikolinieritas. VIF dihitung untuk setiap variabel prediktor.
VIF(Xⱼ) = 1 / (1 − R²ⱼ)
Di mana R²ⱼ adalah koefisien determinasi saat Xⱼ diregresikan terhadap semua prediktor lainnya.
Semakin tinggi R²ⱼ (Xⱼ bisa dijelaskan variabel lain), semakin tinggi VIF — koefisien Xⱼ semakin tidak bisa dipercaya.
VIF < 5 — Aman, tidak ada masalah multikolinieritas berarti
VIF 5–10 — Perlu diperhatikan; investigasi lebih lanjut
VIF 10–30 — Multikolinieritas tinggi; perlu penanganan
VIF > 30 — Sangat parah; model koefisien tidak dapat dipercaya
5. Solusi Mengatasi Multikolinieritas
✗ Kehilangan informasi potensial
✗ Komponen sulit diinterpretasikan
✗ Perlu tuning hyperparameter λ
✗ Bisa hapus variabel yang sebenarnya relevan
✗ Tidak selalu bisa mengumpulkan data lebih banyak
✗ Hanya untuk kolinieritas dari interaksi
1. Identifikasi pasangan dengan |r| > 0.85 di heatmap korelasi.
2. Hitung VIF — variabel dengan VIF > 10 adalah kandidat untuk ditangani.
3. Konsultasi domain: variabel mana yang paling bermakna secara bisnis? Pertahankan itu, hapus redundannya.
4. Jika tidak bisa hapus (semua penting), coba Ridge/Lasso atau PCA.
5. Jika tujuan adalah prediksi (bukan interpretasi koefisien), multikolinieritas tidak selalu jadi masalah kritis.
6. Praktik Python: Deteksi dan Penanganan
6.1 Deteksi VIF dan Korelasi
import pandas as pd
import numpy as np
from statsmodels.stats.outliers_influence import variance_inflation_factor
from sklearn.linear_model import LinearRegression
np.random.seed(42)
n = 100
jam_belajar = np.random.normal(4, 1.5, n)
# Buat variabel yang sangat berkorelasi dengan jam_belajar
catatan = jam_belajar * 1.2 + np.random.normal(0, 0.5, n)
les_tambahan= jam_belajar * 0.8 + np.random.normal(0, 0.3, n)
kehadiran = np.random.normal(80, 10, n) # independen
nilai_uts = 40 + 7*jam_belajar + 0.3*kehadiran + np.random.normal(0,5,n)
df = pd.DataFrame({
'jam_belajar' : jam_belajar,
'catatan' : catatan,
'les_tambahan' : les_tambahan,
'kehadiran' : kehadiran,
'nilai_uts' : nilai_uts
})
features = ['jam_belajar', 'catatan', 'les_tambahan', 'kehadiran']
X = df[features]
# ── Matriks korelasi antar prediktor ─────────────
print("=== KORELASI ANTAR PREDIKTOR ===")
print(X.corr().round(3))
# ── Hitung VIF ────────────────────────────────────
X_const = pd.DataFrame({'const': 1, **{c: X[c] for c in features}})
vif_data = pd.DataFrame({
'variabel': features,
'VIF': [variance_inflation_factor(X_const.values, i+1)
for i in range(len(features))]
}).round(2)
print("\n=== VARIANCE INFLATION FACTOR ===")
print(vif_data)
print("\nVariabel dengan VIF > 5:")
print(vif_data[vif_data['VIF'] > 5])
=== KORELASI ANTAR PREDIKTOR ===
jam_belajar catatan les_tambahan kehadiran
jam_belajar 1.000 0.939 0.946 0.027
catatan 0.939 1.000 0.893 0.042
les_tambahan 0.946 0.893 1.000 0.032
kehadiran 0.027 0.042 0.032 1.000 ← independen
=== VARIANCE INFLATION FACTOR ===
variabel VIF
0 jam_belajar 18.42 ← parah
1 catatan 13.67 ← parah
2 les_tambahan 16.91 ← parah
3 kehadiran 1.01 ← aman
Variabel dengan VIF > 5:
variabel VIF
0 jam_belajar 18.42
1 catatan 13.67
2 les_tambahan 16.91
6.2 Ridge dan Lasso Regression sebagai Solusi
from sklearn.linear_model import Ridge, Lasso, LinearRegression
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
X_all = df[features].values
y = df['nilai_uts'].values
X_train, X_test, y_train, y_test = train_test_split(
X_all, y, test_size=0.2, random_state=42)
# Scaling wajib sebelum regularisasi
sc = StandardScaler()
X_train_s = sc.fit_transform(X_train)
X_test_s = sc.transform(X_test)
models = {
'OLS biasa': LinearRegression(),
'Ridge (λ=1)': Ridge(alpha=1.0),
'Lasso (λ=0.5)': Lasso(alpha=0.5)
}
print(f"{'Model':<18} {'RMSE Test':>12} {'Koefisien'}")
print('-'*70)
for name, model in models.items():
model.fit(X_train_s, y_train)
y_pred = model.predict(X_test_s)
rmse = mean_squared_error(y_test, y_pred, squared=False)
coef_str = ' | '.join([f"{features[i]}={c:.2f}"
for i,c in enumerate(model.coef_)])
print(f"{name:<18} {rmse:>10.3f} {coef_str}")
Model RMSE Test Koefisien
----------------------------------------------------------------------
OLS biasa 5.12 jam_belajar=14.23 | catatan=-3.87 | les_tambahan=-4.91 | kehadiran=2.98
↑ koefisien tidak stabil — jam_belajar jauh lebih besar dari seharusnya
↑ catatan dan les_tambahan NEGATIF padahal mestinya positif!
Ridge (λ=1) 5.08 jam_belajar=4.82 | catatan=3.91 | les_tambahan=3.75 | kehadiran=2.85
✓ semua koefisien proporsional dan masuk akal
Lasso (λ=0.5) 5.14 jam_belajar=8.23 | catatan=0.00 | les_tambahan=0.00 | kehadiran=2.71
✓ catatan dan les_tambahan di-set nol (feature selection otomatis!)
Uji Pemahaman Sesi 12
- Multikolinieritas: dua atau lebih variabel prediktor saling berkorelasi tinggi — model tidak bisa memisahkan kontribusi masing-masing
- Dampak: SE koefisien membengkak, koefisien tidak stabil, t-test tidak bermakna, interpretasi sulit — tapi prediksi keseluruhan bisa masih OK
- Paradoks: R² tinggi tapi hampir semua variabel individual tidak signifikan = tanda kuat multikolinieritas
- Deteksi 1: matriks korelasi antar prediktor — |r| > 0.8–0.9 antar dua variabel patut dicurigai
- Deteksi 2: VIF = 1/(1−R²j) — VIF <5 aman, 5–10 perhatian, >10 parah, >30 kritis
- VIF mendeteksi kolinieritas gabungan (3+ variabel), bukan hanya berpasangan seperti matriks korelasi
- Solusi: (1) Hapus variabel redundan, (2) PCA/dimensi reduksi, (3) Ridge Regression (L2), (4) Lasso Regression (L1/feature selection), (5) perbesar sampel
- Jika tujuan prediksi (bukan interpretasi): Ridge/Lasso lebih dianjurkan daripada menghapus variabel
- Python: variance_inflation_factor() dari statsmodels; Ridge() dan Lasso() dari sklearn.linear_model
- Selalu scaling sebelum Ridge/Lasso karena regularisasi sensitif terhadap skala fitur