Variabel Acak dan Distribusi

Tur variabel acak diskrit dan kontinu.

Daftar isi

Variabel acak mengubah hasil percobaan acak menjadi angka, sedangkan distribusi menyatakan peluang setiap angka yang mungkin muncul. Topik ini menelusuri variabel acak diskrit dan kontinu, fungsi massa dan kepadatan peluang, nilai harapan serta varians, dan empat distribusi yang paling sering ditemui pada kode. Setelah topik ini dipahami, keluaran fungsi acak NumPy dapat dibaca sebagai sampel dari distribusi tertentu, dan rerata simulasi dapat dibandingkan dengan hitungan analitiknya secara berdampingan.

Variabel acak dan fungsi massa peluang#

Variabel acak (random variable) adalah fungsi yang menautkan setiap hasil percobaan acak dengan suatu bilangan, biasanya dinotasikan XX. Pada satu pelemparan dadu, nilai XX berada di antara 1 dan 6, sedangkan pada jumlah dua dadu nilainya berada di antara 2 dan 12. Fungsi massa peluang (probability mass function) menyatakan peluang setiap nilai tersebut dan ditulis P(X=x)P(X = x). Dadu baku memiliki fungsi massa peluang yang datar.

P(X=x)={16untuk x∈{1,2,3,4,5,6}0untuk nilai lain P(X = x) = \begin{cases} \frac{1}{6} & \text{untuk } x \in \{1, 2, 3, 4, 5, 6\} \\ 0 & \text{untuk nilai lain} \end{cases}

Fungsi massa peluang yang sah selalu memenuhi dua syarat, yaitu setiap nilainya tidak negatif dan seluruhnya berjumlah satu. Syarat penjumlahan itulah yang membedakan distribusi satu sama lain, karena bentuk batangnya menyatakan nilai mana yang cenderung muncul. Contohnya, jumlah dua dadu menumpuk pada tengah, dengan P(X=7)=636P(X = 7) = \frac{6}{36} sebagai puncaknya, dan bentuk semacam ini kembali muncul pada demo interaktif di bagian akhir topik.

Nilai harapan dan varians#

Nilai harapan (expected value) adalah rata-rata jangka panjang dari variabel acak, yaitu pusat yang dituju rerata sampel apabila percobaan diulang berkali-kali. Nilainya dihitung sebagai rerata berbobot peluang.

E[X]=∑xx P(X=x) \mathbb{E}[X] = \sum_{x} x \, P(X = x)

Dadu baku menghasilkan E[X]=1+2+3+4+5+66=3,5\mathbb{E}[X] = \frac{1+2+3+4+5+6}{6} = 3{,}5, suatu nilai yang justru tidak mungkin muncul pada satu lemparan. Ketidakmungkinan tersebut bukan kontradiksi, karena nilai harapan menggambarkan pusat massa, bukan hasil satu percobaan. Sebaran di sekeliling pusat diukur oleh varians.

Var⁡[X]=E[(X−E[X])2] \operatorname{Var}[X] = \mathbb{E}\left[(X - \mathbb{E}[X])^2\right]

Dadu baku memiliki Var⁡[X]=3512≈2,917\operatorname{Var}[X] = \frac{35}{12} \approx 2{,}917, dan akarnya disebut simpangan baku (standard deviation) yang besarnya sekitar 1,7081{,}708. Dua ukuran ini berpasangan pada hampir semua analisis data, yaitu nilai harapan sebagai posisi dan varians sebagai lebar sebarannya.

Dari diskrit ke kontinu#

Variabel acak kontinu bernilai pada interval bilangan real, misalnya suhu sensor atau waktu tunggu antrean tiket loket. Karena jumlah nilainya tak hingga, peluang per titik tidak lagi bermakna, dan perannya digantikan oleh fungsi kepadatan peluang (probability density function) f(x)f(x). Peluang pada suatu interval dihitung sebagai luas di bawah kurva kepadatannya.

P(a≤X≤b)=∫abf(x) dx P(a \le X \le b) = \int_a^b f(x) \, dx

Fungsi f(x)f(x) sendiri bukan peluang, melainkan kepadatan yang luas totalnya berjumlah satu. Distribusi normal (normal distribution) adalah contoh kontinu yang paling terkenal, dengan bentuk lonceng yang ditentukan oleh rerata μ\mu dan simpangan baku σ\sigma. Penghubung kedua kasus adalah fungsi distribusi kumulatif (cumulative distribution function) F(x)=P(X≤x)F(x) = P(X \le x), yang terdefinisi dengan baik pada variabel diskrit maupun kontinu.

Menghitung dan mensimulasikan dengan NumPy#

Skrip berikut menghitung nilai harapan dan varians dadu secara analitik dari tabel peluangnya, lalu menghitung keduanya lagi dari 100.000 sampel acak. Benih tetap membuat angka simulasi dapat direproduksi ulang secara persis sama.

python variabel-acak.py
"""Nilai harapan dan varians dadu: hitungan analitik dibandingkan simulasi."""
import numpy as np

mata = np.arange(1, 7)
peluang = np.full(6, 1 / 6)
nilai_harapan = np.sum(mata * peluang)
varians = np.sum((mata - nilai_harapan) ** 2 * peluang)
print("E[X]  analitik :", round(float(nilai_harapan), 4))
print("Var[X] analitik:", round(float(varians), 4))

rng = np.random.default_rng(42)
sampel = rng.integers(1, 7, size=100_000)
print("E[X]  simulasi :", round(float(sampel.mean()), 4))
print("Var[X] simulasi:", round(float(sampel.var()), 4))
text Keluaran
E[X]  analitik : 3.5
Var[X] analitik: 2.9167
E[X]  simulasi : 3.4998
Var[X] simulasi: 2.9173

Rerata simulasi 3.4998 dan varians 2.9173 berada sangat dekat dengan nilai analitiknya, dan kesesuaian ini adalah ciri hukum bilangan besar. Pola kerja yang sama, yaitu membandingkan rumus dengan sampel, berlaku untuk distribusi apa pun. NumPy menyediakan generator untuk keluarga distribusi yang sering digunakan, sebagaimana dirangkum tabel berikut.

DistribusiParameterContoh kejadian
Bernoullippsatu lemparan koin dengan peluang sisi tertentu
Binomialnn, ppbanyaknya sukses dari nn percobaan
Uniformaa, bbbilangan acak pada interval [a,b][a, b]
Normalμ\mu, σ\sigmapengukuran yang menumpuk di sekitar rerata
python Contoh: mengambil sampel dari empat distribusi
import numpy as np

rng = np.random.default_rng(42)
print("bernoulli :", rng.binomial(1, 0.3, size=10))
print("binomial  :", rng.binomial(10, 0.3, size=10))
print("uniform   :", np.round(rng.uniform(2.0, 5.0, size=5), 3))
print("normal    :", np.round(rng.normal(0.0, 1.0, size=5), 3))
text Keluaran
bernoulli : [1 0 1 0 0 1 1 1 0 0]
binomial  : [2 5 3 4 3 2 3 1 4 3]
uniform   : [4.274 3.064 4.912 4.679 4.335]
normal    : [-0.352  0.532  0.365  0.413  0.431]

Baris bernoulli dan binomial menggunakan fungsi yang sama dengan parameter berbeda, yaitu n=1n = 1 menghasilkan koin tunggal, sedangkan n=10n = 10 menghitung banyaknya sukses. Sampel uniform tersebar merata pada interval 2 sampai 5, sedangkan sampel normal terpusat di sekitar nol dengan tanda yang bervariasi. Seluruh angka berasal dari benih yang sama, sehingga urutannya identik pada setiap eksekusi.

Menggambar fungsi massa peluang#

Bentuk distribusi lebih mudah dibaca apabila digambar. Skrip berikut menghasilkan grafik batang fungsi massa peluang dadu menggunakan matplotlib, dan berkasnya disematkan tepat setelah skrip tersebut.

python gambar_pmf.py
"""Fungsi massa peluang dadu baku digambar dengan matplotlib."""
import numpy as np
import matplotlib

matplotlib.use("Agg")
import matplotlib.pyplot as plt

mata = np.arange(1, 7)
peluang = np.full(6, 1 / 6)

fig, ax = plt.subplots(figsize=(6, 3))
ax.bar(mata, peluang, color="#1f77b4", width=0.6)
ax.axhline(1 / 6, color="#d62728", linestyle="--", linewidth=1.2)
ax.text(6.45, 1 / 6, "1/6", color="#d62728", va="center", fontsize=10)
ax.set_xticks(mata)
ax.set_ylim(0, 0.25)
ax.set_xlabel("mata dadu")
ax.set_ylabel("peluang")
plt.tight_layout()
plt.savefig("pmf-dadu.svg")
Fungsi massa peluang dadu baku dengan garis bantu 1/6

Keenam batang setinggi sama karena dadu baku berdistribusi uniform diskrit, dan garis putus-putus menandai peluang tiap batang sebesar 16\frac{1}{6}. Pemanggilan matplotlib.use("Agg") memilih backend tanpa jendela, sehingga skrip berjalan pada lingkungan tanpa layar, dan hasilnya disimpan sebagai berkas SVG yang dapat diperbesar tanpa pecah.

Mencoba distribusi secara interaktif#

Demo berikut mensimulasikan jumlah dua dadu pada sebuah kanvas. Tekan tombol “Lempar 100 kali” beberapa kali secara berurutan, kemudian amati batang mana yang tumbuh paling tinggi dan bentuk keseluruhan histogramnya. Tombol Ulangi mengosongkan kanvas untuk percobaan baru.

Kode sumber demo
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="utf-8">
<title>Demo distribusi jumlah dua dadu</title>
<style>
  body { font-family: sans-serif; margin: 12px; }
  canvas { border: 1px solid #ccc; background: #fff; }
  button { margin: 8px 8px 0 0; padding: 6px 12px; }
  p { margin: 8px 0 0; font-size: 14px; }
</style>
</head>
<body>
<canvas id="kanvas" width="440" height="240"></canvas>
<p>
  <button id="lempar" type="button">Lempar 100 kali</button>
  <button id="ulang" type="button">Ulangi</button>
  <span id="info"></span>
</p>
<script>
  const kvs = document.getElementById("kanvas").getContext("2d");
  const hitung = {};        // jumlah mata -> banyaknya kemunculan
  let totalLemparan = 0;

  function lemparSekali() {
    const d1 = 1 + Math.floor(Math.random() * 6);
    const d2 = 1 + Math.floor(Math.random() * 6);
    const jumlah = d1 + d2;
    hitung[jumlah] = (hitung[jumlah] || 0) + 1;
    totalLemparan++;
  }

  function gambar() {
    kvs.clearRect(0, 0, 440, 240);
    const maks = Math.max(...Object.values(hitung), 1);
    for (let jumlah = 2; jumlah <= 12; jumlah++) {
      const tinggi = (hitung[jumlah] || 0) / maks * 185;
      kvs.fillStyle = "#1f77b4";
      kvs.fillRect(18 + (jumlah - 2) * 36, 220 - tinggi, 26, tinggi);
      kvs.fillStyle = "#333333";
      kvs.fillText(String(jumlah), 25 + (jumlah - 2) * 36, 234);
      if (hitung[jumlah]) {
        kvs.fillText(String(hitung[jumlah]), 24 + (jumlah - 2) * 36, 212 - tinggi);
      }
    }
    document.getElementById("info").textContent = "total lemparan: " + totalLemparan;
  }

  document.getElementById("lempar").addEventListener("click", () => {
    for (let i = 0; i < 100; i++) lemparSekali();
    gambar();
  });
  document.getElementById("ulang").addEventListener("click", () => {
    for (const k in hitung) delete hitung[k];
    totalLemparan = 0;
    gambar();
  });
  gambar();
</script>
</body>
</html>

Batang pada jumlah 7 tumbuh paling tinggi karena enam dari 36 pasangan dadu menghasilkannya, sedangkan ujung 2 dan 12 hanya dihasilkan oleh satu pasangan. Makin banyak lemparan, bentuk segitiganya makin tegas, dan bentuk itulah fungsi massa peluang dari jumlah dua dadu. Demo ini juga memperlihatkan peran jumlah sampel, karena histogram dengan 100 lemparan masih bergelombang sebelum akhirnya mendekati bentuk teoretisnya.

Di mana hal ini ditemui dalam kode#

Distribusi muncul di titik-titik tak terduga pada kode machine learning. Inisialisasi bobot jaringan saraf umumnya menarik sampel uniform atau normal dengan skala kecil, pelucutan (dropout) menarik sampel Bernoulli untuk memutuskan unit mana yang aktif, dan asumsi derau (noise) pengukuran sering dinyatakan sebagai distribusi normal. Nilai harapan juga menjadi bahasa sehari-hari kode machine learning, karena loss pada model dinyatakan sebagai rerata, yaitu taksiran E[kerugian]\mathbb{E}[\text{kerugian}] dari data.

python Contoh: distribusi pada inisialisasi bobot dan pelucutan
import numpy as np

rng = np.random.default_rng(42)
bobot = rng.normal(0.0, 0.01, size=(3, 4))    # inisialisasi bobot lapisan
lucut = rng.random(size=(3, 4)) < 0.5         # pelucutan dengan peluang 0,5
print("bobot rata-rata :", round(float(bobot.mean()), 5))
print("bobot simpangan :", round(float(bobot.std()), 5))
print("unit aktif      :", int(lucut.sum()), "dari", lucut.size)
text Keluaran
bobot rata-rata : -0.00142
bobot simpangan : 0.00918
unit aktif      : 4 dari 12

Rerata bobot −0.00142-0.00142 dan simpangannya 0.009180.00918 sesuai dengan distribusi normal bersimpangan 0,010{,}01 yang diminta, dengan selisih kecil khas sampel. Matriks pelucutan mengaktifkan 4 dari 12 unit, mendekati harapan separuhnya, dan masker semacam ini dikalikan pada lapisan selama pelatihan. Dengan memahami distribusinya, parameter seperti skala inisialisasi dan peluang pelucutan menjadi keputusan yang terukur, bukan angka ajaib.

Ringkasan#

  • Variabel acak menautkan hasil percobaan dengan bilangan, dan distribusinya dinyatakan oleh fungsi massa peluang untuk kasus diskrit atau fungsi kepadatan peluang untuk kasus kontinu.
  • Nilai harapan E[X]\mathbb{E}[X] adalah pusat distribusi sebagai rerata berbobot peluang, sedangkan varians dan simpangan baku mengukur lebar sebarannya.
  • Pada variabel kontinu, peluang di setiap titik tunggal bernilai nol, sehingga peluangnya selalu dihitung sebagai luas pada interval.
  • NumPy menyediakan pengambilan sampel Bernoulli, Binomial, Uniform, dan Normal melalui generator berbenih, sehingga setiap rumus dapat diverifikasi dengan simulasi yang dapat direproduksi.

Referensi#