Statistics Essentials untuk ML

6 jam17 min baca
Tujuan

Paham distribusi, probabilitas, dan konsep statistik yang muncul terus di ML.

06 β€” Statistics Essentials untuk ML

Estimasi: 6 jam Prasyarat: 04-linear-algebra.md, 05-calculus-intuition.md Tujuan: Paham distribusi, probabilitas, dan konsep statistik yang muncul terus di ML.

WAJIB: tonton StatQuest "Statistics Fundamentals" playlist di YouTube. Best statistik teacher di internet.


Kenapa Materi Ini Penting?

Statistik dan probabilitas adalah bahasa ketidakpastian β€” dan ML adalah machine learning under uncertainty. Setiap loss function, evaluation metric, sampling strategy, dan output LLM diatur oleh statistik.

flowchart LR
    Stat["πŸ“Š Statistik"] --> LF["🎯 Loss Function<br/>(MSE, Cross-Entropy)"]
    Prob["🎲 Probabilitas"] --> NTP["πŸ”€ Next Token Prediction<br/>(softmax over vocab)"]
    Dist["πŸ“ˆ Distribution"] --> Init["βš–οΈ Weight Init<br/>(normal/xavier)"]
    Bayes["🧠 Bayes"] --> Class["🏷️ Naive Bayes<br/>+ Bayesian DL"]
    Met["πŸ“ Metrics"] --> Eval["βœ… Model Evaluation<br/>(precision, recall)"]
Konsep Statistik Dipakai di Mana di AI/ML
Mean/Std Normalisasi input, batch normalization
Normal distribution Inisialisasi weight, dropout, noise injection
Probabilitas Output LLM = distribusi probabilitas atas vocab
Cross-entropy Loss function paling umum untuk klasifikasi
Bayes' theorem Spam filter, Bayesian neural net, anomaly detection
Sampling Top-k, top-p, temperature di LLM generation
Confusion matrix Evaluasi binary/multi-class classifier
CLT Justifikasi kenapa banyak hal "normal"

Bottom line: ChatGPT itu = probability machine. Saat dia "milih kata berikutnya", dia sampling dari distribusi probabilitas. Paham statistik = paham kenapa LLM kadang random dan bagaimana mengontrolnya.


Bagian 1 β€” Statistik Deskriptif

Cara meringkas data.

Mean (Rata-rata)

mean = sum / count
import numpy as np
data = np.array([85, 70, 92, 88, 75])
data.mean()    # 82.0

Sensitif terhadap outlier:

np.array([1, 2, 3, 4, 100]).mean()    # 22.0  (skewed!)

Median

Nilai tengah setelah di-sort. Robust ke outlier.

np.median([1, 2, 3, 4, 100])    # 3

Mode

Nilai paling sering muncul.

from scipy import stats
stats.mode([1, 2, 2, 3, 3, 3, 4]).mode    # 3

Variance & Standard Deviation

Mengukur sebaran data dari mean.

variance = mean((x - mean)Β²)
std = √variance
data = np.array([10, 20, 30, 40, 50])
data.var()    # 200
data.std()    # 14.14

Intuisi:

  • std kecil β†’ data nempel dekat mean
  • std besar β†’ data tersebar lebar

Analogi "kerumunan": std itu seperti seberapa berkumpul vs tersebar sebuah keramaian. Std kecil = kerumunan padat di satu titik. Std besar = orang-orang menyebar luas. Mean = "pusat massa" kerumunan.

flowchart LR
    Std["πŸ“Š Standard Deviation"] --> Small["🎯 Std kecil<br/>(misal 1)"]
    Std --> Med["πŸ“ Std sedang<br/>(misal 10)"]
    Std --> Big["🌐 Std besar<br/>(misal 100)"]
    Small --> S1["Data padat dekat mean"]
    Med --> M1["Data sebar moderat"]
    Big --> B1["Data sangat sebar"]

Quantile / Percentile

np.percentile(data, 25)    # Q1 (25%)
np.percentile(data, 50)    # median
np.percentile(data, 75)    # Q3

IQR (Interquartile Range) = Q3 - Q1. Robust measure of spread.

Skewness & Kurtosis (Sekedar Tahu)

  • Skewness β€” asimetri distribusi (left-skewed, right-skewed)
  • Kurtosis β€” tinggi puncak (heavy-tailed atau tidak)

Bagian 2 β€” Distribusi Penting

Normal Distribution (Gaussian)

Bel curve. Distribusi paling penting di statistik dan ML.

Analogi "lonceng": normal distribution itu seperti bentuk lonceng. Kebanyakan orang berkumpul di tengah (dekat rata-rata), sedikit di pinggir kiri/kanan, dan sangat sedikit di ekor jauh. Tinggi badan, IQ, error pengukuran β€” semua mengikuti pola lonceng ini.

Cara Membaca Diagram:

  • Node atas = distribusi normal dengan dua parameter utama.
  • Cabang kiri (Mean ΞΌ) = pusat lonceng; (Std Οƒ) = lebar lonceng.
  • Tiga node kanan = persentase data dalam Β±1Οƒ, Β±2Οƒ, Β±3Οƒ.

Walkthrough Step-by-Step:

  1. Tentukan mean ΞΌ untuk menggeser pusat lonceng.
  2. Tentukan std Οƒ untuk mengontrol seberapa lebar/tinggi lonceng.
  3. Gunakan rule 68-95-99.7 untuk mengetahui proporsi data di tiap interval.

Analogi Sehari-hari: seperti distribusi nilai ujian β€” kebanyakan murid di sekitar rata-rata, sedikit yang nilainya sangat tinggi atau sangat rendah.

Diagram statis Mermaid sebagai fallback:

flowchart TD
    N["πŸ”” Normal Distribution"] --> M["πŸ“ Mean ΞΌ<br/>(pusat lonceng)"]
    N --> S["πŸ“ Std Οƒ<br/>(lebar lonceng)"]
    N --> R1["68% data dalam Β±1Οƒ"]
    N --> R2["95% data dalam Β±2Οƒ"]
    N --> R3["99.7% data dalam Β±3Οƒ"]
import numpy as np
import matplotlib.pyplot as plt

data = np.random.normal(loc=0, scale=1, size=1000)    # mean=0, std=1
plt.hist(data, bins=50)
plt.show()

Property:

  • 68% data dalam Β±1 std
  • 95% dalam Β±2 std
  • 99.7% dalam Β±3 std (rule 68-95-99.7)

Mana yang terdistribusi normal?

  • Tinggi badan manusia
  • IQ
  • Error pengukuran
  • Sum of many independent events (Central Limit Theorem)

Uniform Distribution

Setiap nilai dalam range punya probabilitas sama.

np.random.uniform(0, 1, 1000)

Analogi "dadu fair": uniform distribution itu seperti dadu fair β€” setiap angka 1-6 punya peluang sama (1/6). Tidak ada favorit. Datar dari ujung ke ujung.

flowchart LR
    U["🎲 Uniform"] --> Eq["Semua nilai<br/>peluang sama"]
    N["πŸ”” Normal"] --> Mid["Tengah dominan,<br/>ekor jarang"]

Bernoulli & Binomial

  • Bernoulli: 1 kali coba, sukses atau gagal (e.g. flip coin)
  • Binomial: n kali coba, hitung jumlah sukses
np.random.binomial(n=10, p=0.5, size=1000)    # 10 flip, p=0.5

Poisson

Jumlah kejadian dalam interval waktu (e.g. customer datang per jam).

Distribusi yang Sering Muncul di NLP/LLM

  • Categorical / Multinomial β€” pilih 1 dari N kategori (e.g. next token prediction!)
  • Softmax distribution β€” output LLM untuk vocab

Bagian 3 β€” Central Limit Theorem (CLT)

Salah satu teorema paling indah di statistik.

Pernyataan

Sum (atau mean) dari banyak variabel random independen mendekati normal distribution, tanpa peduli distribusi asalnya.

Implikasi

  • Average of dice rolls β†’ mendekati normal
  • Mean of survey samples β†’ normal (asal sample size cukup besar, n>30)
  • Test scores from random students β†’ mirip normal

Aplikasi ML: banyak teorema asumsi normal. CLT memberikan justifikasi.


Bagian 4 β€” Probabilitas Dasar

Definisi

Probability = chance kejadian, dari 0 (tidak akan terjadi) sampai 1 (pasti).

P(A) = (jumlah kasus favorable) / (total kasus)

Analogi "ukuran ketidakpastian": probabilitas itu seperti berat keyakinan. P=1 berarti yakin 100% terjadi. P=0 berarti yakin 100% tidak terjadi. P=0.5 = ragu maksimal (50/50). Semua angka di antaranya = derajat keyakinan.

flowchart LR
    Z["P = 0<br/>❌ Mustahil"] --> Q["P = 0.25<br/>🌧️ Tidak mungkin"]
    Q --> H["P = 0.5<br/>🀷 Ragu maksimal"]
    H --> T["P = 0.75<br/>β˜€οΈ Mungkin"]
    T --> O["P = 1<br/>βœ… Pasti"]

Aksioma

  1. 0 ≀ P(A) ≀ 1
  2. P(sample space) = 1
  3. P(A βˆͺ B) = P(A) + P(B) jika A dan B disjoint

Independent vs Dependent

Independent: terjadinya A tidak mempengaruhi B

P(A ∩ B) = P(A) Γ— P(B)

Dependent: terjadinya A mempengaruhi B

P(A ∩ B) = P(A) Γ— P(B|A)

Conditional Probability

P(A|B) = P(A ∩ B) / P(B)

"Probabilitas A given B sudah terjadi."

Contoh:

  • P(hujan) = 0.3
  • P(macet) = 0.4
  • P(macet | hujan) = 0.8 (kalau hujan, macet jauh lebih mungkin)

Bagian 5 β€” Bayes' Theorem (Wajib Paham!)

Salah satu rumus paling penting di ML.

Rumus

P(A|B) = P(B|A) Γ— P(A) / P(B)

Intuisi

Update belief dengan evidence baru:

posterior = (likelihood Γ— prior) / evidence

Analogi "update keyakinan": Bayes itu seperti detektif yang update kecurigaan setelah dapat bukti baru. Mulai dengan keyakinan awal (prior), liat bukti, hitung seberapa mungkin bukti itu muncul kalau hipotesis benar (likelihood), kemudian update keyakinan jadi posterior. Setiap bukti baru = update lagi.

Cara Membaca Diagram:

  • Tiga node kiri = bahan baku update: prior, evidence, likelihood.
  • Node tengah (Update) = formula Bayes yang menggabungkan ketiganya.
  • Node kanan (Posterior) = keyakinan baru setelah bukti.
  • Edge balik (putus-putus) = posterior jadi prior baru saat datang bukti berikutnya.

Walkthrough Step-by-Step:

  1. Mulai dari prior P(A) = keyakinan awal sebelum lihat data.
  2. Saat datang evidence B, hitung likelihood P(B|A).
  3. Terapkan Bayes: posterior = (likelihood Γ— prior) / evidence.
  4. Posterior baru menjadi prior untuk update berikutnya β€” proses iteratif.

Analogi Sehari-hari: Detektif menyelidiki kasus. Mulai dengan dugaan awal, terima fakta baru satu per satu, dan setiap fakta menggeser keyakinan ke kesimpulan akhir.

Diagram statis Mermaid sebagai fallback:

flowchart LR
    Prior["🧠 Prior P(A)<br/>keyakinan awal"] --> Update["⚑ Update<br/>(Bayes)"]
    Evidence["πŸ” Evidence B<br/>bukti baru"] --> Update
    Like["πŸ“Š Likelihood P(B|A)"] --> Update
    Update --> Post["🎯 Posterior P(A|B)<br/>keyakinan baru"]
    Post -.->|"ulangi saat<br/>ada bukti baru"| Prior

Contoh Klasik: Tes Medis

Misalkan:

  • Penyakit X menyerang 1% populasi β†’ P(disease) = 0.01
  • Tes positif kalau punya penyakit: 95% β†’ P(positive|disease) = 0.95
  • Tes positif palsu: 5% β†’ P(positive|no disease) = 0.05

Pertanyaan: kalau tes positif, berapa probabilitas benar-benar sakit?

P(disease|positive) = P(positive|disease) Γ— P(disease) / P(positive)

P(positive) = P(positive|disease) Γ— P(disease) + P(positive|no disease) Γ— P(no disease)
            = 0.95 Γ— 0.01 + 0.05 Γ— 0.99
            = 0.0095 + 0.0495
            = 0.059

P(disease|positive) = 0.95 Γ— 0.01 / 0.059
                    = 0.16

Hanya 16%! Walau tes 95% akurat, karena penyakit jarang, kebanyakan positif sebenarnya false positive.

Pelajaran: prior matters. Banyak kesalahan logika sehari-hari karena ignore base rate.

Worked Example β€” Visualisasi Bayes Update

Bayangkan 10.000 orang:

10.000 orang total
β”œβ”€β”€ 100 sakit (1%)
β”‚   β”œβ”€β”€ 95 tes positif βœ… (true positive)
β”‚   └── 5 tes negatif ❌ (false negative)
└── 9.900 sehat (99%)
    β”œβ”€β”€ 495 tes positif ❌ (false positive)
    └── 9.405 tes negatif βœ… (true negative)

Total tes positif = 95 + 495 = 590
Yang BENERAN sakit dari 590 positif = 95
P(sakit | positif) = 95/590 β‰ˆ 16%
flowchart TD
    Pop["πŸ‘₯ 10.000 orang"] --> Sick["πŸ€’ 100 sakit (1%)"]
    Pop --> Well["πŸ’ͺ 9.900 sehat (99%)"]
    Sick --> TP["βœ… 95 positif<br/>(true positive)"]
    Sick --> FN["❌ 5 negatif<br/>(false negative)"]
    Well --> FP["⚠️ 495 positif<br/>(FALSE POSITIVE!)"]
    Well --> TN["βœ… 9.405 negatif<br/>(true negative)"]
    TP --> Pos["πŸ“Š Total positif: 590"]
    FP --> Pos
    Pos --> Result["🎯 P(sakit|positif)<br/>= 95/590 β‰ˆ 16%"]

Insight: false positive (495) jauh lebih banyak dari true positive (95) β€” meskipun tes 95% akurat. Ini sebabnya disease screening untuk penyakit jarang sering memberi hasil menyesatkan.

Aplikasi di ML

  • Naive Bayes Classifier β€” implementasi langsung Bayes
  • Bayesian Inference β€” update parameter model dengan evidence baru
  • Bayesian Networks β€” model probabilistic graphical

Bagian 6 β€” Hypothesis Testing (Sneak Peek)

Konsep

  1. Bikin null hypothesis Hβ‚€ (default, no effect)
  2. Bikin alternative H₁ (ada effect)
  3. Hitung p-value β€” probabilitas observasi seekstrim ini, jika Hβ‚€ benar
  4. Kalau p-value < threshold (biasanya 0.05) β†’ tolak Hβ‚€

Analogi "kejutan": p-value itu seperti seberapa mengejutkan hasilnya kalau asumsi default (Hβ‚€) benar. p-value kecil = "hasil ini sangat aneh kalau Hβ‚€ benar β€” mungkin Hβ‚€ salah". p-value besar = "hasil ini wajar saja, tidak ada alasan menolak Hβ‚€".

flowchart TD
    H0["πŸ“‹ Hβ‚€: tidak ada efek<br/>(default skeptis)"] --> Exp["πŸ§ͺ Eksperimen<br/>kumpul data"]
    Exp --> P["🎯 Hitung p-value"]
    P --> Q{"p < 0.05?"}
    Q -->|"Iya 😲<br/>(mengejutkan!)"| Reject["❌ Tolak Hβ‚€<br/>(efek nyata)"]
    Q -->|"Tidak 😴<br/>(biasa saja)"| Keep["βœ… Terima Hβ‚€<br/>(belum cukup bukti)"]

Contoh

Hβ‚€: koin fair (P(head) = 0.5) H₁: koin tidak fair

Lempar 100 kali, dapat 70 head. p-value = ?

Kalau Hβ‚€ benar, peluang dapat 70+ head dari 100 = sangat kecil. p-value < 0.05 β†’ tolak Hβ‚€.

Tipe Error

  • Type I: tolak Hβ‚€ padahal benar (false positive)
  • Type II: terima Hβ‚€ padahal salah (false negative)

Konteks ML: A/B testing model versions, evaluating model improvements.


Bagian 7 β€” Correlation vs Causation

Correlation

Ukuran "sejauh mana 2 variabel berubah bersama".

Pearson correlation (-1 sampai 1):

  • 1 = perfect positive (naik bersama)
  • 0 = no correlation
  • -1 = perfect negative (satu naik, satu turun)
np.corrcoef(x, y)

Klasik: Correlation β‰  Causation

Es krim sales correlate dengan kasus tenggelam. Apakah es krim menyebabkan tenggelam? Tidak. Variable ketiga (panas) menyebabkan keduanya.

Penting di ML: model bisa belajar correlation. Untuk causal claim butuh causal inference (bidang sendiri).


Bagian 8 β€” Sampling

Population vs Sample

  • Population: semua data yang relevan (semua orang Indonesia)
  • Sample: subset (1000 orang yang di-survey)

Sampling Methods

  • Random sampling β€” paling umum
  • Stratified β€” pertahankan proporsi grup
  • Systematic β€” tiap N item
  • Cluster β€” grup geografis

Sampling Bias

Salah pilih sample β†’ kesimpulan salah.

Contoh: survey internet β†’ bias terhadap internet users.

Konteks ML: training data bias = model bias. Hati-hati kapan sample mewakili population.


Bagian 9 β€” Train/Validation/Test Split

Penting di ML. Sudah disebutkan di Fase 1, sekarang lebih detail.

Pembagian

[--------- Training (60-80%) ---------|--Val (10-20%)--|--Test (10-20%)--]
  • Training β€” train model
  • Validation β€” tune hyperparameters, monitor overfitting
  • Test β€” evaluasi final, sekali pakai

Aturan Emas

JANGAN PERNAH train pakai test set. Itu seperti murid lihat soal ujian sebelum ujian.

Cross-Validation (k-Fold)

Untuk dataset kecil:

Fold 1: [Test|Train|Train|Train|Train]
Fold 2: [Train|Test|Train|Train|Train]
...
Fold 5: [Train|Train|Train|Train|Test]

Train 5 kali, average performance. Lebih reliable estimate.

from sklearn.model_selection import cross_val_score

scores = cross_val_score(model, X, y, cv=5)
print(scores.mean(), scores.std())

Bagian 10 β€” Metrics

Klasifikasi

Confusion Matrix:

                Predicted
              Pos      Neg
Actual Pos   TP        FN
       Neg   FP        TN
  • Accuracy = (TP+TN) / total
  • Precision = TP / (TP+FP) β€” "dari yang predict positive, berapa benar?"
  • Recall = TP / (TP+FN) β€” "dari yang aktual positive, berapa terdeteksi?"
  • F1 = harmonic mean (precision, recall)

Aturan praktis:

  • Class imbalance? β†’ precision/recall lebih informatif dari accuracy
  • Cost false positive tinggi (e.g. spam filter buang email penting)? β†’ precision penting
  • Cost false negative tinggi (e.g. kanker terlewat)? β†’ recall penting

Regresi

  • MSE/RMSE β€” average squared error
  • MAE β€” average absolute error
  • RΒ² β€” proporsi variance explained (0-1, semakin tinggi semakin baik)

Classification Probabilistic

  • AUC-ROC β€” area under ROC curve
  • Log loss β€” penalty untuk confidence yang salah

Cek Pemahaman

  • Bisa hitung mean, median, std?
  • Tahu apa itu normal distribution dan rule 68-95-99.7?
  • Paham CLT secara konseptual?
  • Bisa apply Bayes' theorem?
  • Tahu beda correlation dan causation?
  • Tahu kenapa train/test split penting?
  • Paham precision vs recall?

Hubungan dengan AI/ML

flowchart TD
    LLM["πŸ€– LLM (e.g. GPT)"] --> NTP["πŸ”€ Next token prediction"]
    NTP --> Logits["πŸ“Š Logits per vocab"]
    Logits --> Soft["🎲 Softmax β†’ distribusi probabilitas"]
    Soft --> Sample{"🎯 Sampling strategy"}
    Sample --> Greedy["πŸ“Œ Greedy<br/>(max prob)"]
    Sample --> Top["🎭 Top-k / Top-p"]
    Sample --> Temp["🌑️ Temperature<br/>(skala distribusi)"]
    Greedy --> Out["πŸ“€ Token terpilih"]
    Top --> Out
    Temp --> Out
Konsep Statistik Manifestasi di LLM/ML
Probabilitas Output LLM = P(token|context) untuk semua vocab
Softmax Convert logits ke distribusi probabilitas valid
Cross-entropy loss Beda antara predicted distribusi dan target
Sampling (top-k, top-p) Cara LLM "milih" kata berikutnya
Temperature Tinggi = lebih random, rendah = lebih deterministic
Normal init Inisialisasi weight (nn.init.normal_)
Batch norm Standarisasi (mean=0, std=1) per batch
Dropout Bernoulli sampling pada neuron saat training
Confusion matrix Evaluasi classifier (toxic detection, intent classification)

Insight kunci: saat ChatGPT "mikir kata berikutnya", dia sebenarnya sampling dari distribusi probabilitas atas ~50.000 token. Temperature, top-k, top-p semua mengontrol bagaimana sampling dilakukan. Statistik ada di setiap step.


Common Mistakes & FAQ

"p-value = probabilitas Hβ‚€ benar?"

TIDAK! Ini kesalahpahaman paling umum.

  • Salah: "p-value 0.03 = ada 3% chance Hβ‚€ benar"
  • Benar: "p-value 0.03 = kalau Hβ‚€ benar, ada 3% chance dapat hasil seekstrim ini"

P-value adalah P(data | Hβ‚€), bukan P(Hβ‚€ | data). Bedanya halus tapi penting (ini sebenarnya aplikasi Bayes' theorem).

"Correlation tinggi = causation, kan?"

Tidak. Es krim sales dan kasus tenggelam berkorelasi (keduanya naik di musim panas), tapi es krim tidak menyebabkan orang tenggelam. Variable ketiga (cuaca panas) menyebabkan keduanya. Untuk causal claim butuh randomized experiment atau causal inference framework.

"Mean lebih baik dari median, kan?"

Tergantung. Mean = rata-rata, median = nilai tengah.

  • Mean baik untuk data simetris tanpa outlier
  • Median lebih robust kalau ada outlier ekstrem

Contoh: gaji di startup. Kalau founder dapat 100x gaji junior, mean gaji "tinggi" tapi menyesatkan. Median lebih representatif.

"Accuracy 95% = model bagus?"

Tidak selalu. Kalau dataset class imbalance (mis. 95% class 0, 5% class 1), model yang selalu predict class 0 dapat 95% accuracy β€” tanpa belajar apa-apa. Pakai precision, recall, F1 untuk class imbalance.

"Probability vs likelihood, beda?"

  • Probability = P(data | parameter) β€” anggap parameter fixed, hitung peluang data
  • Likelihood = L(parameter | data) β€” anggap data fixed, hitung "seberapa cocok" parameter

Bentuknya mirip secara matematika tapi interpretasinya beda. Maximum Likelihood Estimation (MLE) = cari parameter yang memaksimalkan likelihood.

"Variance vs standard deviation?"

StdΒ² = variance. Std punya unit yang sama dengan data (mis. rupiah), variance dalam unit kuadrat (rupiahΒ²). Std lebih intuitif untuk dibaca; variance lebih sering muncul di rumus.

"Kenapa pakai squared error, bukan absolute error?"

  • MSE = mean((y_pred - y_true)Β²) β€” penalti besar untuk error besar, smooth (bisa diturunkan)
  • MAE = mean(|y_pred - y_true|) β€” penalti linear, lebih robust ke outlier

MSE lebih populer karena turunannya enak. Tapi MAE lebih baik kalau dataset banyak outlier.

"Confusion matrix kebalik (TP/FP) β€” gimana ngafalin?"

Pakai pola "Actual baris, Predicted kolom":

  • True/False = apakah prediksinya benar?
  • Positive/Negative = apa yang di-prediksi?

Jadi False Positive = prediksi positif tapi salah (= aktual negatif). False Negative = prediksi negatif tapi salah (= aktual positif, tapi kelewatan).


Challenge 3.6

Challenge 1 β€” Tonton StatQuest

Playlist "Statistics Fundamentals" oleh Josh Starmer. Wajib episode:

  • Histograms
  • Population/Sample
  • Normal Distribution
  • Mean/Median/Mode
  • Variance/SD
  • Hypothesis Testing
  • p-values

Tulis 10 insight di jurnal.

Challenge 2 β€” Statistik Deskriptif Manual

Diberikan data: [12, 15, 18, 22, 25, 30, 32, 35, 40, 100]

Hitung manual:

  • Mean
  • Median
  • Variance
  • Std
  • Q1, Q3, IQR
  • Identifikasi outlier (definisi: > Q3 + 1.5Γ—IQR)

Cek dengan NumPy.

Challenge 3 β€” Plot Distribusi

Pakai matplotlib + numpy:

import numpy as np
import matplotlib.pyplot as plt

# 4 distribusi
fig, axes = plt.subplots(2, 2, figsize=(10, 8))

# Normal
data = np.random.normal(0, 1, 10000)
axes[0, 0].hist(data, bins=50)
axes[0, 0].set_title("Normal")

# Uniform
data = np.random.uniform(0, 1, 10000)
axes[0, 1].hist(data, bins=50)
axes[0, 1].set_title("Uniform")

# Exponential
data = np.random.exponential(1, 10000)
axes[1, 0].hist(data, bins=50)
axes[1, 0].set_title("Exponential")

# Binomial
data = np.random.binomial(20, 0.5, 10000)
axes[1, 1].hist(data, bins=20)
axes[1, 1].set_title("Binomial")

plt.tight_layout()
plt.show()

Observasi: bentuk masing-masing.

Challenge 4 β€” Demonstrasi CLT

import numpy as np
import matplotlib.pyplot as plt

# Distribusi original β€” uniform (bukan normal!)
population = np.random.uniform(0, 100, 100000)

plt.subplot(1, 2, 1)
plt.hist(population, bins=50)
plt.title("Population (Uniform)")

# Mean dari banyak sample
sample_means = []
for _ in range(10000):
    sample = np.random.choice(population, size=30)
    sample_means.append(sample.mean())

plt.subplot(1, 2, 2)
plt.hist(sample_means, bins=50)
plt.title("Sample Means (looks Normal!)")

plt.show()

Walau population uniform, sample means β†’ normal. Itu CLT.

Challenge 5 β€” Bayes' Theorem Problem

Spam filter:

  • 30% email adalah spam
  • 95% spam mengandung kata "lottery"
  • 5% non-spam mengandung kata "lottery"

Email mengandung "lottery". Berapa probabilitas spam?

Hitung manual + verifikasi dengan code.

Challenge 6 β€” Confusion Matrix Manual

Diberikan:

y_true = [1, 0, 1, 1, 0, 1, 0, 0, 1, 0]
y_pred = [1, 0, 1, 0, 0, 1, 1, 0, 1, 1]

Hitung manual:

  • TP, TN, FP, FN
  • Accuracy
  • Precision (untuk class 1)
  • Recall (untuk class 1)
  • F1

Verifikasi dengan sklearn:

from sklearn.metrics import confusion_matrix, classification_report
print(confusion_matrix(y_true, y_pred))
print(classification_report(y_true, y_pred))

Challenge 7 β€” Real Dataset Analysis

Pakai dataset Kaggle (mis. Titanic):

  1. Load CSV
  2. Statistik deskriptif (mean, std, dll) per kolom numeric
  3. Distribusi tiap kolom (histogram)
  4. Correlation matrix
  5. Jelaskan 3 insight yang kamu lihat
import pandas as pd

df = pd.read_csv("titanic.csv")
df.describe()
df.hist()
df.corr()

Challenge 8 β€” Refleksi

Tulis: "Setelah belajar statistik, apa yang sebelumnya membingungkan tentang ML sekarang masuk akal?"

400-500 kata.


Selanjutnya: challenges.md β€” final challenge konsolidasi Fase 3 sebelum lanjut ke NumPy/Pandas di Fase 4.