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.
| Kategori | Dampak pada pelatihan | Langkah pertama |
|---|---|---|
| Nilai hilang | Baris dibuang atau diisi, keduanya mengubah distribusi | Hitung jumlahnya per kolom |
| Duplikat | Satu contoh terbobot lebih dari satu kali | Hitung duplicated().sum() |
| Label salah | Batas keputusan bergeser ke arah label keliru | Tinjau contoh acak per label |
| Satuan campur | Nilai ekstrem semu pada satu kolom | Periksa rentang nilai kolom |
| Outlier | Koefisien dan statistik tergeser | Bandingkan 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.
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,normalPemeriksaan 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.
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))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.00Keluaran 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.
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.
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())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: int64Perbandingan 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_catatansebagai 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, dandescribe()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#
- Working with missing data — pandas — Panduan resmi pandas untuk mendeteksi dan menangani nilai hilang.
- Imputation of missing values — scikit-learn — Strategi pengisian nilai hilang, dari statistik sederhana hingga imputasi berbasis model.
- pandas.DataFrame.duplicated — pandas — Dokumentasi metode yang menandai baris duplikat.