Bab Distribusi Uniform memperkenalkan sebaran yang merata di dalam sebuah rentang, dan Normal Distribution memperkenalkan sebaran lonceng yang simetris. Keduanya mengizinkan nilai negatif. Padahal banyak kuantitas nyata tidak pernah negatif: waktu antar kedatangan pelanggan, total waktu menunggu, maupun proporsi campuran bahan. Untuk kebutuhan itu Generator menyediakan tiga method bertetangga: exponential(), gamma(), dan beta().
Bab ini memakai pola yang sama dengan bab-bab lain pada section ini: setiap Generator dibuat dengan np.random.default_rng(seed) agar output dapat direproduksi, lalu sampel berukuran besar dijadikan bahan uji empiris terhadap mean teoretis. Ketiga distribusi juga saling terkait: gamma adalah penjumlahan beberapa eksponensial, dan eksponensial adalah pasangan kontinu dari Poisson pada Binomial dan Poisson Distribution.
Waktu Antar Kedatangan dengan rng.exponential #
Bayangkan kasir minimarket yang rata-rata dilalui satu pelanggan setiap dua menit. Jarak waktu antara dua pelanggan berturut-turut tidak selalu dua menit — bisa 30 detik, bisa juga lima menit — tetapi sebarannya punya pola khas: makin lama jeda, makin jarang terjadi. Pola itu dimodelkan distribusi eksponensial dengan satu parameter scale, dan sifat pentingnya sederhana: scale adalah mean sebaran tersebut.
import numpy as np
rng = np.random.default_rng(42)
jeda = rng.exponential(scale=2.0, size=100_000)
print(jeda[:5].round(2))
print("mean sampel :", round(float(jeda.mean()), 3))
print("mean teoretis:", 2.0)Output yang Dihasilkan:
[4.81 4.67 4.77 0.56 0.17]
mean sampel : 2.007
mean teoretis: 2.0Bedah baris demi baris:
- Baris 4 (
rng.exponential(scale=2.0, size=100_000)): method membangkitkan 100.000 jeda antar kedatangan dengan mean 2,0 menit per kedatangan; hasilnya arrayfloat64. - Baris 5 (
jeda[:5].round(2)): hanya lima sampel pertama yang dicetak — ribuan angka mentah tidak nyaman dibaca, dan pembulatan dua desimal sudah cukup untuk menangkap besaran nilainya. - Baris 6-7: mean sampel 2,007 hanya melenceng 0,007 menit dari
scale=2.0; semakin besarsize, selisihnya makin kecil.
Waktu Tunggu ke-k Kedatangan dengan rng.gamma #
Kasir pada contoh tadi baru boleh istirahat setelah pelanggan ketiga datang. Berapa total waktu menunggu sampai kedatangan ketiga? Jawabannya adalah penjumlahan tiga jeda antar kedatangan — dan jumlah dari k variabel eksponensial berdistribusi gamma dengan shape=k. Karena tiap eksponensial bermean scale, mean gammanya adalah shape * scale.
import numpy as np
rng = np.random.default_rng(42)
eksp = rng.exponential(scale=2.0, size=(50_000, 3))
tunggu_sum = eksp.sum(axis=1)
tunggu_gamma = rng.gamma(shape=3, scale=2.0, size=50_000)
print("sum 3 eksponensial:", round(float(tunggu_sum.mean()), 3))
print("gamma(3, 2.0) :", round(float(tunggu_gamma.mean()), 3))
print("contoh gamma [:5] :", tunggu_gamma[:5].round(2))Output yang Dihasilkan:
sum 3 eksponensial: 6.01
gamma(3, 2.0) : 6.006
contoh gamma [:5] : [ 6.66 3.99 7.79 4.27 10.33]Bedah baris demi baris:
- Baris 5 (
rng.exponential(scale=2.0, size=(50_000, 3))): membuat 50.000 baris; tiap baris memuat tiga jeda antar kedatangan milik satu skenario. - Baris 6 (
eksp.sum(axis=1)): penjumlahan sepanjangaxis=1merapat tiap baris menjadi satu total — waktu menunggu sampai kedatangan ketiga. - Baris 7 (
rng.gamma(shape=3, scale=2.0, size=50_000)): membangkitkan kuantitas yang sama secara langsung. Mean keduanya, 6,01 dan 6,006, mendekati teori3 * 2.0 = 6.0.
Distribusi gamma adalah versi umum dari eksponensial: shape=1 mengembalikan eksponensial biasa, sedangkan shape pecahan diperbolehkan untuk kuantitas akumulatif lain seperti curah hujan harian.
Proporsi dengan rng.beta #
Eksponensial dan gamma menghasilkan bilangan positif tanpa batas atas. Sebaliknya, rng.beta(a, b) menghasilkan nilai di antara 0 dan 1, sehingga tepat untuk proporsi. Contoh: sebuah iklan mendapat 10 klik dengan 2 konversi. Proporsi konversi yang sesungguhnya tidak diketahui pasti; beta(a=2, b=8) membangkitkan nilai proporsi yang masuk akal, terpusat di sekitar 2/(2+8) = 0.2. Pola yang sama dipakai untuk proporsi bahan campur, misalnya rancangan 2 kg arabika terhadap 8 kg robusta pada racikan kopi.
import numpy as np
rng = np.random.default_rng(42)
proporsi = rng.beta(a=2.0, b=8.0, size=100_000)
print(proporsi[:5].round(2))
print("mean sampel :", round(float(proporsi.mean()), 3))
print("mean teoretis:", 0.2)Output yang Dihasilkan:
[0.17 0.19 0.28 0.21 0.3 ]
mean sampel : 0.2
mean teoretis: 0.2Dua argumen a dan b bekerja seperti “bobot keberhasilan” dan “bobot kegagalan”: a=2 yang kecil membuat sampel condong ke nilai rendah, sementara b=8 menekan sebaran ke arah 0. Bila perannya dibalik — a=8, b=2 — pusat sebaran berpindah mendekati 0,8.
Tabel Ringkas dan Uji Mean Empiris #
| Method | Parameter | Rentang nilai | Mean teoretis | Contoh kasus |
|---|---|---|---|---|
rng.exponential(scale) | scale | (0, ∞) | scale | jeda antrean kasir minimarket |
rng.gamma(shape, scale) | shape, scale | (0, ∞) | shape * scale | menunggu pelanggan ke-3 |
rng.beta(a, b) | a, b | (0, 1) | a/(a+b) | proporsi konversi iklan |
Satu blok terakhir merangkum verifikasi mean sampel terhadap mean teoretis untuk ketiganya sekaligus:
import numpy as np
rng = np.random.default_rng(42)
kasus = [
("exponential(2.0)", rng.exponential(2.0, 100_000), 2.0),
("gamma(3, 2.0)", rng.gamma(3, 2.0, 100_000), 6.0),
("beta(2, 8)", rng.beta(2.0, 8.0, 100_000), 0.2),
]
for nama, sampel, teori in kasus:
print(f"{nama:18s} mean sampel={round(float(sampel.mean()), 3)} teori={teori}")Output yang Dihasilkan:
exponential(2.0) mean sampel=2.007 teori=2.0
gamma(3, 2.0) mean sampel=6.003 teori=6.0
beta(2, 8) mean sampel=0.2 teori=0.2Ketiga mean sampel berlabuh di dekat nilai teoretisnya — bukti bahwa parameter yang kita berikan memang mengendalikan pusat sebaran. Ketiga method ini selalu mengembalikan float64; bila kebutuhannya bilangan bulat acak, gunakan method pada Random Integer dan Sampling. Kombinasi ketiganya dengan sampel normal membuka banyak skenario simulasi, mulai dari antrean hingga pemodelan proporsi.