Sebelum menghitung apa pun dari sebuah data, kita perlu tahu berapa banyak nilai yang benar-benar bisa dipercaya. Contoh nyata: logger suhu ruang server merekam delapan pembacaan per jam, tetapi listrik padam beberapa saat sehingga sebagian sel tidak terisi dan masuk ke NumPy sebagai nan (diperkenalkan pada Chapter NaN dan Infinity).

Menghitung nilai valid dan tidak valid adalah langkah pertama penilaian kualitas data. Pola dasarnya pendek: buat mask deteksi dengan np.isnan atau np.isfinite, lalu jumlahkan mask-nya. Bab ini memakai pola itu untuk menyusun laporan kualitas data yang cepat dan tetap jujur ketika data juga memuat inf.

Menghitung Nilai Valid dan Tidak Valid #

python
import numpy as np

suhu = np.array([27.5, np.nan, 29.1, np.nan, np.nan, 26.8, 28.4, 30.0])
print(np.isnan(suhu))
print(np.isnan(suhu).sum())
print(np.isfinite(suhu).sum())
print(np.isfinite(suhu).mean())

Output yang Dihasilkan:

text
[False  True False  True  True False False False]
3
5
0.625

Mari kita bedah:

  1. Baris 3: delapan pembacaan suhu; posisi ke-1, ke-3, dan ke-4 tidak terisi sehingga bernilai nan.
  2. Baris 4-5: np.isnan(suhu) menghasilkan mask boolean, dan penjumlahan mask menghitung True sebagai 1 — terdapat 3 pembacaan yang hilang.
  3. Baris 6: np.isfinite menghitung kebalikannya, yaitu 5 nilai berhingga yang sah.
  4. Baris 7: .mean() pada mask boolean menghasilkan fraksi valid 5/8 = 0.625 — sekitar 62,5 persen data bisa dipercaya.

Laporan Kualitas Data Cepat #

Pola di atas layak disusun menjadi laporan ringkas yang dicetak setiap kali data baru masuk, sebelum statistik apa pun dihitung:

python
import numpy as np

suhu = np.array([27.5, np.nan, 29.1, np.nan, np.nan, 26.8, 28.4, 30.0])
jumlah_nan = int(np.isnan(suhu).sum())
jumlah_valid = int(np.isfinite(suhu).sum())

print("== Laporan Kualitas Data Suhu ==")
print("Total pembacaan   :", suhu.size)
print("Nilai valid       :", jumlah_valid)
print("Nilai NaN         :", jumlah_nan)
print("Fraksi valid      :", jumlah_valid / suhu.size)

Output yang Dihasilkan:

text
== Laporan Kualitas Data Suhu ==
Total pembacaan   : 8
Nilai valid       : 5
Nilai NaN         : 3
Fraksi valid      : 0.625

Penjelasan singkat:

  1. Baris 4-5: hasil penjumlahan mask dibungkus int() agar angka di laporan tampil sebagai bilangan bulat biasa, bukan np.int64.
  2. Baris 8-11: empat angka inti kualitas data — total, valid, tidak valid, dan fraksinya — semuanya berasal dari dua mask yang sama.

Laporan semacam ini menjawab tiga pertanyaan kualitas data sekaligus:

  1. Berapa banyak nilai yang tidak valid, agar kita tahu skala masalahnya.
  2. Seberapa besar porsi yang valid, agar keputusan buang atau isi bisa dibangun di atas angka.
  3. Apa jenis nilai tidak validnya — nan, inf, atau keduanya — agar metode pembersihannya tepat.

NaN Bukan Satu-satunya Nilai Tidak Valid #

np.isnan hanya mengenali nan. Bila data berpotensi memuat inf — misalnya dari pembagian nol saat preprocessing — penghitung valid yang paling aman adalah np.isfinite, karena fungsi ini hanya menghitung nilai berhingga:

python
import numpy as np

tegangan = np.array([220.0, np.nan, np.inf, 225.5])
print("isnan   :", np.isnan(tegangan).sum())
print("isinf   :", np.isinf(tegangan).sum())
print("isfinite:", np.isfinite(tegangan).sum())
print("size - isnan =", tegangan.size - np.isnan(tegangan).sum())

Output yang Dihasilkan:

text
isnan   : 1
isinf   : 1
isfinite: 2
size - isnan = 3

Hasil di atas memperlihatkan mengapa pemilihan detektor itu penting:

EkspresiYang dihitungHasil pada tegangan
np.isnan(x).sum()hanya nan1
np.isinf(x).sum()inf dan -inf1
np.isfinite(x).sum()nilai berhingga (valid)2
x.size - np.isnan(x).sum()semua yang tidak valid (nan + inf)3

Jika kita mengira semua nilai tidak valid di data ini berupa nan, angka size - isnan (= 3) akan dibaca sebagai jumlah nilai valid — padahal yang benar-benar valid hanya 2. Selisih satu itu adalah inf yang luput dari np.isnan.

Bila data hanya memuat nan, angka dari np.isnan dan np.isfinite saling melengkapi (3 + 5 = 8). Begitu inf mungkin ada di data, hanya np.isfinite yang menghitung nilai valid dengan benar. Aturan pemilihan detektor ini akan terus kita pakai pada bab-bab filtering dan penggantian nilai.