Selama fase eksplorasi data, kita sering menemukan variabel dengan missing data. Missing data muncul karena berbagai alasan: kesalahan sampling, sengaja dihilangkan, atau alasan lainnya. Apa pun penyebabnya, kita perlu menganalisis alasan hilangnya data tersebut. Untuk mempelajari missing data, artikel mengenai tipe missing data dari Yogita Kinha adalah awal yang baik.
Setelah analisis yang tepat, salah satu cara untuk mengatasi masalah missing data adalah dengan mengisinya dengan nilai tertentu. Untungnya, Pandas memungkinkan kita untuk mengisi missing data dengan mudah. Bagaimana kita melakukannya, dan bagaimana cara yang optimal untuk mengisi missing data? Mari kita pelajari bersama.
Fungsi Fillna Pandas
Menurut dokumentasi Pandas, fillna adalah fungsi Pandas untuk mengisi nilai NA/NaN dengan metode yang ditentukan. Pada DataFrame Pandas, kita menyebut objek missing data sebagai objek NaN. Dengan fillna, kita akan mengganti nilai NaN idengan nilai lain yang telah kita analisis.
Mari kita coba fungsi ini dengan contoh dataset. Artikel ini akan menggunakan dataset Local Epidemics of Dengue Fever train dari Kaggle (Lisensi: CC0: Public Domain).
import pandas as pd
df = pd.read_csv('dengue_features_train.csv')
df.head(10)
Seperti yang kita lihat pada dataset di atas, ada missing data di kolom ndvi_ne. Menggunakan fungsi fillna dari Pandas, kita bisa dengan mudah mengganti missing data dengan nilai lain. Izinkan saya memberi Anda contoh.
df.fillna(0).head(10)
Dengan fungsi fillna, kita mengganti missing data dengan nilai 0. Anda dapat menggantinya dengan jenis nilai apa pun dengan fungsi fillna. Misalnya, saya mengganti missing data dengan string ‘zero’.
df.fillna('zero').head(10)
Saya bisa mengganti missing data dengan fungsi, yang juga bisa Anda lakukan, tetapi tidak akan berguna.
df.fillna(pd.isna).head(10)
Sebagai catatan tambahan, fungsi fillna tidak akan mengubah dataset aktual saat Anda mengeksekusinya. Anda bisa menjalankan kode berikut jika ingin DataFrame diganti saat Anda mengeksekusi fungsi.
df.fillna(0, inplace = True)
Tidak akan ada output saat Anda menjalankan kode di atas, tetapi DataFrame Anda akan terpengaruh. Jangan gunakan parameter inplace jika Anda masih bereksperimen dengan data.
Mengganti Missing Value di Beberapa Kolom
Anda harus berhati-hati saat menggunakan fungsi fillna. Jika kita menjalankan fungsi ini menggunakan seluruh DataFrame, itu akan mengisi setiap missing data dengan nilai yang diberikan, bahkan jika itu bukan niat Anda. Mari kita lihat apa yang saya bicarakan dengan menggunakan contoh data.
df[df['ndvi_ne'].isna()]
Saya menghapus semua observasi pada kolom ndvi_ne. Jika kita melihat output di atas, kita bisa melihat bahwa beberapa kolom juga mengandung missing data. Mari coba menggunakan fungsi fillna untuk mengisinya.
df[df['ndvi_ne'].isna()].fillna('zero')
Sekarang semua missing data diganti dengan nilai string ‘zero’. Seringkali, ini bukan yang kita inginkan. Jika kita ingin mengganti missing data pada kolom tertentu, kita bisa mengambil kolom tersebut terlebih dahulu sebelum menggunakan fungsi fillna.
df['ndvi_ne'].fillna(0)
Ada juga cara optimal untuk mengisi missing data dengan melewatkan dictionary yang berisi nama kolom sebagai key dan apa yang akan diganti sebagai value. Mari coba dengan contoh kode.
df[df['ndvi_ne'].isna()].fillna({'ndvi_ne':0,
'ndvi_nw':'zero',
'ndvi_se': df['ndvi_se'].mean()})
Dengan kode di atas, kita mengganti kolom ndvi_ne dengan 0, ndvi_nw dengan ‘zero’, dan ndvi_se dengan rata-rata kolom tersebut. Sisanya tidak disentuh karena kita tidak menyebutkannya dalam fungsi.
Mengisi Missing Data Secara Berturut-turut
Fungsi fillna Pandas juga memungkinkan pengguna untuk menentukan jumlah missing data yang akan diganti. Dengan menggunakan parameter limit, kita bisa mengisi missing data hingga data ke-n secara berturut-turut. Mari coba dengan contoh kode.
df[df['ndvi_ne'].isna()].fillna(0, limit = 3).head()
Kita bisa melihat dari output di atas bahwa hanya tiga dari lima baris missing data yang diganti. Jika kita mengubah parameter limit, kita bisa melihat hasil yang berbeda.
df[df['ndvi_ne'].isna()].fillna(0 , limit = 2).head()
Hanya dua dari lima data yang diganti. Missing data tidak perlu berada di atas satu sama lain. Mereka bisa berada di baris yang berbeda, dan parameter limit hanya akan menggantikan dua data pertama jika parameter limit disetel ke dua.
Pengisian Forward dan Backward
Kelebihan dari fungsi fillna Pandas adalah kita bisa mengisi missing data dari observasi sebelumnya (ffill) atau observasi berikutnya (bfill). Mari coba mengisi data dari observasi sebelumnya. Sebagai pengingat, kita memiliki missing data di kolom berikut.
df['ndvi_ne'].head(10)
Kemudian, kita akan menggunakan fungsi fillna untuk mengganti missing data dari baris sebelumnya.
df['ndvi_ne'].head(10).fillna(method = 'ffill')
Sekarang missing data diganti dengan nilai dari baris sebelumnya, atau kita bisa menyebutnya forward fill. Mari coba sebaliknya: backward fill atau mengisi missing data dari baris berikutnya.
df['ndvi_ne'].head(10).fillna(method = 'bfill')
Kita bisa melihat dari output di atas bahwa data terakhir masih hilang. Karena kita tidak memiliki observasi setelah baris missing data tersebut, fungsi ini tetap membiarkannya seperti itu.
Metode pengisian forward dan backward adalah fungsi yang baik jika Anda tahu data sebelumnya dan sesudahnya masih terkait, seperti dalam data time series. Bayangkan data saham; data hari sebelumnya mungkin masih berlaku pada hari berikutnya.
Kesimpulan
Missing Data adalah hal yang umum selama preprocessing dan eksplorasi data. Salah satu cara untuk mengatasi missing data adalah dengan menggantinya dengan nilai tertentu. Untuk melakukannya, kita bisa menggunakan fungsi Pandas yang disebut fillna. Penggunaan fungsi ini cukup sederhana, tetapi ada beberapa metode untuk mengisi data kita secara optimal, termasuk mengganti missing data di beberapa kolom, membatasi pengisian nilai, dan menggunakan baris lain untuk mengisi data.
Comments