Itertools dan Kombinatorika untuk Probabilitas dan Statistika¶
Modul math dan itertools sangat berguna untuk menghitung banyaknya cara pada masalah probabilitas dan statistika:
berapa banyak cara menyusun objek (permutasi),
berapa banyak cara memilih objek (kombinasi),
berapa besar ruang sampel percobaan (Cartesian product),
serta menghitung peluang dari ruang sampel tersebut.
Di bab ini kita fokus pada fungsi-fungsi yang paling relevan untuk perkuliahan Probabilitas dan Statistika.
Faktorial¶
Secara matematis, faktorial didefinisikan sebagai:
[ n! = 1 \times 2 \times 3 \times \dots \times n,\quad 0! = 1 ]
Di Python, faktorial tersedia di modul math:
import math
print(math.factorial(5)) # 120 (5! = 1*2*3*4*5)
print(math.factorial(0)) # 1 (0! didefinisikan = 1)
# Contoh: berapa banyak cara menyusun 4 orang dalam 4 kursi?
n = 4
print(math.factorial(n)) # 24 cara
Faktorial adalah fondasi utama untuk permutasi dan kombinasi.
Permutasi (Urutan Penting)¶
Dalam probabilitas, permutasi menghitung banyaknya cara menyusun (r) objek dari (n) objek dengan memperhatikan urutan:
[ P(n, r) = \frac{n!}{(n - r)!} ]
Di Python, kita bisa:
menggunakan
math.perm(n, r)(Python 3.8+),menggunakan rumus dengan
math.factorial, ataumenghasilkan semua susunan dengan
itertools.permutations.
Cara Praktis dengan math.perm¶
import math
print(math.perm(5, 2)) # 20
print(math.perm(4, 4)) # 24
Rumus dengan math.factorial¶
import math
def permutasi_rumus(n, r):
return math.factorial(n) // math.factorial(n - r)
print(permutasi_rumus(5, 2)) # 20
print(permutasi_rumus(4, 4)) # 24
itertools.permutations¶
from itertools import permutations
items = ["A", "B", "C"]
print("Permutasi 2 dari [A, B, C]:")
for p in permutations(items, 2):
print(p)
# Hitung banyaknya permutasi 2 dari 3
jumlah_perm = sum(1 for _ in permutations(items, 2))
print("Jumlah permutasi:", jumlah_perm) # 6
Ini sesuai dengan rumus:
[ P(3, 2) = \frac{3!}{(3-2)!} = \frac{3!}{1!} = 6 ]
Kombinasi (Urutan Tidak Penting)¶
Kombinasi menghitung banyaknya cara memilih (r) objek dari (n) objek tanpa memperhatikan urutan:
[ C(n, r) = \binom{n}{r} = \frac{n!}{r!(n - r)!} ]
Di Python, pendekatan yang paling ringkas untuk menghitung banyaknya kombinasi adalah math.comb(n, r).
Cara Praktis dengan math.comb¶
import math
print(math.comb(5, 2)) # 10
print(math.comb(6, 3)) # 20
Rumus dengan math.factorial¶
import math
def kombinasi_rumus(n, r):
return math.factorial(n) // (math.factorial(r) * math.factorial(n - r))
print(kombinasi_rumus(5, 2)) # 10
print(kombinasi_rumus(6, 3)) # 20
itertools.combinations¶
from itertools import combinations
items = ["A", "B", "C"]
print("Kombinasi 2 dari [A, B, C]:")
for c in combinations(items, 2):
print(c)
jumlah_comb = sum(1 for _ in combinations(items, 2))
print("Jumlah kombinasi:", jumlah_comb) # 3
Di sini hanya ada 3 kombinasi:
("A", "B")("A", "C")("B", "C")
Sedangkan susunan ("B", "A") tidak dihitung terpisah karena urutan tidak penting.
Kombinasi dengan Pengulangan¶
Kadang kita boleh mengambil elemen yang sama lebih dari sekali. Secara matematis, banyaknya kombinasi dengan pengulangan dari (n) jenis objek yang diambil (r) kali adalah:
[ \binom{n + r - 1}{r} ]
Di Python, kita bisa menggunakan itertools.combinations_with_replacement:
from itertools import combinations_with_replacement
rasa = ["vanila", "coklat", "stroberi"]
print("Pilih 2 sendok es krim (boleh rasa yang sama):")
for combo in combinations_with_replacement(rasa, 2):
print(combo)
Contoh di atas memodelkan situasi seperti “stars and bars” dalam kombinatorika (membagi r item identik ke n kategori).
Peringatan
Untuk n besar, hindari list(...) pada hasil itertools karena dapat menghabiskan memori. Gunakan iterator langsung atau hitung dengan rumus (math.perm, math.comb) jika hanya membutuhkan jumlahnya.
Cartesian Product dan Ruang Sampel¶
Dalam probabilitas, ruang sampel untuk dua percobaan independen dapat dibentuk dengan Cartesian product:
[ S = A \times B = {(a, b) \mid a \in A,; b \in B} ]
Di Python, ini dilakukan dengan itertools.product.
Contoh: Dua kali lempar koin¶
from itertools import product
koin = ["H", "T"] # H = Head, T = Tail
ruang_sampel = list(product(koin, repeat=2))
print("Ruang sampel dua kali lempar koin:")
for outcome in ruang_sampel:
print(outcome)
print("Jumlah outcome:", len(ruang_sampel)) # 4
Hasil:
("H", "H")("H", "T")("T", "H")("T", "T")
Sehingga peluang memperoleh tepat satu kali H adalah:
[ P(\text{satu H}) = \frac{2}{4} = \frac{1}{2} ]
Contoh: Dua dadu enam sisi¶
from itertools import product
dadu = [1, 2, 3, 4, 5, 6]
ruang_sampel = list(product(dadu, repeat=2))
print("Jumlah outcome:", len(ruang_sampel)) # 36
# Peluang jumlah mata dadu = 7
jumlah_7 = [pair for pair in ruang_sampel if sum(pair) == 7]
print("Outcome dengan jumlah 7:", jumlah_7)
print("Banyaknya:", len(jumlah_7))
print("Peluang:", len(jumlah_7) / len(ruang_sampel))
Secara teori, ada 6 pasangan yang jumlahnya 7:
(1, 6), (2, 5), (3, 4), (4, 3), (5, 2), (6, 1)
Jadi:
[ P(\text{jumlah} = 7) = \frac{6}{36} = \frac{1}{6} ]
Contoh Aplikasi Terpadu¶
Contoh 1: Memilih Panitia (Kombinasi)¶
Misalkan ada 10 mahasiswa dan akan dipilih 3 orang sebagai panitia (tanpa peran khusus). Berapa banyak kombinasi panitia yang mungkin?
import math
n = 10 # jumlah mahasiswa
r = 3 # jumlah yang dipilih
jumlah_cara = math.factorial(n) // (math.factorial(r) * math.factorial(n - r))
print("Banyak cara memilih panitia:", jumlah_cara) # 120
Jika setiap panitia dipilih secara acak dari 10 mahasiswa tanpa penggantian, maka:
[ P(\text{suatu kombinasi tertentu}) = \frac{1}{\binom{10}{3}} = \frac{1}{120} ]
Contoh 2: Permutasi Kursi (Urutan Penting)¶
Ada 5 mahasiswa dan 3 kursi di baris depan. Berapa banyak cara menyusun siapa duduk di mana?
import math
n = 5
r = 3
jumlah_cara = math.factorial(n) // math.factorial(n - r)
print("Banyak cara menyusun mahasiswa di kursi:", jumlah_cara) # 60
Di sini urutan kursi penting, sehingga kita memakai permutasi, bukan kombinasi.
Ringkasan¶
Gunakan
math.perm(n, r)danmath.comb(n, r)untuk menghitung jumlah permutasi/kombinasi secara langsung.Gunakan
math.factorialjika Anda sedang mempelajari turunan rumus secara manual.Gunakan
itertools.permutationsketika urutan penting (penyusunan).Gunakan
itertools.combinationsketika urutan tidak penting (pemilihan).Gunakan
itertools.combinations_with_replacementketika pemilihan boleh mengulang elemen yang sama.Gunakan
itertools.productuntuk membangun ruang sampel percobaan majemuk (Cartesian product), sehingga peluang bisa dihitung sebagai (\text{jumlah kasus menguntungkan} / \text{jumlah semua kasus}).