Keyakinan yang telah diperbarui sekali biasanya belum berhenti di situ, karena data sering datang bertahap. Topik ini membahas pemutakhiran Bayesian berurutan, yaitu posterior dari satu kelompok data dipakai sebagai prior bagi kelompok berikutnya. Contohnya mengikuti lima hari latihan soal seorang siswa, dan bagian akhir membuktikan bahwa pemutakhiran bertahap menghasilkan posterior yang sama dengan memproses seluruh data sekaligus.
Posterior menjadi prior berikutnya#
Pemutakhiran Bayesian tidak membedakan keyakinan lama dan keyakinan baru. Prior hari ini hanyalah posterior dari data kemarin, sedangkan data hari ini masuk melalui likelihood miliknya sendiri. Rumus Teorema Bayes yang sama diterapkan berulang kali, sehingga siklusnya berjalan seperti pada diagram berikut.
Kotak ketiga pada diagram tidak menjadi akhir proses. Posterior melengkung kembali ke posisi prior, lalu menunggu kelompok data berikutnya, dan siklus ini dapat berjalan berulang kali tanpa mengubah rumusnya. Perkalian likelihood antarhari mengasumsikan hasil tiap hari saling bebas apabila diketahui, asumsi yang wajar untuk soal latihan pada hari yang berbeda.
Pada keluarga konjugat Beta-Binomial, siklus tersebut memiliki bentuk singkat yang mudah diingat. Prior yang bertemu data berupa jawaban benar dari soal berubah menjadi posterior , sebagaimana ditunjukkan rumus berikut.
Parameter menjumlah seluruh jawaban benar yang pernah teramati, sedangkan menjumlah seluruh jawaban salah. Metode kisi pada topik ini sengaja tetap dipakai agar langkah perkalian dan normalisasinya terlihat, kemudian bentuk analitik di atas dipakai sebagai pembandingnya.
Rangkaian lima hari memberi gambaran nyata tentang cara parameter itu bergerak. Setiap jawaban benar menaikkan parameter dan setiap jawaban salah menaikkan parameter , sehingga rerata posterior bergeser mengikuti skor harian. Jumlah yang membesar dari 2 menjadi 52 adalah penanda bertambahnya informasi, dan kurva yang makin sempit adalah wujud visual penanda tersebut.
Pemutakhiran hari demi hari#
Contoh berjalan memakai catatan lima hari latihan, masing-masing sepuluh soal. Hari pertama menghasilkan 8 jawaban benar, hari kedua 9, hari ketiga 7, hari keempat 9, dan hari kelima 10. Program berikut memproses data satu hari pada satu waktu, mencetak rerata posterior setelah setiap hari, lalu menggambar seluruh evolusi kurvanya.
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
# Data latihan lima hari, masing-masing sepuluh soal: pasangan (benar, total soal)
batch = [(8, 10), (9, 10), (7, 10), (9, 10), (10, 10)]
# Grid theta yang sama dipakai sepanjang pemutakhiran
theta = np.linspace(0.0, 1.0, 1000)
prior = np.ones_like(theta) # prior uniform sebelum hari pertama
# Simpan setiap kurva untuk gambar evolusinya
kurva = [prior]
for hari, (y, n) in enumerate(batch, start=1):
likelihood = stats.binom.pmf(y, n, theta)
posterior = prior * likelihood
posterior /= np.trapezoid(posterior, theta)
rerata = np.trapezoid(theta * posterior, theta)
print(f"Hari {hari}: benar {y} dari {n}, rerata posterior = {rerata:.4f}")
kurva.append(posterior)
prior = posterior # posterior hari ini menjadi prior hari berikutnya
# Gambar evolusi: prior awal berwarna abu-abu, posterior harian makin tua warnanya
fig, ax = plt.subplots(figsize=(7, 4), constrained_layout=True)
ax.plot(theta, kurva[0], color="#999999", linewidth=2, label="Prior awal")
warna = plt.cm.Blues(np.linspace(0.35, 0.95, len(batch)))
for hari in range(1, len(kurva)):
ax.plot(theta, kurva[hari], color=warna[hari - 1], linewidth=2, label=f"Hari {hari}")
ax.set_xlabel("Nilai theta (proporsi benar)")
ax.set_ylabel("Densitas")
ax.set_title("Evolusi posterior lima hari latihan")
ax.legend()
fig.savefig("evolusi-posterior.png", dpi=110)Hari 1: benar 8 dari 10, rerata posterior = 0.7500
Hari 2: benar 9 dari 10, rerata posterior = 0.8182
Hari 3: benar 7 dari 10, rerata posterior = 0.7812
Hari 4: benar 9 dari 10, rerata posterior = 0.8095
Hari 5: benar 10 dari 10, rerata posterior = 0.8462
Rerata posterior bergerak mengikuti data dan bukan hanya menuruni tangga naik. Nilainya naik menjadi 0.8182 setelah hari kedua, kemudian turun ke 0.7812 ketika hari ketiga hanya mencatat 7 jawaban benar, lalu kembali naik sepanjang dua hari terakhir. Perilaku dua arah inilah yang membedakan pemutakhiran dari sekadar penghitungan rata-rata berjalan.
Bentuk kurva pada gambar memberi informasi kedua. Kurva hari pertama masih lebar karena hanya bertumpu pada sepuluh soal, sedangkan kurva hari kelima menyempit jauh di sekitar 0.85 setelah lima puluh soal diakumulasi. Penyempitan itu menyatakan penyusutan ketidakpastian, sesuatu yang tidak terbaca dari rerata semata.
Setiap rerata harian juga dapat diverifikasi dengan bentuk analitiknya. Setelah hari pertama, posterior berparameter 9 dan 3 sehingga reratanya , dan setelah hari kelima berparameter 44 dan 8 sehingga reratanya . Kesesuaian angka kisi dengan perhitungan pecahan semacam ini menjadi pemeriksaan cepat sebelum gambar dibaca lebih lanjut.
Berurutan sama dengan sekaligus#
Perkalian pada penyebut rumus Bayes bersifat asosiatif, sehingga mengalikan prior dengan likelihood hari pertama, kedua, dan seterusnya memberikan hasil yang sama dengan mengalikan seluruh likelihood sekaligus. Konsekuensinya, posterior akhir tidak bergantung pada cara kelompok data dibagi, dan urutan kedatangannya pun tidak mengubah kurva akhirnya. Sifat semacam ini patut dibuktikan langsung agar statusnya bukan sekadar klaim.
import numpy as np
from scipy import stats
# Data gabungan lima hari: 8 + 9 + 7 + 9 + 10 = 43 benar dari 50 soal
y_total, n_total = 43, 50
theta = np.linspace(0.0, 1.0, 1000)
# Pemutakhiran berurutan, posterior setiap hari menjadi prior hari berikutnya
prior = np.ones_like(theta)
for y, n in [(8, 10), (9, 10), (7, 10), (9, 10), (10, 10)]:
posterior = prior * stats.binom.pmf(y, n, theta)
posterior /= np.trapezoid(posterior, theta)
prior = posterior
berurutan = posterior
# Pemutakhiran sekaligus atas seluruh data dari prior uniform yang sama
sekaligus = stats.binom.pmf(y_total, n_total, theta)
sekaligus /= np.trapezoid(sekaligus, theta)
# Verifikasi analitik: posterior akhir adalah Beta(1 + 43, 1 + 50 - 43) = Beta(44, 8)
analitik = stats.beta.pdf(theta, 1 + y_total, 1 + n_total - y_total)
print(f"Selisih maksimum berurutan vs sekaligus = {np.abs(berurutan - sekaligus).max():.2e}")
print(f"Selisih maksimum sekaligus vs analitik = {np.abs(sekaligus - analitik).max():.2e}")
print(f"Rerata posterior akhir = {np.trapezoid(theta * sekaligus, theta):.4f}")
print(f"Rerata analitik Beta(44, 8) = {stats.beta.mean(44, 8):.4f}")Selisih maksimum berurutan vs sekaligus = 3.73e-14
Selisih maksimum sekaligus vs analitik = 3.55e-15
Rerata posterior akhir = 0.8462
Rerata analitik Beta(44, 8) = 0.8462Selisih antara jalur berurutan dan jalur sekaligus hanya , yang merupakan error pembulatan angka pecahan pada komputer, bukan perbedaan metode. Kedua jalur sama persis secara matematis, dan perhitungan analitik Beta(44, 8) menegaskannya dengan selisih . Rerata akhir 0.8462 sama dengan , yaitu perbandingan jawaban benar 44 terhadap total parameter posterior .
Sifat tak bergantung urutan ini terlihat pula pada parameternya. Mengurutkan ulang kelima kelompok data hanya mengurutkan ulang perkalian likelihood, dan hasil kali bilangan tidak bergantung pada urutannya, sehingga parameter akhir tetap dan . Yang berubah oleh urutan hanyalah jalur perjalanannya, yaitu deret rerata yang dilalui dari prior awal menuju posterior akhir.
Ringkasan#
- Posterior dari satu kelompok data menjadi prior bagi kelompok berikutnya, sehingga siklus prior, likelihood, dan posterior berulang sebanyak datanya.
- Pada keluarga konjugat Beta-Binomial, siklus itu mempersingkat menjadi menuju .
- Lima hari latihan dengan skor 8, 9, 7, 9, dan 10 dari 10 menggeser rerata posterior dari 0.7500 ke 0.8462 sekaligus menyempitkan kurvanya.
- Pemutakhiran berurutan dan pemutakhiran sekaligus menghasilkan kurva yang selisihnya hanya , dan posterior akhirnya diverifikasi sebagai Beta(44, 8).
Referensi#
- scipy.stats.binom — SciPy — Dokumentasi distribusi Binomial yang menjadi likelihood setiap kelompok data harian.
- scipy.stats.beta — SciPy — Dokumentasi distribusi Beta untuk memverifikasi posterior akhir secara analitik.
- OpenIntro Statistics — OpenIntro — Buku pengantar statistika yang membahas estimasi proporsi beserta ketidakpastiannya.