Di antara semua bentuk distribusi, satu bentuk paling terkenal: kurva lonceng. Tinggi badan, hasil ujian, galat pengukuran sensor — semuanya kerap menghampiri bentuk ini. Pada chapter ini kita pelajari distribusi normal secara utuh: dua parameter yang membentuknya, aturan empiris 68-95-99.7 untuk membaca sebarannya, dan standardisasi z-score untuk membandingkan nilai dari dunia yang berbeda-beda. Pemahaman ini menjadi pintu bagi seluruh inferensi statistika pada chapter-chapter berikutnya.
Kurva Lonceng dan Dua Parameternya #
Distribusi normal adalah distribusi peluang kontinu yang simetris, dengan nilai terpadat di tengah dan kedua ekor yang menipis mulus ke kiri dan ke kanan. Seluruh bentuknya ditentukan hanya oleh dua parameter: rata-rata populasi μ yang menentukan pusat kurva, dan simpangan baku populasi σ yang menentukan lebarnya. Kurva milik nilai ujian dengan μ = 70 dan σ = 8 akan berbentuk lebih kurus daripada kurva μ = 70 dan σ = 15, tetapi keduanya tetap berbentuk lonceng yang sama.
Bentuk matematisnya dikenal sebagai fungsi kerapatan peluang:
f(x) = (1 / (σ √(2π))) × e^(-(x - μ)² / (2σ²))Kita tidak perlu menghitung rumus ini dengan tangan — tugas itu milik scipy.stats.norm. Yang perlu kita pahami adalah dua sifat pentingnya. Pertama, luas total di bawah kurva selalu 1, karena kurva ini mendistribusikan seluruh peluang. Kedua, peluang sebuah nilai berada di antara dua titik sama dengan luas di bawah kurva di antara kedua titik tersebut; inilah yang kita hitung dengan fungsi cdf (cumulative distribution function).
Aturan Empiris 68-95-99.7 #
Karena bentuknya selalu sama relatif terhadap μ dan σ, kita bisa menyimpulkan proporsi data tanpa menghitung ulang. Aturan empirisnya berbunyi: sekitar 68% data berada dalam 1σ dari μ, sekitar 95% dalam 2σ, dan hampir semua (99,7%) dalam 3σ. Kita buktikan ketiganya dengan norm.cdf pada kasus nilai ujian dengan μ = 70 dan σ = 8:
from scipy.stats import norm
mu = 70 # rata-rata nilai ujian
sigma = 8 # simpangan baku
for k in (1, 2, 3):
dalam = norm.cdf(mu + k * sigma, mu, sigma) - norm.cdf(mu - k * sigma, mu, sigma)
print(f"±{k}σ : {dalam:.4f}")Output yang Dihasilkan:
±1σ : 0.6827
±2σ : 0.9545
±3σ : 0.9973Mari kita telaah kode di atas:
- Baris 5 (
for k in (1, 2, 3)): kita menguji tiga lebar jendela — 1, 2, dan 3 simpangan baku ke tiap arah dari μ. - Baris 6 (
norm.cdf(mu + k * sigma, ...)):norm.cdf(x, mu, sigma)mengembalikan peluang nilai normal berada di bawahx. Selisihcdfdi batas atas dan batas bawah jendela menghasilkan peluang berada di dalam jendela. - Baris 7 (
print): hasilnya dicetak dengan empat angka desimal agar perbandingannya mudah dibaca.
Terjemahan ketiga angka tersebut ke dunia nilai ujian (rentang μ ± kσ):
| Jendela | Rentang nilai | Proporsi siswa |
|---|---|---|
| μ ± 1σ | 62 sampai 78 | 68,27% |
| μ ± 2σ | 54 sampai 86 | 95,45% |
| μ ± 3σ | 46 sampai 94 | 99,73% |
Nilai di atas 94 maupun di bawah 46 hanya menampung 0,27% siswa — kurang dari 3 dari 1.000. Aturan ini sekaligus menjadi alat pemeriksaan cepat: jika sebuah nilai berada lebih dari 3σ dari rata-rata, nilainya pantas diperiksa lebih lanjut, misalnya sebagai kandidat outlier pada tahap pembersihan data.
Standardisasi dengan z-score #
Pertanyaan yang lebih menarik dari “berapa peluangnya?” adalah “seberapa istimewakah nilai ini?” Tinggi 175 cm dan nilai ujian 86 berasal dari dunia dengan satuan berbeda dan tidak bisa dibandingkan langsung. z-score menjawabnya dengan mengubah setiap nilai menjadi jumlah simpangan baku dari rata-ratanya:
z = (x - μ) / σNilai z sama dengan 0 berarti tepat di rata-rata; z = +2 berarti dua simpangan baku di atas rata-rata. Setelah standardisasi, semua distribusi normal menjadi satu distribusi normal baku (μ = 0, σ = 1) — sehingga tabel z yang sama berlaku untuk tinggi badan, nilai ujian, maupun durasi penggilingan kopi. Mari kita terapkan pada data tinggi badan pria dewasa dengan μ = 168 cm dan σ = 7 cm:
from scipy.stats import norm
mu, sigma = 168, 7 # tinggi badan pria dewasa (cm), angka ilustrasi
tinggi = [160, 168, 175, 182]
for t in tinggi:
z = (t - mu) / sigma
persentil = norm.cdf(z) * 100
print(f"tinggi {t} cm -> z = {z:+.2f}, persentil ke-{persentil:.1f}")
batas_atas = norm.ppf(0.95, loc=mu, scale=sigma)
print(f"Batas 5% tertinggi: {batas_atas:.1f} cm")Output yang Dihasilkan:
tinggi 160 cm -> z = -1.14, persentil ke-12.7
tinggi 168 cm -> z = +0.00, persentil ke-50.0
tinggi 175 cm -> z = +1.00, persentil ke-84.1
tinggi 182 cm -> z = +2.00, persentil ke-97.7
Batas 5% tertinggi: 179.5 cmMari kita telaah hasilnya:
- Baris 6 (
z = (t - mu) / sigma): standardisasi sesuai rumus. Tinggi 160 cm berjarak −8 cm dari μ; dibagi σ = 7 menghasilkan z = −1,14 — jarak yang juga langsung terbaca sebagai posisi di bawah kurva. - Baris 7 (
norm.cdf(z)): memasukkan z ke fungsi kerapatan baku memberi persentil. Tinggi 175 cm berada di persentil ke-84,1 — artinya sekitar 84% pria dewasa lebih pendek. - Baris 10-11 (
norm.ppf):ppfadalah kebalikancdf. Kita bertanya “nilai apa yang dilampaui hanya 5% populasi?” dan jawabannya 179,5 cm — angka yang berguna misalnya untuk menentukan batas ukuran seragam.
Untuk melihat bentuk kurvanya sekaligus area ±1σ, kita dapat menggambarkannya:
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
mu, sigma = 70, 8
x = np.linspace(mu - 4 * sigma, mu + 4 * sigma, 400)
y = norm.pdf(x, mu, sigma)
fig, ax = plt.subplots(figsize=(8, 4))
ax.plot(x, y, color="#2563eb")
x_inti = np.linspace(mu - sigma, mu + sigma, 200)
ax.fill_between(x_inti, norm.pdf(x_inti, mu, sigma), alpha=0.35, color="#2563eb")
ax.axvline(mu, color="gray", linestyle="--")
ax.set_xlabel("Nilai ujian")
ax.set_ylabel("Kerapatan peluang")
ax.set_title("Kurva normal (mu = 70, sigma = 8), area ±1 sigma diarsir")
plt.show()Grafik yang dihasilkan berbentuk kurva lonceng dengan puncak tepat di nilai 70. Garis putus-putus vertikal menandai pusat μ, dan area yang diarsir — membentang dari 62 sampai 78 — menutup sekitar dua pertiga luas total kurva, sesuai aturan 68%. Kedua ekor kurva mendekati nol dengan mulus tetapi tidak pernah benar-benar menyentuh sumbu mendatar.
Mengapa Normal Begitu Penting #
Peran distribusi normal dalam data science jauh melebihi banyaknya data yang memang berdistribusi normal. Tiga alasan utamanya: banyak proses pengukuran alami menghasilkan sebaran mendekati normal; banyak metode statistika klasik (interval kepercayaan, uji-t) bekerja paling andal ketika perkiraan kita mengikuti kurva ini; dan yang paling mengejutkan — rata-rata sampel cenderung berdistribusi normal meskipun data aslinya tidak normal, sebuah jaminan dari Teorema Limit Pusat yang akan kita simulasikan pada chapter Teorema Limit Pusat.
Rangkuman #
- Distribusi normal berbentuk kurva lonceng yang sepenuhnya ditentukan oleh dua parameter: pusat μ dan lebar σ.
- Aturan empiris 68-95-99.7 memberi perkiraan cepat proporsi data dalam jarak 1σ, 2σ, dan 3σ dari rata-rata;
norm.cdfmenghitung versi persisnya. - z-score menstandardisasi nilai apa pun menjadi jumlah simpangan baku dari rata-rata, membuat data dari satuan berbeda dapat dibandingkan.
norm.ppfbekerja sebagai kebalikancdfuntuk mencari batas nilai pada persentil tertentu.
Kita sekarang memiliki kurva lonceng sebagai patokan. Pertanyaan berikutnya: apa yang terjadi jika kita mengambil banyak sampel dari satu populasi dan menghitung rata-ratanya? Ternyata rata-rata-rata-rata tersebut punya distribusi tersendiri — dan itulah bintang utama chapter Distribusi Sampling.