Handling Missing Values

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

Sharing is caring:

Leave a Comment