Dua kelas bisa memiliki rata-rata nilai yang sama persis, tetapi satu kelas nilainya seragam sedangkan kelas lain lompat-lompat dari 60 ke 100. Mean menyamarkan perbedaan semacam itu. Untuk mengukur seberapa renggang data dari pusatnya, kita membutuhkan variance dan standard deviation.

Bab ini menelusuri keduanya secara berurutan: definisi variance sebagai rata-rata kuadrat selisih, hubungan std == sqrt(var), perbedaan ddof=0 (populasi) dan ddof=1 (sampel), lalu pemakaian std untuk membandingkan sebaran dua kelompok data.

Variance: Rata-rata Kuadrat Selisih dari Mean #

Variance didefinisikan sebagai rata-rata dari kuadrat selisih tiap data terhadap mean. Kita hitung dulu secara manual, lalu bandingkan dengan var():

python
import numpy as np

nilai = np.array([70, 75, 80, 85, 90])
selisih = nilai - nilai.mean()
print(selisih)
print(np.mean(selisih ** 2))
print(nilai.var())

Output yang Dihasilkan:

text
[-10.  -5.   0.   5.  10.]
50.0
50.0

Bedah baris demi baris:

  1. Baris 3 (selisih = nilai - nilai.mean()): mean dari data adalah 80.0. Broadcasting (dibahas pada Chapter Pengenalan Broadcasting) mengurangkan 80.0 dari tiap elemen sekaligus, menghasilkan jarak tiap nilai terhadap pusatnya: [-10. -5. 0. 5. 10.].
  2. Baris 4 (np.mean(selisih ** 2)): tiap selisih dikuadratkan agar selisih negatif dan positif tidak saling meniadakan, lalu dikuadratkan rata-ratanya: (100 + 25 + 0 + 25 + 100) / 5 = 50.0. Inilah variance.
  3. Baris 5 (nilai.var()): method .var() melakukan persis kedua langkah itu dalam satu panggilan; hasilnya identik, 50.0.

Bila selisih dirata-rata tanpa dikuadratkan, hasilnya selalu 0.0 karena selisih negatif dan positif saling menutup — itulah alasan langkah kuadrat tidak bisa dilewatkan.

Satuan variance adalah satuan data kuadrat (poin kuadrat, rupiah kuadrat), dan angka 50.0 sulit ditafsirkan langsung. Di sinilah standard deviation masuk.

Standard Deviation: Akar dari Variance #

Standard deviation (simpangan baku) adalah akar kuadrat dari variance, sehingga satuannya kembali ke satuan data asli:

python
import numpy as np

nilai = np.array([70, 75, 80, 85, 90])
print(nilai.std())
print(np.sqrt(nilai.var()))
print(nilai.std() == np.sqrt(nilai.var()))

Output yang Dihasilkan:

text
7.0710678118654755
7.0710678118654755
True

Dua baris pertama menunjukkan std dan sqrt(var) memberi angka yang sama persis, dan baris ketiga membuktikannya dengan perbandingan == yang menghasilkan True — hubungan ini berlaku untuk ddof apa pun, bukan kebetulan pada data ini.

Dengan satuan yang kembali ke poin, hasilnya mudah dibaca: sebaran data bergerak tipikal sekitar 7 poin dari mean 80. Nilai 70 menyimpang 10 poin (lebih dari satu std), sedangkan nilai 75 menyimpang 5 poin (kurang dari satu std). Perbandingan sederhana seperti ini jauh lebih intuitif dibanding membaca variance 50.0 dalam satuan poin kuadrat.

ddof=0 dan ddof=1: Populasi vs Sampel #

Variance memiliki dua konvensi pembagi: membagi dengan N (seluruh data dianggap populasi) atau membagi dengan N - 1 (data dianggap sampel dari populasi yang lebih besar). NumPy mengatur lewat parameter ddof (delta degrees of freedom): default ddof=0 membagi N, sedangkan ddof=1 membagi N - 1:

python
import numpy as np

nilai = np.array([70, 75, 80, 85, 90])
print(nilai.var(), nilai.std())
print(nilai.var(ddof=1), nilai.std(ddof=1))

Output yang Dihasilkan:

text
50.0 7.0710678118654755
62.5 7.905694150420948

Angkanya memang berbeda, dan perbedaan itu makin kecil bila data makin banyak. Tabel berikut merangkum keduanya:

PemanggilanPembagiKonteks datavariancestd
nilai.var() / nilai.std()N = 5populasi utuh50.07.0710678118654755
nilai.var(ddof=1) / nilai.std(ddof=1)N - 1 = 4sampel62.57.905694150420948

Kapan ddof=1 dipakai? Bila lima nilai di atas adalah lima sampel acak dari seluruh populasi siswa, variance populasi tidak bisa dihitung langsung; sampel cenderung lebih rapat ke mean-nya sendiri daripada ke mean populasi, dan pembagi N - 1 mengoreksi kecenderungan variance sampel yang terlalu kecil.

Membandingkan Sebaran dengan std #

Keunggulan std paling terasa saat membandingkan dua kelompok data yang rata-ratanya sama:

python
import numpy as np

kelas_a = np.array([70, 75, 80, 85, 90])
kelas_b = np.array([60, 70, 80, 90, 100])
print(kelas_a.mean(), kelas_b.mean())
print(kelas_a.std())
print(kelas_b.std())

Output yang Dihasilkan:

text
80.0 80.0
7.0710678118654755
14.142135623730951

Mean kedua kelas sama persis, 80.0, tetapi std kelas B dua kali lipat std kelas A: 14.142135623730951 berbanding 7.0710678118654755. Nilai kelas B menyimpang dari mean dengan jarak tipikal 14 poin, dua kali lebih renggang daripada kelas A.

Variance juga bisa dipakai untuk perbandingan yang sama (50.0 berbanding 200.0), tetapi satuan kuadratnya membuat interpretasi kurang langsung. Inilah alasan std lebih sering dilaporkan: satuannya sama dengan data, sehingga bisa dibandingkan langsung dengan mean. Untuk melihat sebaran per baris atau per kolom pada array dua dimensi, kedua fungsi ini menerima parameter axis dengan aturan yang sama seperti dibahas pada Chapter Operasi Berdasarkan Axis.