Seperti sudah dibahas pada modul sebelumnya, missing values lumrah terjadi. Ada dua pendekatan:
- Deletion atau Listwise deletion
- Imputation
Listwise Deletion, cara termudah dan sering digunakan, yaitu menghapus seluruh row data yang mengandung missing value.
Namun teknik ini bisa menyebabkan masalah kekurangan data.
Hal lain yang perlu diperhatikan adalah jika missing value tidak random. Menghapus data tersebut, bisa menyebabkan bias.
Imputation, mengisi missing value berdasarkan data yang diketahui.
Method yang paling sederhana adalah column average yaitu menggunakan data mean dari kolom tersebut. Ada juga yang menggunakan data median. Kelemahan pendekatan ini dapat melemahkan kolerasi antar kolom data.
Metoda lainnya adalah dengan mengiterpolasi menggunakan data terdekat, misalnya data dari row sebelumnya. Metoda ini cocok digunakan jika ordered dataset.
Pendakatan kompleks, membuat model ML untuk memprediksi missing value. Hal yang perlu diperhatikan data akan memiliki kolerasi kuat.
Pengetahuan yang berhubungan dengan dataset dapat membantu Anda dalam menangani masalah ini. Yang dimaksud pengetahuan disini adalah, misal dataset adalah tentang harga rumah, pengetahuan mengenai seluk beluk properti dapat membantu dalam menangani missing value.
Implementasi menggunakan Python
Contoh kode sederhana untuk cek missing value. Import library yang dibutuhkan yaitu pandas dan numpy. Pada code dibuat data sederhana.
import pandas as pd
import numpy as np
df = pd.DataFrame(data={
'feature1' : [np.nan, 3, 6, 9, 12, 15, np.nan],
'feature2' : [100, np.nan, 200, 300, np.nan, np.nan, 600],
'feature3' : [1000, 500, 2000, 3000, 4000, 6000, 8000]
})
Fungsi df.isnull() adalah fungsi dari pandas untuk memeriksa apakah dataframe ada nilai null. Jika ada akan ditampilkan true dan false jika tidak ada.
df.isnull()
feature1 feature2 feature3
0 True False False
1 False True False
2 False False False
3 False False False
4 False True False
5 False True False
6 True False False
Fungsi df.isnull().sum() untuk melihat summary null value.
df.isnull().sum()
feature1 2
feature2 3
feature3 0
dtype: int64
Code berikut contoh missing value handling menggunakan fungsi df.fillna(). Parameter yang digunakan adalah method=’pad’, null value akan diisi dengan data sebelumnya. Feature1 baris 6, diisi nilai 15.
Limit=1 berarti hanya akan melakukan replacement pada nilai null pertama, lalu akan replace forward atau backward 1 kali nilai nan berikutnya.
Perhatikan feature2, yang direplace adalah baris 1 dan 4, baris 5 tidak di replace.
Jika limit = 2, maka feature2 baris 5 akan di replace.
df.fillna(method='pad', limit=1)
feature1 feature2 feature3
0 NaN 100.0 1000
1 3.0 100.0 500
2 6.0 200.0 2000
3 9.0 300.0 3000
4 12.0 300.0 4000
5 15.0 NaN 6000
6 15.0 600.0 8000
Perhatikan feature1 baris 0, tidak direplace dengan method pad karena tidak ada nilai sebelumnya. Untuk itu dapat digunakan method bfill.
Tips Gunakan inplace=True agar modifikasi disimpan dalam dataframe. Contoh: df.fillna(method=’pad’, limit=1, inplace=True)
df.fillna(method='bfill')
feature1 feature2 feature3
0 3.0 100.0 1000
1 3.0 200.0 500
2 6.0 200.0 2000
3 9.0 300.0 3000
4 12.0 600.0 4000
5 15.0 600.0 6000
6 NaN 600.0 8000
Jika dataset cukup besar, dan Anda ingin menghapus seluruh baris yang ada nila NaN, dapat gunakan fungsi df.dropna(), parameter yang digunakan adalah axis, 0 untuk hapus row, 1 untuk hapus column.
df.dropna(axis=0)
feature1 feature2 feature3
2 6.0 200.0 2000
3 9.0 300.0 3000
Untuk replacement menggunakan mean, contohnya column feature1, replace NaN value dengan mean.
df['feature1'].fillna(df['feature1'].mean())
0 9.0
1 3.0
2 6.0
3 9.0
4 12.0
5 15.0
6 9.0
Name: feature1, dtype: float64
Teknik lainnya adalah menggunakan interpolasi dengan menggunakan fungsi df.interpolate(). Default method adalah linear.
Perhatikan baris 1, diisi dengan nilai 150, baris 4 dengan 400 dan baris 5 dengan 500.
df['feature2'].interpolate()
0 100.0
1 150.0
2 200.0
3 300.0
4 400.0
5 500.0
6 600.0
Name: feature2, dtype: float64
Rerefensi
- Fungsi fillna di https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.fillna.html
- Fungsi dropna https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.dropna.html
- Fungsi interpolate https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.interpolate.html