Mendeteksi Univariate Outliers dengan Metode IQR (Python)

Stevanus Setiawan
5 min readAug 11, 2020

--

Photo by Yann Le Comte on Unsplash

Dalam fase eksplorasi data tentunya salah satu yang perlu kita lakukan adalah menemukan outliers dan mempelajarinya. Sebetulnya banyak cara-cara untuk mendeteksi Ouliers (semisalnya menggunakan Z-Score atau DBSCAN Clustering)

Namun seperti pada judul di tulisan ini, saya hanya akan berbagi salah satu cara untuk medeteksi outliers yaitu dengan menggunakan metode IQR (atau Interquartile Range). Sebetulnya saya sempat menulis tentang IQR di artikel ini, namun kali ini, saya akan lebih fokus untuk mendeteksi Univariate outliers.

Outliers?

Menurut Wikipedia

In statistics, an outlier is a data point that differs significantly from other observations.

Jadi dari definisi di atas, kita bisa langsung menangkap apa itu outliers. Dan di bayangan saya, outliers adalah orang-orang yang berada di luar kerumunan.

Dan terkadang di statistik, outliers mungkin menganggu perhitungan kita. Jadi itu tergantung keputusan kita masing-masing, bagaimana kita harus menangani mereka. Ada yang membuangnya, ada juga yang hanya memberikan tanda, atau ada juga yang mendiamkannya saja dengan alasan itu suatu yang natural dan masuk akal.

Univariate Outliers?

Dan di tulisan ini, kita hanya akan fokus dengan Univariate Outliers. Dimana secara kasar, univariate mengartikan kita hanya menganalisa atau mengamati atau menggunakan satu variabel (atau kolom atau fitur). Maka artinya, kita hanya akan membicarakan outliers di satu fitur.

Sebagai contoh:

import pandas as pd
import numpy as np
pd.DataFrame({'Nilai Ujian' : [95,90,35,100,94,90,95]})

Tentu dari nilai-nilai di atas, kita dapat menyadari bahwa data ke-2 dengan nilai ujian 35 adalah sebuah outlier. Karena bisa dilihat nilai-nilai lainnya termasuk tinggi hanya data ke-2 yang punya niali sangat rendah. Yang artinya orang dengan data ke-2 perlu belajar lebih giat atau diberi masukkan untuk ujian selanjutnya.

Jadi dengan menemukan outliers, kita bisa mendapatkan gambaran-gambaran, untuk membuat pengembangan dari bidang yang kita jalankan.

Mendeteksi Univariate Outliers

Kalau contoh data di atas, kita bisa dengan mudah menemukan outliers, namun bagaimana kalau datanya banyak? Apa kita akan melihatnya satu per satu? Tentu tidak. Kita harus melakukannya secara efisien.

Data yang kita gunakan di sini, data tips.

import seaborn as snstips = sns.load_dataset('tips')
tips.head()

Metode IQR

Dari data di atas, kita akan fokus dengan feature (atau kolom) tip, sebelum saya berbicara tentang matematiknya, mari kita berbicara visuaslisasinya terlebih dulu, dimana IQR dapat divisualkan menggunakan boxplot. Visual ini dilakukan dengan bantuan Matplotlib dan Seaborn.

import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize = (10, 5))
sns.boxplot(tips['tip'])
plt.annotate('Outlier', (tips['tip'].describe()['max'],0.1), xytext = (tips['tip'].describe()['max'],0.3),
arrowprops = dict(facecolor = 'blue'), fontsize = 13 )
IQR = tips['tip'].describe()['75%'] - tips['tip'].describe()['25%']
Boxplot untuk data tips pada fitur tip dengan diberikan satu panah untuk contoh satu outliers

Kalau kalian lihat ada titik-titik kecil yang berada di kisaran 6 sampai 10. Mereka adalah outliers. Tapi tentu kita tidak ingin berhenti di sini, kita ingin mengetahui data-data mana yang outliers.

Secara matematis IQR dapat dituliskan sebagai berikut

Untuk Quartile, saya juga pernah menulisnya di artikel ini atau mungkin kaian dapat merujuk ke artikel-artikel lainnya. Dan sekarang, saya hanya akan fokus untuk menemukan outliers.

Nah untuk menemukan outliers, kita perlu mendefinisikan sebuah range, atau sebuah batasan. Dimana untuk data-data yang diluar range tersebut kita sebut Outliers. Namun seperti batasan-batasan lainnya, selalu ada batas bawah dan batas atas. Untuk metode IQR batas bawahnya didefiniskan seperti berikut

Sedangkan untuk batas atas

Data-data yang lebih kecil dari batas bawah atau lebih besar dari batas atas, akan dianggap sebagai Outliers. Atau agar lebih mudah, akan saya visualkan dengan bantuan boxplot,

import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize = (10, 5))
sns.boxplot(tips['tip'])
plt.axvline(tips['tip'].describe()['25%'], color = 'red', label = 'Q1')
plt.axvline(tips['tip'].describe()['50%'], color = 'yellow', label = 'Q2')
plt.axvline(tips['tip'].describe()['75%'], color = 'blue', label = 'Q3')
plt.annotate('Outlier', (tips['tip'].describe()['max'],0.1), xytext = (tips['tip'].describe()['max'],0.3),
arrowprops = dict(facecolor = 'blue'), fontsize = 13 )
IQR = tips['tip'].describe()['75%'] - tips['tip'].describe()['25%']plt.annotate('Batas Atas', (tips['tip'].describe()['75%'] + 1.5*IQR, 0.2),
xytext = (tips['tip'].describe()['75%'] + 1.5*IQR, 0.4),
arrowprops = dict(facecolor = 'blue'), fontsize = 13 )
plt.annotate('Batas Bawah', (tips['tip'].describe()['min'], 0.2),
xytext = (tips['tip'].describe()['min'], 0.4),
arrowprops = dict(facecolor = 'blue'), fontsize = 13 )
plt.legend()

Ini fungsi yang akan kita gunakan untuk menemukan dan menunjukkan outliers:

def detect_outliers(df, x):
Q1 = df[x].describe()['25%']
Q3 = df[x].describe()['75%']
IQR = Q3-Q1
return df[(df[x] < Q1-1.5*IQR) | (df[x] > Q3+1.5*IQR)]

Kalau untuk kasus ini, kita dapat menggunakan fungsi di atas dengan cara berikut:

detect_outliers(tips,'tip')

Karena untuk kasus ini, outliers adalah pengunjung-pengunjung yang memberikan tips-tips besar. Dan dari hasil di atas, ini masuk akal, kita bisa melihat kebanyakan pengunjung memberikan tips-tips besar saat di hari sabtu atau minggu dan saat makan malam. Jadi dari sini, kita juga bisa mendapatkan gambaran, kapan orang-orang memberikan tips-tips yang besar.

Saya harap tulisan ini dapat membantu… Terimakasih telah membacanya sampai selesai…

--

--

Stevanus Setiawan

Pada Medium ini, saya menulis tentang Data Science, Machine Learning, Statistik, Filosofi, dan Penulisan.