Chapter sebelumnya memberi kita kemampuan menghitung probabilitas satu kejadian. Dunia nyata jarang memberi pertanyaan sesederhana itu: pelanggan yang datang “saat jam sibuk” dan “membeli menu diskon”, transaksi “bernomor besar” atau “dari perangkat baru” — kombinasi kejadian ada di mana-mana. Untuk menggabungkannya kita butuh beberapa aturan aritmetika probabilitas: komplemen, penjumlahan, dan perkalian. Pada chapter ini keempat aturan tersebut kita turunkan dengan kartu remi dan lemparan dadu, lalu periksa tiap hasil rumus dengan hitungan enumerasi langsung dan simulasi.

Aturan Komplemen: Menghitung Sisanya #

Kadang jauh lebih mudah menghitung kejadian yang TIDAK terjadi. Peluang “minimal satu pelanggan memesan paket bundling hari ini” menuntut menjumlah banyak kemungkinan, sedangkan “tidak ada yang memesan” cukup satu hitungan. Aturan komplemen menyatakan peluang kejadian dan lawannya selalu berjumlah 1:

text
P(not A) = 1 - P(A)

Kita pakai satu dek remi 52 kartu sebagai laboratorium pertama, dibangun lewat comprehension bersarang:

python
ranks = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "As"]
suits = ["Hati", "Wajik", "Keriting", "Sekop"]
dek = [f"{r} {s}" for s in suits for r in ranks]

kartu_as = [k for k in dek if k.startswith("As ")]
p_as = len(kartu_as) / len(dek)

print(f"Jumlah kartu di dek : {len(dek)}")
print(f"Jumlah kartu As     : {len(kartu_as)}")
print(f"P(As)               = {len(kartu_as)}/{len(dek)} = {p_as:.4f}")
print(f"P(bukan As)         = 1 - {p_as:.4f} = {1 - p_as:.4f}")

Output yang Dihasilkan:

text
Jumlah kartu di dek : 52
Jumlah kartu As     : 4
P(As)               = 4/52 = 0.0769
P(bukan As)         = 1 - 0.0769 = 0.9231

Bedah baris-per-barisnya:

  1. Baris 3 (dek = [...]): comprehension bersarang menghasilkan 13 kartu untuk tiap dari 4 lambang — 52 kartu utuh, urutan penulisan konsisten.
  2. Baris 5 (k.startswith("As ")): menyaring empat kartu As. Spasi pada awalan mencegah kartu lain ikut terpilih.
  3. Baris 9-10: P(As) = 4/52 ≈ 0,0769, lalu komplemennya 48/52 ≈ 0,9231 — cukup satu pengurangan, tanpa perlu menyaring 48 kartu satu per satu.

Aturan Penjumlahan: Menggabungkan Dua Kejadian #

Peluang “A atau B terjadi” tidak bisa dijumlah begitu saja, karena hasil yang termasuk keduanya terhitung dua kali. Aturan penjumlahan mengoreksinya dengan mengurangi irisan sekali:

text
P(A ∪ B) = P(A) + P(B) - P(A ∩ B)

Contoh klasiknya: peluang kartu yang terambil adalah As ATAU Hati. Kita bandingkan rumus dengan enumerasi langsung memakai himpunan:

python
ranks = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "As"]
suits = ["Hati", "Wajik", "Keriting", "Sekop"]
dek = [f"{r} {s}" for s in suits for r in ranks]

kartu_as = {k for k in dek if k.startswith("As ")}
kartu_hati = {k for k in dek if k.endswith("Hati")}

p_as = len(kartu_as) / len(dek)
p_hati = len(kartu_hati) / len(dek)
p_irisan = len(kartu_as & kartu_hati) / len(dek)

p_union_rumus = p_as + p_hati - p_irisan
p_union_hitung = len(kartu_as | kartu_hati) / len(dek)

print(f"P(As)                  = {p_as:.4f}")
print(f"P(Hati)                = {p_hati:.4f}")
print(f"P(As dan Hati)         = {p_irisan:.4f}")
print(f"P(As atau Hati) rumus  = {p_union_rumus:.4f}")
print(f"P(As atau Hati) hitung = {p_union_hitung:.4f}")

Output yang Dihasilkan:

text
P(As)                  = 0.0769
P(Hati)                = 0.2500
P(As dan Hati)         = 0.0192
P(As atau Hati) rumus  = 0.3077
P(As atau Hati) hitung = 0.3077

Mari kita telaah hasilnya:

  1. p_as + p_hati = 0,0769 + 0,2500 = 0,3269 — jumlah naif yang terlalu besar.
  2. p_irisan = 0,0192: satu kartu (As Hati) termasuk As sekaligus Hati, sehingga dihitung dua kali pada penjumlahan naif; itulah yang dikurangkan rumus.
  3. Hasil rumus vs enumerasi: 0,3077 = 0,3077. Menghitung ulang anggota kartu_as | kartu_hati (16 kartu dari 52) mengonfirmasi rumusnya.

Kasus khusus muncul bila dua kejadian tidak mungkin terjadi bersamaan (saling lepas atau mutually exclusive). Irisannya kosong sehingga suku pengurang hilang, seperti mata dadu ganjil dan genap:

python
S = range(1, 7)
ganjil = {1, 3, 5}
genap = {2, 4, 6}

print(f"Irisan ganjil dan genap      : {len(ganjil & genap)} anggota")
print(f"P(ganjil dan genap)          : {len(ganjil & genap) / 6:.4f}")
print(f"P(ganjil atau genap) rumus   : {(len(ganjil) + len(genap)) / 6:.4f}")
print(f"P(ganjil atau genap) hitung  : {len(ganjil | genap) / 6:.4f}")

Output yang Dihasilkan:

text
Irisan ganjil dan genap      : 0 anggota
P(ganjil dan genap)          : 0.0000
P(ganjil atau genap) rumus   : 1.0000
P(ganjil atau genap) hitung  : 1.0000

Irisan ganjil dan genap memang nol anggota, sehingga P(ganjil atau genap) cukup P(ganjil) + P(genap) = 3/6 + 3/6 = 1. Kesalahan yang sering terjadi di lapangan adalah menganggap dua kejadian saling lepas padahal tidak — pelanggan “membeli kopi” dan “membeli roti” jelas bisa terjadi bersamaan, sehingga penjumlahan tanpa pengurangan irisan akan menaksir terlalu tinggi.

Aturan Perkalian: Kejadian yang Merdeka #

Untuk “A dan B terjadi bersamaan”, aturannya bergantung pada hubungan kedua kejadian. Bila keduanya merdeka (independen) — hasil yang satu tidak memengaruhi peluang lainnya — probabilitasnya cukup dikalikan:

text
Bila A dan B merdeka: P(A dan B) = P(A) × P(B)

Dua lemparan dadu adalah contoh sempurna: mata dadu pertama tidak mengubah peluang mata dadu kedua. Kita buktikan dengan tiga cara sekaligus — enumerasi 36 hasil, rumus perkalian, dan simulasi 100.000 pasangan:

python
import itertools

import numpy as np

ruang = list(itertools.product(range(1, 7), repeat=2))
enam_enam = [(a, b) for a, b in ruang if a == 6 and b == 6]

p_enumerasi = len(enam_enam) / len(ruang)
p_rumus = 1/6 * 1/6

rng = np.random.default_rng(42)
simulasi = rng.integers(1, 7, size=(100_000, 2))
p_simulasi = np.mean((simulasi[:, 0] == 6) & (simulasi[:, 1] == 6))

print(f"Ukuran ruang sampel dua dadu : {len(ruang)}")
print(f"P(6 dan 6) enumerasi         : {len(enam_enam)}/{len(ruang)} = {p_enumerasi:.4f}")
print(f"P(6 dan 6) rumus 1/6 x 1/6   : {p_rumus:.4f}")
print(f"P(6 dan 6) simulasi          : {p_simulasi:.4f}")

Output yang Dihasilkan:

text
Ukuran ruang sampel dua dadu : 36
P(6 dan 6) enumerasi         : 1/36 = 0.0278
P(6 dan 6) rumus 1/6 x 1/6   : 0.0278
P(6 dan 6) simulasi          : 0.0278

Bedah kodenya:

  1. itertools.product(range(1, 7), repeat=2): membangkitkan seluruh 36 pasangan terurut dua dadu — ruang sampel dua percobaan sekaligus.
  2. p_rumus = 1/6 * 1/6: aturan perkalian pada kejadian merdeka memberi 1/36 ≈ 0,0278.
  3. rng.integers(1, 7, size=(100_000, 2)): 100.000 baris, tiap baris satu pasangan lemparan. Ekspresi (simulasi[:, 0] == 6) & (simulasi[:, 1] == 6) menandai baris yang kedua dadunya bernilai 6, lalu np.mean menghitung proporsinya.

Ketiga cara sepakat di 0,0278. Perlu dicatat: aturan perkalian ini hanya berlaku untuk kejadian merdeka. Begitu hasil kedua dadu bergantung pada yang pertama (misalnya melempar dua dadu sekaligus lalu menyebut “keduanya sama”), ruang sampelnya berubah dan perkalian sederhana tidak lagi sahih — kerumitan semacam itu kita tangani pada chapter berikutnya.

Rangkuman #

  • Komplemen: P(not A) = 1 − P(A); sering menjadi jalan pintas untuk kejadian berbunyi “minimal satu”.
  • Penjumlahan: P(A ∪ B) = P(A) + P(B) − P(A ∩ B); irisan dikurangkan agar hasil yang tergabung tidak terhitung dua kali.
  • Kejadian saling lepas punya irisan kosong sehingga penjumlahannya menjadi langsung; kejadian yang bisa terjadi bersamaan wajib dikurangi irisannya.
  • Kejadian merdeka mengikuti P(A dan B) = P(A) × P(B), seperti dua lemparan dadu terpisah — verifikasi enumerasi dan simulasi sama-sama menghasilkan 1/36.

Penjumlahan dan perkalian hari ini masih memakai probabilitas mentah setiap kejadian. Namun banyak pertanyaan nyata berbunyi “berapa peluang A TERJADI BILA kita tahu B sudah terjadi?” — informasi baru yang mempersempit ruang sampel. Pertanyaan berbentuk “diketahui…” itulah topik chapter Probabilitas Bersyarat .

Referensi #

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