Memahami Konsep Probabilitas dan Implementasinya dengan Python untuk Analisis Statistik
Dasar Probabilitas dan Ruang Sampel dalam Analisis Data
Probabilitas adalah ukuran kuantitatif seberapa mungkin suatu kejadian terjadi, dinyatakan dalam rentang 0 hingga 1. Dalam konteks analisis data, probabilitas menjadi fondasi untuk menarik kesimpulan dari sampel ke populasi. Konsep paling mendasar adalah ruang sampel — seluruh kemungkinan hasil dari suatu eksperimen — dan kejadian (event), yaitu subset dari ruang sampel yang menjadi perhatian kita.
Kita dapat menghitung probabilitas empiris dengan menghitung frekuensi relatif suatu kejadian dari data yang diamati. Semakin banyak data yang kita miliki, semakin akurat estimasi probabilitas ini. Mari kita lihat implementasinya dengan Python.
!pip install numpy matplotlibimport numpy as np
import matplotlib.pyplot as plt
# Simulasi pelemparan dadu 1000 kali
np.random.seed(42)
dadu = np.random.randint(1, 7, size=1000)
# Hitung frekuensi relatif setiap sisi
nilai, frekuensi = np.unique(dadu, return_counts=True)
prob_empiris = frekuensi / len(dadu)
print("Probabilitas Empiris Setiap Sisi Dadu:")
for n, p in zip(nilai, prob_empiris):
print(f"Sisi {n}: {p:.3f} (teoretis: {1/6:.3f})")
# Visualisasi
plt.bar(nilai, prob_empiris, color='skyblue', edgecolor='navy')
plt.axhline(y=1/6, color='red', linestyle='--', label='Probabilitas Teoretis (1/6)')
plt.xlabel('Sisi Dadu')
plt.ylabel('Probabilitas Empiris')
plt.title('Distribusi Probabilitas Empiris Pelemparan Dadu')
plt.legend()
plt.show()Output:
Probabilitas Empiris Setiap Sisi Dadu:
Sisi 1: 0.181 (teoretis: 0.167)
Sisi 2: 0.164 (teoretis: 0.167)
Sisi 3: 0.154 (teoretis: 0.167)
Sisi 4: 0.174 (teoretis: 0.167)
Sisi 5: 0.172 (teoretis: 0.167)
Sisi 6: 0.155 (teoretis: 0.167)
Kode di atas mensimulasikan 1000 kali pelemparan dadu dan menghitung probabilitas empiris setiap sisi. Garis merah menunjukkan probabilitas teoretis 1/6 — semakin dekat batang biru ke garis ini, semakin akurat estimasi kita. Inilah esensi dari frekuensi relatif: probabilitas sebagai limit dari frekuensi jangka panjang.
Hukum Probabilitas — Aturan Penjumlahan dan Perkalian
Dua aturan fundamental yang mengatur perhitungan probabilitas adalah aturan penjumlahan dan aturan perkalian. Aturan penjumlahan digunakan untuk menghitung probabilitas gabungan dua kejadian: P(A∪B) = P(A) + P(B) − P(A∩B). Jika kedua kejadian saling lepas (mutually exclusive), P(A∩B) = 0, sehingga rumusnya menyederhanakan menjadi P(A) + P(B).
Aturan perkalian berkaitan dengan probabilitas irisan: P(A∩B) = P(A) × P(B|A). Untuk kejadian independen, P(B|A) = P(B), sehingga P(A∩B) = P(A) × P(B). Konsep probabilitas bersyarat (conditional probability) ini menjadi dasar bagi banyak teknik statistik inferensial.

Gambar: Diagram Venn yang mengilustrasikan probabilitas bersyarat P(A∣B) = P(A∩B)/P(B) — Sumber: [Wikimedia Commons (Chabacano, CC BY-SA 4.0)](https://commons.wikimedia.org/wiki/File:Probabilidad_condicionada.svg)
!pip install numpy pandasimport pandas as pd
import numpy as np
# Simulasi dataset pelanggan
np.random.seed(42)
n = 1000
data = {
'pembelian': np.random.choice(['ya', 'tidak'], n, p=[0.3, 0.7]),
'newsletter': np.random.choice(['terdaftar', 'tidak'], n, p=[0.4, 0.6])
}
df = pd.DataFrame(data)
# Matriks kontingensi
kontingensi = pd.crosstab(df['pembelian'], df['newsletter'], margins=True)
print("Matriks Kontingensi:")
print(kontingensi)
# Probabilitas bersyarat P(pembelian=ya | newsletter=terdaftar)
p_pembelian_newsletter = kontingensi.loc['ya', 'terdaftar'] / kontingensi.loc['All', 'terdaftar']
print(f"\nP(pembelian=ya | newsletter=terdaftar) = {p_pembelian_newsletter:.3f}")
# Probabilitas bersyarat P(pembelian=ya | newsletter=tidak)
p_pembelian_no_news = kontingensi.loc['ya', 'tidak'] / kontingensi.loc['All', 'tidak']
print(f"P(pembelian=ya | newsletter=tidak) = {p_pembelian_no_news:.3f}")Output:
Matriks Kontingensi:
newsletter terdaftar tidak All
pembelian
tidak 262 419 681
ya 123 196 319
All 385 615 1000
P(pembelian=ya | newsletter=terdaftar) = 0.319
P(pembelian=ya | newsletter=tidak) = 0.319Dari output kode di atas, kita bisa melihat bagaimana probabilitas bersyarat membantu mengukur hubungan antar variabel. Jika P(pembelian=ya | newsletter=terdaftar) lebih tinggi dari P(pembelian=ya) secara keseluruhan, maka newsletter memiliki pengaruh positif terhadap pembelian — informasi yang sangat berharga dalam analisis bisnis.
Distribusi Probabilitas Diskrit — Binomial dan Poisson
Distribusi Binomial memodelkan jumlah keberhasilan dalam n percobaan Bernoulli yang independen, di mana setiap percobaan memiliki probabilitas sukses p yang sama. Contoh klasik: berapa probabilitas mendapatkan tepat 7 gambar dari 10 lemparan koin? Ciri-ciri distribusi Binomial adalah percobaan bersifat biner (sukses/gagal), jumlah percobaan tetap, dan setiap percobaan independen.
Distribusi Poisson memodelkan jumlah kejadian dalam interval waktu atau ruang tetap, seperti jumlah pelanggan yang datang dalam satu jam atau jumlah cacat per meter kain. Parameter utamanya adalah λ (lambda) — rata-rata kejadian per interval. Poisson sangat berguna untuk kejadian langka dengan frekuensi rendah.
Data Science with Python
Master the art of data analysis, visualization, and predictive modeling.
!pip install numpy matplotlib scipyimport numpy as np
import matplotlib.pyplot as plt
from scipy import stats
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
# Distribusi Binomial: n=20, p=0.3
n, p = 20, 0.3
x_binom = np.arange(0, n+1)
pmf_binom = stats.binom.pmf(x_binom, n, p)
ax1.bar(x_binom, pmf_binom, color='coral', edgecolor='darkred')
ax1.set_title(f'Distribusi Binomial (n={n}, p={p})')
ax1.set_xlabel('Jumlah Keberhasilan')
ax1.set_ylabel('Probabilitas')
# Distribusi Poisson: lambda=4
lam = 4
x_poisson = np.arange(0, 15)
pmf_poisson = stats.poisson.pmf(x_poisson, lam)
ax2.bar(x_poisson, pmf_poisson, color='lightgreen', edgecolor='darkgreen')
ax2.set_title(f'Distribusi Poisson (λ={lam})')
ax2.set_xlabel('Jumlah Kejadian')
ax2.set_ylabel('Probabilitas')
plt.tight_layout()
plt.show()Output:

Output dari kode ini menunjukkan dua plot berdampingan. Plot kiri adalah distribusi Binomial yang menceng ke kanan karena probabilitas sukses 0.3 — puncaknya berada di sekitar 6 keberhasilan. Plot kanan adalah distribusi Poisson dengan λ=4 yang mendekati simetris. Kedua distribusi ini sering muncul dalam analisis data nyata: Binomial untuk data proporsi dan Poisson untuk data hitungan (count data).
Distribusi Probabilitas Kontinu — Normal dan Eksponensial
Distribusi Normal, juga dikenal sebagai distribusi Gauss, adalah distribusi kontinu yang paling penting dalam statistik. Bentuknya simetris menyerupai lonceng, dengan parameter mean (μ) sebagai pusat dan standar deviasi (σ) sebagai ukuran penyebaran. Peran sentral distribusi Normal berasal dari Central Limit Theorem, yang menyatakan bahwa rata-rata sampel mendekati distribusi Normal terlepas dari distribusi populasi aslinya.

Gambar: Kurva distribusi Normal standar dengan area probabilitas pada 1, 2, dan 3 standar deviasi — Sumber: [Wikimedia Commons (D Wells, CC BY-SA 4.0)](https://commons.wikimedia.org/wiki/File:Standard_Normal_Distribution.png)
Distribusi Eksponensial memodelkan waktu antar kejadian — misalnya, waktu antara kedatangan pelanggan atau waktu hingga komponen elektronik rusak. Distribusi ini memiliki hubungan erat dengan Poisson: jika jumlah kejadian per interval berdistribusi Poisson, maka waktu antar kejadian berdistribusi Eksponensial.
!pip install numpy matplotlib scipyimport numpy as np
import matplotlib.pyplot as plt
from scipy import stats
# Distribusi Normal
mu, sigma = 0, 1
x = np.linspace(-4, 4, 1000)
pdf_normal = stats.norm.pdf(x, mu, sigma)
# Hitung probabilitas di atas Z=1.5
z_threshold = 1.5
prob_above = 1 - stats.norm.cdf(z_threshold)
x_fill = np.linspace(z_threshold, 4, 200)
plt.figure(figsize=(10, 6))
plt.plot(x, pdf_normal, 'b-', linewidth=2, label='Distribusi Normal Standar')
plt.fill_between(x_fill, stats.norm.pdf(x_fill), color='red', alpha=0.3,
label=f'P(Z > {z_threshold}) = {prob_above:.3f}')
plt.axvline(x=z_threshold, color='red', linestyle='--', alpha=0.7)
plt.xlabel('Z-score')
plt.ylabel('Density')
plt.title('Distribusi Normal Standar dengan Area Probabilitas')
plt.legend()
plt.show()
print(f"Probabilitas Z > {z_threshold}: {prob_above:.4f}")
print(f"Artinya: hanya {prob_above*100:.2f}% data yang berada di atas Z={z_threshold}")Output:
Probabilitas Z > 1.5: 0.0668
Artinya: hanya 6.68% data yang berada di atas Z=1.5
Dalam plot yang dihasilkan, daerah merah adalah area yang mewakili probabilitas P(Z > 1.5). Konsep Z-score memungkinkan kita membandingkan nilai dari distribusi yang berbeda dengan menstandarisasinya ke skala yang sama. Ini sangat berguna dalam deteksi outlier dan penentuan threshold.
Hukum Bilangan Besar dan Teorema Limit Pusat
Hukum Bilangan Besar (Law of Large Numbers) menyatakan bahwa semakin banyak sampel yang kita ambil, rata-rata sampel akan semakin mendekati ekspektasi teoretisnya. Inilah mengapa kita percaya bahwa hasil survei dengan 1000 responden lebih akurat daripada survei dengan 100 responden.
Central Limit Theorem (CLT) adalah salah satu teorema paling fundamental dalam statistik. CLT menyatakan bahwa distribusi rata-rata sampel akan mendekati distribusi Normal seiring bertambahnya ukuran sampel, terlepas dari bentuk distribusi populasi aslinya. Inilah yang memungkinkan kita melakukan inferensi statistik tanpa mengetahui distribusi populasi.
!pip install numpy matplotlibimport numpy as np
import matplotlib.pyplot as plt
# Populasi: distribusi uniform (bukan Normal!)
populasi = np.random.uniform(0, 10, 100000)
# Ambil ribuan sampel dan hitung rata-ratanya
n_sample = 30
n_iterasi = 5000
rata_rata_sampel = []
for _ in range(n_iterasi):
sampel = np.random.choice(populasi, n_sample)
rata_rata_sampel.append(np.mean(sampel))
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
ax1.hist(populasi, bins=50, color='gray', edgecolor='black', alpha=0.7)
ax1.set_title('Distribusi Populasi (Uniform)')
ax1.set_xlabel('Nilai')
ax1.set_ylabel('Frekuensi')
ax2.hist(rata_rata_sampel, bins=40, color='steelblue', edgecolor='navy', alpha=0.7)
ax2.set_title(f'Distribusi Rata-rata Sampel (n={n_sample}, {n_iterasi} iterasi)')
ax2.set_xlabel('Rata-rata Sampel')
ax2.set_ylabel('Frekuensi')
plt.tight_layout()
plt.show()
print(f"Mean populasi: {np.mean(populasi):.3f} (teoretis: 5.0)")
print(f"Mean rata-rata sampel: {np.mean(rata_rata_sampel):.3f}")Output:
Mean populasi: 4.995 (teoretis: 5.0)
Mean rata-rata sampel: 5.004
Hasil simulasi menunjukkan kontras yang luar biasa: plot kiri adalah distribusi uniform (seragam) yang datar, sementara plot kanan adalah distribusi rata-rata sampel yang berbentuk lonceng (Normal). Inilah bukti nyata CLT — bahkan dari populasi yang tidak Normal sekalipun, rata-rata sampel akan berdistribusi Normal. Fenomena ini menjadi fondasi bagi hampir semua metode statistik inferensial modern.
Aplikasi Probabilitas dalam Pengujian Hipotesis Sederhana
Pengujian hipotesis adalah aplikasi langsung probabilitas dalam pengambilan keputusan statistik. Konsep kuncinya adalah p-value — probabilitas mengamati data setidaknya seekstrem data yang ada, dengan asumsi hipotesis nol benar. Jika p-value lebih kecil dari tingkat signifikansi (α), kita menolak hipotesis nol.
Namun interpretasi p-value sering disalahpahami. P-value bukan probabilitas bahwa hipotesis nol benar, melainkan ukuran seberapa tidak biasa data kita jika hipotesis nol benar. Mari kita lihat implementasinya.
!pip install numpy scipy matplotlibimport numpy as np
import matplotlib.pyplot as plt
from scipy import stats
# Data sampel: nilai ujian 30 siswa
np.random.seed(42)
sampel = np.random.normal(72, 15, 30) # mean=72, std=15, n=30
# Uji apakah mean sampel berbeda signifikan dari 65
t_stat, p_value = stats.ttest_1samp(sampel, 65)
mean_sampel = np.mean(sampel)
# Visualisasi distribusi t dan daerah kritis
x = np.linspace(-4, 4, 1000)
t_dist = stats.t.pdf(x, df=29)
t_critical = stats.t.ppf(0.975, df=29)
plt.figure(figsize=(10, 6))
plt.plot(x, t_dist, 'b-', label='Distribusi t (df=29)')
# Daerah penolakan (two-tailed)
x_left = np.linspace(-4, -t_critical, 200)
x_right = np.linspace(t_critical, 4, 200)
plt.fill_between(x_left, stats.t.pdf(x_left, df=29), color='red', alpha=0.3)
plt.fill_between(x_right, stats.t.pdf(x_right, df=29), color='red', alpha=0.3)
plt.axvline(x=t_stat, color='green', linestyle='--', linewidth=2,
label=f't-statistik = {t_stat:.3f}')
plt.xlabel('t-value')
plt.ylabel('Density')
plt.title(f'Uji t Satu Sampel\nMean={mean_sampel:.2f}, p-value={p_value:.4f}')
plt.legend()
plt.show()
print(f"Rata-rata sampel: {mean_sampel:.2f}")
print(f"t-statistik: {t_stat:.3f}")
print(f"p-value: {p_value:.4f}")
print(f"Nilai kritis (α=0.05): ±{t_critical:.3f}")
if p_value < 0.05:
print("Kesimpulan: Tolak H0 — mean sampel berbeda signifikan dari 65")
else:
print("Kesimpulan: Gagal tolak H0 — tidak cukup bukti adanya perbedaan")Output:
Rata-rata sampel: 69.18
t-statistik: 1.695
p-value: 0.1008
Nilai kritis (α=0.05): ±2.045
Kesimpulan: Gagal tolak H0 — tidak cukup bukti adanya perbedaan
Dalam plot yang dihasilkan, daerah merah adalah daerah penolakan (rejection region). Jika garis hijau (t-statistik) jatuh di dalam daerah merah, kita menolak hipotesis nol. Penting untuk diingat bahwa signifikansi statistik tidak selalu berarti signifikansi praktis — efek yang sangat kecil bisa menjadi signifikan hanya karena ukuran sampel yang besar.
Probabilitas bukan sekadar teori abstrak — ia adalah mesin penggerak di balik setiap keputusan berbasis data yang kita buat. Dari uji A/B testing hingga model prediktif, pemahaman yang kuat tentang probabilitas dan distribusi akan membuat analisis statistik kita lebih akurat dan dapat dipertanggungjawabkan. Jika Anda ingin memperdalam kemampuan statistik inferensial dan teknik analisis data lainnya, Rumah Coding menyediakan bootcamp Data Science terstruktur yang mencakup seluruh fondasi ini secara praktis.
Kursus Terkait
Data Science with Python
Master the art of data analysis, visualization, and predictive modeling.
E-commerce Sales Dashboard
- Data Cleaning Pipeline
- Interactive Charts
- Sales Forecasting Model
Deep Learning Bootcamp
A beginner-friendly, highly interactive bootcamp designed to take you from foundational concepts to deploying real-world Artificial Intelligence applications. Through a completely project-based approach, you will master the core of Deep Learning, Artificial Neural Networks, and Computer Vision using Python and TensorFlow, ultimately building a professional-grade AI web application for your portfolio.
GreenGuard: Intelligent Plant Disease Diagnosis Web App
- Interactive Image Upload UI: A clean, user-friendly interface built with Streamlit that supports drag-and-drop image uploads directly from a computer or mobile phone.
- Real-Time AI Inference: Utilizes a lightweight, optimized CNN model (like MobileNetV2) to process the image and return a diagnosis in seconds without heavy server load.
- Confidence Scoring Dashboard: Visually displays the model's prediction probability (e.g., "95% confident this is Tomato Late Blight") using interactive progress bars or charts.
LLM Bootcamp
This project-based bootcamp is designed for beginners to dive practically into the world of Large Language Models (LLMs). Through hands-on building, you will learn how to interact with top-tier AI APIs, master prompt engineering, orchestrate complex workflows using LangChain, and implement Retrieval-Augmented Generation (RAG) to query your own documents. By the end of this course, you will have the skills to build, test, and deploy a fully functional, custom AI web application.
Domain-Specific AI Knowledge Assistant
- Dynamic Document Processing: A sidebar interface allowing users to upload new PDF or TXT files, which the app automatically chunks, embeds, and stores in the vector database.
- Context-Aware Chat UI: A modern chat interface built with Streamlit that maintains conversation history, allowing users to ask follow-up questions naturally.
- Strict Guardrails (Anti-Hallucination): System instructions designed so the AI politely declines to answer questions that fall outside the context of the uploaded documents.
Artikel Terkait
Memahami Konsep Sampling Techniques dan Implementasinya dengan Python untuk Analisis Statistik yang Akurat
Memahami Konsep Feature Selection dengan Chi-Square, Mutual Information, dan RFE: Implementasi dengan Scikit-learn