"Enter"a basıp içeriğe geçin

Aykırı Değer Tespiti (Outlier Detection)

Outlier Detection

Aykırı değerler (outliers) veriler üzerindeki diğer gözlemlerden ya da örneklerden aşırı sapan, ölçümde deneysel hatalar ya da farklılık belirtebilen değerlerdir. Genel duruma uyum göstermezler.

Farklı ancak kısmen benzer anlamlara gelen anomali (anomaly) ve aykırı değer (outlier) kavramları birbirleri yerine sıklıkla kullanılmaktadır. Diğer yandan her ikisinin de tespiti için benzer yöntemler kullanmak mümkün. Ancak anomali genellikle tespit edilmek istenen anormal durumu ifade ederken aykırı değer ise ayıklanmak istenen hatalı veriye işaret etmektedir. Örnek vermek gerekirse hatalı veri ölçümü ya da kaydı bir aykırılık ifade ederken doğru ölçüme rağmen beklenmeyen bir durum (arıza, sorun vs.) ise anomaliye işaret etmektedir.

İki çeşit aykırılıktan söz edilebilir: Tek değişkenli (univariate) ve Çok değişkenli (mulitvariate). Tek değişkenli aykırı değer tespiti tek boyutlu uzayda yani tek bir niteliğin dağılımına bakılarak gözle dahi görülmesi mümkün olan aykırılıklardır. Çok değişkenli aykırılık ise birden fazla boyut ya da niteliğin dahil edilerek tespit edilebildiği insan algısı ile algılamanın güç olduğu durumlara verilen isimdir.

Bunun yanında, ister tek boyutlu olsun ister çok boyutlu, aykırı durum tek bir nokta (point) olarak yani diğer gözlem ya da verilerden bağımsız olarak var olabileceği gibi bağlamsal (contextual) olarak verideki gürültü diyebileceğimiz şekilde tüm veriye sirayet etmiş olabilir. Diğer yandan bir kısım gözleme çeşitli bir sebeple toplu (collective) şekilde de etki etmiş olabilir.

Aykırı değer tespiti (outlier detection) için farklı yöntemler mevcut.

Tukey metodu (Tukey’s method for identfying outliers)

Aykırı değer tespitinde sıkça karşılaşabilen Tukey metodunu uygulamak için veriler küçükten büyüğe doğru sıralanır, sıralanan değerler arasında sıralama olarak %25’e ve %75’e denk gelen değerler belirlenir. Birinci çeyrek (first quartile) ve üçüncü çeyrek (third quartile) adları verilen bu değerlerin farkları bulunur (interquartile, IQR). Bu değerin 1.5 katı aykırı adım (outlier step) olarak belirlenir. Birinci çeyrek değerinden aykırı adım kadar ya da daha küçük olan değerler ile üçüncü çeyrek değerinden yine aykırı adım değeri kadar ya da daha yüksek olan değerler aykırı değer (outlier data) olarak adlandırılır.

Python ile kısa bir örnek yapmak için 2 boyutlu 40 ayrı gözlem noktasından oluşan bir pandas dataframe’i oluşturalım:

import pandas as pd
import numpy as np
from IPython.display import display

data = {'a':[1,2,3,4,5,6,7,8,9,2,3,4,7,29,2,3,67,8,5,4,8,9,8,1,2,0,-1,-39,3,5,8,9,8,7,5,4,3,2,1,2],
        'b':[3,9,3,4,5,2,3,4,5,6,8,4,5,6,7,8,3,2,3,4,12,7,8,3,2,123,2,3,4,5,6,2,19,1,-10,3,4,5,6,3]}

df = pd.DataFrame(data)

Her bir özellik (feature) için aykırı değerleri yukarıda bahsedilen yönteme göre bir for döngüsü ile yakalayalım:

outliers = []
outliers_list= []

for feature in df.keys():
    #birinci çeyrek değerini bul
    Q1 = np.percentile(df[feature],25.)
    
    #üçüncü çeyrek değerini bul
    Q3 = np.percentile(df[feature],75.)

    #aykırı adım değerini bul
    step = (Q3-Q1)*1.5

    #ilgili özellik için aykırı değerleri bul
    outlier_feature = df[~((df[feature] >= Q1 - step)&(df[feature] <= Q3 + step))]
    display(outlier_feature)
    
    #aykırı değere sahip satır indekslerini kaydet
    outliers +=outlier_feature.index.tolist()
    
    #aykırı değerleri kaydet
    outliers_list.append(list(outlier_feature.index))

Aykırı değerleri ve indekslerini kaydettiğimize göre bu değerleri veriden silebiliriz:

df = df.drop(df.index[outliers]).reset_index(drop = True)
df

40 ayrı veri noktasından oluşan dataframe outlier detection sonrası ‘a’ kolonundaki 3 ve ‘b’ kolonundaki 4 farklı aykırı değerin tespit edilip kaldırılması ile 33 veri noktasına indirgenmiş oldu.

Burada yapılan işlem anlaşılacağı üzere her bir özellik için tek değişkenli (univariate) aykırı değer tespitidir.

Tukey yöntemi ile aykırı değer tespiti öncesi (üst) ve sonrası (alt)

Z-score yöntemi ile aykırı değer tespiti

Tek değişkenli aykırı değer analizine diğer bir örnek ise Veri Ölçeklendirme ve Normalizasyon adlı içerikte detayları ile anlatılan Z score dönüşümüdür. Z-score dönüşümü sonrası -3 ile +3 değerleri dışarısında olan değerler aykırı değer (outlier) olarak belirlenmekte ve veriden çıkarılmaktadır.

Mahalanobis Distance ile aykırı veri tespiti

Çok değişkenli (multivariate) aykırı veri analizinde artık tek bir niteliğin (feature) değil doğrudan bir gözlemin ya da örneğin (satır, row) diğer gözlemlerden aykırılığına bakmak gerekir. Bu durumda sıklıkla kullanılan Euclidean distance kavramı kullanılamıyor zira artık iki noktanın birbirinden uzaklığına değil bir noktanın bir dağılımdan uzaklığına bakmak gerekiyor. İşte bu noktada Mahalanobis Distance kavramı ortaya atılıyor.

D^2 = (x-m)^T.C^{-1}.(x-m)

D Mahalanobis distance, x gözlem (nokta, satır), m ortalama, C ise kovaryans olmak üzere Mahalanobis distance yukarıdaki formül ile hesaplanabilir.

Python ile Mahalanobis distance hesaplamak için aşağıdaki kod parçasını yine yukarıdaki veri seti için kullanabiliriz:

df = pd.DataFrame(data)
x_minus_mu = df - np.mean(df)
cov = np.cov(df.values.T)
inv_covmat = np.linalg.inv(cov)
left_term = np.dot(x_minus_mu, inv_covmat)
mahal = np.dot(left_term, x_minus_mu.T)
df['mahal'] = mahal.diagonal()
df.head()

her bir nokta için Mahalanobis distance hesaplandığına göre artık sadece bu bilgi ile herhangi bir tek değişkenli (univariate) aykırı veri tespit yöntemi bu bilgi için uygulanarak aykırı noktalar bulunabilir.

outliers = []
outliers_list= []

for feature in df[['mahal']].keys():
    #birinci çeyrek değerini bul
    Q1 = np.percentile(df[feature],25.)
    
    #üçüncü çeyrek değerini bul
    Q3 = np.percentile(df[feature],75.)

    #aykırı adım değerini bul
    step = (Q3-Q1)*1.5

    #ilgili özellik için aykırı değerleri bul
    outlier_feature = df[~((df[feature] >= Q1 - step)&(df[feature] <= Q3 + step))]
    display(outlier_feature)
    
    #aykırı değere sahip satır indekslerini kaydet
    outliers +=outlier_feature.index.tolist()
    
    #aykırı değerleri kaydet
    outliers_list.append(list(outlier_feature.index))

Mahalanobis distance ile tek değişkenli aykırı değer tespiti bir araya getirilerek çok değişkenli aykırı nokta/gözlem tespiti (multivariate outlier detection) yapılmış oldu.

Aykırı değer/nokta tespiti için oldukça fazla yöntem olduğunu akıldan çıkarmadan tek değişkenli aykırı değer tespiti için (univariate outlier detection) Tukey metodunu ve çok değişkenli aykırı nokta tespiti (multivariate outlier detection) için ise Mahalanobis distance kavramını öğrendiğimiz yazının sonuna geldik.

Python uygulamalarına yönelik github reposu için tıklayın.

Keyifli öğrenmeler 🙂

İlk Yorumu Siz Yapın

Bir Cevap Yazın

Translate »
%d blogcu bunu beğendi: