Working with Missing Data

Pandas Dataframe

Dadan Dahman W.
Howdy Sysinfo
5 min readFeb 19, 2022

--

Pada bagian ini, kita akan membahas value yang hilang (juga disebut sebagai NA) pada pandas dataframe.

Value yang hilang/tidak lengkap dari dataframe akan membuat analisis atau model prediksi yang dibuat menjadi tidak akurat dan mengakibatkan keputusan salah yang diambil. Terdapat beberapa cara untuk mengatasi data yang hilang/tidak lengkap tersebut. Salah satu alasan terjadinya missing value adalah tidak terkumpulnya beberapa informasi. Misalnya beberapa orang menolak untuk mengisi data hobi, pendapatan bulanan, usia, dan lain-lain. Kondisi ini menyebabkan informasi yang dikumpulkan belum clear sehingga sulit untuk dilakukan analisis.

Inspect

Untuk mengetahui kolom mana yang terdapat missing value, kita bisa menggunakan method .info() pada dataframe. Mengetahui berapa banyak nilai hilang dari tiap kolom di dataset tersebut dengan menerapkan chaining method pada dataframe yaitu .isna().sum(). Method .isna() digunakan untuk mengecek berapa data yang bernilai NaN dan .sum() menjumlahkannya secara default untuk masing-masing kolom dataframe.

import pandas as pd# Baca file
df = pd.read_csv("https://raw.githubusercontent.com/dadandw/sample_dataset/main/public_data_covid19.csv")
# Cetak info dari df
print(df.info())
# Cetak jumlah missing value di setiap kolom
mv = df.isna().sum()
print("\nJumlah missing value per kolom:\n", mv)

Handling

Untuk membuang missing value dapat menggunakan method .dropna()

Pada method .dropna() ada dua keyword argumen yang harus diisikan yaitu axis dan how. Keyword axis digunakan untuk menentukan arah dataframe yang akan dibuang angka 1 untuk menyatakan kolom (column-based) atau dapat ditulis dalam string “column”. Jika digunakan angka 0 berarti itu dalam searah index (row-based) atau dapat ditulis dalam string “index”.

Sementara, keyword how digunakan untuk bagaimana cara membuangnya. Opsi yang dapat diterimanya (dalam string) adalah :

  • “all” artinya jika seluruh data di satu/beberapa kolom atau di satu/beberapa baris adalah missing value.
  • “any” artinya jika memiliki 1 saja data yang hilang maka buanglah baris/kolom tersebut.
# Cetak ukuran awal dataframe
print("Ukuran awal df: %d baris, %d kolom." % df.shape)
# Drop kolom yang seluruhnya missing value dan cetak ukurannya
df = df.dropna(axis=1, how="all")
print("Ukuran df setelah buang kolom dengan seluruh data missing: %d baris, %d kolom." % df.shape)
# Drop baris jika ada satu saja data yang missing dan cetak ukurannya
df = df.dropna(axis=0, how="any")
print("Ukuran df setelah dibuang baris yang memiliki sekurangnya 1 missing value: %d baris, %d kolom." % df.shape)

Cara selanjutnya dengan mengisi missing value tersebut dengan nilai statistik lain berupa mean dan median, interpolasi data, dan string atau teks lain.

Ketika missing value yang data nya bersifat object. Misal kolom tersebut adalah province_state, karena tidak tahu secara persis province_state mana yang dimaksud, bisa menempatkan string “unknown” sebagai substitusi missing value. Meskipun keduanya berarti sama-sama tidak tahu tetapi berbeda dalam representasi datanya.

Untuk melakukan hal demikian dapat menggunakan method .fillna() pada kolom dataframe yang dimaksud.

# Cetak unique value pada kolom province_state
print("Unique value awal:\n", df["province_state"].unique())
# Ganti missing value dengan string "unknown_province_state"
df["province_state"] = df["province_state"].fillna("unknown_province_state")
# Cetak kembali unique value pada kolom province_state
print("Unique value setelah fillna:\n", df["province_state"].unique())

Terlihat bahwa unique value di kolom “province_state” yang semula ada nan telah berubah menjadi “unknown”.

Kita akan menangani missing value dengan nilai statistik, menggunakan median atau mean. Misalnya akan menggunakan kolom active. Dengan mengabaikan terlebih dahulu sebaran berdasarkan negara (univariate), jika mengisi dengan nilai rata-rata maka harus melihat terlebih dahulu data apakah memiliki outliers atau tidak. Jika ada outliers dari data maka menggunakan median.

# Cetak nilai mean dan median awal
print("Awal: mean = %f, median = %f." % (df["active"].mean(), df["active"].median()))
# Isi missing value kolom active dengan median
df_median = df["active"].fillna(df["active"].median())
# Cetak nilai mean dan median awal setelah diisi dengan median
print("Fillna median: mean = %f, median = %f." % (df_median.mean(), df_median.median()))
# Isi missing value kolom active dengan mean
df_mean = df["active"].fillna(df["active"].mean())
# Cetak nilai mean dan median awal setelah diisi dengan mean
print("Fillna mean: mean = %f, median = %f." % (df_mean.mean(), df_mean.median()))

Kemudian kita akan menggunakan teknik interpolasi dalam mengisi nilai missing value pada suatu dataset. Data yang menggunakan interpolasi untuk mengisi data yang hilang adalah time series data, yang secara default akan diisi dengan interpolasi linear.

import numpy as np
import pandas as pd
# Data
ts = pd.Series({
"2020-01-01":9,
"2020-01-02":np.nan,
"2020-01-05":np.nan,
"2020-01-07":24,
"2020-01-10":np.nan,
"2020-01-12":np.nan,
"2020-01-15":33,
"2020-01-17":np.nan,
"2020-01-16":40,
"2020-01-20":45,
"2020-01-22":52,
"2020-01-25":75,
"2020-01-28":np.nan,
"2020-01-30":np.nan
})
# Isi missing value menggunakan interpolasi linier
ts = ts.interpolate()
# Cetak time series setelah interpolasi linier
print("Setelah diisi missing valuenya:\n", ts)

Sekian penjelasan mengenai bagaimana teknik handling missing value, semoga bermangaat.

--

--