Deret waktu dari sensor, pencatatan stok, dan hasil pengukuran laboratorium sering memiliki celah: pembacaan tertentu gagal direkam, atau pengukuran diambil dengan jarak yang tidak rata. Daripada membuang seluruh baris data, kita bisa memperkirakan nilai di antara dua titik yang diketahui. Teknik paling sederhana adalah interpolasi linear, dan di NumPy fungsi ini siap pakai sebagai np.interp.
Cara Kerja np.interp #
Fungsi np.interp(x_baru, xp, fp) menerima tiga argumen: titik yang ingin dicari (x_baru), titik acuan yang sudah diketahui (xp), dan nilainya (fp). NumPy menghubungkan dua titik acuan yang mengapit x_baru dengan garis lurus, lalu membaca nilai pada posisi tersebut:
import numpy as np
xp = np.array([0.0, 10.0, 20.0])
fp = np.array([0.0, 100.0, 180.0])
x_baru = np.array([5.0, 12.5, 20.0])
print(np.interp(x_baru, xp, fp))Output yang Dihasilkan:
[ 50. 120. 180.]Mari kita periksa perhitungannya:
- Baris 3-4 (
xpdanfp): titik acuan berupa pasangan(0, 0),(10, 100), dan(20, 180);xpwajib berisi nilai yang meningkat (increasing). - Titik 5.0: berada di antara 0 dan 10, tepat di tengah segmen, sehingga hasilnya
50.0. - Titik 12.5: berada di segmen 10-20. NumPy menghitung
100 + (12.5 - 10) * (180 - 100) / (20 - 10) = 120.0, yaitu nilai awal ditambah proporsi jarak dikali kemiringan segmen. - Titik 20.0: sama persis dengan titik acuan terakhir, sehingga dikembalikan
180.0tanpa perubahan.
Nilai di Luar Rentang: Menjepit ke Ujung #
Perilaku np.interp di luar rentang xp perlu dipahami dengan baik: fungsi ini tidak mengekstrapolasi dan tidak error. Nilai di luar rentang dijepit ke nilai ujung yang terdekat:
import numpy as np
xp = np.array([0.0, 10.0, 20.0])
fp = np.array([0.0, 100.0, 180.0])
print(np.interp(np.array([-5.0, 25.0]), xp, fp))
print(np.interp(np.array([-5.0, 25.0]), xp, fp, left=-1.0, right=999.0))Output yang Dihasilkan:
[ 0. 180.]
[ -1. 999.]Baris pertama menunjukkan perilaku default: -5.0 menghasilkan 0.0 (nilai ujung kiri) dan 25.0 menghasilkan 180.0 (nilai ujung kanan). Bila perilaku ini tidak diinginkan, parameter left dan right mengganti nilai penggantinya, seperti pada baris kedua.
Mengisi Pembacaan Sensor yang Hilang #
Kasus nyata: sensor suhu mencatat data tiap jam, tetapi dua pembacaan gagal dan tersimpan sebagai nan. Kita isi celah tersebut dengan interpolasi dari pembacaan yang valid:
import numpy as np
jam = np.array([8.0, 9.0, 10.0, 11.0, 12.0])
suhu = np.array([26.0, np.nan, 29.0, np.nan, 33.0])
mask = np.isnan(suhu)
suhu[mask] = np.interp(jam[mask], jam[~mask], suhu[~mask])
print(suhu)Output yang Dihasilkan:
[26. 27.5 29. 31. 33. ]Bedah baris demi baris:
- Baris 3-4: deret asli memuat dua
nanpada jam 9 dan jam 11. - Baris 5 (
mask = np.isnan(suhu)): boolean mask menandai posisi nilai yang hilang. - Baris 6 (
np.interp(jam[mask], jam[~mask], suhu[~mask])): fungsi hanya menerima titik valid (~maskberarti “bukan nan”), lalu menghitung taksiran untuk jam yang hilang: jam 9 berada tepat di tengah 26.0 dan 29.0, menghasilkan27.5; jam 11 berada di tengah 29.0 dan 33.0, menghasilkan31.0. - Penugasan
suhu[mask] = ...: nilainandigantikan langsung di array asli, dan deret kembali utuh.
Tabel berikut membandingkan deret sebelum dan sesudah pengisian:
| Jam | Suhu asli | Suhu hasil |
|---|---|---|
| 8 | 26.0 | 26.0 |
| 9 | nan | 27.5 |
| 10 | 29.0 | 29.0 |
| 11 | nan | 31.0 |
| 12 | 33.0 | 33.0 |
Pendekatan ini menjaga panjang deret tetap sama sehingga aman untuk perhitungan lanjutan seperti rata-rata bergulir. Perlu diingat, nilai hasil interpolasi adalah taksiran linear — pada data yang bergerak melengkung tajam, metode yang lebih halus seperti spline akan memberi hasil lebih akurat.