Angka pada Bagian 3 baru menjadi estimasi; estimasi baru menjadi laporan setelah galatnya diukur. Bagian penutup ini mengukur selisih absolut dan relatif setiap estimator, menguji sebarannya lewat standard error, lalu menguji hukum konvergensi 1/√N. Semua perhitungan memakai seed 42 dan n = 100.000, sehingga setiap angka di bawah ini identik dengan hasil Bagian 3.

Selisih Absolut dan Relatif #

Ketiga estimator dijalankan ulang dalam satu blok — seed dan urutannya sama dengan Bagian 3 — lalu galatnya dihitung dalam dua ukuran:

python
import numpy as np

n = 100_000

rng = np.random.default_rng(42)
x = rng.uniform(-1.0, 1.0, size=n)
y = rng.uniform(-1.0, 1.0, size=n)
est_pi = 4 * np.count_nonzero(x**2 + y**2 <= 1.0) / n

rng = np.random.default_rng(42)
jumlah = rng.integers(1, 7, size=(n, 2)).sum(axis=1)
est_p7 = np.count_nonzero(jumlah == 7) / n

rng = np.random.default_rng(42)
est_integral = np.pi * np.sin(rng.random(n) * np.pi).mean()

daftar = [
    ("pi", np.pi, est_pi),
    ("P(jumlah=7)", 6 / 36, est_p7),
    ("Integral sin", 2.0, est_integral),
]
for nama, teori, estimasi in daftar:
    selisih = abs(estimasi - teori)
    relatif = selisih / teori * 100
    print(f"{nama:<12} | teori {teori:.4f} | estimasi {estimasi:.4f} | selisih {selisih:.4f} ({relatif:.2f}%)")

Output yang Dihasilkan:

text
pi           | teori 3.1416 | estimasi 3.1431 | selisih 0.0015 (0.05%)
P(jumlah=7)  | teori 0.1667 | estimasi 0.1683 | selisih 0.0016 (0.96%)
Integral sin | teori 2.0000 | estimasi 2.0013 | selisih 0.0013 (0.07%)

Mari kita bedah:

  1. Baris 5-15: tiga Generator ber-seed 42 dibentuk satu per satu dengan urutan panggilan yang meniru Bagian 3, sehingga ketiga estimasi kembali bernilai 3.1431, 0.1683, dan 2.0013.
  2. Baris 17-21 (daftar = [...]): pasangan (nama, nilai teoretis, estimasi) dikumpulkan dalam list agar loop pencetakan memakai satu format yang sama.
  3. Baris 22-25: selisih = abs(estimasi - teori) mengukur galat absolut, dan relatif membaginya dengan nilai teori — penting karena selisih 0.0016 pada peluang 0.1667 berarti 0.96%, sementara selisih serupa pada pi hanya 0.05%.

Peluang dua dadu ternyata eksperimen dengan galat relatif terbesar, meskipun selisih absolutnya mirip dengan dua lainnya — inilah alasan dua ukuran galat selalu dilaporkan berdampingan.

Standard Error dan Sebaran Estimasi #

Selisih satu kali lari belum menceritakan seberapa jauh estimasi bisa meleset bila diulang. Teorinya adalah standard error (SE): untuk estimator pi dengan p = π/4, SE = 4 × √(p(1−p)/n). Kita bandingkan SE itu dengan sebaran nyata dari sepuluh pengulangan ber-seed 42 sampai 51:

python
import numpy as np

p = np.pi / 4
n = 100_000
se_teoritis = 4 * np.sqrt(p * (1 - p) / n)
print(f"Standard error teoretis (n = 100.000) : {se_teoritis:.5f}")

estimasi = []
for seed in range(42, 52):
    rng = np.random.default_rng(seed)
    x = rng.uniform(-1.0, 1.0, size=n)
    y = rng.uniform(-1.0, 1.0, size=n)
    estimasi.append(4 * np.count_nonzero(x**2 + y**2 <= 1.0) / n)
estimasi = np.array(estimasi)
print("Sepuluh estimasi:", np.round(estimasi, 4))
print(f"Rata-rata 10 estimasi : {estimasi.mean():.4f}")
print(f"Std 10 estimasi (ddof=1) : {estimasi.std(ddof=1):.5f}")

Output yang Dihasilkan:

text
Standard error teoretis (n = 100.000) : 0.00519
Sepuluh estimasi: [3.1431 3.1479 3.1417 3.1454 3.1447 3.1366 3.1474 3.1366 3.1442 3.1447]
Rata-rata 10 estimasi : 3.1432
Std 10 estimasi (ddof=1) : 0.00395

Penjelasan tiap bagian:

  1. Baris 5 (se_teoritis = 4 * np.sqrt(p * (1 - p) / n)): setiap titik adalah percobaan sukses-gagal, sehingga varians proporsinya p(1−p) (lihat Chapter Variance dan Standard Deviation); faktor 4 mengembalikan proporsi ke skala pi.
  2. Baris 9-13 (for seed in range(42, 52)): sepuluh Generator dengan seed 42 sampai 51 dibentuk satu per satu — setiap pengulangan adalah satu “tarikan” dari distribusi estimasi; konsepnya sama dengan pengujian ber-seed pada Chapter Reproducibility dan Random Seed.
  3. Baris 15-17: estimasi.mean() menghasilkan 3.1432 — dekat dengan pi — dan estimasi.std(ddof=1) menghasilkan 0.00395, satu orde dengan SE teoretis 0.00519.

Menguji Hukum 1/sqrt(N) #

Hukum 1/√N membuat prediksi yang bisa diuji: ketika n naik 100 kali (dari 1.000 ke 100.000), SE turun 10 kali. Kita uji dengan prosedur yang sama pada dua skala:

python
import numpy as np

def estimasi_pi(n, seed):
    rng = np.random.default_rng(seed)
    x = rng.uniform(-1.0, 1.0, size=n)
    y = rng.uniform(-1.0, 1.0, size=n)
    return 4 * np.count_nonzero(x**2 + y**2 <= 1.0) / n

p = np.pi / 4
for n in [1_000, 100_000]:
    hasil = np.array([estimasi_pi(n, seed) for seed in range(42, 52)])
    se_teoritis = 4 * np.sqrt(p * (1 - p) / n)
    std_empiris = hasil.std(ddof=1)
    print(f"n = {n:>7} | std empiris {std_empiris:.5f} | SE teori {se_teoritis:.5f} | rasio {std_empiris / se_teoritis:.2f}")

Output yang Dihasilkan:

text
n =    1000 | std empiris 0.04383 | SE teori 0.05193 | rasio 0.84
n =  100000 | std empiris 0.00395 | SE teori 0.00519 | rasio 0.76

Mari kita baca hasilnya:

  1. Baris 3-7: fungsi estimasi_pi sama seperti Bagian 3; setiap ukuran n diuji dengan sepuluh seed yang sama (42 sampai 51), sehingga perbandingan antarskala adil.
  2. Baris 10-14: SE teoretis turun dari 0.05193 ke 0.00519 — tepat 10 kali — dan std empiris turun dari 0.04383 ke 0.00395 (sekitar 11 kali), sesuai prediksi.
  3. Kolom rasio: std empiris 0.84 dan 0.76 kali SE teoretis; karena masing-masing hanya dihitung dari 10 pengulangan, menyimpang sedikit dari 1.0 adalah perilaku yang diharapkan.

Laporan Akhir dan Pemeriksaan Mandiri #

Seandainya proyek ini dijalankan sebagai folder kode, hasil akhirnya kita simpan sebagai laporan/hasil.md dan pemeriksaannya sebagai tests/pemeriksaan_simulasi.py. Inti laporan tersebut adalah tabel berikut:

EksperimenNilai teoretisEstimasi (n = 100.000)Selisih absolutGalat relatif
Estimasi pi3.14163.14310.00150.05%
P(jumlah dua dadu = 7)0.16670.16830.00160.96%
Integral sin(x) di [0, π]2.00002.00130.00130.07%

Catatan pendukung laporan:

  • SE teoretis pi pada n = 100.000: 0.00519; std 10 estimasi ber-seed: 0.00395 — sejalan.
  • Ketika n naik dari 1.000 ke 100.000, SE teoretis turun tepat 10 kali (0.05193 → 0.00519), sesuai hukum 1/√N.
  • Seluruh estimasi memakai seed 42 dan dapat direproduksi persis; galat relatif ketiganya di bawah 1%.

Terakhir, pemeriksaan mandiri menjalankan ulang ketiga estimator dan mengujinya dengan assert:

python
import numpy as np

def estimasi_pi(n, seed=42):
    rng = np.random.default_rng(seed)
    x = rng.uniform(-1.0, 1.0, size=n)
    y = rng.uniform(-1.0, 1.0, size=n)
    return 4 * np.count_nonzero(x**2 + y**2 <= 1.0) / n

n = 100_000
est_pi = estimasi_pi(n)
rng = np.random.default_rng(42)
jumlah = rng.integers(1, 7, size=(n, 2)).sum(axis=1)
proporsi_7 = np.count_nonzero(jumlah == 7) / n
est_integral = np.pi * np.sin(np.random.default_rng(42).random(n) * np.pi).mean()

assert abs(est_pi - np.pi) < 0.05
assert abs(proporsi_7 - 6 / 36) < 0.01
assert abs(est_integral - 2.0) < 0.02

print(f"Estimasi pi     : {est_pi:.4f} (teori {np.pi:.4f})")
print(f"Proporsi 7      : {proporsi_7:.4f} (teori {6 / 36:.4f})")
print(f"Integral sin    : {est_integral:.4f} (teori 2.0000)")
print("Semua pemeriksaan lulus")

Output yang Dihasilkan:

text
Estimasi pi     : 3.1431 (teori 3.1416)
Proporsi 7      : 0.1683 (teori 0.1667)
Integral sin    : 2.0013 (teori 2.0000)
Semua pemeriksaan lulus

Bedah pemeriksaan:

  1. Baris 3-7 (def estimasi_pi): fungsi yang sama dengan Bagian 3 dipakai ulang, memastikan pemeriksaan menguji estimator yang benar-benar dipakai proyek.
  2. Baris 9-14: ketiga estimator dihitung ulang dengan seed 42; hasilnya 3.1431, 0.1683, dan 2.0013 — konsisten dengan seluruh tabel proyek.
  3. Baris 16-18 (assert ...): tiga toleransi dipasang — 0.05 untuk pi, 0.01 untuk peluang dadu, dan 0.02 untuk integral, jauh di atas galat teramati; bila satu saja tidak terpenuhi, Python menghentikan script dengan AssertionError.
  4. Baris 20-23: ringkasan nilai dicetak, dan baris Semua pemeriksaan lulus hanya muncul bila ketiga assert lolos — tanda bahwa proyek ini dalam keadaan sehat.

Dengan laporan ini, siklus proyek tuntas: pertanyaan menjadi model, model diberi sampel, sampel dijalankan, dan hasilnya dinilai galatnya sampai lulus pemeriksaan sendiri.