Rata-rata biasa menganggap semua komponen sama pentingnya. Kenyataan tidak selalu demikian: nilai ujian akhir biasanya lebih menentukan daripada kuis, dan mata kuliah 4 SKS berbobot lebih besar daripada yang 2 SKS. Untuk kebutuhan semacam ini NumPy menyediakan np.average — fungsi rata-rata yang menerima bobot (weights) opsional. Bab ini menelusuri perilakunya tanpa bobot, dengan bobot, hingga perhitungan berbasis axis pada array 2-D.
average Tanpa Bobot Sama dengan mean #
Tanpa argumen weights, np.average menghitung rata-rata biasa dan hasilnya sama persis dengan np.mean. Begitu weights diberikan, fungsi tersebut menghitung rata-rata berbobot dengan rumus Σ(nilai × bobot) / Σ(bobot):
import numpy as np
nilai = np.array([80, 70, 90])
print("mean :", np.mean(nilai))
print("average:", np.average(nilai))
bobot = np.array([0.5, 0.3, 0.2]) # ujian akhir, tugas, kuis
rata_bobot = np.average(nilai, weights=bobot)
manual = np.sum(nilai * bobot) / np.sum(bobot)
print("weighted :", rata_bobot)
print("manual :", manual)
print("bobot skala 5x:", np.average(nilai, weights=np.array([5, 3, 2])))Output yang Dihasilkan:
mean : 80.0
average: 80.0
weighted : 79.0
manual : 79.0
bobot skala 5x: 79.0Mari kita bedah baris demi baris:
- Baris 5-6: tanpa bobot,
np.averagedannp.meanmenghasilkan80.0yang identik. - Baris 8: bobot merepresentasikan komposisi penilaian — ujian akhir 50%, tugas 30%, kuis 20%.
- Baris 10 (
np.average(..., weights=bobot)): perhitungannya80 × 0.5 + 70 × 0.3 + 90 × 0.2 = 40 + 21 + 18 = 79.0; komposisi inilah yang menurunkan hasil dari80.0menjadi79.0. - Baris 11 (
manual): rumus yang dihitung manual memberikan hasil sama, membuktikan definisi rata-rata berbobot. - Baris 15: bobot
[5, 3, 2]proporsional dengan[0.5, 0.3, 0.2]dan menghasilkan79.0juga —np.averagemenormalkan bobot secara otomatis denganΣ(bobot).
Laporan IP dengan returned=True #
Kasus nyata yang sering muncul: menghitung IP (indeks prestasi) dari skor per mata kuliah berbobot SKS, sekaligus melaporkan total SKS-nya. Parameter returned=True membuat np.average mengembalikan tuple berisi dua nilai — hasil rata-rata berbobot dan jumlah bobot (sum_of_weights):
import numpy as np
skor = np.array([3.0, 4.0, 3.5]) # skor per mata kuliah
sks = np.array([3, 2, 4])
ip, total_sks = np.average(skor, weights=sks, returned=True)
print("IP :", ip)
print("total sks :", total_sks)
print("manual :", np.sum(skor * sks) / np.sum(sks))Output yang Dihasilkan:
IP : 3.4444444444444446
total sks : 9.0
manual : 3.4444444444444446Yang perlu kita perhatikan:
- Baris 3-4:
skordanskssejajar per mata kuliah — mata kuliah pertama bernilai3.0dengan bobot3SKS, dan seterusnya. - Baris 6 (
returned=True): fungsi mengembalikan dua nilai yang langsung kita bongkar keipdantotal_sks; tanpa parameter tersebut hanya hasil rata-rata yang dikembalikan. - Baris 8: IP dihitung sebagai
(3.0 × 3 + 4.0 × 2 + 3.5 × 4) / 9 = 31 / 9 = 3.4444444444444446— angka panjang di belakang koma adalah perilaku normal presisi float64. - Baris 9:
total_sks = 9.0adalahΣ(bobot)yang dihitung di dalam fungsi, sehingga kita tidak perlu memanggilnp.sum(sks)terpisah hanya untuk pelaporan.
Bobot Sama dan axis pada Array 2-D #
Dua sifat menutup bab ini. Pertama, bila semua bobot bernilai sama, rata-rata berbobot kembali menjadi rata-rata biasa. Kedua, np.average mendukung axis pada array 2-D dengan bobot — bobot dipakai sepanjang axis yang dipilih:
import numpy as np
nilai = np.array([80, 70, 90])
print("bobot sama :", np.average(nilai, weights=np.ones(3)))
print("mean :", np.mean(nilai))
tabel = np.array([
[80, 70, 90],
[75, 85, 65],
]) # baris: mahasiswa, kolom: mata kuliah
bobot = np.array([0.5, 0.3, 0.2])
hasil, jumlah_bobot = np.average(tabel, axis=1, weights=bobot, returned=True)
print("per baris :", hasil)
print("jumlah bobot :", jumlah_bobot)Output yang Dihasilkan:
bobot sama : 80.0
mean : 80.0
per baris : [79. 76.]
jumlah bobot : [1. 1.]Membaca hasil tersebut:
- Baris 4-5: bobot seragam
np.ones(3)menghasilkan80.0— sama persis dengannp.mean; identitas ini menjadi patokan bahwa bobot memang mengubah hasil hanya bila nilainya tidak seragam. - Baris 13 (
axis=1): rata-rata berbobot dihitung antar kolom untuk tiap baris; baris pertama menghasilkan40 + 21 + 18 = 79.0dan baris kedua37.5 + 25.5 + 13 = 76.0. - Baris 15:
jumlah_bobotberupa array[1. 1.]— satu nilai untuk tiap baris; karena bobot sudah berjumlah 1,sum_of_weightsper baris adalah1.0, berbeda dengan9.0pada contoh SKS sebelumnya.
Sebagai rangkuman, tabel berikut membandingkan kedua fungsi rata-rata yang kita pakai sejak Chapter mean, median, dan percentile:
| Aspek | np.mean | np.average |
|---|---|---|
| Bobot elemen | semua elemen setara | parameter weights opsional |
| Hasil tanpa bobot | rata-rata biasa | sama persis dengan np.mean |
| Laporan jumlah bobot | tidak tersedia | returned=True mengembalikan sum_of_weights |
| axis + weights pada 2-D | tidak didukung | didukung |