Model machine learning belajar dari data tentang manusia, dan data tentang manusia menyimpan sejarah — termasuk sejarah yang tidak adil bagi sebagian kelompok. Model tidak punya niat baik maupun buruk; model hanya meniru pola yang paling menguntungkan secara metrik, dan pola itu bisa berisi ketimpangan lama tanpa satu pun programmer menulis aturan yang membedakan orang. Chapter ini membahas dari mana bias datang, mendemonstrasikan bagaimana kesenjangan historis otomatis diwarisi model, lalu membentuk kebiasaan audit yang paling mendasar: mengukur kinerja per kelompok.

Tiga Sumber Bias #

Bias pada data science tidak datang dari satu pintu. Tiga sumber yang paling sering ditemui:

SumberMekanismeContoh pada Toko Kopi Kita
Historisdunia memang timpang saat data dicatat; model mempelajari ketimpangan itu sebagai polaprogram diskon member dulu hanya ditawarkan di gerai Bandung, sehingga “kota” tampak menentukan minat promo
Samplingsebagian kelompok kurang terwakili dalam data sehingga polanya kurang terpelajaridata transaksi hanya terkumpul dari pelanggan yang memakai aplikasi; pelanggan tunai yang lebih tua kurang terwakili
Label (pengukuran)target yang tersedia hanyalah pengganti dari hal yang sebenarnya ingin diprediksi“puas” diukur dari mengisi rating, padahal yang mengisi rating umumnya hanya pelanggan yang sangat puas atau sangat kecewa

Ketiganya bisa hadir sekaligus dalam satu dataset, dan ketiganya tidak membutuhkan niat buruk siapa pun — cukup data yang dikumpulkan sebagaimana adanya, tanpa pertanyaan “apakah pola ini pantas dipelajari model”.

Model Mewarisi Pola, Bukan Menilainya #

Mekanisme pewarisannya perlu dipahami agar tidak tampak sebagai gejala tersembunyi, karena sesungguhnya mekanismenya sederhana. Model regresi logistik menghitung bobot untuk setiap fitur berdasarkan seberapa kuat fitur itu memperkirakan target; model tidak tahu mana fitur “tentang kelompok orang” dan mana fitur “tentang perilaku”. Begitu kolom seperti kota, kode pos, atau jenis paket data ikut menjadi fitur, setiap ketimpangan historis yang berpaut dengan kolom itu akan dipelajari persis seperti hubungan lain — bahkan fitur yang tampak netral bisa bertindak sebagai pengganti (proxy) untuk kelompok.

Mengukur Selisih Antar Kelompok #

Langkah audit termurah adalah menghitung kinerja model per kelompok dan membandingkannya. Kode berikut membangun data 60 pelanggan dari dua kota dengan sejarah program promo yang timpang, melatih model kepatuhan promo, lalu membandingkan rata-rata skor model antar kota:

python
import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression

rng = np.random.default_rng(42)
n = 60
kota = rng.choice(["Bandung", "Surabaya"], n)
kunjungan = rng.integers(1, 15, n)
belanja = rng.integers(50, 350, n)

# Riwayat: diskon member dulu hanya ditawarkan di gerai Bandung,
# sehingga pola ikut-serta timpang antar kota sejak awal.
peluang_ikut = np.where(kota == "Bandung", 0.60, 0.10)
ikut_promo = rng.random(n) < (peluang_ikut + 0.001 * (belanja - 200))

fitur = pd.DataFrame({
    "gerai_bandung": (kota == "Bandung").astype(int),
    "belanja": belanja,
    "kunjungan": kunjungan,
})

model = LogisticRegression().fit(fitur, ikut_promo.astype(int))
skor = model.predict_proba(fitur)[:, 1]

ringkasan = pd.DataFrame({
    "kota": kota,
    "ikut_promo": ikut_promo.astype(int),
    "skor_model": skor,
})
tabel = ringkasan.groupby("kota").agg(
    jumlah=("kota", "size"),
    ikut_historis=("ikut_promo", "mean"),
    rata_skor_model=("skor_model", "mean"),
)
print(tabel.round(3).to_string())

Output yang Dihasilkan:

text
          jumlah  ikut_historis  rata_skor_model
kota                                            
Bandung       27          0.630            0.559
Surabaya      33          0.152            0.209

Mari kita telaah bagian-bagian pentingnya:

  1. Baris 13-14 (sejarah yang timpang): peluang dasar mengikuti promo dibuat 60% untuk Bandung dan 10% untuk Surabaya, ditambah pengaruh kecil dari nilai belanja. Inilah bahan mentah bias historis — bukan properti pelanggannya, melainkan kebijakan lama yang hanya menawarkan program di satu kota.
  2. Baris 16-20 (fitur): kolom gerai_bandung dimasukkan sebagai fitur biasa, berdampingan dengan belanja dan kunjungan. Model akan memperlakukannya sama: sumber sinyal untuk memperkirakan target.
  3. Baris 22-23 (pelatihan): model regresi logistik menemukan bahwa gerai_bandung adalah prediktor kuat, lalu memberinya bobot besar — persis seperti tugasnya.
  4. Baris 25-34 (ringkasan + groupby + agg): tiga angka dihitung per kota: jumlah data, proporsi ikut promo pada data historis, dan rata-rata skor model.
  5. Hasil output: skor model (0,559 berbanding 0,209) meniru kesenjangan historis (0,630 berbanding 0,152). Tidak ada baris kode yang menyuruh model membedakan pelanggan Bandung dan Surabaya — model mengikuti data, dan datanya timpang.

Mitigasi: Evaluasi per Kelompok #

Kesenjangan pada output di atas bukan alasan untuk langsung membuang model, melainkan alasan untuk bertanya. Pertama, dari mana ketimpangan datang: bila sumbernya historis, pertimbangkan apakah pola lama itu pantas dilanjutkan atau justru perlu dikoreksi. Kedua, apakah sampling-nya seimbang: 27 baris Bandung berbanding 33 Surabaya masih lumrah, tetapi bila satu kelompok hanya menyisakan segelintir baris, polanya nyaris tidak terpelajari. Ketiga, apakah labelnya mengukur hal yang benar: “mengikuti promo” dan “tertarik promo” berbeda bila penawarannya dulu memang tidak pernah sampai ke satu kota.

Kebiasaan teknis yang paling jitu adalah membawa kelompok ke dalam evaluasi: hitung metrik per kelompok sejak eksperimen pertama, bukan setelah laporan jadi. Alat pengukurannya sama dengan yang sudah kita kuasai pada chapter Metrik Klasifikasi — yang berubah hanyalah satu hal: tabel metrik dipecah per kelompok, lalu selisihnya dibaca sebagai temuan, bukan dipoles rata-rata. Selisih yang ditemukan wajib masuk laporan; menyembunyikannya di angka gabungan adalah bentuk pelaporan yang menyesatkan.

Keadilan Punya Banyak Definisi #

Satu kompleksitas terakhir yang perlu diakui secara terbuka: fairness bukan satu rumus. Keadilan bisa berarti peluang dipromosikan sama besar di setiap kelompok, bisa berarti tingkat kesalahan setara, bisa berarti skor terkalibrasi sama baiknya untuk semua kelompok — dan beberapa definisi ini terbukti saling tidak bisa dipenuhi bersamaan dalam satu situasi. Karena itu pertanyaan yang jujur bukan “apakah model ini adil”, melainkan “definisi adil mana yang relevan dengan keputusan ini, dan bagaimana kondisinya menurut definisi tersebut”.

Rangkuman #

  • Bias masuk lewat tiga pintu utama: pola historis yang timpang, sampling yang kurang mewakili sebagian kelompok, dan label yang hanya pengganti dari hal yang sebenarnya ingin diprediksi.
  • Model memperlakukan setiap kolom sebagai sumber sinyal; kolom kelompok atau proxy-nya otomatis mewariskan ketimpangan historis ke skor model.
  • Audit pertama yang wajib: hitung kinerja dan skor model per kelompok, lalu baca selisihnya sebagai temuan — angka gabungan menyembunyikan kesenjangan.
  • Fairness punya banyak definisi yang bisa saling berbenturan; pilih definisi sesuai keputusan, ukur menurutnya, dan laporkan bersama hasilnya.

Data yang adil coba kita bangun tetap bisa runtuh sebelum dianalisis bila cara memperolehnya keliru. Dari mana data tentang orang-orang itu berasal, dan apakah mereka pernah setuju untuk dipakai sejauh ini? Kita bahas pada chapter Persetujuan Penggunaan Data .

Referensi: