Deskriptif memberi tahu kita apa yang sudah terjadi; probabilitas memberi kerangka untuk membicarakan apa yang mungkin terjadi. Setiap keputusan bertumpu pada kalkulasi semacam ini: berapa persen stok kopi yang sebaiknya disiapkan besok, seberapa sering pelanggan baru kembali lagi, atau seberapa mungkin transaksi di atas ratusan juta adalah penipuan. Pada chapter ini kita membangun tiga fondasi sekaligus: ruang sampel dan kejadian, probabilitas sebagai frekuensi relatif dari data, lalu simulasi yang memperlihatkan hukum frekuensi relatif bekerja di depan mata kita.

Ruang Sampel dan Kejadian #

Ruang sampel (S) adalah daftar seluruh hasil yang mungkin terjadi, sedangkan kejadian (event) adalah bagian dari ruang sampel yang kita minati. Untuk satu lemparan dadu, ruang sampelnya enam mata dadu; kejadian “mata dadu ganjil” adalah tiga di antaranya. Bila setiap hasil berpeluang sama, probabilitas kejadian A cukup dihitung sebagai perbandingan banyaknya anggota:

text
P(A) = n(A) / n(S)      (berlaku bila setiap hasil berpeluang sama)

Kita wujudkan langsung dengan Python:

python
ruang_sampel = [1, 2, 3, 4, 5, 6]
ganjil = [x for x in ruang_sampel if x % 2 == 1]
lima_atas = [x for x in ruang_sampel if x >= 5]

print(f"Ruang sampel S            : {ruang_sampel}")
print(f"Kejadian A (mata ganjil)  : {ganjil}")
print(f"Kejadian B (mata >= 5)    : {lima_atas}")
print(f"P(A) = {len(ganjil)}/{len(ruang_sampel)} = {len(ganjil) / len(ruang_sampel):.4f}")
print(f"P(B) = {len(lima_atas)}/{len(ruang_sampel)} = {len(lima_atas) / len(ruang_sampel):.4f}")

Output yang Dihasilkan:

text
Ruang sampel S            : [1, 2, 3, 4, 5, 6]
Kejadian A (mata ganjil)  : [1, 3, 5]
Kejadian B (mata >= 5)    : [5, 6]
P(A) = 3/6 = 0.5000
P(B) = 2/6 = 0.3333

Bedah baris-per-barisnya:

  1. Baris 1 (ruang_sampel): ruang sampel ditulis eksplisit sebagai list — enam hasil mungkin, tidak ada yang terlewat.
  2. Baris 2-3 (list comprehension): dua kejadian dibangun dengan menyaring ruang sampel. Kejadian hanyalah himpunan bagian; satu hasil (mata 5) bahkan menjadi anggota dua kejadian sekaligus.
  3. Baris 6-7 (len(ganjil) / len(ruang_sampel)): rumus P(A) = n(A)/n(S) diterjemahkan apa adanya: 3/6 = 0,5 untuk mata ganjil dan 2/6 = 0,3333 untuk mata 5 ke atas.

Cara pandang “hitung anggota” ini bekerja bila setiap hasil berpeluang sama. Dadu yang adil memenuhi syarat itu; dadu yang condong tidak — dan di situlah kita butuh cara lain yang lebih umum.

Probabilitas dari Data: Frekuensi Relatif #

Untuk kejadian yang tidak bisa kita daftar hasilnya dengan adil — cuaca misalnya — probabilitas didekati lewat frekuensi relatif: seberapa sering kejadian itu terjadi dari seluruh pengamatan. Kita pakai catatan cuaca Kota Bandung selama 30 hari:

python
from collections import Counter

catatan_cuaca = [
    "hujan", "cerah", "berawan", "hujan", "cerah", "hujan", "hujan", "cerah",
    "berawan", "cerah", "hujan", "berawan", "cerah", "hujan", "hujan",
    "cerah", "berawan", "cerah", "hujan", "cerah", "hujan", "hujan",
    "cerah", "hujan", "berawan", "hujan", "cerah", "berawan", "cerah",
    "berawan",
]

frekuensi = Counter(catatan_cuaca)
total_hari = len(catatan_cuaca)

print(f"Total hari tercatat : {total_hari} hari")
for cuaca, jumlah in sorted(frekuensi.items()):
    print(f"{cuaca:8s}: {jumlah:2d} hari, frekuensi relatif = {jumlah / total_hari:.4f}")

Output yang Dihasilkan:

text
Total hari tercatat : 30 hari
berawan :  7 hari, frekuensi relatif = 0.2333
cerah   : 11 hari, frekuensi relatif = 0.3667
hujan   : 12 hari, frekuensi relatif = 0.4000

Mari kita telaah hasilnya:

  1. Counter(catatan_cuaca): menghitung frekuensi setiap kategori dalam sekali jalan — 12 hari hujan, 11 cerah, 7 berawan.
  2. sorted(frekuensi.items()): iterasi urut menurut abjad agar hasil konsisten antar-jalannya (urutan internal Counter mengikuti urutan kemunculan).
  3. jumlah / total_hari: frekuensi relatif tiap kategori. Hujan muncul 12/30 = 0,4000, sehingga wajar jika kita memakai 0,4 sebagai estimasi “probabilitas hujan hari ini di Bandung”.

Angka 0,4 tersebut adalah probabilitas empiris — taksiran dari data, bukan hukum alam. Ia akan berubah bila catatannya diperpanjang atau berganti musim; ketepatannya bergantung pada banyaknya pengamatan, dan justru itu yang kita uji pada simulasi berikutnya.

Simulasi: Hukum Frekuensi Relatif #

Hukum frekuensi relatif menyatakan: bila percobaan diulang sangat banyak kali, frekuensi relatif sebuah kejadian akan mendekati probabilitas teoretisnya. Kita buktikan dengan 100.000 lemparan dadu simulasi — seed 42 membuat rangkaiannya dapat diulang — lalu mengamati proporsi mata enam pada titik-titik tertentu:

python
import numpy as np

rng = np.random.default_rng(42)
lemparan = rng.integers(1, 7, size=100_000)

print(f"{'n':>7s} {'frek. relatif':>14s} {'jarak ke 1/6':>14s}")
for n in (10, 100, 1_000, 10_000, 100_000):
    frek = np.mean(lemparan[:n] == 6)
    print(f"{n:7d} {frek:14.4f} {abs(frek - 1/6):14.4f}")
print(f"P teoretis = 1/6 = {1/6:.4f}")

Output yang Dihasilkan:

text
      n  frek. relatif   jarak ke 1/6
     10         0.1000         0.0667
    100         0.1400         0.0267
   1000         0.1590         0.0077
  10000         0.1625         0.0042
 100000         0.1659         0.0008
P teoretis = 1/6 = 0.1667

Bedah kodenya:

  1. Baris 3 (rng.integers(1, 7, size=100_000)): membuat 100.000 angka bulat 1-6 (batas atas 7 bersifat eksklusif) dalam satu panggilan — jauh lebih cepat daripada perulangan eksplisit.
  2. Baris 7 (lemparan[:n] == 6): membandingkan n lemparan pertama dengan 6, menghasilkan array boolean; np.mean pada array boolean menghitung proporsi True — itulah frekuensi relatif.
  3. Baris 8 (abs(frek - 1/6)): jarak menuju nilai teoretis, dicetak berdampingan supaya penyusutannya terlihat.

Hasilnya mengikuti pola yang diramalkan teori: pada 10 lemparan frekuensi relatif masih 0,1000 (meleset 0,0667), lalu merapat bertahap — 0,1590 pada seribu, 0,1625 pada sepuluh ribu, hingga 0,1659 pada seratus ribu lemparan, hanya 0,0008 dari target 1/6. Deretan ini juga menjelaskan mengapa pengamatan sedikit tidak bisa dipercaya: dengan n = 10, “belum pernah muncul mata enam” sungguh mungkin terjadi meski dadu adil.

Rangkuman #

  • Ruang sampel S memuat seluruh hasil yang mungkin; kejadian A adalah bagian dari S. Untuk hasil berpeluang sama, P(A) = n(A)/n(S).
  • Probabilitas empiris ditaksir dari frekuensi relatif data: jumlah kemunculan kejadian dibagi banyaknya pengamatan.
  • Hukum frekuensi relatif: seiring percobaan diulang, frekuensi relatif konvergen menuju probabilitas teoretis — dibuktikan simulasi dari meleset 0,0667 (n=10) menjadi 0,0008 (n=100.000).
  • rng.integers() dan np.mean() pada array boolean membentuk pola dasar simulasi probabilitas yang akan sering kita pakai.

Satu kejadian sejauh ini selalu kita hitung sendirian. Padahal keputusan nyata hampir selalu melibatkan beberapa kejadian sekaligus: pelanggan yang “datang pada jam sibuk” sekaligus “membeli menu promosi”. Bagaimana menggabungkan probabilitas beberapa kejadian — dijumlah, dikurang, atau dikali — menjadi bahasan chapter Aturan Probabilitas .

Referensi #

  1. NumPy — Absolute Beginner’s Guide
  2. Python — statistics: Mathematical statistics functions