“Berapa pelanggan membeli kopi lagi bulan depan?” dan “berapa pelanggan yang membeli lagi BILA mereka tercatat sebagai member?” adalah dua pertanyaan dengan jawaban yang bisa sangat berbeda. Informasi tambahan mengubah peluang — inilah gagasan probabilitas bersyarat, jantung dari seluruh analisis segmentasi, penyaringan spam, hingga diagnosis medis. Pada chapter ini kita menghitung P(A|B) dari sebuah tabel kontingensi pelanggan Toko Kopi Kita, melihat bagaimana ruang sampel menyempit, lalu menggunakannya untuk menguji apakah dua kejadian saling merdeka.

Membaca Tabel Kontingensi #

Tabel kontingensi (cross tabulation) adalah tabel silang yang menghitung frekuensi gabungan dua variabel kategorikal. Kita memiliki data 100 pelanggan: status keanggotaan (member atau bukan) disilangkan dengan perilaku bulan berikutnya (beli lagi atau tidak):

python
import pandas as pd

tabel = pd.DataFrame(
    {
        "beli lagi": [32, 21],
        "tidak beli": [8, 39],
    },
    index=pd.Index(["member", "bukan member"], name="status"),
)

print(tabel)
print()
print("Total baris :", tabel.sum(axis=1).tolist())
print("Total kolom :", tabel.sum(axis=0).tolist())
print("N           :", tabel.values.sum())

Output yang Dihasilkan:

text
              beli lagi  tidak beli
status                             
member               32           8
bukan member         21          39

Total baris : [40, 60]
Total kolom : [53, 47]
N           : 100

Bedah baris-per-barisnya:

  1. Baris 3-8 (pd.DataFrame): 32 pelanggan member yang beli lagi, 8 member yang tidak; 21 bukan member yang beli lagi, 39 yang tidak. index=pd.Index(..., name="status") memberi nama pada baris agar tabel terbaca jelas.
  2. tabel.sum(axis=1): total per baris — 40 member dan 60 bukan member; inilah distribusi status.
  3. tabel.sum(axis=0): total per kolom — 53 pelanggan beli lagi dan 47 tidak; inilah distribusi perilaku.
  4. tabel.values.sum(): N = 100, seluruh sel dijumlah sebagai pemeriksaan konsistensi.

Empat sel di tengah tabel adalah irisan kejadian; total baris dan kolom (disebut marginal) adalah kejadian tunggal. Seluruh perhitungan bab ini hanya bermain di angka-angka tersebut.

Mempersempit Ruang Sampel #

Rumus probabilitas bersyarat untuk data frekuensi sederhana sekali:

text
P(A | B) = n(A dan B) / n(B)

Bilangan penyebut bukan lagi N = 100, melainkan hanya anggota kejadian B. Inilah makna “ruang sampel menyempit”: begitu kita tahu pelanggan adalah member, populasi yang relevan tinggal 40 orang, dan peluangnya dihitung di dalam kelompok itu saja. Kita hitung berbagai versi sekaligus:

python
member_beli = 32
member_total = 40
beli_total = 53
n = 100

p_beli_diketahui_member = member_beli / member_total
p_member_diketahui_beli = member_beli / beli_total
p_beli = beli_total / n
p_member = member_total / n

print(f"P(beli lagi | member)      = 32/40 = {p_beli_diketahui_member:.4f}")
print(f"P(member | beli lagi)      = 32/53 = {p_member_diketahui_beli:.4f}")
print(f"P(beli lagi)               = 53/100 = {p_beli:.4f}")
print(f"P(member dan beli lagi)    = 32/100 = {member_beli / n:.4f}")
print(f"Cek P(member) x P(beli|member) = {p_member:.2f} x {p_beli_diketahui_member:.2f} "
      f"= {p_member * p_beli_diketahui_member:.4f}")
print(f"Selisih P(beli|member) - P(beli)  = {p_beli_diketahui_member - p_beli:+.4f}")

Output yang Dihasilkan:

text
P(beli lagi | member)      = 32/40 = 0.8000
P(member | beli lagi)      = 32/53 = 0.6038
P(beli lagi)               = 53/100 = 0.5300
P(member dan beli lagi)    = 32/100 = 0.3200
Cek P(member) x P(beli|member) = 0.40 x 0.80 = 0.3200
Selisih P(beli|member) - P(beli)  = +0.2700

Mari kita telaah hasilnya:

  1. P(beli lagi | member) = 32/40 = 0,80: penyebutnya total member, bukan seluruh pelanggan. Mengetahui status member menaikkan peluang beli lagi dari 0,53 menjadi 0,80.
  2. P(member | beli lagi) = 32/53 ≈ 0,60: arah yang dibalik — dari para pembeli, berapa persen yang member. Angka ini berbeda dari 0,80 meski kedua soal memakai sel 32 yang sama.
  3. Cek perkalian bersyarat: P(member dan beli lagi) = 32/100 = 0,32, dan memang P(member) × P(beli|member) = 0,40 × 0,80 = 0,32. Hubungan P(A dan B) = P(B) × P(A|B) terbukti konsisten — bentuk inilah versi umum aturan perkalian pada chapter sebelumnya.

Awas Arah: P(A|B) Bukan P(B|A) #

Dua angka 0,80 dan 0,60 di atas memakai sel dan frekuensi yang sama, tetapi pertanyaannya berbeda arah. Menukar keduanya adalah salah satu kekeliruan paling umum dalam penalaran probabilistik. Contoh nyatanya: karena “sebagian besar pelanggan yang berhenti adalah bukan member” (dari 47 yang tidak beli lagi, 39 bukan member), tim promo bisa tergoda menyimpulkan “bukan member cenderung pergi”. Padahal P(bukan member | tidak beli lagi) = 39/47 ≈ 0,83 dan P(tidak beli lagi | bukan member) = 39/60 = 0,65 menjawab pertanyaan berbeda — yang kedua yang relevan untuk menilai risiko pergi di kelompok bukan member.

Merdeka atau Tidak: Informasi yang Mengubah Peluang #

Dua kejadian disebut merdeka (independen) bila informasi tentang B tidak mengubah peluang A, yakni P(A|B) = P(A). Dari hasil di atas: P(beli lagi | member) = 0,80 sedangkan P(beli lagi) = 0,53 — selisih +0,27. Informasi keanggotaan mengubah peluang secara besar, jadi status member dan perilaku beli lagi jelas tidak merdeka. Efeknya juga terlihat pada perkalian: karena tidak merdeka, P(member) × P(beli) = 0,40 × 0,53 = 0,212 ≠ 0,32 — perkalian versi merdeka tidak berlaku, yang berlaku adalah perkalian bersyarat.

Sebaliknya, bayangkan bila keanggotaan memang tidak berefek: sel tabel akan proporsional sehingga P(beli|member) = P(beli|bukan member) = P(beli). Uji kemerdekaan formal dengan chi-square akan kita temui lagi pada bab analisis lanjutan; untuk kebutuhan sehari-hari, membandingkan probabilitas bersyarat antar kelompok sudah cukup menjawab “apakah segmentasi ini berarti?”.

Rangkuman #

  • Tabel kontingensi menyilangkan dua variabel kategorikal; sel menyimpan irisan kejadian, total marginal menyimpan kejadian tunggal.
  • P(A|B) = n(A dan B) / n(B): ruang sampel menyempit menjadi hanya anggota B, sehingga penyebut berganti dari N menjadi n(B).
  • P(A|B) dan P(B|A) menjawab pertanyaan berbeda; keduanya memakai irisan yang sama tetapi penyebut yang berbeda.
  • Kejadian merdeka memenuhi P(A|B) = P(A); bila tidak merdeka, pakai P(A dan B) = P(B) × P(A|B).

Kita sekarang bisa menjawab pertanyaan “peluang berubah bagaimana bila ada informasi baru”. Langkah berikutnya lebih menarik lagi: membalik arah penalaran itu secara sistematis — dari “peluang hasil tes pada orang sakit” menuju “peluang orang sakit bila tesnya positif”. Pembalikan inilah isi Teorema Bayes .

Referensi #

  1. pandas — User Guide
  2. Python — statistics: Mathematical statistics functions