Seluruh model pada section ini memprediksi angka pada skala terbuka: nilai ulangan 0-100, harga beras ribuan rupiah per kilogram. Banyak pertanyaan nyata justru berjawaban dua kategori — lulus atau tidak, cacat atau tidak, tertarik atau tidak — dan menyimpannya sebagai angka 0 dan 1 tidak membuat garis regresi biasa menjadi alat yang tepat. Regresi logistik memperluas keluarga regresi ke respons biner semacam itu: peluang sukses dimodelkan sebagai kurva berbentuk S yang naik atau turun mengikuti prediktor, bukan garis lurus. Chapter ini menunjukkan tiga alasan kegagalan OLS pada data 0/1, membangun transformasi logit yang menuntaskan ketiganya, memfitkan model pada dua puluh siswa program remedial, lalu membaca koefisiennya pada satuan baru — log-odds dan odds ratio — sebelum memakainya untuk klasifikasi.
Mengapa Garis Lurus Gagal untuk Data 0/1 #
Bayangkan kita memperlakukan data remedial (diperkenalkan di bawah) seperti biasa: y bernilai 0 atau 1 diregresikan terhadap jam belajar dengan rumus least squares chapter Simple Linear Regression. Garis yang keluar adalah ŷ = −0.19 + 0.11x — slope dan intercept yang tampak sah, tetapi prediksinya tidak:
OLS pada data remedial : yhat = -0.19 + 0.11x
prediksi pada x = 1 : -0.08 (peluang negatif — tidak bermakna)
prediksi pada x = 13 : 1.26 (peluang di atas 1 — tidak bermakna)Kedua nilai x itu bukan ekstrapolasi jauh; x = 1 dan x = 13 adalah jam belajar siswa sungguhan dalam data. Peluang tidak bisa negatif dan tidak bisa melebihi 1, sedangkan garis lurus tidak mengenal batas itu — masalah pertama. Masalah kedua lebih dalam: varians residual OLS dituntut konstan (asumsi E pada tabel LINE chapter Regression Assumptions), padahal data 0/1 melanggar syarat itu secara konstruksi. Pada prediktor tertentu, y mengikuti Distribusi Bernoulli dengan varians p(1−p) — mencapai puncak 0.25 saat p = 0.5 dan mengecil ke nol di kedua ujung — sehingga residual selalu melebar di tengah dan mengecil di ujung, apa pun datanya.
Masalah ketiga adalah bentuk. Peluang yang dipengaruhi satu prediktor secara alami melengkung mendatar ketika mendekati 0 dan 1 — tidak ada ruang untuk terus menurun atau menanjak — sehingga bentuk hubungannya adalah huruf S, bukan garis. Garis lurus hanya bisa menghindari keluar dari rentang [0, 1] dengan menjadi nyaris datar, dan garis datar membuang informasi prediktor. Regresi logistik menuntaskan ketiga masalah sekaligus: pindahkan sisi kiri persamaan ke skala yang tidak dibatasi.
Logit: Meluruskan Peluang Lewat Odds #
Bahan bakarnya adalah odds, yang diperkenalkan chapter Rasio dan Proporsi: rasio antara jumlah sukses dan jumlah gagal. Dari 42 siswa lulus dan 8 tidak lulus pada chapter itu, odds lulus adalah 42/8 = 5.25 — lima koma dua lima keberhasilan untuk setiap satu kegagalan. Odds dihitung dari peluang lewat odds = p/(1−p); peluang terkurung di antara 0 dan 1, tetapi odds membentang dari 0 sampai tak terbatas. Mengambil logaritma alami (materi chapter Eksponen dan Logaritma) membuka rentang itu sepenuhnya menjadi seluruh garis bilangan:
odds = p / (1 - p) peluang -> odds
logit(p) = ln( p / (1 - p) ) odds -> log-odds
model : logit(p) = β0 + β1·x linear di skala log-odds
dibalik : p = 1 / (1 + e^-(β0 + β1·x)) kurva S (sigmoid)Regresi logistik memasang model linear pada log-odds, bukan pada peluang: logit(p) = β0 + β1x. Karena log-odds tidak terbatas, koefisien bekerja persis seperti slope biasa — naik tetap sebesar β1 tiap satu satuan x — tanpa pernah melanggar batas peluang, dan rumus pembaliknya memetakan garis linear itu kembali menjadi kurva S yang mendatar di 0 dan 1. Skala ini juga cocok dengan perilaku berlipat: bila tiap tambahan satu jam mengalikan odds dengan faktor tetap, log-odds bertambah bilangan tetap — persis perilaku linear.
Dataset: Dua Puluh Siswa Program Remedial #
Contoh kita memakai data fiktif 20 siswa program remedial matematika di sebuah SMA. Variabel bebas x adalah rata-rata jam belajar mandiri per minggu selama program (1 sampai 13 jam), dan variabel terikat y adalah hasil ujian remedial di akhir program: 1 untuk lulus, 0 untuk tidak. Sebelas siswa lulus dan sembilan tidak — keseimbangan yang cukup rapat agar contoh tidak menyesatkan. Ringkasannya:
| Rentang jam per minggu | Jumlah siswa | Lulus (y = 1) |
|---|---|---|
| 1-4 | 6 | 0 |
| 5-8 | 8 | 4 |
| 9-13 | 6 | 6 |
Pola tabelnya khas data biner: jam belajar rendah seluruhnya tidak lulus, jam belajar tinggi seluruhnya lulus, dan wilayah tengah tumpang tindih — pada 5 sampai 8 jam, hasil bisa ke arah mana pun. Tumpang tindih bukan kelemahan: peluang naik mulus dari dekat nol ke dekat satu, dan tidak ada satu titik potong yang memisahkan seluruh y = 0 dari seluruh y = 1 (pemisahan sempurna), sehingga taksiran koefisien tetap terdefinisi baik.
Memfit Model dengan statsmodels #
statsmodels menyediakan class Logit dengan pola pemakaian yang sama seperti OLS pada chapter Regresi dengan Python: susun matrix desain dengan sm.add_constant, lalu panggil .fit():
import numpy as np
import statsmodels.api as sm
jam = [1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 12, 13]
lulus = [0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1]
X = sm.add_constant(jam)
model = sm.Logit(lulus, X).fit(disp=0)
b0, b1 = model.params
print(f"b0 = {b0:.4f} b1 = {b1:.4f}")
print(f"exp(b1) sebagai odds ratio = {np.exp(b1):.4f}")
print(f"z = {b1 / model.bse[1]:.4f} p-value = {model.pvalues[1]:.4f}")
print(f"pseudo R2 (McFadden) = {model.prsquared:.4f}")
print(f"konvergen dalam {model.mle_retvals['iterations']} iterasi")
for x in (3, 6, 9):
p = 1 / (1 + np.exp(-(b0 + b1 * x)))
print(f"p(lulus | {x:2d} jam) = {p:.4f}")Output yang Dihasilkan:
b0 = -5.8068 b1 = 0.9681
exp(b1) sebagai odds ratio = 2.6330
z = 2.2753 p-value = 0.0229
pseudo R2 (McFadden) = 0.5356
konvergen dalam 7 iterasi
p(lulus | 3 jam) = 0.0520
p(lulus | 6 jam) = 0.5005
p(lulus | 9 jam) = 0.9482Mari kita bedah kode di atas:
- Baris 7-8 (desain dan fit):
sm.add_constant(jam)menempel kolom angka 1 di depan — tempat intercept b0 bekerja, kebiasaan yang sama dengan pemakaianOLSpada chapter Regresi dengan Python;sm.Logit(lulus, X).fit(disp=0)mengestimasi koefisien lewat maximum likelihood, bukan penyelesaian tertutup seperti b1 = Sxy/Sxx pada OLS — nilai dicari iteratif sampai log-likelihood berhenti membaik. Argumendisp=0mematikan catatan iterasi yang biasanya tercetak; hasilnya tetap bisa diperiksa lewatmle_retvals, dan di sini optimasinya konvergen dalam 7 iterasi. - Baris 10 (koefisien):
model.paramsmenyimpan [b0, b1] mengikuti urutan kolom X — disiplin baca urutan yang sama seperti pada regresi berganda. - Baris 17-19 (peluang prediksi): tiga peluang dihitung manual lewat rumus sigmoid, bukan lewat
model.predict(), agar cara b0 dan b1 masuk ke kurva S terlihat langsung.
Membaca Koefisien: Log-Odds dan Odds Ratio #
Slope b1 = 0.9681 berarti tiap tambahan satu jam belajar per minggu menaikkan log-odds lulus sebesar 0.9681 — pernyataan yang benar tetapi nyaris tak terbaca karena manusia tidak berpikir dalam log-odds. Angka yang layak dilaporkan adalah exp(b1) = 2.6330, odds ratio: tiap tambahan satu jam per minggu mengalikan odds lulus sekitar 2.63 kali, dengan prediktor lain tetap. Intercept b0 = −5.8068 adalah log-odds pada x = 0 jam — nilai di luar rentang data (minimum 1 jam), jadi b0 sebaiknya dibaca sebagai konstanta kalibrasi kurva, sikap yang sama dengan pembacaan intercept pada chapter Simple Linear Regression.
Perjalanan ketiga skala pada tiga titik x merangkum seluruh interpretasi (dibulatkan ke empat desimal):
| x (jam) | log-odds b0 + b1x | peluang p | odds p/(1−p) |
|---|---|---|---|
| 3 | −2.9024 | 0.0520 | 0.0549 |
| 6 | 0.0021 | 0.5005 | 1.0021 |
| 9 | 2.9065 | 0.9482 | 18.2925 |
Kolom log-odds bergerak linear — melangkah tetap sekitar 2.90 tiap tiga jam, alias 0.9681 per jam — persis perilaku garis regresi biasa. Kolom peluang melengkung: dari 0.05 ke 0.50 lalu ke 0.95, nyaris simetris di sekitar titik 50:50 yang tercapai di sekitar 6 jam, tempat log-odds melewati nol. Kolom odds memperlihatkan sisi lain kurva S: odds berlipat dengan faktor tetap — dari 0.0549 ke 1.0021 ke 18.2925, masing-masing sekitar 18.25 kali per tiga jam (yakni 2.6330 pangkat tiga). Peluang yang melengkung dan odds yang berlipat-lipat adalah dua wajah dari log-odds yang menanjak lurus.
Signifikansi slope diuji dengan z = b1/SE(b1) = 2.2753, memberi p-value 0.0229 — cukup bukti pada α = 0.05 untuk menolak hipotesis β1 = 0; uji ini sekeluarga dengan uji-t slope pada OLS. Kecocokan model diringkas pseudo R2 McFadden 0.5356 — angka yang tidak boleh dibaca dengan skala R2 = 0.9961 pada chapter Evaluasi Model Regresi: McFadden bekerja pada rentang berbeda dan tidak bisa dibandingkan langsung dengan R2 OLS; nilai 0.2-0.4 saja sudah tergolong kecocokan yang baik pada banyak penerapan.
Klasifikasi: Ambang 0.5 dan Akurasi #
Model memprediksi peluang, sedangkan keputusan sering butuh kategori: siswa ini diprediksi lulus atau tidak? Aturan paling umum memotong peluang pada ambang 0.5 — kelas 1 bila p > 0.5, kelas 0 bila tidak — lalu membandingkan kelas prediksi dengan y sesungguhnya:
import numpy as np
import statsmodels.api as sm
jam = [1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 12, 13]
lulus = [0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1]
X = sm.add_constant(jam)
model = sm.Logit(lulus, X).fit(disp=0)
b0, b1 = model.params
p_semua = 1 / (1 + np.exp(-(b0 + b1 * np.array(jam))))
benar = 0
for x, y, p in zip(jam, lulus, p_semua):
kelas = 1 if p > 0.5 else 0
if kelas == y:
benar += 1
status = "benar"
else:
status = "salah"
print(f"jam = {x:2d} y = {y} p = {p:.4f} kelas = {kelas} {status}")
print(f"benar = {benar} dari {len(jam)} siswa, akurasi = {benar / len(jam):.4f}")Output yang Dihasilkan:
jam = 1 y = 0 p = 0.0079 kelas = 0 benar
jam = 2 y = 0 p = 0.0204 kelas = 0 benar
jam = 3 y = 0 p = 0.0520 kelas = 0 benar
jam = 3 y = 0 p = 0.0520 kelas = 0 benar
jam = 4 y = 0 p = 0.1263 kelas = 0 benar
jam = 4 y = 0 p = 0.1263 kelas = 0 benar
jam = 5 y = 0 p = 0.2757 kelas = 0 benar
jam = 5 y = 1 p = 0.2757 kelas = 0 salah
jam = 6 y = 0 p = 0.5005 kelas = 1 salah
jam = 6 y = 1 p = 0.5005 kelas = 1 benar
jam = 7 y = 1 p = 0.7252 kelas = 1 benar
jam = 7 y = 1 p = 0.7252 kelas = 1 benar
jam = 8 y = 1 p = 0.8742 kelas = 1 benar
jam = 8 y = 0 p = 0.8742 kelas = 1 salah
jam = 9 y = 1 p = 0.9482 kelas = 1 benar
jam = 9 y = 1 p = 0.9482 kelas = 1 benar
jam = 10 y = 1 p = 0.9797 kelas = 1 benar
jam = 11 y = 1 p = 0.9922 kelas = 1 benar
jam = 12 y = 1 p = 0.9970 kelas = 1 benar
jam = 13 y = 1 p = 0.9989 kelas = 1 benar
benar = 17 dari 20 siswa, akurasi = 0.8500Mari kita bedah kode di atas:
- Baris 10 (peluang seluruh observasi): rumus sigmoid diterapkan sekali ke seluruh array jam — cara kerja vektor NumPy yang sama dengan perhitungan residual OLS pada chapter Regresi dengan Python.
- Baris 14 (ambang):
kelas = 1 if p > 0.5 else 0memindahkan peluang ke keputusan biner; mengganti ambang hanyalah mengubah satu baris ini. - Baris 13-21 (akurasi tangan): penghitung
benarbertambah setiap kelas prediksi cocok dengan y, lalu akurasi = 17/20 = 0.8500 — angka ini dirakit dari perbandingan eksplisit baris demi baris, bukan diambil dari fungsi siap pakai.
Dari 20 siswa, 17 terklasifikasi benar. Tiga kekeliruan semuanya terjadi di wilayah tumpang tindih: siswa belajar 5 jam yang justru lulus (p = 0.2757), siswa 6 jam yang tidak lulus (p = 0.5005), dan siswa 8 jam yang tidak lulus (p = 0.8742). Kasus kedua paling menarik karena peluangnya 0.5005 — melewati ambang hanya dengan selisih lima per sepuluh ribu. Perhatikan pula dua siswa yang sama-sama belajar 6 jam: keduanya menerima peluang identik 0.5005, tetapi satu lulus dan satu tidak — model hanya membaca x, dan peluang 0.5 sungguh-sungguh berarti kedua hasil sama mungkinnya, tema yang berakar pada sifat percobaan Distribusi Bernoulli. Sebagai pembanding, aturan naif “prediksi semua siswa lulus” benar pada 11 dari 20 kasus (akurasi 0.55); model menambah enam keputusan benar dari informasi jam belajar.
Kehati-hatian: Ambang, Kausalitas, dan Pembacaan Odds Ratio #
Ambang 0.5 bukan hukum alam. Ambang yang tepat bergantung pada ongkos tiap jenis kekeliruan: bila tindak lanjut bagi siswa yang diprediksi lulus murah sementara siswa yang terlewat menanggung akibat berat, ambang diturunkan; bila tindak lanjutnya mahal, ambang dinaikkan. Akurasi tunggal juga menyesatkan saat kelas timpang — pada data dengan 95 persen siswa lulus, aturan “semua lulus” mencatat akurasi 0.95 tanpa membaca satu prediktor pun. Karena itu laporkan peluang tiap kasus, bukan hanya kelas akhirnya, agar pengambil keputusan dapat memilih ambang sesuai konteks.
Sikap kausal tidak berubah dari seluruh section ini — tema chapter Correlation vs Causation berlaku penuh. Jam belajar dan kelulusan berkaitan erat pada data observasional ini, tetapi motivasi belajar dan penguasaan materi awal dapat mendorong keduanya sekaligus; pergantian kurva dari garis ke bentuk S tidak memberi model kemampuan memilih jalur sebab. Klaim kausal tetap membutuhkan desain eksperimen atau argumentasi tersendiri.
Regresi logistik menutup satu babak penting bagi keluarga regresi: model kini bicara peluang, dan Distribusi Bernoulli yang dulu tampak sebagai bata bangunan kecil menjadi pintu masuknya — tiap observasi 0/1 membawa peluang p(x) yang dilengkungkan model menjadi kurva S. Masih ada satu asumsi regresi yang belum pernah kita tangkap dalam satu angka: independensi residual antar observasi. Pada data yang berurutan dalam waktu, pelanggaran asumsi itu begitu lazim sehingga layak memiliki statistik uji tersendiri — Durbin-Watson — pokok chapter terakhir section ini. Dokumentasi Logit dan fungsi terkait tersedia di dokumentasi statsmodels
; pembahasan regresi logistik yang lebih mendalam termuat di Penn State STAT 500
dan NIST/SEMATECH e-Handbook
.