Memahami Konsep Probabilitas dan Implementasinya dengan Python untuk Analisis Statistik

Lhuqita Fazry
Data Science Probabilitas Python Statistik Distribusi
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.

pythonpython
!pip install numpy matplotlib
pythonpython
import 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:

text
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)
Distribusi Probabilitas Empiris Pelemparan Dadu

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.

Diagram Venn Probabilitas Bersyarat

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)

pythonpython
!pip install numpy pandas
pythonpython
import 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:

text
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.319

Dari 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
Data Science • Beginner

Data Science with Python

Master the art of data analysis, visualization, and predictive modeling.

Daftar
pythonpython
!pip install numpy matplotlib scipy
pythonpython
import 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:

Distribusi Binomial dan Poisson

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.

Distribusi Normal Standar

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.

pythonpython
!pip install numpy matplotlib scipy
pythonpython
import 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:

text
Probabilitas Z > 1.5: 0.0668
Artinya: hanya 6.68% data yang berada di atas Z=1.5
Distribusi Normal Standar dengan Area Probabilitas

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.

pythonpython
!pip install numpy matplotlib
pythonpython
import 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:

text
Mean populasi: 4.995 (teoretis: 5.0)
Mean rata-rata sampel: 5.004
Simulasi Central Limit Theorem

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.

pythonpython
!pip install numpy scipy matplotlib
pythonpython
import 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:

text
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
Uji t Satu Sampel

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

E-commerce Sales Dashboard
Kursus Premium Data Science

Data Science with Python

Master the art of data analysis, visualization, and predictive modeling.

Proyek Akhir

E-commerce Sales Dashboard

  • Data Cleaning Pipeline
  • Interactive Charts
  • Sales Forecasting Model
7 Weeks Beginner
Lihat Detail Kursus
GreenGuard: Intelligent Plant Disease Diagnosis Web App
Kursus Premium Machine Learning

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.

Proyek Akhir

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.
7 Weeks Intermediate
Lihat Detail Kursus
Domain-Specific AI Knowledge Assistant
Kursus Premium Machine Learning

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.

Proyek Akhir

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.
7 Weeks Beginner
Lihat Detail Kursus

Artikel Terkait