MA1420 · DATA SAINS · SESI 12

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?

💡 ILUSTRASI — DUA SAKSI YANG BERKATA HAL SAMA

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:

MULTIKOLINIERITAS SEMPURNA X₃ = 2×X₁ + X₂
Satu variabel adalah kombinasi linear persis dari yang lain. Matriks singular — model tidak bisa dihitung sama sekali. Contoh: memasukkan suhu °C dan °F sekaligus.
MULTIKOLINIERITAS TINGGI (praktikal) Corr(X₁, X₂) ≈ 0.85+
Korelasi sangat tinggi tapi tidak sempurna. Model bisa dihitung, tapi koefisien tidak stabil dan standard error membengkak. Lebih umum terjadi di data nyata.

Contoh Nyata Multikolinieritas

KonteksVariabel yang Berkorelasi TinggiAlasan
Prediksi harga rumahLuas tanah ↔ Luas bangunanRumah besar biasanya di tanah besar
Prediksi nilai UASJam belajar ↔ Kehadiran ↔ IPK semester laluSemua mencerminkan "ketekunan" mahasiswa
Analisis ekonomiGDP ↔ Pendapatan per kapita ↔ KonsumsiSemua tumbuh bersama seiring waktu
KesehatanBerat badan ↔ BMI ↔ Lingkar pinggangSemua mengukur aspek yang sama dari obesitas
CuacaSuhu ↔ Kelembaban ↔ Indeks panasIndeks panas dihitung dari suhu + kelembaban

2. Dampak Multikolinieritas pada Model Regresi

📈
SE Membengkak
Standard error koefisien meningkat drastis → interval kepercayaan sangat lebar → estimasi tidak presisi.
🎲
Koefisien Tidak Stabil
Menambah atau menghapus satu observasi bisa mengubah tanda atau besaran koefisien secara drastis.
🔍
t-test Tidak Bermakna
Variabel yang sebenarnya penting menjadi tidak signifikan secara statistik karena SE-nya besar.
🤔
Interpretasi Sulit
Koefisien tidak bisa diinterpretasikan sebagai "efek murni X pada Y" — efek tercampur antar variabel.
Prediksi Masih OK
Meski koefisien tidak bisa diinterpretasikan, prediksi model bisa tetap akurat jika pola multikolinieritas bertahan di data baru.
📉
R² Tinggi, t Rendah
Paradoks: R² keseluruhan tinggi (model fit baik), tapi tidak ada variabel individual yang signifikan secara t-test.

Ilustrasi Dampak: Perbandingan Koefisien

✓ TANPA MULTIKOLINIERITAS
jam_belajar +8.25***
kehadiran +0.43**
jam_tidur +1.12*
SE(jam_belajar) 1.42
⚠️ DENGAN MULTIKOLINIERITAS
jam_belajar +12.87ns
jam_belajar_2 −5.21ns
jam_tidur +1.08*
SE(jam_belajar) 9.74 ← 7× lebih besar!

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

1
Periksa Matriks Korelasi antar Prediktor
Cara cepat pertama: jika ada pasangan prediktor dengan |r| > 0.8–0.9, kemungkinan besar ada masalah. Ini hanya mendeteksi multikolinieritas berpasangan (pairwise), tidak mendeteksi kolinieritas gabungan 3+ variabel.
df[predictors].corr()
2
Hitung VIF (Variance Inflation Factor)
Metode yang lebih komprehensif — mendeteksi multikolinieritas gabungan, tidak hanya berpasangan. VIF mengukur seberapa besar variansi koefisien meningkat akibat kolinieritas.
from statsmodels.stats.outliers_influence import variance_inflation_factor
3
Amati Paradoks R²-tinggi-tapi-t-rendah
Jika R² keseluruhan tinggi (≥ 0.7) tapi hampir semua uji-t individual tidak signifikan, ini tanda kuat multikolinieritas. Model "tahu" bahwa variabel-variabelnya bersama informatif, tapi tidak bisa memisahkan kontribusi masing-masing.
model.summary() dari statsmodels
4
Cek Condition Number (Angka Kondisi)
Metode lanjutan dari aljabar linear. Condition number > 30 mengindikasikan multikolinieritas sedang; > 100 parah. Berguna untuk diagnosis komprehensif.
np.linalg.cond(X_matrix)

4. VIF — Variance Inflation Factor

VIF mengukur seberapa besar variansi estimasi koefisien meningkat akibat multikolinieritas. VIF dihitung untuk setiap variabel prediktor.

RUMUS DAN INTERPRETASI VIF

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.

Variabel
VIF
Visualisasi
Status
jam_tidur
1.15
✓ OK (<5)
kehadiran
2.34
✓ OK (<5)
jam_belajar
6.72
⚠ Sedang (5–10)
catatan_harian
11.45
⚠ Tinggi (10–30)
jam_les_tambahan
24.83
✗ Parah (>10)
total_waktu_studi
89.21
✗✗ KRITIS (>30)
📏 PANDUAN THRESHOLD VIF

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

Solusi
Cara & Kapan
Kelebihan / Kekurangan
Hapus variabel
Dari sepasang variabel berkorelasi tinggi, pilih yang paling relevan secara domain; hapus yang redundan. Mudah dan langsung.
✓ Sederhana
✗ Kehilangan informasi potensial
PCA / Dimensi Reduksi
Gabungkan variabel berkorelasi ke komponen ortogonal baru (tidak saling berkorelasi). Gunakan komponen sebagai prediktor.
✓ Tidak ada info hilang
✗ Komponen sulit diinterpretasikan
Ridge Regression
Tambahkan penalti L2 pada koefisien (λΣβ²). Koefisien "diperkecil" menuju 0 — tidak dihapus. Cocok saat semua variabel memang penting.
✓ Pertahankan semua variabel
✗ Perlu tuning hyperparameter λ
Lasso Regression
Penalti L1 (λΣ|β|). Beberapa koefisien di-set ke nol persis — built-in feature selection. Menghasilkan model yang sparse (jarang).
✓ Feature selection otomatis
✗ Bisa hapus variabel yang sebenarnya relevan
Perbesar Sampel
Multikolinieritas sering lebih buruk pada sampel kecil. Data lebih banyak memberi estimasi koefisien yang lebih stabil.
✓ Tidak mengubah model
✗ Tidak selalu bisa mengumpulkan data lebih banyak
Centering variabel
Kurangi mean dari setiap variabel sebelum membuat interaction term. Mengurangi multikolinieritas yang muncul dari interaksi X₁×X₂.
✓ Mudah, preservasi interpretasi
✗ Hanya untuk kolinieritas dari interaksi
💡 STRATEGI PRAKTIS BERURUTAN

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

PYTHON · DETEKSI MULTIKOLINIERITAS
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])
📤 OUTPUT
=== 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

PYTHON · RIDGE & LASSO vs OLS BIASA
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}")
📤 OUTPUT
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

🧩PERTANYAAN 1 — IDENTIFIKASI
Model regresi prediksi harga rumah menyertakan fitur: luas_tanah, luas_bangunan, jumlah_kamar, harga_tanah_per_m2. Pasangan mana yang paling berpotensi menyebabkan multikolinieritas?
Benar! B. luas_tanah ↔ harga_tanah_per_m2 sangat berpotensi — di lokasi tertentu, luas tanah bisa berkorelasi tinggi dengan harga per m² (lokasi strategis = tanah sempit tapi mahal). Lebih jelas lagi: luas_bangunan ↔ jumlah_kamar — semakin luas bangunan, biasanya semakin banyak kamar. Keduanya mengukur "ukuran rumah" dari aspek berbeda. Identifikasi ini dilakukan lewat matriks korelasi dan VIF.
🧩PERTANYAAN 2 — VIF
Variabel X₃ diregresikan terhadap X₁ dan X₂, menghasilkan R² = 0.90. Berapakah VIF(X₃), dan apa artinya?
Benar! A. VIF = 1/(1 − R²) = 1/(1 − 0.90) = 1/0.10 = 10. Artinya: variansi koefisien X₃ dalam model regresi adalah 10 kali lebih besar dari yang seharusnya jika X₃ tidak berkorelasi dengan prediktor lain. VIF = 10 termasuk parah — perlu penanganan. SE koefisien X₃ menjadi √10 ≈ 3.16× lebih besar dari idealnya.
🧩PERTANYAAN 3 — SOLUSI
Peneliti memiliki 12 variabel prediktor tapi banyak yang saling berkorelasi (VIF 8–25). Tujuannya adalah prediksi akurat, bukan interpretasi koefisien. Solusi mana yang PALING TEPAT?
Benar! C. Karena tujuan adalah prediksi (bukan interpretasi), kita tidak harus mengorbankan variabel. Ridge Regression menambahkan penalti L2 yang menstabilkan koefisien tanpa menghapus variabel — cocok saat semua variabel mungkin relevan. PCA mengubah variabel berkorelasi menjadi komponen ortogonal — prediksi tetap akurat. Lasso (pilihan D) bisa menghapus variabel yang sebetulnya informatif untuk prediksi, jadi tidak selalu terbaik.
📋 Ringkasan Sesi 12