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):

python
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:

text
mean   : 80.0
average: 80.0
weighted      : 79.0
manual        : 79.0
bobot skala 5x: 79.0

Mari kita bedah baris demi baris:

  1. Baris 5-6: tanpa bobot, np.average dan np.mean menghasilkan 80.0 yang identik.
  2. Baris 8: bobot merepresentasikan komposisi penilaian — ujian akhir 50%, tugas 30%, kuis 20%.
  3. Baris 10 (np.average(..., weights=bobot)): perhitungannya 80 × 0.5 + 70 × 0.3 + 90 × 0.2 = 40 + 21 + 18 = 79.0; komposisi inilah yang menurunkan hasil dari 80.0 menjadi 79.0.
  4. Baris 11 (manual): rumus yang dihitung manual memberikan hasil sama, membuktikan definisi rata-rata berbobot.
  5. Baris 15: bobot [5, 3, 2] proporsional dengan [0.5, 0.3, 0.2] dan menghasilkan 79.0 juga — np.average menormalkan 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):

python
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:

text
IP        : 3.4444444444444446
total sks : 9.0
manual    : 3.4444444444444446

Yang perlu kita perhatikan:

  1. Baris 3-4: skor dan sks sejajar per mata kuliah — mata kuliah pertama bernilai 3.0 dengan bobot 3 SKS, dan seterusnya.
  2. Baris 6 (returned=True): fungsi mengembalikan dua nilai yang langsung kita bongkar ke ip dan total_sks; tanpa parameter tersebut hanya hasil rata-rata yang dikembalikan.
  3. 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.
  4. Baris 9: total_sks = 9.0 adalah Σ(bobot) yang dihitung di dalam fungsi, sehingga kita tidak perlu memanggil np.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:

python
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:

text
bobot sama : 80.0
mean       : 80.0
per baris    : [79. 76.]
jumlah bobot : [1. 1.]

Membaca hasil tersebut:

  1. Baris 4-5: bobot seragam np.ones(3) menghasilkan 80.0 — sama persis dengan np.mean; identitas ini menjadi patokan bahwa bobot memang mengubah hasil hanya bila nilainya tidak seragam.
  2. Baris 13 (axis=1): rata-rata berbobot dihitung antar kolom untuk tiap baris; baris pertama menghasilkan 40 + 21 + 18 = 79.0 dan baris kedua 37.5 + 25.5 + 13 = 76.0.
  3. Baris 15: jumlah_bobot berupa array [1. 1.] — satu nilai untuk tiap baris; karena bobot sudah berjumlah 1, sum_of_weights per baris adalah 1.0, berbeda dengan 9.0 pada contoh SKS sebelumnya.

Sebagai rangkuman, tabel berikut membandingkan kedua fungsi rata-rata yang kita pakai sejak Chapter mean, median, dan percentile:

Aspeknp.meannp.average
Bobot elemensemua elemen setaraparameter weights opsional
Hasil tanpa bobotrata-rata biasasama persis dengan np.mean
Laporan jumlah bobottidak tersediareturned=True mengembalikan sum_of_weights
axis + weights pada 2-Dtidak didukungdidukung