Topik ini membahas pengambilan sampel dari distribusi yang paling sering digunakan melalui objek Generator, yaitu distribusi seragam, distribusi normal, bilangan bulat seragam, dan pemilihan nilai dari kumpulan yang tersedia. Setelah membacanya, parameter setiap metode dapat dihubungkan dengan sifat statistik sampel yang dihasilkan, dan ringkasan sampel dapat diperiksa terhadap parameter tersebut.
Distribusi seragam dengan uniform#
Distribusi seragam (uniform) memberikan peluang yang sama pada setiap nilai dalam satu rentang. Metode uniform(low, high, size) menghasilkan bilangan real pada rentang , sehingga batas bawah dapat muncul sedangkan batas atas tidak. Nilai harapan distribusi ini terletak di tengah rentang, yaitu . Tidak ada bagian rentang yang diutamakan, sehingga histogram sampelnya mendekati persegi panjang yang datar. Parameter size menerima bilangan bulat maupun tuple, sehingga array dua dimensi dapat dibuat dalam satu pemanggilan, misalnya size=(2, 3). Blok berikut mengambil seratus ribu sampel pada rentang 10 sampai 20, lalu meringkasnya.
import numpy as np
rng = np.random.default_rng(seed=7)
sampel = rng.uniform(low=10.0, high=20.0, size=100_000)
print(sampel[:5])
print(f"rata-rata sampel : {np.mean(sampel):.4f}")
print(f"minimum : {np.min(sampel):.4f}")
print(f"maksimum : {np.max(sampel):.4f}")[16.25095467 18.97213801 17.7568569 12.2520719 13.00166285]
rata-rata sampel : 15.0050
minimum : 10.0002
maksimum : 19.9999Rata-rata sampel 15.0050 hampir persis sama dengan nilai teoretis . Nilai minimum dan maksimum menempel pada kedua batas tanpa melewatinya, sesuai dengan rentang . Dengan seratus ribu sampel berseed, ringkasan ini stabil dan dapat diulang persis pada setiap eksekusi.
Distribusi normal dengan normal#
Distribusi normal adalah distribusi lonceng yang datanya terkonsentrasi di sekitar rata-rata. Notasi menyatakan sampel dengan rata-rata dan varians . Distribusi ini menjadi pilihan baku untuk memodelkan derau pengukuran maupun variasi alami yang mengelompok di sekitar rata-rata, sehingga metodenya muncul di hampir setiap alur statistik. Pada metode normal(loc, scale, size), parameter loc mengisi dan parameter scale mengisi simpangan baku . Satu sifat yang sering digunakan untuk memeriksa sampel: sekitar 68% nilai berada dalam satu simpangan baku dari rata-ratanya, yaitu pada rentang .
import numpy as np
rng = np.random.default_rng(seed=7)
sampel = rng.normal(loc=70.0, scale=8.0, size=100_000)
print(f"rata-rata sampel : {np.mean(sampel):.4f}")
print(f"simpangan baku sampel : {np.std(sampel):.4f}")
print(f"persentase di 62-78 : {np.mean((sampel >= 62.0) & (sampel <= 78.0)) * 100:.2f}")rata-rata sampel : 69.9894
simpangan baku sampel : 7.9864
persentase di 62-78 : 68.31Sampel seratus ribu nilai ujian dengan loc=70 dan scale=8 menghasilkan rata-rata 69.9894 serta simpangan baku 7.9864, masing-masing sangat dekat dengan parameternya. Persentase nilai pada rentang 62 sampai 78 tercatat 68.31%, konsisten dengan sifat 68% di atas. Perbandingan semacam ini adalah cara paling langsung untuk memastikan sampel mengikuti parameter yang diberikan.
Bilangan bulat dengan integers#
Metode integers(low, high, size) menghasilkan bilangan bulat yang seragam pada rentang . Untuk menirukan dadu enam sisi, rentangnya adalah 1 sampai 7, atau gunakan rentang 1 sampai 6 dengan endpoint=True. Parameter size menerima tuple untuk array multidimensi, dan seluruh nilai memiliki peluang yang sama karena distribusinya seragam. Hasilnya bertipe bilangan bulat 64 bit secara default pada lingkungan 64 bit, sehingga array berukuran besar tetap ringan di memori. Frekuensi kemunculan setiap nilai dihitung dengan np.bincount, yang hanya menerima nilai tidak negatif, sehingga rentang yang memuat bilangan negatif perlu digeser terlebih dahulu. Keseragaman dadu kemudian diperiksa langsung dari frekuensinya.
import numpy as np
rng = np.random.default_rng(seed=7)
lemparan = rng.integers(low=1, high=7, size=60_000)
frekuensi = np.bincount(lemparan)[1:]
for muka, hitung in enumerate(frekuensi, start=1):
print(f"muka {muka}: {hitung}")muka 1: 9899
muka 2: 9981
muka 3: 9959
muka 4: 9876
muka 5: 10153
muka 6: 10132Setiap muka dadu muncul sekitar sepuluh ribu kali dari total 60.000 lemparan. Selisih antar muka berada pada kisaran ratusan, dan selisih sebesar itu wajar untuk sampel acak dengan ukuran ini. Apabila jumlah sampel diperbesar, frekuensi antar muka saling mendekat, tetapi selisih kecil terhadap jumlah ideal tidak pernah hilang sepenuhnya.
Memilih sampel dengan choice#
Metode choice(a, size, replace, p) memilih nilai dari kumpulan a. Parameter replace menentukan apakah satu nilai boleh terpilih lebih dari sekali. Pada mode tanpa pengembalian (without replacement), ukuran sampel tidak boleh melebihi banyaknya nilai yang tersedia. Parameter p menerima bobot peluang untuk setiap nilai, dengan jumlah yang harus tepat satu. Keluaran selalu berbentuk array dengan bentuk size, dan pemanggilan tanpa size mengembalikan satu nilai saja. Pola penggunaan yang lazim antara lain memilih indeks baris untuk penarikan contoh ulang (bootstrap) dan memilih langkah berikutnya pada simulasi berbasis peluang.
import numpy as np
rng = np.random.default_rng(seed=7)
nama = np.array(["Ali", "Budi", "Citra", "Dewi"])
print(rng.choice(nama, size=3, replace=False))
print(rng.choice(nama, size=6, replace=True))
print(rng.choice([10, 20, 30, 40], size=8, p=[0.5, 0.25, 0.125, 0.125]))['Budi' 'Citra' 'Dewi']
['Dewi' 'Dewi' 'Ali' 'Ali' 'Budi' 'Budi']
[10 30 30 10 10 10 10 10]Baris pertama memilih tiga nama berbeda tanpa pengembalian. Baris kedua mengizinkan pengembalian, sehingga nama yang sama muncul berulang. Baris ketiga memberi bobot 0.5 pada nilai 10 dan bobot yang lebih kecil pada nilai lainnya, sehingga nilai 10 mendominasi keluaran. Kumpulan a boleh berupa array string maupun array angka.
Kesalahan umum#
Meminta lebih banyak sampel daripada banyaknya nilai yang tersedia pada mode tanpa pengembalian. Pemanggilan semacam ini memicu ValueError karena tidak ada cukup nilai yang berbeda untuk diambil, dan ukuran populasi yang dimaksud adalah banyaknya elemen kumpulan a, bukan rentang nilainya. Blok berikut menunjukkan pesan errornya.
import numpy as np
rng = np.random.default_rng(seed=7)
try:
sampel = rng.choice(np.arange(5), size=10, replace=False)
except ValueError as e:
print(f"{type(e).__name__}: {e}")ValueError: Cannot take a larger sample than population when replace is FalsePerbaikannya adalah memperbesar kumpulan nilai, mengecilkan size, atau mengatur replace=True apabila pengembalian memang diizinkan. Kesalahan serupa juga muncul apabila bobot p tidak berjumlah tepat satu, misalnya bobot 0.5, 0.2, 0.2, dan 0.2 yang jumlahnya 1.1. NumPy memeriksa jumlah bobot dengan toleransi yang ketat, sehingga bobot perlu diperiksa dengan np.sum terlebih dahulu bila bobotnya dihitung dinamis.
Menggunakan fungsi warisan karena contoh lama memuatnya. Fungsi seperti np.random.randint() bekerja pada state global dan tidak digunakan pada kode baru. Padanannya pada Generator adalah integers, sedangkan np.random.rand() dipetakan ke random dan np.random.randn() dipetakan ke normal. Mengetahui pemetaan ini memudahkan membaca kode lama tanpa menularkannya ke kode baru. Hasil API warisan dan Generator juga tidak dapat dibandingkan langsung meskipun seednya sama, karena algoritma di balik keduanya berbeda.
Ringkasan#
- Metode
uniform,normal,integers, danchoicemencakup sampel seragam real, normal, bulat seragam, dan pemilihan nilai. - Parameter distribusi terbaca kembali pada ringkasan sampel: rata-rata mendekati
locatau tengah rentang, dan simpangan baku mendekatiscale. - Rentang pada
uniformdanintegersbersifat setengah terbuka, sehingga batas atas tidak ikut diambil. choicemengatur pengembalian melaluireplacedan bobot peluang melaluip, dengan jumlah bobot yang harus tepat satu.
Referensi#
- numpy.random.Generator — NumPy — Dokumentasi kelas Generator beserta seluruh metode distribusinya.
- numpy.random.Generator.normal — NumPy
— Rincian parameter
loc,scale, dansizepada metode normal. - numpy.random.Generator.choice — NumPy
— Rincian parameter
a,replace, danppada metode choice.