Sebelum satu model pun dilatih, pekerjaan pertama machine learning adalah membaca datanya: di mana pusatnya, seberapa lebar sebarannya, dan kolom mana yang saling berhubungan. Statistika deskriptif menyediakan alat ukur untuk ketiganya, dan alat-alat itu bukan sekadar laporan — mean dan simpangan baku hidup di dalam StandardScaler, kuartil menjadi dasar deteksi pencilan, dan korelasi memandu seleksi fitur. Pada chapter ini kita menghitung semuanya dengan NumPy pada data sintetis kecil, lalu membaca maknanya untuk keputusan machine learning yang nyata.
Mean, Median, dan Modus #
Mean adalah rata-rata hitung: seluruh nilai dijumlah lalu dibagi banyaknya data. Median adalah nilai tengah setelah data diurutkan. Modus adalah nilai yang paling sering muncul, dan ukuran ini paling berguna untuk data kategorik — misalnya departemen terbanyak pada data karyawan, yang kelak dihitung dengan value_counts() di pandas. Ketiganya menjawab pertanyaan yang sama (di mana pusat data?) dengan tingkat keawasan yang berbeda terhadap pencilan (outlier).
Perbedaan itu penting untuk data miring seperti gaji dan harga rumah. Satu eksekutif bergaji ratusan juta menarik mean jauh ke atas, padahal mayoritas karyawan tidak digambarkan angka itu. Median jauh lebih tahan: satu nilai ekstrem hanya menggeser posisi tengah sedikit. Dalam pipeline machine learning, pilihan mean atau median menentukan strategi imputasi nilai hilang pada data miring.
Sebaran: Varians dan Simpangan Baku #
Dua kolom bisa memiliki mean yang sama tetapi sebaran yang jauh berbeda. Varians mengukur lebar sebaran itu sebagai rata-rata kuadrat simpangan dari mean; simpangan baku adalah akarnya sehingga satuannya kembali sama dengan data asli. Simpangan baku inilah yang dipakai StandardScaler: transformasi z = (x − mean) / std menggeser pusat data ke 0 dan menyetel lebar sebaran ke 1, agar fitur berskala besar tidak mendominasi fitur berskala kecil saat model menghitung jarak.
Persentil, Kuartil, dan IQR #
Persentil ke-k adalah nilai yang dilewati persen k dari data setelah diurutkan — P90 gaji berarti 90 persen karyawan berpenghasilan di bawah angka itu. Tiga persentil khusus membagi data menjadi empat bagian sama besar: kuartil 1 (P25), median (P50), dan kuartil 3 (P75). Jarak P75 − P25 disebut IQR (interquartile range) dan menjadi ukuran sebaran yang tahan pencilan; pagar P25 − 1,5 × IQR dan P75 + 1,5 × IQR menjadi ambang baku deteksi pencilan yang akan kita pakai lagi di Section Persiapan Data.
File statistik-deskriptif.py merangkai seluruh ukuran tersebut pada data gaji sintetis, lalu memperlihatkan dua kejadian penting: dampak pencilan pada mean versus median, dan standardisasi manual yang hasilnya identik dengan StandardScaler.
# Statistik deskriptif dengan NumPy: ukuran pemusatan, sebaran, kuantil,
# pengaruh pencilan, dan standardisasi manual.
import numpy as np
rng = np.random.default_rng(42)
# Gaji bulanan (juta rupiah) 9 karyawan, ditarik dari bilangan bulat 5-14
gaji = rng.integers(low=5, high=15, size=9).astype(float)
print("Data gaji (juta rupiah):", gaji)
print("Terurut :", np.sort(gaji))
print(f"\nMean : {gaji.mean():.3f}")
print(f"Median : {np.median(gaji):.3f}")
print(f"Simpangan baku : {gaji.std():.3f}")
print(f"Std sampel (ddof=1): {gaji.std(ddof=1):.3f}")
print(f"Minimum : {gaji.min():.3f}")
print(f"Maksimum : {gaji.max():.3f}")
p25, p50, p75 = np.percentile(gaji, [25, 50, 75])
print(f"\nKuartil 1 (P25) : {p25:.3f}")
print(f"Median (P50) : {p50:.3f}")
print(f"Kuartil 3 (P75) : {p75:.3f}")
print(f"IQR (P75 - P25) : {p75 - p25:.3f}")
# Satu direktur bergaji 95 juta masuk ke daftar gaji
gaji_ekstrem = np.append(gaji, 95.0)
print("\nSetelah satu pencilan (95.0) ditambahkan:")
print(f"Mean : {gaji_ekstrem.mean():.3f} (naik tajam)")
print(f"Median : {np.median(gaji_ekstrem):.3f} (hampir tak bergeser)")
# Standardisasi manual seperti StandardScaler: z = (x - mean) / std
z = (gaji - gaji.mean()) / gaji.std()
print("\nStandardisasi manual z = (x - mean) / std:")
print(f"Mean z : {z.mean():.6f}")
print(f"Std z : {z.std():.6f}")
print("Data ternormalisasi:", np.round(z, 2))Output yang Dihasilkan:
Data gaji (juta rupiah): [ 5. 12. 11. 9. 9. 13. 5. 11. 7.]
Terurut : [ 5. 5. 7. 9. 9. 11. 11. 12. 13.]
Mean : 9.111
Median : 9.000
Simpangan baku : 2.767
Std sampel (ddof=1): 2.934
Minimum : 5.000
Maksimum : 13.000
Kuartil 1 (P25) : 7.000
Median (P50) : 9.000
Kuartil 3 (P75) : 11.000
IQR (P75 - P25) : 4.000
Setelah satu pencilan (95.0) ditambahkan:
Mean : 17.700 (naik tajam)
Median : 10.000 (hampir tak bergeser)
Standardisasi manual z = (x - mean) / std:
Mean z : 0.000000
Std z : 1.000000
Data ternormalisasi: [-1.49 1.04 0.68 -0.04 -0.04 1.41 -1.49 0.68 -0.76]Mari kita telaah baris-baris kode yang berperan penting:
- Baris 6 dan 9 (
default_rng(42)sertagaji = rng.integers(...)): data sintetis sembilan gaji dibuat dengan generator berseed sehingga hasilnya sama setiap dijalankan — prinsip reproduksibilitas yang dipakai sepanjang Course ini. - Baris 13–18: mean 9,111 hampir sama dengan median 9,000 karena data berdistribusi lumayan simetris. Perhatikan dua versi simpangan baku:
std()bawaan memakai pembagi n (versi populasi),std(ddof=1)memakai n − 1 (versi sampel) dan hasilnya sedikit lebih besar. - Baris 20–24 (
np.percentile): kuartil membentuk ringkasan lima angka bersama minimum dan maksimum; IQR sebesar 4,0 berarti 50 persen data tengah tersebar selebar itu. - Baris 26–30 (eksperimen pencilan): menambahkan satu nilai 95,0 melompatkan mean dari 9,111 ke 17,700 — hampir dua kali lipat — sedangkan median hanya bergeser dari 9,000 ke 10,000. Inilah alasan data gaji diringkas dengan median.
- Baris 32–37 (standardisasi manual): rumus z = (x − mean) / std mengembalikan mean tepat 0 dan simpangan baku tepat 1.
StandardScalermelakukan perhitungan yang persis sama di balik layarnya.
Korelasi Pearson #
Korelasi Pearson mengukur kekuatan hubungan linear antara dua variabel dengan koefisien r di rentang −1 sampai 1. Nilai mendekati +1 berarti kedua variabel naik bersama; mendekati −1 berarti satu naik saat yang lain turun; mendekati 0 berarti hubungan linearnya lemah. np.corrcoef menerima beberapa variabel sekaligus dan menghasilkan matriks simetris: diagonal selalu 1 karena setiap variabel berkorelasi sempurna dengan dirinya sendiri, sedangkan sel di luar diagonal memuat r antar pasangan variabel.
File korelasi.py menguji tiga variabel: jam belajar, nilai ujian, dan nomor sepatu sebagai pembanding yang tidak berhubungan.
# Korelasi Pearson dan cara membaca matriks korelasi.
import numpy as np
rng = np.random.default_rng(42)
n = 30
# Jam belajar per minggu vs nilai ujian: hubungan positif + derau
jam_belajar = rng.uniform(0.5, 9.5, size=n)
derau = rng.normal(0.0, 7.0, size=n)
nilai = 40.0 + 5.5 * jam_belajar + derau
# Variabel pembanding yang tidak berhubungan: nomor sepatu
nomor_sepatu = rng.uniform(36.0, 44.0, size=n)
# np.corrcoef menerima daftar variabel; tiap baris = satu variabel
matriks = np.corrcoef([jam_belajar, nilai, nomor_sepatu])
print("Matriks korelasi (urutan: jam_belajar, nilai, nomor_sepatu):")
print(np.round(matriks, 3))
r_belajar_nilai = matriks[0, 1]
r_belajar_sepatu = matriks[0, 2]
print(f"\nr(jam_belajar, nilai) = {r_belajar_nilai:.3f}")
print(f"r(jam_belajar, nomor_sepatu) = {r_belajar_sepatu:.3f}")
print(f"r(nilai, nomor_sepatu) = {matriks[1, 2]:.3f}")Output yang Dihasilkan:
Matriks korelasi (urutan: jam_belajar, nilai, nomor_sepatu):
[[ 1. 0.931 -0.18 ]
[ 0.931 1. -0.045]
[-0.18 -0.045 1. ]]
r(jam_belajar, nilai) = 0.931
r(jam_belajar, nomor_sepatu) = -0.180
r(nilai, nomor_sepatu) = -0.045Bedah kode di atas baris demi baris:
- Baris 9–11 (konstruksi hubungan): nilai ujian dibangun dari formula 40 + 5,5 × jam belajar ditambah derau normal berskala 7 — hubungan positif yang jelas tetapi tidak sempurna, meniru data dunia nyata.
- Baris 14 (
nomor_sepatu): variabel pembanding diambil seragam tanpa hubungan apa pun dengan dua variabel lainnya. - Baris 17–19 (
np.corrcoef): tiga variabel dimasukkan sebagai list; keluarannya matriks 3 × 3 yang dibulatkan tiga desimal agar mudah dibaca. - Baris 21–25 (pembacaan hasil): r(jam belajar, nilai) = 0,931 menandakan hubungan linear positif yang sangat kuat. Sebaliknya, r terhadap nomor sepatu hanya −0,180 dan −0,045 — nilai yang secara praktis dianggap nol pada sampel 30.
Dalam praktik machine learning, matriks korelasi dipakai untuk dua keputusan. Pertama, mendeteksi fitur yang saling tumpang tindih: dua kolom dengan r di atas 0,9 membawa informasi hampir sama, dan salah satu biasanya cukup dibuang untuk model linear agar koefisiennya stabil. Kedua, menilai kekuatan sinyal terhadap target sebelum melatih model. Satu peringatan klasik selalu berlaku: korelasi bukan bukti sebab-akibat — penjualan es krim dan kecelakaan renang berkorelasi karena keduanya dipengaruhi musim panas, bukan karena yang satu menyebabkan yang lain.
| Ukuran | Pertanyaan yang dijawab | Tahan pencilan | Peran di machine learning |
|---|---|---|---|
| Mean | Di mana pusat data? | Tidak | Pusat StandardScaler, imputasi |
| Median | Nilai tengah data? | Ya | Imputasi data miring |
| Simpangan baku | Seberapa lebar sebaran? | Tidak | Skala fitur pada StandardScaler |
| IQR | Lebar 50 persen data tengah? | Ya | Ambang deteksi pencilan |
| Korelasi r | Seberapa linear hubungan dua kolom? | Tidak | Seleksi fitur, deteksi redundansi |
Distribusi dan Sampling #
Statistik di atas meringkas data yang sudah ada; distribusi menggambarkan bentuk keseluruhannya. Dua bentuk yang paling sering muncul pada chapter-chapter berikutnya: distribusi normal (lonceng simetris di sekitar mean, seperti tinggi badan atau derau pengukuran) dan distribusi seragam (setiap nilai pada satu rentang sama seringnya, seperti yang dihasilkan rng.uniform). Sampling adalah proses menarik sebagian data dari populasi — dan karena sampel acak berbeda-beda, statistik sampel ikut bergoyang; seed tetap seperti default_rng(42) menjaga eksperimen kita dapat diulang dengan hasil identik. Bagaimana cara berpikir formal tentang peluang dan kejadian itulah materi Chapter Probabilitas Dasar untuk Machine Learning.
Referensi Resmi #
- numpy.percentile — NumPy API — dokumentasi resmi kuantil dan persentil.
- numpy.corrcoef — NumPy API — dokumentasi resmi koefisien korelasi Pearson.
- numpy.std — NumPy API — dokumentasi resmi simpangan baku beserta parameter ddof.
- Preprocessing data — scikit-learn User Guide — StandardScaler yang memakai mean dan simpangan baku.