Kualitas Data

Dampak kualitas data terhadap model dengan contoh nyata: nilai hilang, duplikat, dan label yang salah.

Daftar isi

Model machine learning mengoptimalkan pola yang terdapat pada data yang diberikan, termasuk pola yang salah. Prinsip garbage in, garbage out menyatakan hal itu sebagai fakta mekanis, bukan peringatan moral, sehingga kualitas data perlu diperiksa sebelum algoritma mana pun dipilih. Topik ini membahas lima kategori masalah kualitas data yang paling sering ditemui, yaitu nilai hilang, baris duplikat, label yang salah, satuan campur, dan outlier (nilai yang jauh dari kelompoknya). Pemeriksaan dan perbaikan dipraktikkan pada dataset kecil catatan sensor suhu menggunakan pandas, sehingga setiap langkah dapat diulang pada data sendiri.

Kategori masalah pada data tabular#

Setiap kategori masalah bekerja melalui mekanisme yang berbeda, sehingga penanganannya juga berbeda. Kelimanya sering muncul bersamaan pada satu tabel kecil. Dataset contoh pada topik ini sengaja memuat satu contoh dari setiap masalah agar deteksi dan perbaikannya dapat diamati dari awal hingga akhir. Tabel di akhir bagian merangkum dampak setiap kategori pada pelatihan beserta langkah pertama penanganannya.

  • Nilai hilang (missing value) terjadi ketika sel tidak terisi, misalnya karena sensor gagal membaca atau kolom tidak wajib diisi. Pilihan penanganannya ada tiga, yaitu membuang barisnya, mengisi nilai dengan statistik seperti median, atau menjadikan kehilangan itu sendiri sebagai sinyal melalui kolom indikator.
  • Baris duplikat terjadi ketika satu contoh tercatat dua kali, misalnya karena sensor mengirim ulang data yang sama. Model yang meminimalkan error total akan memberi bobot dua kali lipat pada contoh tersebut.
  • Label yang salah berarti target pelatihan tidak sesuai kenyataan. Batas keputusan yang dibentuk model mengikuti label itu, sehingga satu label keliru dapat menggeser prediksi pada contoh di sekitarnya.
  • Satuan campur terjadi ketika sebagian baris ditulis dalam satuan berbeda pada kolom yang sama, misalnya suhu dalam Fahrenheit sementara sisanya Celsius. Bagi model, nilai tersebut terlihat seperti ekstrem.
  • Outlier adalah nilai yang jauh dari kelompok nilai lain pada satu kolom. Outlier dapat berupa kesalahan pencatatan atau kejadian nyata, sehingga penyebabnya diselidiki terlebih dahulu sebelum nilai itu dibuang.
KategoriDampak pada pelatihanLangkah pertama
Nilai hilangBaris dibuang atau diisi, keduanya mengubah distribusiHitung jumlahnya per kolom
DuplikatSatu contoh terbobot lebih dari satu kaliHitung duplicated().sum()
Label salahBatas keputusan bergeser ke arah label keliruTinjau contoh acak per label
Satuan campurNilai ekstrem semu pada satu kolomPeriksa rentang nilai kolom
OutlierKoefisien dan statistik tergeserBandingkan median dengan rata-rata

Berkas contoh dan pemeriksaan pertama#

Dataset contoh berisi catatan sensor suhu dari dua gudang. Setiap baris memuat penanda catatan, waktu pencatatan, lokasi, suhu dalam Celsius pada kolom suhu_c, kelembapan, dan label kondisi yang menjadi target. Berkas berikut menyimpan empat belas baris data dengan empat masalah yang sengaja ditanam, yaitu satu nilai hilang, satu baris duplikat, satu satuan campur, dan satu label yang bertentangan dengan suhunya.

csv data-catatan.csv
id_catatan,waktu,lokasi,suhu_c,kelembapan,kondisi
1,2024-03-01 08:00,gudang-a,24.1,60,normal
2,2024-03-01 09:00,gudang-a,24.3,61,normal
3,2024-03-01 10:00,gudang-a,,63,normal
4,2024-03-01 11:00,gudang-b,25.8,58,normal
5,2024-03-01 12:00,gudang-b,26.2,57,normal
6,2024-03-01 13:00,gudang-b,26.0,58,normal
7,2024-03-01 14:00,gudang-a,25.1,60,normal
8,2024-03-01 15:00,gudang-a,25.3,59,normal
9,2024-03-01 16:00,gudang-b,77.0,56,normal
10,2024-03-01 17:00,gudang-b,26.4,58,normal
11,2024-03-01 18:00,gudang-a,25.0,60,beku
12,2024-03-01 19:00,gudang-a,24.8,61,normal
13,2024-03-01 20:00,gudang-b,26.1,59,normal
13,2024-03-01 20:00,gudang-b,26.1,59,normal

Pemeriksaan pertama tidak memerlukan grafik apa pun. Jumlah nilai hilang per kolom, jumlah baris duplikat, distribusi label, dan statistik deskriptif kolom numerik sudah menyingkap sebagian besar masalah. Skrip berikut menjalankan pemeriksaan tersebut sekaligus.

python cek-kualitas.py
import pandas as pd

pd.set_option("display.width", 80)

df = pd.read_csv("data-catatan.csv")

print(f"Jumlah baris: {len(df)}")
print()
print("Nilai hilang per kolom:")
print(df.isna().sum())
print()
print(f"Baris duplikat persis: {int(df.duplicated().sum())}")
print()
print("Baris dengan suhu hilang:")
print(df[df["suhu_c"].isna()])
print()
print("Distribusi label kondisi:")
print(df["kondisi"].value_counts())
print()
print("Statistik deskriptif kolom numerik:")
print(df[["suhu_c", "kelembapan"]].describe().round(2))
text Keluaran
Jumlah baris: 14

Nilai hilang per kolom:
id_catatan    0
waktu         0
lokasi        0
suhu_c        1
kelembapan    0
kondisi       0
dtype: int64

Baris duplikat persis: 1

Baris dengan suhu hilang:
   id_catatan             waktu    lokasi  suhu_c  kelembapan kondisi
2           3  2024-03-01 10:00  gudang-a     NaN          63  normal

Distribusi label kondisi:
kondisi
normal    13
beku       1
Name: count, dtype: int64

Statistik deskriptif kolom numerik:
       suhu_c  kelembapan
count   13.00       14.00
mean    29.40       59.21
std     14.32        1.81
min     24.10       56.00
25%     25.00       58.00
50%     25.80       59.00
75%     26.10       60.00
max     77.00       63.00

Keluaran memperlihatkan satu nilai hilang pada kolom suhu_c dan satu baris duplikat persis. Baris yang suhunya hilang masih terisi lengkap pada kolom lain, sehingga baris itu layak diisi, bukan dibuang. Bagian statistik memberi petunjuk yang paling penting, yaitu rata-rata suhu_c 29.40 sementara mediannya 25.80 dengan nilai maksimum 77.00. Jarak rata-rata terhadap median sebesar itu menandai satu nilai yang jauh di luar kelompok, dan pada data sensor selisih semacam ini lazimnya berasal dari satuan campur atau kesalahan pencatatan. Label beku hanya muncul satu kali, dan pada blok CSV terlihat label itu menempel pada suhu 25.0, sebuah kontradiksi yang harus dibereskan sebelum data digunakan untuk melatih model.

Perbaikan minimal langkah demi langkah#

Perbaikan dilakukan berurutan karena urutannya menentukan hasil. Duplikat dibuang terlebih dahulu agar tidak memengaruhi statistik pengisian. Nilai hilang kemudian diisi dengan median suhu pada lokasi yang sama, lalu baris dengan suhu di atas 40 diperlakukan sebagai Fahrenheit dan dikonversi menggunakan rumus berikut.

Tc=(Tf−32)×59 T_{c} = (T_{f} - 32) \times \frac{5}{9}

Dengan rumus itu, nilai 77.0 kembali menjadi 25.0, angka yang konsisten dengan suhu gudang pada jam yang sama. Terakhir, label beku yang menempel pada suhu di atas nol diperbaiki menjadi normal karena bertentangan dengan maknanya. Skrip berikut mengerjakan keempat langkah itu.

python perbaiki-kualitas.py
import pandas as pd

pd.set_option("display.width", 80)

df = pd.read_csv("data-catatan.csv")

# langkah 1: buang baris duplikat persis agar satu contoh tidak terbobot dua kali
df = df.drop_duplicates().copy()

# langkah 2: isi suhu hilang dengan median suhu pada lokasi yang sama
median_lokasi = df.groupby("lokasi")["suhu_c"].median()
df["suhu_c"] = df["suhu_c"].fillna(df["lokasi"].map(median_lokasi))

# langkah 3: konversi nilai fahrenheit menjadi celsius
mask_f = df["suhu_c"] > 40
df.loc[mask_f, "suhu_c"] = (df.loc[mask_f, "suhu_c"] - 32) * 5 / 9

# langkah 4: perbaiki label yang bertentangan dengan nilai suhunya
mask_label = (df["kondisi"] == "beku") & (df["suhu_c"] > 0)
df.loc[mask_label, "kondisi"] = "normal"

print(f"Jumlah baris setelah perbaikan : {len(df)}")
print(f"Nilai hilang pada suhu_c       : {int(df['suhu_c'].isna().sum())}")
print(f"Baris duplikat persis          : {int(df.duplicated().sum())}")
print()
print("Statistik suhu_c setelah perbaikan:")
print(df["suhu_c"].describe().round(2))
print()
print("Distribusi label kondisi:")
print(df["kondisi"].value_counts())
text Keluaran
Jumlah baris setelah perbaikan : 13
Nilai hilang pada suhu_c       : 0
Baris duplikat persis          : 0

Statistik suhu_c setelah perbaikan:
count    13.00
mean     25.31
std       0.73
min      24.10
25%      24.90
50%      25.10
75%      26.00
max      26.40
Name: suhu_c, dtype: float64

Distribusi label kondisi:
kondisi
normal    13
Name: count, dtype: int64

Perbandingan sebelum dan sesudah terlihat pada angka kuncinya. Nilai maksimum suhu_c turun dari 77.00 menjadi 26.40, rata-rata turun dari 29.40 menjadi 25.31, dan distribusi label tinggal berisi normal yang konsisten dengan suhunya. Jumlah baris berkurang dari 14 menjadi 13 karena satu baris duplikat dibuang. Dataset sekecil ini memang dapat diperbaiki secara manual, tetapi langkah yang sama berlaku untuk berkas berukuran besar, dan keempat langkahnya dapat dijalankan ulang setiap kali data baru masuk.

Kesalahan umum#

  • Membuang setiap baris yang memiliki nilai hilang. Langkah ini terlihat praktis, tetapi bila baris terdampak banyak, data latih menyusut dan informasi dari baris yang dibuang ikut hilang. Bila kehilangan tidak terjadi secara acak, pembuangan justru menimbulkan bias karena model hanya melihat kasus yang datanya lengkap. Periksa porsinya per kolom terlebih dahulu, lalu pilih antara membuang, mengisi, atau menjadikan kehilangan sebagai sinyal.
  • Membuang outlier tanpa menyelidiki penyebabnya. Nilai ekstrem dapat berupa kejadian nyata yang justru penting bagi target, misalnya suhu yang melonjak saat terjadi kebakaran. Pembuangan semacam itu menghilangkan contoh langka yang paling perlu dipelajari model. Telusuri sumbernya dan konversikan satuannya terlebih dahulu, lalu buang nilai hanya bila terbukti kesalahan pencatatan.
  • Memperlakukan kolom penanda seperti id_catatan sebagai fitur. Penanda unik tidak membawa pola yang dapat diterapkan pada data baru karena setiap baris baru selalu memperoleh penanda yang belum pernah terlihat. Model yang dilatih dengan kolom ini hanya menghafal baris data latihnya. Kolom semacam ini dikeluarkan dari fitur sejak awal.

Ringkasan#

  • Model mengoptimalkan pola apa pun yang ada pada data, sehingga duplikat, label salah, dan satuan campur akan dipelajari oleh model sebagaimana pola yang benar.
  • Pemeriksaan pertama yang murah terdiri atas isna().sum() untuk nilai hilang, duplicated().sum() untuk duplikat, value_counts() untuk distribusi label, dan describe() untuk rentang nilai, dengan jarak rata-rata terhadap median sebagai penanda nilai ekstrem.
  • Penanganan nilai hilang memiliki tiga pilihan, yaitu membuang baris, mengisi dengan median, atau menjadikan kehilangan sebagai sinyal melalui kolom indikator.
  • Konversi satuan dikerjakan dengan rumus tetap, sedangkan statistik pengisian dihitung dari data latih setelah pemecahan.

Referensi#