Pada chapter sebelumnya kita berhenti di satu ketegangan: angka P(positif | sakit) mudah didapat dari spesifikasi alat tes, tetapi keputusan nyata justru membutuhkan P(sakit | positif) — peluang seseorang memang sakit setelah hasil tesnya positif. Teorema Bayes adalah jembatan resmi untuk membalik arah penalaran tersebut. Pada chapter ini kita menurunkan rumusnya dari aturan perkalian, memakainya pada studi kasus skrining kesehatan dengan angka yang realistis, lalu membongkar jebakan bernama base rate fallacy yang menipu bahkan para profesional medis. Di akhir chapter kita lihat peran rumus ini di data science, dari penyaringan spam hingga klasifikasi naive Bayes.

Rumus yang Membalik Arah #

Titik awalnya adalah aturan perkalian dari chapter Aturan Probabilitas: irisan dua kejadian bisa dihitung dua arah, P(A dan B) = P(B) × P(A | B) = P(A) × P(B | A). Kedua bentuk menghitung angka yang sama, sehingga kita boleh menyamakannya lalu mengisolasi P(A | B). Hasilnya adalah Teorema Bayes:

text
P(A | B) = P(B | A) × P(A) / P(B)

Empat komponen rumus ini punya nama yang dipakai luas, dan menghafal namanya sama pentingnya dengan rumusnya:

BagianNama umumMakna
P(A)priorKeyakinan awal terhadap A sebelum bukti B diperhitungkan
P(B | A)likelihoodPeluang melihat bukti B bila A memang terjadi
P(B)evidencePeluang bukti B muncul dari seluruh kemungkinan sebab
P(A | B)posteriorKeyakinan terhadap A setelah bukti B masuk

Kita uji dulu pada data yang sudah dikenal: tabel kontingensi 100 pelanggan Toko Kopi Kita dari chapter sebelumnya. Dari tabel itu kita tahu P(beli lagi | member) = 32/40 = 0,80; Teorema Bayes memberi kita arah sebaliknya, P(member | beli lagi), tanpa membuka ulang tabel:

python
# Data tabel kontingensi 100 pelanggan dari chapter sebelumnya
p_member = 40 / 100
p_beli_diketahui_member = 32 / 40
p_beli_lagi = 53 / 100

p_member_diketahui_beli = (p_beli_diketahui_member * p_member) / p_beli_lagi

print(f"P(member | beli lagi) = {p_beli_diketahui_member:.2f} x {p_member:.2f} / {p_beli_lagi:.2f}")
print(f"                     = {p_beli_diketahui_member * p_member:.4f} / {p_beli_lagi:.2f} = {p_member_diketahui_beli:.4f}")
print(f"Pemeriksaan langsung 32/53 = {32 / 53:.4f}")

Output yang Dihasilkan:

text
P(member | beli lagi) = 0.80 x 0.40 / 0.53
                     = 0.3200 / 0.53 = 0.6038
Pemeriksaan langsung 32/53 = 0.6038

Mari kita telaah kode di atas:

  1. Baris 2-4 (tiga peluang masukan): P(member) = 0,40 berperan sebagai prior, P(beli lagi | member) = 0,80 sebagai likelihood, dan P(beli lagi) = 0,53 sebagai evidence. Ketiganya dibaca langsung dari tabel kontingensi.
  2. Baris 6 (penerapan rumus): posterior = 0,80 × 0,40 / 0,53. Pembilangnya adalah P(member dan beli lagi) = 0,32 — irisan yang memang tersimpan sebagai satu sel tabel.
  3. Baris 10 (pemeriksaan): menghitung 32/53 secara langsung memberi 0,6038 — sama persis. Teorema Bayes bukan rumus baru, melainkan penataan ulang aturan perkalian yang sudah kita percaya.

Studi Kasus: Hasil Skrining yang Positif #

Sekarang kasus yang sering membuat intuisi keliru. Sebuah tes skrining kesehatan memiliki angka yang bagus: sensitivitas 95% artinya P(positif | sakit) = 0,95, dan tingkat positif palsu hanya 5% artinya P(positif | sehat) = 0,05. Penyakit yang disaring ini jarang: hanya 1% populasi memang mengidapnya — angka 1% inilah base rate. Seorang peserta skrining menerima hasil positif. Berapa peluang ia benar-benar sakit?

Banyak orang menjawab “sekitar 95%”. Cara paling jernih menjawabnya adalah membayangkan seluruh populasi skrining sebagai hitungan orang, lalu memilahnya kelompok per kelompok:

python
n = 100_000            # ukuran populasi skrining
prevalensi = 0.01      # base rate: 1% penduduk memang sakit
sensitivitas = 0.95    # P(positif | sakit)
positif_palsu = 0.05   # P(positif | sehat)

n_sakit = round(n * prevalensi)
n_sehat = n - n_sakit
n_benar = round(n_sakit * sensitivitas)
n_palsu = round(n_sehat * positif_palsu)

baris = [
    ("Populasi skrining", f"{n:,} orang"),
    ("Sakit (1% populasi)", f"{n_sakit:,} orang"),
    ("Sehat (99% populasi)", f"{n_sehat:,} orang"),
    ("Positif dari kelompok sakit", f"{n_benar:,} orang"),
    ("Positif dari kelompok sehat", f"{n_palsu:,} orang"),
    ("Total hasil positif", f"{n_benar + n_palsu:,} orang"),
]
for label, nilai in baris:
    print(f"{label:<28}: {nilai}")

print(f"\nP(sakit | positif) = {n_benar:,} / {n_benar + n_palsu:,} = {n_benar / (n_benar + n_palsu):.4f}")

Output yang Dihasilkan:

text
Populasi skrining           : 100,000 orang
Sakit (1% populasi)         : 1,000 orang
Sehat (99% populasi)        : 99,000 orang
Positif dari kelompok sakit : 950 orang
Positif dari kelompok sehat : 4,950 orang
Total hasil positif         : 5,900 orang

P(sakit | positif) = 950 / 5,900 = 0.1610

Mari kita telaah hitungannya langkah demi langkah:

  1. Baris 6-7 (memilah populasi): dari 100.000 orang, base rate 1% membuat kelompok sakit hanya 1.000 orang, sedangkan 99.000 orang sehat. Ketimpangan ukuran inilah sumber utama rendahnya posterior.
  2. Baris 8 (positif benar): sensitivitas 95% menangkap 950 dari 1.000 orang sakit. Angka ini persis pembilang Teorema Bayes, P(positif dan sakit) = 0,95 × 0,01 = 0,0095.
  3. Baris 9 (positif palsu): 5% dari 99.000 orang sehat menghasilkan 4.950 hasil positif palsu — hampir lima kali lipat positif benar, meskipun persentasenya kecil.
  4. Baris 22 (posterior): meja pembagian hasil positif berisi 950 + 4.950 = 5.900 orang; hanya 950 di antaranya sakit. Posterior = 950/5.900 = 0,1610, jauh dari intuisi 95%.

Jawaban yang benar: peluang peserta skrining itu memang sakit hanya 16,1%. Tes yang “akurat 95%” tetap sangat berguna — peluang sakit naik dari 1% ke 16,1% setelah hasil positif — tetapi jauh dari kepastian.

Base Rate Menentukan Segalanya #

Kekeliruan mengabaikan P(A) — prevalensi — dikenal sebagai base rate fallacy. Intuisi kita terpaku pada likelihood 95% dan lupa bahwa evidence P(positif) harus dihitung dari kedua kelompok sekaligus. Karena kelompok sehat jauh lebih besar, sumbangannya terhadap meja hasil positif ikut membesar. Kita lihat efeknya secara sistematis dengan mengubah-ubah base rate pada tes yang sama:

python
def bayes(prior, sensitivitas, positif_palsu):
    """Hitung P(sakit | positif) lewat Teorema Bayes."""
    p_positif = prior * sensitivitas + (1 - prior) * positif_palsu
    return (sensitivitas * prior) / p_positif

sensitivitas = 0.95
positif_palsu = 0.05

print("Prevalensi | P(positif) | P(sakit | positif)")
for prevalensi in (0.01, 0.05, 0.10, 0.50):
    p_positif = prevalensi * sensitivitas + (1 - prevalensi) * positif_palsu
    print(f"{prevalensi:>10.2f} | {p_positif:>10.4f} | {bayes(prevalensi, sensitivitas, positif_palsu):>14.4f}")

Output yang Dihasilkan:

text
Prevalensi | P(positif) | P(sakit | positif)
      0.01 |     0.0590 |         0.1610
      0.05 |     0.0950 |         0.5000
      0.10 |     0.1400 |         0.6786
      0.50 |     0.5000 |         0.9500

Perhatikan bagaimana posterior melonjak saat prior membaik:

  1. Prevalensi 1%: posterior hanya 0,1610. Prior yang kecil membuat positif palsu mendominasi meja hasil positif.
  2. Prevalensi 10%: posterior 0,6786. Kelompok sakit kini sepuluh kali lebih besar, sehingga jumlah positif benar mulai menyaingi jumlah positif palsu.
  3. Prevalensi 50%: posterior 0,9500 — kini intuisi “95%” benar, karena prior memang sudah setengah.

Inilah sebabnya protokol medis jarang menyaring seluruh populasi untuk penyakit langka: tes yang sama menjadi jauh lebih meyakinkan bila hanya dipesan untuk kelompok berisiko tinggi, karena prior kelompok itu lebih besar. Dalam analisis data, situasi serupa muncul di deteksi penipuan transaksi — transaksi curang bisa di bawah 1% dari seluruh transaksi, sehingga model dengan akurasi 99% tetap menghasilkan mayoritas peringatan yang keliru.

Teorema Bayes di Data Science #

Gagasan “perbarui keyakinan saat bukti baru masuk” adalah pola kerja yang muncul di mana-mana. Penyaringan spam menghitung posterior P(spam | pesan) dari kata-kata di dalam pesan: setiap kata adalah bukti kecil yang menggeser keyakinan, dan kata-kata tertentu seperti “gratis” atau “menang” memiliki likelihood yang timpang antara kelas spam dan bukan spam. Klasifikasi naive Bayes memperluas pola ini menjadi algoritma machine learning utuh — kita akan membangunnya pada chapter Naive Bayes di Section Supervised Learning.

Cara pandang Bayes juga mengubah budaya pelaporan. Alih-alih satu putaran keputusan “tolak atau terima hipotesis”, analisis Bayesian memakai posterior hari ini sebagai prior hari berikutnya: keyakinan diperbarui terus-menerus seiring data mengalir masuk, bukan direset dari nol. Course ini memakai kerangka frekuentis pada chapter-chapter inferensi, tetapi mengenali kapan sebuah pertanyaan sebenarnya menanyakan posterior membuat kita tidak mudah menukar arah probabilitas bersyarat.

Rangkuman #

  • Teorema Bayes membalik arah penalaran: dari P(B | A) menuju P(A | B) melalui prior, likelihood, dan evidence; posterior adalah hasil akhirnya.
  • Enumerasi populasi (memilah 100.000 orang ke empat kelompok) memverifikasi rumus dengan cara yang paling mudah diperiksa dengan akal sehat.
  • Base rate fallacy: mengabaikan prevalensi membuat hasil positif tes terasa jauh lebih meyakinkan daripada kenyataannya; pada penyakit langka, positif palsu bisa mengungguli positif benar.
  • Posterior sangat peka terhadap prior: pada tes yang sama, prevalensi 1% menghasilkan posterior 16,1%, sedangkan prevalensi 50% menghasilkan 95%.
  • Pola pembaruan keyakinan ini bekerja di penyaringan spam, deteksi penipuan, dan klasifikasi naive Bayes.

Sejauh ini peluang selalu menempel pada kejadian: “member”, “beli lagi”, “hasil positif”. Langkah berikutnya menaikkan abstraksi satu tingkat: kita memandang setiap hasil percobaan sebagai sebuah bilangan — banyaknya potong bolu yang terjual, suhu udara, durasi penyeduhan — sehingga peluang bisa dirata-rata, dijumlah, dan dibangun menjadi model. Bilangan yang membawa peluang itulah variabel acak, bintang utama chapter Variabel Acak .

Referensi #

  1. SciPy — scipy.stats: Statistical Functions
  2. Python — statistics: Mathematical statistics functions