Referensi cepat probabilitas dan statistik untuk machine learning. Distribusi, Bayes, sampling, confidence interval, hipotesis, dan evaluasi model dengan Python.
Probabilitas dan statistik muncul terus saat kamu membangun model machine learning. Model klasifikasi mengeluarkan probabilitas kelas. A/B test meminta confidence interval. Model regresi perlu kamu cek residual-nya. Cheat sheet ini fokus ke konsep yang langsung kepakai saat membaca data, memilih metrik, dan menilai apakah angka model layak dipercaya.
Sebelum menghitung apa pun, bedakan populasi, sampel, feature, dan target. Populasi adalah semua data yang ingin kamu pahami. Sampel adalah bagian populasi yang benar-benar kamu punya. Pada dataset prediksi harga rumah, luas bangunan dan jumlah kamar adalah feature X; harga adalah target y.
Variabel acak memetakan hasil kejadian ke angka. Variabel diskret punya nilai terhitung, misalnya jumlah bug yang masuk hari ini. Variabel kontinu bisa mengambil nilai di suatu interval, misalnya durasi request dalam milidetik.
| Istilah | Notasi umum | Contoh machine learning |
|---|---|---|
| Observasi | x_i | Satu transaksi pelanggan |
| Feature matrix | X | Banyak kolom input, banyak baris data |
| Target | y | Label spam atau harga rumah |
| Prediksi | ŷ | Output model untuk satu baris |
| Parameter populasi | μ, σ | Rata-rata dan simpangan baku populasi |
| Statistik sampel | x̄, s | Estimasi dari data sampel |
Data nominal hanya punya kategori tanpa urutan, seperti kota atau jenis perangkat. Data ordinal punya urutan, seperti rating 1 sampai 5. Data interval punya selisih yang bermakna tetapi nolnya tidak absolut. Suhu Celsius masuk sini. Data rasio punya nol absolut, misalnya penghasilan atau waktu proses.
Jangan langsung melatih model. Lihat dulu sebaran data dan nilai hilang. Mean mudah tertarik outlier. Median lebih tahan terhadap satu nilai besar yang nyasar.
import numpy as np
import pandas as pd
harga = pd.Series([120, 125, 128, 130, 132, 800])
print(harga.describe())
print("mean:", harga.mean())
print("median:", harga.median())
print("std sampel:", harga.std(ddof=1))
print("kuantil 25%, 50%, 75%:", harga.quantile([0.25, 0.5, 0.75]))
# IQR untuk deteksi kandidat outlier
q1, q3 = harga.quantile([0.25, 0.75])
iqr = q3 - q1
batas_bawah = q1 - 1.5 * iqr
batas_atas = q3 + 1.5 * iqr
print(harga[(harga < batas_bawah) | (harga > batas_atas)])ddof=1 menghasilkan simpangan baku sampel. Jika kamu menghitung simpangan baku dari seluruh populasi yang memang lengkap, gunakan ddof=0. Kandidat outlier tidak otomatis salah. Harga 800 mungkin properti premium, bukan typo. Cek sumber datanya dulu, kan.
Probabilitas sebuah kejadian A berada antara 0 dan 1. Nilai 0 berarti mustahil pada ruang sampel yang didefinisikan. Nilai 1 berarti pasti. Jika semua hasil punya peluang sama, P(A) = jumlah hasil yang mendukung A / jumlah semua hasil.
P(bukan A) = 1 - P(A).P(A atau B) = P(A) + P(B) - P(A dan B).P(A dan B) = P(A) × P(B | A).P(A dan B) = 0.P(A dan B) = P(A) × P(B).Saling lepas dan independen bukan hal yang sama. Dua hasil pelemparan dadu bisa independen. Nilai dadu pertama tidak mengubah dadu kedua. Namun angka 1 dan angka 6 pada satu lemparan dadu saling lepas. Jika angka 1 terjadi, angka 6 jelas tidak terjadi pada lemparan yang sama.
P(A | B) dibaca peluang A setelah B diketahui terjadi. Rumusnya:
P(A | B) = P(A dan B) / P(B)Misal dari 1.000 transaksi, ada 40 fraud. Dari 40 fraud itu, 30 terjadi pada transaksi di atas Rp5 juta. Jika ada 100 transaksi di atas Rp5 juta, maka:
P(fraud | transaksi_besar) = 30 / 100 = 0.30
P(transaksi_besar | fraud) = 30 / 40 = 0.75Dua angka ini menjawab pertanyaan berbeda. Sistem deteksi fraud biasanya perlu yang pertama: jika transaksi besar, berapa peluang fraud? Jangan tukar arah kondisinya.
Bayes membalik probabilitas kondisional:
P(A | B) = P(B | A) × P(A) / P(B)Dalam deteksi penyakit, A bisa berarti pasien sakit dan B berarti hasil tes positif. Sensitivitas tinggi saja belum membuat hasil positif pasti benar, karena prevalensi penyakit ikut memengaruhi hasil akhir.
# Contoh: prevalensi 1%, sensitivitas 95%, false positive rate 5%
prevalensi = 0.01
sensitivitas = 0.95
false_positive_rate = 0.05
p_positif = (
sensitivitas * prevalensi
+ false_positive_rate * (1 - prevalensi)
)
p_sakit_jika_positif = sensitivitas * prevalensi / p_positif
print(f"P(sakit | tes positif): {p_sakit_jika_positif:.2%}")Hasilnya sekitar 16%. Kedengarannya kontraintuitif, tapi false positive dari kelompok sehat jumlahnya jauh lebih banyak karena prevalensi hanya 1%. Ini alasan threshold model tidak boleh dipilih dari accuracy saja.
Distribusi menjelaskan peluang setiap nilai atau rentang nilai. Saat memakai model, distribusi membantu kamu memilih asumsi, transformasi, dan metrik yang masuk akal.
| Distribusi | Parameter | Cocok untuk | Contoh |
|---|---|---|---|
| Bernoulli | p | Satu percobaan ya atau tidak | Klik iklan atau tidak |
| Binomial | n, p | Jumlah sukses dari n percobaan | Jumlah user yang konversi dari 100 visitor |
| Poisson | λ | Jumlah kejadian per interval | Tiket support per jam |
| Geometrik | p | Percobaan sampai sukses pertama | Berapa panggilan sampai user menjawab |
from scipy.stats import binom, poisson
# Peluang tepat 12 konversi dari 100 visitor jika p=0.1
print(binom.pmf(k=12, n=100, p=0.1))
# Peluang paling banyak 5 tiket per jam jika rata-rata 4 tiket/jam
print(poisson.cdf(k=5, mu=4))Poisson mengasumsikan laju rata-rata relatif stabil dan kejadian independen. Jika varians jumlah tiket jauh lebih besar daripada rata-ratanya, data bisa mengalami overdispersion. Negative binomial sering lebih cocok untuk kasus itu.
Distribusi normal punya bentuk lonceng dengan parameter mean μ dan simpangan baku σ. Banyak feature tidak benar-benar normal, jadi jangan memaksa transformasi hanya agar histogram terlihat cantik. Yang perlu kamu cek adalah apakah asumsi model tertentu butuh bentuk itu.
| Distribusi | Ciri | Contoh |
|---|---|---|
| Normal | Simetris di sekitar mean | Error pengukuran kecil yang terkumpul |
| Uniform | Semua nilai dalam interval punya densitas sama | Angka acak dari generator tertentu |
| Exponential | Waktu tunggu sampai kejadian berikutnya | Jeda antar request saat proses Poisson |
| Log-normal | Nilai positif dan ekor kanan panjang | Nilai transaksi atau durasi tertentu |
| Beta | Nilai antara 0 dan 1 | Probabilitas konversi atau proporsi |
PDF, atau probability density function, bukan peluang tepat pada satu nilai kontinu. Untuk variabel kontinu, peluang X = 3.0 adalah 0. Peluang bermakna ada pada interval, misalnya P(2.5 < X < 3.5).
from scipy.stats import norm
# X ~ Normal(100, 15). Peluang nilai berada antara 85 dan 115.
p = norm.cdf(115, loc=100, scale=15) - norm.cdf(85, loc=100, scale=15)
print(f"P(85 < X < 115) = {p:.2%}")Z-score menyatakan jarak nilai dari mean dalam satuan simpangan baku:
z = (x - μ) / σDalam preprocessing, StandardScaler menghitung mean dan simpangan baku dari data latih, lalu memakai angka itu pada validasi dan test. Fit scaler pada seluruh dataset sebelum split adalah data leakage.
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
pipeline = Pipeline([
("scale", StandardScaler()),
("model", LogisticRegression(max_iter=1000)),
])
pipeline.fit(X_train, y_train)Mean menjawab pusat rata-rata. Median menjawab nilai tengah. Modus menjawab nilai paling sering. Varians mengukur rata-rata kuadrat jarak dari mean. Simpangan baku adalah akar varians dan kembali ke satuan asli data.
Sampel acak yang baik memberi setiap unit populasi peluang terdefinisi untuk terpilih. Central Limit Theorem menyatakan distribusi mean dari banyak sampel independen cenderung normal saat ukuran sampel bertambah, dengan syarat tertentu. Ini bicara tentang distribusi mean sampel, bukan jaminan bahwa data mentah normal.
Standard error mean:
SE = s / √nJika n naik empat kali lipat, standard error turun setengah. Menambah data membantu, tetapi manfaatnya melambat. Dari 100 ke 400 baris memberi dampak lebih besar daripada dari 10.000 ke 10.300 baris.
import numpy as np
rng = np.random.default_rng(42)
populasi = rng.lognormal(mean=4, sigma=0.7, size=100_000)
mean_sampel = [rng.choice(populasi, size=50).mean() for _ in range(5_000)]
print(np.mean(mean_sampel), np.std(mean_sampel, ddof=1))Populasi di atas condong ke kanan, tetapi kumpulan mean_sampel jauh lebih simetris. Coba ganti ukuran sampel dari 50 ke 5. Bentuknya akan lebih liar.
Confidence interval 95% untuk mean memberi rentang prosedural. Jika kamu mengulang proses sampling dan menghitung interval dengan metode sama berkali-kali, kira-kira 95% interval akan mencakup mean populasi. Ini bukan berarti ada peluang 95% mean tetap berada dalam satu interval yang sudah dihitung. Mean populasi nilainya tetap.
from scipy import stats
import numpy as np
nilai = np.array([72, 78, 81, 76, 84, 80, 77, 79, 83, 75])
n = len(nilai)
mean = nilai.mean()
se = stats.sem(nilai)
low, high = stats.t.interval(0.95, df=n - 1, loc=mean, scale=se)
print(f"mean={mean:.2f}, CI 95%=({low:.2f}, {high:.2f})")Untuk sampel kecil dengan simpangan baku populasi tidak diketahui, gunakan distribusi t seperti contoh tersebut. Jika kamu punya data berpasangan, misalnya metrik user sebelum dan sesudah perubahan, interval harus menghitung perbedaan setiap pasangan, bukan dua grup terpisah.
Korelasi Pearson mengukur hubungan linear. Nilainya antara minus satu dan satu. Nilai mendekati nol tidak berarti tidak ada hubungan sama sekali. Hubungan berbentuk U bisa punya korelasi Pearson nol.
from scipy.stats import pearsonr, spearmanr
r, p_value = pearsonr(df["durasi_menit"], df["nilai"])
rho, p_rank = spearmanr(df["peringkat_pengguna"], df["retensi_hari"])
print(r, p_value)
print(rho, p_rank)Gunakan Spearman ketika hubungan monotonic tetapi tidak linear, atau data ordinal. Korelasi tidak membuktikan sebab akibat. Pengguna yang aktif mungkin punya retensi tinggi, tapi kampanye, tipe pengguna, dan umur akun bisa menjelaskan keduanya.
Mulai dari hipotesis nol H0, misalnya rata-rata conversion rate versi baru sama dengan versi lama. Hipotesis alternatif H1 menyatakan ada perbedaan atau arah tertentu. P-value menjawab: jika H0 benar, seberapa ekstrem data ini atau yang lebih ekstrem? P-value bukan peluang bahwa H0 benar.
from scipy.stats import ttest_ind
versi_lama = [10, 12, 11, 9, 13, 10, 12]
versi_baru = [13, 14, 12, 15, 13, 14, 16]
hasil = ttest_ind(versi_lama, versi_baru, equal_var=False)
print(hasil.statistic, hasil.pvalue)Jangan berhenti di p-value. Lihat juga effect size dan confidence interval. Perbedaan 0,02% bisa sangat mudah lolos ambang statistik jika data jutaan baris, tetapi tidak berarti layak dikerjakan oleh tim produk.
Model probabilistik memberi P(y=1 | X), bukan janji mutlak. Logistic regression memakai sigmoid untuk mengubah skor linear menjadi angka 0 sampai 1. Saat skor probabilitas penting, cek calibration curve. Model yang mengeluarkan 0,8 seharusnya benar kira-kira 80% pada grup prediksi yang sebanding.
from sklearn.calibration import CalibrationDisplay
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(random_state=42)
model.fit(X_train, y_train)
CalibrationDisplay.from_estimator(model, X_test, y_test, n_bins=10)Kalibrasi dan discrimination berbeda. ROC AUC mengukur seberapa baik model mengurutkan contoh positif lebih tinggi daripada negatif. Model bisa punya AUC bagus tetapi probabilitasnya terlalu percaya diri. Untuk keputusan kredit, triase medis, atau alokasi review manual, perbedaan itu terasa di lapangan.
| Istilah | Arti singkat |
|---|---|
| Bayes | Cara menghitung probabilitas posterior dari prior dan evidence. |
| Confidence interval | Rentang hasil prosedur estimasi pada tingkat kepercayaan tertentu. |
| Data leakage | Informasi dari test atau masa depan bocor ke proses pelatihan. |
| Distribution | Aturan peluang untuk nilai sebuah variabel acak. |
| Effect size | Besar dampak praktis, bukan hanya bukti statistik. |
| Feature | Kolom input yang dipakai model untuk membuat prediksi. |
| Likelihood | Seberapa mungkin data muncul untuk nilai parameter tertentu. |
| Outlier | Observasi jauh dari pola mayoritas, perlu diperiksa konteksnya. |
| Posterior | Probabilitas setelah evidence baru masuk. |
| Prior | Keyakinan probabilitas sebelum melihat evidence baru. |
| Standard error | Estimasi simpangan baku statistik sampel, misalnya mean. |
| Variance | Rata-rata kuadrat jarak nilai dari mean. |
Login atau daftar akun gratis untuk membaca cheat sheet ini.