Distribusi Uniform dan Normal

Kurva lonceng, sifat normal, dan aturan 68-95-99,7.

Daftar isi

Topik ini membahas dua distribusi kontinu yang paling sering digunakan, yaitu uniform sebagai model peluang yang merata dan normal sebagai model kurva lonceng. Pembahasan mencakup cara menghasilkan keduanya di NumPy, parameter yang membentuk kurva normal, verifikasi aturan 68-95-99,7 lewat CDF, dan standardisasi menjadi skor z. Seluruh klaim teoretis diverifikasi dengan simulasi agar angkanya terukur.

Distribusi uniform: peluang yang merata#

Distribusi uniform kontinu memberikan kepadatan yang sama tingginya pada seluruh selang [a,b][a, b], sehingga peluang hanya bergantung pada panjang intervalnya. Contoh netralnya adalah pemilihan waktu inspeksi acak di loket kampus, yaitu satu titik waktu yang dipilih sama mungkin pada rentang satu jam. Peluang inspeksi jatuh pada lima belas menit pertama sama besarnya dengan lima belas menit ketiga karena panjang intervalnya sama. Rata-ratanya berada tepat di tengah selang, yaitu 30 menit.

Skrip berikut menghasilkan waktu inspeksi untuk seratus ribu pemilihan fiktif, lalu menghitung peluang pada empat subinterval yang panjangnya sama, yaitu 15 menit per interval. Bila model uniform benar, keempat peluang itu harus sama besar. Rata-rata simulasinya juga dibandingkan dengan nilai tengah selang.

python simulasi-uniform.py
"""Ciri distribusi uniform: peluang sebanding dengan panjang interval."""
import numpy as np

rng = np.random.default_rng(42)
waktu = rng.uniform(0.0, 60.0, size=100_000)

print(f"Rata-rata simulasi            : {np.mean(waktu):.4f}")
print(f"Rata-rata teoretis            : {30.0:.4f}")
print(f"P(0 <= X < 15)      simulasi  : {np.mean((waktu >= 0.0) & (waktu < 15.0)):.4f}")
print(f"P(15 <= X < 30)     simulasi  : {np.mean((waktu >= 15.0) & (waktu < 30.0)):.4f}")
print(f"P(30 <= X < 45)     simulasi  : {np.mean((waktu >= 30.0) & (waktu < 45.0)):.4f}")
print(f"P(45 <= X <= 60)    simulasi  : {np.mean((waktu >= 45.0) & (waktu <= 60.0)):.4f}")
text Keluaran
Rata-rata simulasi            : 30.0375
Rata-rata teoretis            : 30.0000
P(0 <= X < 15)      simulasi  : 0.2495
P(15 <= X < 30)     simulasi  : 0.2480
P(30 <= X < 45)     simulasi  : 0.2529
P(45 <= X <= 60)    simulasi  : 0.2497

Keempat peluang hasil simulasi berkumpul di sekitar 0.25, dan rata-rata waktu simulasinya berhimpitan dengan nilai tengah 30.0. Kesamaan itu persis ciri uniform, yaitu peluang sebanding dengan panjang interval sehingga kepadatannya konstan. Karena total luas harus 1 pada selang yang panjangnya 60 menit, tinggi kepadatannya adalah

f(x)=160,0≤x≤60. f(x) = \frac{1}{60}, \quad 0 \le x \le 60.

Dengan kepadatan itu, peluang inspeksi jatuh pada lima belas menit mana pun dihitung sebagai luas persegi panjang lebar 15 dan tinggi 1/601/60, yaitu 0.25. Dua interval yang panjangnya sama pun selalu berpeluang sama besar. Sifat sederhana ini menjadikan uniform titik tolak yang cocok untuk memahami PDF sebelum bergerak ke kurva yang lebih berbentuk.

Distribusi normal: kurva lonceng dengan dua parameter#

Distribusi normal adalah model kurva lonceng yang simetris terhadap rata-ratanya, digunakan luas untuk data pengukuran seperti tinggi badan atau hasil pembacaan sensor. Dua parameternya menentukan seluruh bentuk kurva, yaitu μ\mu sebagai posisi puncak sekaligus rata-rata dan σ\sigma sebagai lebar sekaligus simpangan baku (standard deviation). Semakin besar σ\sigma, semakin lebar dan rendah loncengnya. Karena simetris, separuh luas berada di kiri μ\mu dan separuhnya di kanan.

Skrip berikut menghasilkan tinggi badan seratus ribu orang dewasa fiktif dari model normal dengan μ=170\mu = 170 cm dan σ=8\sigma = 8 cm. Histogram kepadatannya digambar berdampingan dengan kurva normal teoretis dari scipy.stats.norm. Lonceng hasil simulasi diharapkan menutupi kurva teoretisnya.

python simulasi-normal.py
"""Histogram tinggi badan sampel dibandingkan dengan kurva normal teoretis."""
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

rng = np.random.default_rng(42)
tinggi = rng.normal(170.0, 8.0, size=100_000)

xs = np.linspace(140.0, 200.0, 400)
fig, ax = plt.subplots(figsize=(7, 4), constrained_layout=True)
ax.hist(tinggi, bins=60, density=True, alpha=0.6, label="Histogram simulasi")
ax.plot(xs, stats.norm.pdf(xs, 170.0, 8.0), "r-", linewidth=2,
        label="PDF normal teoretis")
ax.set_xlabel("Tinggi badan (cm)")
ax.set_ylabel("Kepadatan")
ax.set_title("Normal mu=170, sigma=8: simulasi vs teori")
ax.legend()
fig.savefig("histogram-pdf-normal.png", dpi=110)

Histogram tinggi badan menutupi kurva normal teoretis
Histogram tinggi badan menutupi kurva normal teoretis

Lonceng hasil simulasi menutupi kurva teoretis, dengan puncak di 170 dan sebaran yang lebar kira-kira 8 cm ke tiap sisi. Sebagian besar data terlihat berkumpul antara 150 dan 190, yaitu sekitar dua sampai tiga simpangan baku dari pusatnya. Kurva teoretis itu adalah PDF normal, yang dituliskan dengan rumus

f(x)=1σ2πexp⁡ ⁣(−(x−μ)22σ2). f(x) = \frac{1}{\sigma\sqrt{2\pi}} \exp\!\left( -\frac{(x-\mu)^2}{2\sigma^2} \right).

Rumus di atas menjelaskan sifat-sifat yang tampak pada gambar. Nilai f(x)f(x) maksimum saat x=μx = \mu, lalu mengecil secara simetris seiring menjauhnya xx dari μ\mu. Nilai f(x)f(x) bukan peluang, melainkan kepadatan, sehingga peluang tetap dibaca sebagai luas di bawah kurva.

Aturan 68-95-99,7#

Aturan 68-95-99,7 menyatakan bahwa sekitar 68% data normal berada antara −1-1 dan 11 simpangan baku dari rata-rata, sekitar 95% antara −2-2 dan 22, dan sekitar 99.7% antara −3-3 dan 33. Aturan ini sering dikutip tanpa bukti, padahal dapat diverifikasi langsung dengan CDF. Skrip berikut menghitung luas ketiga selang itu pada normal standar, lalu menggambarkan dua selang pertamanya.

python aturan-68-95-997.py
"""Verifikasi aturan 68-95-99,7 dengan CDF normal dan gambarnya."""
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

mu, sigma = 0.0, 1.0
standar = stats.norm(mu, sigma)
for z in (1, 2, 3):
    luas = standar.cdf(z) - standar.cdf(-z)
    print(f"P(-{z} <= Z <= {z}) = {luas:.4f}")

xs = np.linspace(-4.0, 4.0, 400)
ys = standar.pdf(xs)
fig, ax = plt.subplots(figsize=(7, 4), constrained_layout=True)
ax.plot(xs, ys, "k-", linewidth=2)
ax.fill_between(xs, ys, where=(xs >= -1) & (xs <= 1), alpha=0.5,
                label="68% (antara -1 dan 1)")
ax.fill_between(xs, ys, where=(xs >= -2) & (xs <= 2), alpha=0.25,
                label="95% (antara -2 dan 2)")
ax.set_xlabel("Skor z")
ax.set_ylabel("Kepadatan")
ax.set_title("Kurva normal standar dengan area 68% dan 95%")
ax.legend()
fig.savefig("kurva-normal-68-95.png", dpi=110)
text Keluaran
P(-1 <= Z <= 1) = 0.6827
P(-2 <= Z <= 2) = 0.9545
P(-3 <= Z <= 3) = 0.9973

Kurva normal standar dengan area 68% dan 95% yang diarsir
Kurva normal standar dengan area 68% dan 95% yang diarsir

Keluaran menunjukkan 0.6827, 0.9545, dan 0.9973, berdekatan dengan angka 68%, 95%, dan 99.7% pada aturannya. Selisih kecil muncul karena aturan itu sendiri merupakan pembulatan. Gambar pendampingnya memperlihatkan area 68% yang lebih gelap terkurung oleh area 95% yang lebih lebar, keduanya terukur dari CDF dan bukan sekadar diklaim.

Standardisasi menjadi skor z#

Standardisasi mengubah nilai dari distribusi normal apa pun menjadi skor z, yaitu jarak ke rata-rata yang diukur dalam satuan simpangan baku dengan rumus z=(x−μ)/σz = (x - \mu)/\sigma. Skor z menyatukan skala yang berbeda menjadi satu acuan, yaitu normal standar dengan μ=0\mu = 0 dan σ=1\sigma = 1. Dengan acuan itu, CDF normal standar sudah cukup untuk membaca peluang semua distribusi normal.

Skrip berikut menghitung skor z untuk tiga tinggi badan dari model μ=170\mu = 170 dan σ=8\sigma = 8, lalu membaca peluang kumulatifnya dengan CDF. Nilai 154 cm dipilih karena berjarak tepat dua simpangan baku di bawah rata-rata, sedangkan 186 cm berjarak dua di atasnya. Nilai 170 cm menjadi titik tengahnya.

python standardisasi-z.py
"""Standardisasi tinggi badan menjadi skor z dan peluangnya."""
from scipy import stats

mu, sigma = 170.0, 8.0
normal = stats.norm(mu, sigma)
for x in (154.0, 170.0, 186.0):
    z = (x - mu) / sigma
    print(f"x = {x:.1f} cm  ->  z = {z:.4f}  ->  P(Z < z) = {normal.cdf(x):.4f}")
text Keluaran
x = 154.0 cm  ->  z = -2.0000  ->  P(Z < z) = 0.0228
x = 170.0 cm  ->  z = 0.0000  ->  P(Z < z) = 0.5000
x = 186.0 cm  ->  z = 2.0000  ->  P(Z < z) = 0.9772

Skor z mengubah pertanyaan tentang tinggi badan menjadi pertanyaan tentang normal standar, dan jawabannya konsisten dengan aturan sebelumnya, yaitu 0.0228 dan 0.9772 pada batas dua simpangan baku. Selisih 1−0.9772=0.02281 - 0.9772 = 0.0228 juga menegaskan simetri kurva. Dengan kebiasaan yang sama, dua data berskala berbeda dapat diperbandingkan lewat skor z masing-masing.

Kesalahan umum#

  • Menggunakan aturan 68-95-99,7 pada data yang tidak berbentuk lonceng. Data menceng seperti waktu antarkedatangan memiliki ekor panjang, sehingga persentase aturannya tidak berlaku. Perbaikannya, periksa histogram terlebih dahulu sebelum menyimpulkan apa pun dari aturan ini.
  • Membaca luas dua sisi sebagai peluang satu sisi. Nilai 0.6827 mencakup dua sisi kurva, sedangkan peluang di atas satu simpangan baku hanya sekitar 0.16. Perbaikannya, bagi luas dua sisi dengan dua bila yang ditanyakan hanya satu sisi, atau langsung gunakan CDF.
  • Lupa menyesuaikan parameter saat menstandardisasi. Skor z menggunakan rata-rata dan simpangan baku dari sumber data yang sama, sehingga parameter dari model lain menghasilkan skor yang keliru. Perbaikannya, hitung μ\mu dan σ\sigma dari data yang sedang dianalisis.

Ringkasan#

  • Uniform memberi kepadatan konstan pada sebuah selang, sehingga peluang sebanding dengan panjang intervalnya.
  • Normal dikendalikan dua parameter, yaitu μ\mu sebagai posisi puncak dan σ\sigma sebagai lebar, dengan kurva yang simetris.
  • Aturan 68-95-99,7 terverifikasi lewat CDF sebagai 0.6827, 0.9545, dan 0.9973.
  • Skor z =(x−μ)/σ= (x - \mu)/\sigma mengubah distribusi normal apa pun menjadi normal standar.

Referensi#