Handling Outliers

Outliers adalah data point yang jauh berbeda dari data point lainnya dalam satu dataset yang sama. Ada beberapa teknik untuk identifikasi outilier, diantaranya: Distance from mean dan Distance from fitted line.

Distance from Mean

Mean adalah nilai rata-rata dari suatu dataset. Jika suatu datapoint sangat jauh dari mean, dapat dipertimbangkan sebagai outliers.

Selain mean, diperlukan juga data standard deviation. Standard deviation adalah ukuran seberapa besar variasi data yang dimiliki. Standar deviation menunjukan seberapa jauh sebuah data point dari nilai mean.

Datapoint yang terletak lebih dari 3 kali standard deviation dapat dipertimbangkan sebagai outlier. Threshold 3x standard deviation tidak mutlak, pada prakteknya ditentukan sesuai kebutuhan.

DIstance from fitted line

Menggunakan regression analisis untuk membuat line berdasarkan pattern dari data. Data point yang terletak jauh dari fitted line, dapat dipertimbangkan sebagai outlier.

Perhatikan gambar dibawah, datapoint yang jauh dari fitted line adalah outlier. Setelah outlier dibuang maka model akan lebih tepat dalam memprediksi.

Penanganan Outlier

Setelah berhasil mengidentifikasi outlier, langkah berikutnya adalah bagaimana outlier akan ditangani.

Jika outlier adalah error dari observasi,

  • Jika seluruh fitur dari data point adalah error, maka membuang data outlier secara keseluruhan adalah pendekatan terbaik.
  • Jika hanya datapoint tersebut yang error, maka pendekatan replacement menggunakan mean dapat dilakukan.

Jika outlier adalah observasi yang benar,

  • Outlier dapat tetap digunakan, selama model tidak terdistorsi.
  • Jika terdistorsi, gunakan pendekatan cap/floor. Yaitu dengan melakukan standarize data, lalu cap positive outlier menjadi +3, dan floor negative outlier menjadi -3. (menggunakan pendekatan 3x standard deviation dari mean).

Standarize data adalah proses mengurangi setiap data point dengan nilai mean. Jadi dataset akan memiliki mean = 0.

Implementasi Deteksi dan Handling Outlier

Berikut contoh program sederhana untuk outliers handling. Dataset yang digunakan bisa download https://drive.google.com/file/d/1v5WjZZM3NdK0ugc13XgcvzEPVPIMrwMC/view?usp=sharing

Import library yang diperlukan yaitu pandas dan matplotlib. Kemudian import dataset menggunakan fungsi pd.read_csv().

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("mall_customers_data.csv")

Periksa apakah dataset ada null value menggunakan perintah df.isnull().any(), return false untuk setiap kolom, menunjukan dataset tidak ada null value.

df.isnull().any()
CustomerID                False
Gender                    False
Age                       False
Annual_Income             False
Spending Score (1-100)    False
dtype: bool

Salah satu teknik untuk melihat data outlier adalah menggunakan chart histogram. Dapat dilihat dari chart, histogram pada pojok kanan menunjukan outlier, yaitu pendapatan antara 150-175.

df["Annual_Income"].plot.hist(bins=10, figsize=(8,6))

Atau dapat juga menggunakan scatter plot. Dapat dilihat terdapat 2 data point dengan pendapatan sekitar 150-175.

df.plot.scatter(x="Age", y="Annual_Income", c="DarkBlue", figsize=(8,6))

Teknik yang paling cocok adalah menggunakan boxplot. Data outlier ditunjukan pada chart (lihat tanda panah merah). Dengan boxplot, setiap column data akan ditampilkan. Dapat dilihat, hanya column annual_income yang memiliki outlier.

boxplot = df.boxplot(grid=False, rot=45,  figsize=(8,6))

Pada tutorial ini, outlier akan ditangani dengan pendekatan interquartile dan mean value. Pertama, data point yang lebih besar dari cutoff, dianggap outlier.

cutoff ditentukan dengan rumus Q1 + 1.5 * IQR

Karena dataset kecil, data outlier tidak akan dihapus, namun akan diganti dengan nilai mean dari non outlier.

Untuk memudahkan proses, kita buat kolom baru sebagai helper, yaitu kolom Annual_Income_Outlier, set dengan nilai False.

Lakukan looping terhadap dataset, check jika Annual_Income > cutoff, maka set kolom yang dibuat diatas dengan value True.

Q1 = df["Annual_Income"].quantile(0.25)
Q3 = df["Annual_Income"].quantile(0.75)

IQR = Q3 - Q1
cutoff = Q1 + 1.5 * IQR

df["Annual_Income_Outlier"] = False

for index, row in df.iterrows():
  if row["Annual_Income"] > cutoff:
    df.at[index, 'Annual_Income_Outlier'] = True

Lalu hitung mean dengan grouping Annual_Income_Outlier. Isi dari mean adalah pandas series seperti berikut. Means yang digunakan adalah mean non outlier, berarti Data dengan value False, yang dapat diakses dengan index 0 , mean[0].

Annual_Income_Outlier
False     54.055556
True     111.650000
Name: Annual_Income, dtype: float64
mean = df.groupby("Annual_Income_Outlier")["Annual_Income"].mean()
mean[0]

Gunakan nilai mean[0] untuk menggantikan Annual_Income outlier.

for index, row in df.iterrows():
  if row["Annual_Income_Outlier"] == True:
    df.at[index, 'Annual_Income'] = mean[0]

Jika kita check dengan boxplot, maka data outlier sudah hilang.

boxplot = df.boxplot(grid=False, column=["Annual_Income"],  figsize=(8,6))
Sharing is caring:

Leave a Comment