Bir veri bilimcisinin/analistinin veriden beklentisi, veriden sağlıklı çıkarımlar yapabilmektir. Veriden sağlıklı çıkarımlar yapmayı güçleştiren önemli engellerden bir tanesi de veri setindeki aykırı (outlier) değerlerdir.

Denize girdiğinizde, temiz bir deniz olduğunu varsayalım, suyun içerisinde sabit dururken dibe doğru baktığınızda ayaklarınızı ve balıkları görebilirsiniz. Ayaklarınızı oynattığınızda, kum taneleri her yere dağılır ve görüntünüz bulanıklaşır. Bir sonraki adımınızda yanlış bir yere basıp basmayacağınızı bilemezsiniz.

Aykırı değerlere sahip veri setleri de aynı şekilde görüntünüzü bulanıklaştırır ve yaptığınız çıkarımların kalitesini etkiler. Bu nedenle, herhangi bir analize başlamadan önce veri setinizde varsa mutlaka tespit etmeli ve gerekli önlemleri almalısınız.

Aykırı değer (outlier) nedir?

Wikipedia’nın tanımına göre, diğer gözlemlerden kayda değer derecede uzak olan gözleme aykırı veya uç değer denir. Aykırı gözlemler, veri setinin geri kalanından farklı davranır ve bu nedenle dikkat çeker.

Aykırı değerlerin ne kadar yanıltıcı olabileceğine dair şöyle bir örnek verebiliriz:

Diyelim ki, bir satış ekibini yönetiyorsunuz ve ekibinizin aylık satış rakamlarını inceliyorsunuz.

Ekip ÜyesiAylık satış rakamı
Mehmet50,000₺
Hasan30,000₺
Ayşe40,000₺
Ali120,000₺

Ekibinizin aylık satış ortalaması, 60,000 lira. Bu değere bakarak, ekibinizin satış hedefini artırırsanız, ciddi bir sorunla karşılaşacaksınız. Ali dışında hiç kimse 60,000 lira bile satış yapmıyor. Bu veri setinde, aykırı bir gözlem olan Ali’nin satış rakamları ekibin performansı hakkında yanlış çıkarımlar yaparak hatalı kararlar almanıza sebep olacaktır.

Aykırı değerler çok farklı sebeplerden kaynaklanabilir. Örnek olarak:

  • Veri girişi veya ölçüm sırasındaki hatalar.
  • Verideki bozulmalar
  • Gerçekten aykırı bir performans gösterimi (Ör: Cristiano Ronaldo, Michael Jordan vs.) veri setinde aykırı değerlere sebep olabilir.

Her aykırı değerin mutlaka hata olmadığınının altını bir kez daha çizmek gerekir. Bazı durumlarda, aykırı gözlemler, veri setindeki yüksek varyansın (değişkenliğin) habercisidir.

Aykırı değer türleri nelerdir?

  • Nokta aykırı değerler (Point outliers): Bir gözlemin veri setinin geri kalanından farklı olduğu durumlara denir.
    Ör: Bir sınıftaki tüm öğrencilerin 40’tan aşağı not alırken, bir öğrencinin 100 alması.
  • Bağlamsal aykırı değerler (Contextual outliers): Bir gözlemin belirli bir bağlam olarak veri setinin geri kalanından farklı olduğu durumlara denir.
    Ör: Ekonominin pandemi ile beraber kötüye gitmesi, Black Friday döneminde satışların fırlaması.
  • Toplu aykırı değerler (Collective outliers): Veri setindeki bir grup verinin kendi içinde normal, tüm veri seti ile kıyaslandığında aykırı olarak göründüğü durumlara denir.
    Ör: Bir mahalledeki tüm sakinlerin aynı anda taşınması.

Aykırı değerler ayrıca tek değişkenli (univariate) veya çok değişkenli (multivariate) olarak da sınıflandırılabilir. Tek değişkenli (univariate) aykırı değerler, tek bir değişkende ortaya çıkarken, çok değişkenli (multivariate) aykırı değerler bir gözlemde en az 2 farklı değişken ile alışılmadık bir kombinasyon olarak ortaya çıkar.

Aykırı değerler neden sorun yaratır?

Birçok istatistiksel test ve makine öğrenmesi algoritması aykırı değerlere karşı hassastır. Bu nedenle, aykırı gözlemlerin tespit edilip, gözden geçirilmesi ve duruma göre müdahale edilmesi gerekmektedir. Aykırı değerler:

  • Verilerin dağılımını ve ortalama, medyan vs. gibi veriyi temsil eden istatistikleri etkiler.
  • Modellerden elde edilen sonuçlara etki eder.
  • İstatistiksel testlerin gücünü düşürür.

Aykırı değerler nasıl tespit edilir? Aykırı değer analizi (outlier detection) nasıl yapılır?

Aykırı gözlemlerin tespitinde kullanılacak yöntemin seçimi, verinin hacmi, dağılımı ve değişken sayısına bağlı olarak değişmektedir.

Aykırı değerleri tespit etmek için kullanılacak yöntemler değişken sayısına göre tek değişkenli, çok değişkenli, dağılımına göre parametrik (bir dağıl veya parametrik olmayan testler (herhangi bir dağılımdan bağımsız) ve istatistiksel veya grafiksel yöntemler olarak farklı gruplara ayrılabilir.

İstatistiksel yöntemleri değişken sayısına göre şu şekilde sınıflandırabiliriz:

  • Tek değişkenli (Univariate) Yöntemler: Çeyrekler açıklığı (Interquartile Range – IQR), Z-Skoru, Ortanca Mutlak Sapma metodu, Hampel filtresi
  • Çok değişkenli (Multivariate) Yöntemler: DBScan, İzolasyon Ormanı

Grafiksel yöntemleri değişken sayısına göre şu şekilde sınıflandırabiliriz:

  • Tek değişkenli (Univariate) Yöntemler: Kutu grafiği (Box plot), Histogram
  • Çok değişkenli (Multivariate) Yöntemler: Saçılım grafiği (Scatterplot)

Bu yazı konusu gereği tek değişkenli yöntemlere odaklanacaktır.

Tek değişkenli (Univariate) Yöntemler

Grafiksel yöntemler

Kutu grafiği (Box-plot)

Kutu grafiği (Box plot), verinin dağılımını çeyrek değerler üzerinden görselleştiren bir grafik türüdür. İsmini görsel olarak kutuya benzemesinden alır.

  • Kutunun alt ve üst kenarları, 25. ve 75. çeyrek değerlerini temsil eder.
  • Aradaki fark çeyrek açıklığını (IQR), yani orta %50’lik değeri temsil eder.
  • Kutu grafiğinin ortasındaki çizgi, ortanca (medyan) değeri verir.
  • Alt ve üst kancaların dışında kalan noktalar aykırı değerleri temsil eder.

Kutu grafiğinin anatomisi

Aykırı değerler verinin dağılımı etkiler fakat kutu grafiğinde aykırı değere rastlamamış olmanız, verinin illa normal dağılacağı anlamına gelmemektedir. Değişkeniniz aykırı değerlere sahip olmadan da sağa veya sola yatık bir dağılıma sahip olabilir.

Avantajları

  • Verinin normal dağılmadığı durumlarda da kullanılabilir.
  • Derinlemesine bir analiz yapmadan önce hızlı bir çıkarım yapmaya yardımcı olur.
  • Birden fazla değişkeni aynı anda kıyaslama imkanı sağlar.

Dezavantajları

  • Kutu grafikleri, veri setindeki tüm değerlerin bir özetidir. Tek tek tüm değerleri içermez. Derinlemesine analiz ve çıkarımlar yapabilmek için diğer yöntemlerle beraber kullanılmalıdır.
Histogram

Histogram, sayısal verinin dağılımı gösteren ve sık kullanılan bir grafiktir. Histogram aracılığı ile bir verideki hangi değerlerin daha çok veya az bulunduğunu ve nasıl yayıldığını görebiliriz.

Histogram grafiğinde, verinin genelinden uzakta kalan gözlemler aykırı değerlerdir.

Örnek histogram grafiği

Avantajları

  • Veriye dair hızlı bir iç görü sağlar.
  • Grafik kolayca anlaşılır.

Dezavantajları

  • Histogram’ın sütunlarını oluşturan kutuların (bins) sayısı veriden veriye göre değiştirilebilir. Her durum için geçerli evrensel bir kutu sayısı rakamı yoktur. Farklı kutu sayıları görünümü değiştireceği için, yanlış çıkarımlar yapmaya neden olabilir.

İstatistiksel yöntemler

Çeyrekler açıklığı (Interquartile Range – IQR)

Veri setlerinin normal dağılıma sahip olmaması yaygın bir durumdur. Bu gibi durumlarda da aykırı değerleri belirleyebilmek için yöntemlere ihtiyaç vardır.

Normal dağılıma sahip olmayan bir değişkenin aykırı değerlerine bakarken, Çeyrekler açıklığı (IQR) istatistiğinden yararlanabilirsiniz. Çeyrekler açıklığı, veri setinin %75’inci ve %25’inci değerleri arasındaki farka verilen isimdir. Bir diğer deyişle, çeyrekler açıklığı verinin orta %50’lik kısmını temsil eder.

Genel bir ifade olarak, %25’inci çeyrek değerinden 1.5 kat az, %75’inci çeyrek değerinden 1.5 kat fazla olan değerler aykırı olarak sınıflandırılır.

Örnek kutu grafiği ve çeyrekler arası açıklık

Avantajları

  • Verideki aykırı gözlemlerden etkilenmez.
  • Verinin normal dağılmadığı durumlarda da kullanışlıdır.
  • Hesaplanması kolaydır.

Dezavantajları

  • Veri setinde sezonsallık olması durumunda yetersiz kalmaktadır.
Ortanca Mutlak Sapma (Median Absolute Deviation – MAD) Metodu

Aykırı değerler, ortalama ve standart sapma değerlerini etkilediği için aykırı değer analizinin etkinliğini düşürür.

Aykırı değerlerin bulunduğu bir veri setinde, gözlemlerin değerine göre hesaplanan ortalamaya kıyasla gözlemlerin sıralamasına göre hesaplandığı için ortanca/medyan değeri daha tutarlı ve etkili bir tahmincidir.

Frank Rudolf Hampel tarafından literatüre kazandırılan ve popülerleştirilen ortanca mutlak sapma değeri, veri setindeki gözlemlerin ortanca değerden ne kadar uzakta olduğunun ölçüsüdür.

Ortanca Mutlak Sapma (MAD) = Ort (|x – Ort|) * C
x: Gözlem değeri
Ort: Ortanca (medyan) değeri
C: Tutarlılık kat sayısı

  1. Gözlemler küçükten büyüğe doğru sıralanarak ortanca değeri hesaplanır.
  2. Hesaplanan ortanca değeri, tek tek tüm gözlemlerden çıkarılarak mutlak değeri hesaplanır.
  3. 2. adımda elde edilen yeni değerler küçükten büyüğe doğru sıralanarak ortanca değeri hesaplanır.
  4. Son olarak, bulunan değer tutarlılık kat sayısı ile çarpılarak ortanca mutlak sapma değeri hesaplanır.

Normal dağılıma sahip değişkenlerde, standart sapma ve ortanca mutlak sapma arasında bir ilişki vardır. Kat sayı değeri normal dağılan bir değişken için 1.4826 olarak alındığı zaman ortanca mutlak sapma, standart sapmanın tutarlı bir tahmincisi olur. Bu durumda aykırı değerleri belirlemek için alt ve üst eşik değerleri şöyle hesaplanır:

Alt eşik = Ortanca – 3 * (MAD), Üst eşik = Ortanca + 3 * (MAD)

Genel bir ifade olarak, ortanca değerden 3 ortanca mutlak sapma uzaklıkta olan gözlemleri aykırı değer olarak konumlayabilirsiniz.

Değişkenin normal dağılıma sahip olmadığı, yani sağa veya sola çarpık olduğu dağılımlarda etkinlik azalır. Doğru analiz yapabilmek için “Çift Ortanca Mutlak Sapma (Double MAD)” yöntemi kullanılır.

  1. Gözlemler küçükten büyüğe doğru sıralanarak ortanca değeri hesaplanır.
  2. Ortanca değer kullanılarak veri ortadan ikiye bölünür.
  3. Yukarıdaki adımda anlatılan şekilde, ortanca değerden küçük ve ortanca değere eşit değerler için ayrı (MAD – Alt), ortanca değerden büyük değerler için (MAD – Üst) ayrı 2 farklı ortanca mutlak sapma değeri hesaplanır. Alt ve üst MAD değerleri hesaplanırken ana verinin ortanca değeri kullanılmalıdır.

Alt eşik = Ortanca – 3 * (MAD – Alt), Üst eşik = Ortanca + 3 * (MAD – Üst)

Alt ve üst eşiğin dışında kalan gözlemler aykırı olarak işaretlenir.

Değişkenin çift tepeli (bimodal) olduğu durumlarda aykırı değerleri belirlemede ortanca yetersiz kalır. Bu sorunu çözmek için “Harrell-Davis Kantil Tahmincisi” kullanılır.

  1. Harrell-Davis Kantil Tahmincisi ile ortanca değeri hesaplanır.
  2. Ortanca değer kullanılarak veri ortadan ikiye bölünür.
  3. Yukarıdaki adımda anlatılan şekilde, ortanca değerden küçük ve ortanca değere eşit değerler için ayrı (MAD – Alt), ortanca değerden büyük değerler için (MAD – Üst) ayrı 2 farklı ortanca mutlak sapma değeri hesaplanır. Alt ve üst MAD değerleri hesaplanırken ana verinin ortanca değeri kullanılmalıdır.

Ortanca mutlak sapma metodu, verinin normal dağılmadığı durumlarda kullanılabilecek güçlü ve aykırı değerlere karşı dayanıklı bir yöntemdir.

Avantajları

  • Hesaplama için ortanca değeri kullandığı için aykırı değerlerden daha az etkilenir.
  • Veri setindeki tüm değerleri hesaba kattığı için Çeyrekler Açıklığı (IQR)’a göre daha güçlü bir yöntemdir.
  • Aykırı değerlere karşı olan dayanıklılığı, veri setini hızlı ve etkili bir şekilde taramak için idealdir.

Dezavantajları

  • Verinin normal dağıldığı durumlarda etkinliği düşüktür.
Z-skoru (Z-Score)

Z-skoru, normal dağılıma sahip bir veri setinde, bir gözlemin ortalamadan ne kadar standart sapma saptığını gösterir. Herhangi bir gözlem için z-skoru, gözlemden ortalama çıkartıldıktan sonra standart sapmaya bölünmesiyle hesaplanır.

Z = (x – μ) / σ

x: Gözlem değeri
μ: Ortalama değer
σ: Standart sapma

Gözlemlerin, normal veya normale yakın dağılıma sahip olduğu durumlarda Z-skoru yöntemi kullanılabilir.

Normal dağılıma sahip bir değişkende gözlemlerin:

  • %68’i ortalamadan 1 standart sapma uzaklıkta,
  • %95’i ortalamadan 2 standart sapma uzaklıkta,
  • %99.7’si ise 3 standart sapma uzaklıkta olduğunu kabul ederiz.
normal dağılım eğrisi

Normal Dağılım Eğrisi

Genel bir ifade olarak, 3 standart sapma uzaklıkta olan gözlemleri aykırı değer olarak konumlayabilirsiniz. Örneklem büyüklüğünün az olduğu durumlarda 2 standart sapma, örneklem büyüklüğünün çok olduğu durumlarda ise 4 standart sapma uzaklığını eşik değer olarak belirleyebilirsiniz.

Avantajları

  • Farklı ölçekteki verilerin kıyaslanabilmesine olanak sağlar.
  • Uygulanışı hızlı ve basittir.

Dezavantajları

  • Verideki aykırı değerlerden etkilenir.
  • Verinin normal dağılıma sahip olmadığı durumlarda, kullanım için öncelikle verinin normalleştirilmesi gerekmektedir.
  • Küçük ve orta veri setlerinde kullanılması kolaydır.
Hampel Filtresi

Hampel filtresi, ortanca mutlak sapma değerini kullanan güçlü bir aykırı değer tespit metodudur.

Her bir gözlem için, “n” boyutunda bir pencere içindeki tüm komşu değerler (gözlemden n/2 önceki ve sonraki komşu değer) kullanılarak bir medyan ve standart sapma değeri hesaplanır. Gözlem, ortanca değerinden “t” standart sapma uzak ise “aykırı değer” olarak işaretlenir. Hampel değeri ne kadar büyükse, gözlemin aykırı değer olma ihtimali o kadar yüksektir.

Hampel filtresi, 2 parametre kullanır.
– n: Pencerenin boyutunun büyüklüğü
– t: Bir gözlemi aykırı olarak belirleyen standart sapma sayısı

t değeri filtrenin agresifliğini belirler. t değerinin yüksek olduğu durumlarda daha sıkı bir filtreleme olurken, düşük olduğu durumlarda çok daha fazla değer aykırı olarak işaretlenecektir.

Avantajları

  • Zaman serilerindeki aykırı değerleri tespit etmek için kullanışlıdır.

Dezavantajları

  • Verinin başında ve sonunda yer alan aykırı değerleri tahmin etmekte yetersiz kalır.
  • Aykırı değerlerin birbirine yakın olduğu durumlarda bu değerleri tespit etmekte sorun yaratabilir.

Hangi aykırı değer analiz yöntemi kullanılmalı?

Veri bilimcisi/analisti olarak farklı aykırı değer analiz yöntemlerini, nasıl çalıştıklarını, avantaj ve dezavantajlarını bilmek farklı koşullarda alternatif çözümler üretmenize yardımcı olacaktır.

Makalede bahsedilen her yöntemin kendi içerisinde avantajları ve dezavantajları bulunmaktadır. Seçilecek yöntem, verinin dağılımına, hacmine, boyut sayısına göre farklılık gösterecektir.

Değişken sayısının az olduğu durumlarda şöyle bir yol izlenilebilir:

  1. Kutu grafiği ile hangi değişkenlerde aykırı değerlerin bulunduğuna dair hızlı bir gözlem yapılması.
  2. İlk adımda aykırı değerlere sahip olduğu anlaşılan verilere histogram ile daha yakın bir bakış sağlayarak değişkenin dağılımına dair fikir elde edilmesi.
  3. Değişkenin dağılımına göre tek değişkenli istatistiksel bir analiz yöntemi seçilmesi.
    1. Normal dağılım: Çeyrekler açıklığı, Z-skoru
    2. Dağılım belirsiz: Ortalama mutlak sapma metodu

Aykırı değerlerin yönetimi

Aykırı değerler tespit edildikten sonraki adım, bu değerlerle ilgili yapılacak işlem olmalıdır.

Aykırı gözlemlerin silinmesi (Trimming)

Aykırı verilerle ilgili uygulanacak en basit yöntem aykırı gözlemlerin silinmesidir. Veri silme işlemleri, verinin değişkenliğini etkileyebilir. Bu nedenle, ilk tercih olmamalıdır ve kaçınılmalıdır

Aykırı değerlerin ölçüm sırasında gerçekleşen bir hata veya veri girişi sırasında insan faktörüyle kaynaklandığından emin olduğunuz durumlarda aykırı gözlemleri silmeyi tercih edebilirsiniz.

Aykırı gözlemlerin yerine değer ataması (Imputation)

Kayıp verilerle başa çıkma yöntemlerinde olduğu gibi aykırı değerlerin yerine de değer atama yöntemi tercih edilebilir. Silme işlemlerinde veri kaybının yarattığı sorunlara göre daha avantajlıdır.

Aykırı değerler yerine atanacak değerler ortalama, medyan, mod gibi temsili istatistikler, yada herhangi bir sabit değer olabilir.

Makine öğrenmesi modellerini kullanan KNN, MICE gibi daha gelişmiş yöntemler ile tahminleme yapılabilir.

Aykırı gözlemlerin sınırlandırılması (Winsorization)

Aykırı verilerin veri setindeki etkisini azaltmak için uygulanabilecek bir diğer strateji de sınırlandırmadır.

Özel bir atama yöntemi olarak da düşünebileceğimiz bu teknik ile değişkenin üst kısmındaki aykırı değerler 95.kantil (Q95), alt kısmındaki aykırı değerler de 5.kantil (Q5) değeri ile değiştirilir.

Aykırı gözlemlerin dönüştürülmesi (Transformation)

Verinin normal dağılmadığı durumlarda dağılımın normal olduğunu varsayan (parametrik) testlerin ve yöntemlerin uygulanması mümkün değildir. Aykırı değerler, bulundukları değişkenlerin dağılımını etkiler.

Aykırı değerlerin verinin dağılımı üzerindeki etkisini azaltmak için veri dönüştürme işlemleri uygulanabilir.

Log dönüşümü

Veri setindeki her gözlemin logaritmasının alınması ile log dönüşümü yapılmış bir seri oluşturulur.

  • Verinin dağılımı üzerine yüksek etkisi vardır.
  • Sağa çarpık dağılımları dönüştürmek için kullanılır.
  • Veri setindeki sıfır veya negatif değerlere uygulanamaz.

Sola çarpık (negatif) dağılıma sahip veri setlerine log dönüşümü uygulamadan önce dağılımın çarpıklığının yönünü sağa çevirmek (pozitife) gerekmektedir.

Karekök dönüşümü

Veri setindeki her gözlemin karekökünün alınması ile karekök dönüşümü yapılmış bir seri oluşturulur.

  • Verinin dağılımı üzerine orta seviye bir etkisi vardır.
  • Verinin orta derecede yatık olduğu dağılımlarda kullanılabilir.
  • Log dönüşümüne kıyasla daha zayıf bir teknik olmasına rağmen sıfır ve negatif değerlere uygulanabilme avantajı vardır.

Sola çarpık (negatif) dağılıma sahip veri setlerine karekök dönüşümü uygulamadan önce dağılımın çarpıklığının yönünü sağa çevirmek (pozitife) gerekmektedir.

Veride uygulanan dönüştürme işlemleri, verinin birimini değiştirir. Bu işlem, mutlaka çıktıların sunulacağı hedef kitle ile paylaşılmalıdır.

Aykırı gözlemlerin gruplanması (Binning)

Bazı gözlemler değişken içerisinde fazla ekstrem/aykırı/uç oldukları için dönüşüme uğrasalar da hala aykırı olarak kalabilirler. Bu nedenle, nümerik değişkenleri kategorik değişkenlere çevirerek aykırı değerleri gruplayabiliriz.

Aykırı değerlere dayanıklı makine öğrenmesi algoritmalarının tercih edilmesi

Aykırı değerler üzerinde işlem yapmak yerine bu değerlere dayanıklı makine öğrenmesi algoritmaları da tercih edebilirsiniz. Aşağıdaki algoritmalar uç değerlere karşı dayanıklıdır:

  • Decision Tree
  • Random Forest
  • XGBoost
  • AdaBoost
  • Naive Bayes

Örnek uygulama: Tek değişkenli yöntemlerle aykırı değer analizi (outlier detection)

Örnek bir veri setinde tek değişkenli yöntemlerle aykırı değerlerin nasıl tespit edileceğine dair örnek bir uygulama yapalım.

Kullanacağımız örnek veri seti, 2009-2019 yılları arasında Amazon’da en iyi satış yapan ilk 50 kitabın bilgisini bulunduruyor.


Örnek veri seti: 2009-2019 yılları arasında Amazon’da en iyi satış yapan ilk 50 kitap.


1. Adım: İlgili kütüphanelerin yüklenmesi ve veri setinin okunması

İlk adımda, analiz sırasında kullanılacak kütüphaneler yüklenmeli ve sonrasında da veri dosyadan okunmalıdır.

Bu uygulamada analiz için Pandas, NumPy ve SciPy veri görselleştirme için de Matplotlib ve Seaborn kütüphanelerini kullanacağız.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats

Daha sonrasında, csv formatında bulunan kullanılacak veri setini okuyacağız. Veri setinin doğru bir şekilde yüklendiğini teyit etmek için ilk ve son 5 satırını head() ve tail() fonksiyonları ile görüntüleyeceğiz.

books = pd.read_csv("amazon-bestsellers.csv")
books.head()
books.tail()

Şimdilik her şey yolunda görünüyor. Veri seti yüklendi. İlk 5 değer şu şekilde:

Veri seti ile ilgili ne kadar çok bilgi edinirseniz o kadar iyi olur. Değişkenlere dair daha fazla bilgi edinmek için info() fonksiyonunu kullanacağız.

books.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 550 entries, 0 to 549
Data columns (total 7 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   Name         550 non-null    object 
 1   Author       550 non-null    object 
 2   User Rating  550 non-null    float64
 3   Reviews      550 non-null    int64  
 4   Price        550 non-null    int64  
 5   Year         550 non-null    int64  
 6   Genre        550 non-null    object 
dtypes: float64(1), int64(3), object(3)
memory usage: 30.2+ KB
  • Veri setinde 7 adet değişken bulunuyor.
    • Name, Author, Genre: Kategorik değişken
    • User Rating, Reviews, Price, Year: Nümerik değişken
  • Year değişkeni ile ilgili bir analiz yapılacağı zaman datetime yani tarih değişken tipine geçmek gerekmektedir.
  • Verideki hiçbir değişkende eksik gözlem bulunmamaktadır.

2. Adım: Aykırı değerlerin kuşbakışı tespit edilmesi.

Veri setiyle ilgili bir ön fikir edindik fakat herhangi bir aykırı değer olup olmadığını bilmiyoruz. Derinlemesine bir analize girmeden önce hangi değişkenlerde aykırı değer olduğunu hızlıca görmek faydalı olabilir. Bunun için grafiksel yöntemlerden, özellikle de kutu grafiğinden faydalanacağız.

fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize = (20, 8))

ax1.boxplot(books["User Rating"])
ax1.set_title("User Rating")

ax2.boxplot(books["Reviews"])
ax2.set_title("Reviews")

ax3.boxplot(books["Price"])
ax3.set_title("Price")

plt.show()
  • Kutu grafiğini çizmek için Matplotlib (kısaca plt) kütüphanesini kullanacağız. Tüm grafikleri tek bir satırda toplamak ve birlikte görmek için öncelikle “fig” adı verilen, 2000 x 800 px (20, 8) ölçülerinde bir çerçeve tanımlıyoruz.
  • Bu çerçevenin 3 adet iç grafik içermesini istediğimiz ve 1 satır, 3 sütun şeklinde yan yana görüntülenmesini istediğimiz için subplots’a 1, 3 parametrelerini veriyoruz.
  • 3 adet iç grafiğini, ax1, ax2, ax3 olarak isimlendirdik.
    • İlk kutu grafiğine (ax1) kitapların ortalama değerlendirme puanlarını gösteren “User Rating”,
    • İkinci kutu grafiğine (ax2) kitapların kaç adet değerlendirmeye sahip olduğunu gösteren “Reviews”,
    • Ve son kutu grafiğine (ax3) de kitapların fiyatlarını temsil eden “Price” değişkenini çizdiriyoruz.
  • Kutu grafiklerinin daha açıklayıcı olması için “set_title” ile de her kutu grafiğine başlık atıyoruz.

Grafikte, her üç değişken için de yuvarlak noktalarla temsil edilen ve kutunun dışarısında kalan aykırı değerler bulunduğunu görüyoruz.

Kitapları seven ve sıklıkla kitap alan biri olarak, veri setinde aykırı olarak görünen değerlerin verinin elde edilirken meydana gelen bir hatadan kaynaklandığını düşünmüyorum. Bu değerler daha çok bazı kitapların üst düzey satış performansından kaynaklanıyor gibi görünüyor.

Bu yorumu neye dayanarak yapıyoruz?

  • Öncelikle “User Rating” sütununda, değerlerin 3-5 yıldız arasında dağıldığını görüyoruz. Amazon’un 5 yıldız üzerinden olan puan sistemini düşündüğümüzde, verideki değerlerin bu aralıkta olması mantıklı görünüyor. Eğer bu alanda 5’ten büyük veya 1’den küçük değerlere rastlasaydık, daha farklı düşünebilirdim.
  • “Reviews” sütunundaki en aykırı değerin 2019 yılı itibariyle 80 binden fazla değerlendirmeye sahip bir kitap olduğunu görüyoruz. Bu kitabın ne olduğunu merak edip, filtrelediğimizde Della Owens tarafından yazılmış Where the Crawdads Sing olduğunu buluyoruz. 2021, Şubat ayı itibari ile bu kitabın 140 binden fazla değerlendirmesi bulunuyor. Yani, 80 bin rakamı da aslında bir hataya benzemiyor.
  • İlk 2 değişken için yaptığımız işlemi, en aykırı değere sahip “Price” sütunu için de yaptığımızda Diagnostic and Statistical Manual of Mental Disorders, 5th Edition: DSM-5 isimli bir kitaba rastlıyoruz. Kitabın 2013 ve 2014 yıllarında en iyi satanlar listesine $105’lık bir fiyat etiketiyle girdiğini, 2021 Şubat ayı itibari ile de $130 civarlarında bir fiyatta olduğunu görüyoruz. Yani bu değişken de de bir veri toplama hatası değil, ekstrem bir performans gördüğümüzü düşünüyorum.

3. Adım: Aykırı değerlere sahip değişkenlerin dağılımının tespit edilmesi.

Aykırı değerleri istatistiksel olarak da tespit etmeden önce değişkenlerin dağılımına dair fikir edinmemiz gerekiyor. Uygulayacağımız istatistiksel yöntemler normal dağılıma sahip olan ve olmayan değişkenlere göre farklılık göstermek zorundadır.

Aykırı değere sahip değişkenlerin dağılımına dair fikir elde etmek için histogramdan faydalanacağız.

fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize = (20, 8))

ax1.hist(books["User Rating"])
ax1.set_title("User Rating")

ax2.hist(books["Reviews"])
ax2.set_title("Reviews")

ax3.hist(books["Price"])
ax3.set_title("Price")

plt.show()
  • Kutu grafiğinde olduğu gibi aynı yolu izliyoruz. Önce çerçeve ve iç grafik yapısını belirledik.
  • Daha sonrasında “hist” fonksiyonu ile 3 farklı değişkenimiz için histogram grafiklerini çizdirdik.

Histogram grafiğinde her üç değişkenin de normal dağılıma sahip olmadığını görüyoruz. “User Rating” değişkeni sola çarpık (negatif) dağılıma sahip iken “Reviews” ve “Price” değişkenleri sağa çarpık (pozitif) dağılım gösteriyor.

Her üç grafikte de ana karadan kopuk, grafiğin en solunda ve en sağında aykırı değerleri görebiliyoruz.

4. Adım: Aykırı değerlerin istatistiksel yöntemlerle tespit edilmesi.

Aykırı değerlere sahip değişkenlerimizin üçü de normal dağılıma sahip olmadığı için Z-skoru yöntemini tercih etmiyoruz. Z-skoru yöntemi ortalama ve standart sapma değerlerini kullanarak hesaplandığı ve bu değerler de verideki aykırı değerlerden etkilendiği için etkinliği düşük olacaktır.

Z-skoru yerine, aykırı değerlere daha dayanıklı olan Çeyrekler Açıklığı (IQR) ve Ortanca Mutlak Sapma (MAD) metodunu kullanacağız.

Çeyrekler Açıklığı (IQR)

Çeyrekler açıklığını kendi oluşturduğumuz bir fonkisyon yardımı ile veya SciPy kütüphanesinin “iqr()” fonksiyonu ile hesaplayabiliriz.

def iqr(df,var):
    q1 = np.quantile(df[var], 0.25)
    q3 = np.quantile(df[var], 0.75)
    diff = q3 - q1
    lower_t = q1 - (1.5 * diff)
    upper_t = q3 + (1.5 * diff)
    return df[(df[var] < lower_t) | (df[var] > upper_t)]
  • Fonksiyona iqr adını verdik. df ve var adında iki parametre ile çalışıyor.
    • df parametresi, veri setinin yani dataframe’in adı.
    • var parametresi ise veri setinde işlem yapılacak değişkenin adı.
  • NumPy kütüphanesinden quantile fonksiyonunu kullanarak 1. ve 3. çeyrek değerlerini hesapladık.
  • Daha sonrasında bu iki çeyrek arasındaki %50’lik dilimi iki değeri birbirinden çıkararak bulduk.
  • Aykırı değerleri belirleyecek sınırlar olan alt ve üst eşik değerlerini hesaplarken 1. çeyrekten 1.5 kat az, 3. çeyrekten de 1.5 kat fazla olan değeri sınır olarak belirledik.
  • Son olarak da işlem yapılan değişkendeki eşik değerlerin altında ve üstünde kalan değerleri filtreledik.
user_rat_out = iqr(books, "User Rating")
reviews_out = iqr(books, "Reviews")
price_out = iqr(books, "Price")

print(len(user_rat_out), len(reviews_out), len(price_out))
21 17 31

Fonksiyonu çalıştırdığımızda, belirlediğimiz kurala göre aykırı olarak bulunan değerleri birer değişkene atadık. Her bir tabloda ne kadar kayıt olduğuna baktığımız zaman, sırasıyla “Users Rating” değişkeninde 21, “Reviews” değişkeninde 17 ve “Price” değişkeninde ise 31 aykırı değer filtrelendiğini görüyoruz.

Ortanca Mutlak Sapma (MAD)

Değişkenlerimiz normal dağılmadığı için Ortanca Mutlak Sapma metodunun “Çift” versiyonunu uygulayacağız. İlgili işlemi yapabilmek için bir fonksiyon tasarlaaycağız.

def double_mad(df, var):
    c = 1.4826
    q2 = np.median(df[var])
    bot_val = df.loc[df[var] <= df[var].median(), var]
    bot_mad = (abs(bot_val - q2).median()) * c
    up_val = df.loc[df[var] >= df[var].median(), var]
    up_mad = (abs(up_val - q2).median()) * c
    lower_t = q2 - (3 * bot_mad)
    upper_t = q2 + (3 * up_mad)
    return df[(df[var] < lower_t) | (df[var] > upper_t)]
  • Fonksiyona double_mad adını verdik. df ve var adında iki parametre ile çalışıyor.
    • df parametresi, veri setinin yani dataframe’in adı.
    • var parametresi ise veri setinde işlem yapılacak değişkenin adı.
  • Pandas kütüphanesinden median fonksiyonunu kullanarak değişkenin ortanca değerini hesapladık.
  • Çift Ortanca Mutlak Sapma metodunda, ortanca değerden küçük veya eşit, ortanca değerden büyük veya eşit değerler için ayrı ayrı iki farklı değer hesaplamamız gerekiyor.
    • Pandas’ın “loc” özelliği ile değişkenin ortanca değerinden düşük olan değerleri filtreleyip bir değişkene atadık. Daha sonrasında da bu değerler için “MAD” değerini hesapladık.
    • Aynı işlemi ortanca değerinden yüksek değerler için de tekrarladık.
  • Aykırı değerleri belirleyecek sınırlar olan alt ve üst eşik değerlerini hesaplarken ortanca değerden 3 ortanca mutlak sapma az ve 3 ortanca mutlak sapma fazla olan değerleri sınır olarak belirledik.
  • Son olarak da işlem yapılan değişkendeki eşik değerlerin altında ve üstünde kalan değerleri filtreledik.
double_mad_rat = double_mad(books, "User Rating")
double_mad_rev = double_mad(books, "Reviews")
double_mad_pri = double_mad(books, "Price")

print(len(double_mad_rat), len(double_mad_rev), len(double_mad_pri))
35, 16, 26

Fonksiyonu çalıştırdığımızda, belirlediğimiz kurala göre aykırı olarak bulunan değerleri birer değişkene atadık. Bu yöntem ile her bir tabloda ne kadar aykırı değeer olduğuna baktığımız zaman, sırasıyla “Users Rating” değişkeninde 35, “Reviews” değişkeninde 16 ve “Price” değişkeninde ise 26 aykırı değer filtrelendiğini görüyoruz.

Kullandığımız her iki yöntemin de “Reviews” ve “Price” değişkenleri için birbirine çok yakın sonuçlar verdiğini söyleyebiliriz.

5. Adım: Aykırı değerlerin yönetimi.

Aykırı gözlemleri tespit ettikten sonra son adım bu değerler ile mücadelede nasıl bir strateji izleneceğidir. Şu ana kadar yaptığımız analizden çıkan gözlemleri şöyle özetleyebiliriz:

  • Verideki aykırı değerler, veri toplama hatasından değil, muhtemelen ekstrem performanstan kaynaklanıyor.
  • Değişkenler normal dağılıma sahip değil.
  • Aykırı olarak işaretlenen gözlem sayısı tüm veri setine kıyasla düşük bir yüzdeyi oluşturuyor.

Veri kaybetmekten olabildiğince kaçınmak istiyoruz. Aykırı gözlem yüzdesi düşük olsa da, bir hatadan kaynaklanmadığını düşündüğümüz için silme işlemini bu uygulama için tercih etmiyoruz.

Aynı şekilde, değerler aykırı olsa da hata olmadığı için veri atama işlemleri ile değerleri değiştirmek istemiyoruz. Bu şekilde, veriden elde edebileceğimiz farklı bulguları kaybedebiliriz.

Bu koşullar atlında aykırı değerlerin veri seti üzerindeki etkisini azaltmak için dönüşüm işlemlerini tercih etmek mantıklı bir seçenek olarak görünüyor.

Dönüşüm işlemleri

Herhangi bir dönüşüm işlemi yapmadan önce, değişkenlerimizin ne kadar çarpık (skewness) ve basık olduğunu (kurtosis) inceleyeceğiz.

Çarpıklık değeri:

  • -0.5 ile 0.5 arasında ise; neredeyse simetrik dağılıma,
  • -0.5 ile -1.0 veya 0.5 ile 1.0 arasında ise; orta derecede çarpık dağılıma,
  • -1.0’den veya 1.0’ten büyük ise; değişken çok çarpık dağılıma sahiptir.
books[["User Rating", "Reviews", "Price"]].agg(['skew', 'kurtosis']).transpose()
               skew     kurtosis 
User Rating -1.502125   3.465375 
Reviews      2.421597   8.809313 
Price        3.685057  22.433520
  • “Reviews” ve “Price” değişkenlerinin çarpıklık değerleri pozitif yani bu değişkenler sağa yatık bir dağılıma, “User Rating” negatif değere yani sola yatık bir dağılıma sahiptir.
  • “Price” değişkeni en yüksek çarpıklık değerine yani en çarpık dağılıma sahiptir.

Not: Daha hızlı anlaşılır bir görünüm için transpose() fonksiyonu ile sonuç tablosunun satırları ve sütunlarının yerini değiştirdik.

Sağa çarpık dağılıma sahip değişkenlere hem log hem de karekök dönüşümü uygulayıp, aradaki farka bakarak hangisinin daha etkili olduğuna bakacağız.

books["reviews_log"] = np.log(books["Reviews"])
books["reviews_sqrt"] = np.sqrt(books["Reviews"])

books[["reviews_log", "reviews_sqrt"]].agg(['skew', 'kurtosis']).transpose()
               skew     kurtosis 
reviews_log  -0.645521  1.162259 
reviews_sqrt  0.884469  1.083373
  • Numpy kütüphanesindeki “log” ve “sqrt” fonksiyonlarını kullanarak değişken üzerinde sırasıyla log ve karekök dönüşümü uyguladık.
  • Daha sonrasında tekrardan basıklık ve çarpıklık katsayılarına baktık.
  • Çıkan sonuçlara göre, çok çarpık dağılıma sahip “Price” değişkenini orta derecede çarpık dağılıma sahip olacak şekilde dönüştürdük.

Dönüşüm işlemlerini “Price” değişkenine uygulayacağız.

books["pr_log"] = np.log(books["Price"])
books["pr_sqrt"] = np.sqrt(books["Price"])

books[["pr_log", "pr_sqrt"]].agg(['skew', 'kurtosis']).transpose()
          skew     kurtosis 
pr_log     NaN       NaN 
pr_sqrt  1.011734  4.449696
  • Aynı dönüşüm işlemlerini “Price” değişkenine de uyguladık. Bu değişkende “sıfır” değeri olan gözlemler olduğu için “Log” dönüşümü değeri NaN yani boş değer olarak hesaplandı. Log dönüşümü veri setinde sıfır veya negatif değerler olduğu koşullarda uygulanamaz.
  • Karekök dönüşümü, çok çarpık dağılıma sahip olan değişkeni neredeyse orta seviyede çarpık dağılıma sahip bir değişkene dönüştürdü.

Dönüşüm işlemleri son olarak da “User Rating” değişkenine uygulayacağız. Fakat bu değişken negatif yani sola yatık bir dağılıma sahip olduğu için log ve karekök dönüşüm işlemlerini uygulayabilmek adına önce verinin dağılımını pozitife çevireceğiz.

books["rs_user_rating"] = max(books["User Rating"]) + 1 - books["User Rating"]

books[["rs_user_rating", "User Rating"]].agg('skew')
rs_user_rating    1.502125 
User Rating      -1.502125
  • Değişkenin dağılımını pozitife çevirmek için, verideki maksimum değere, +1 ekledikten sonra tek tek tüm gözlemleri bu değerden çıkardığımızda, aynı değişkenin, aynı çarpıklıkta fakat pozitif dağılıma sahip bir versiyonunu elde ettik.
  • Yeni ve eski değişkenlerin çarpıklık değerlerini karşılaştırdığımızda, verinin çarpıklık değerinini aynı fakat yönünün değiştiğini görebiliyoruz.

Artık değişken veri dönüşümü için hazır.

books["rs_user_rating_log"] = np.log(books["rs_user_rating"])
books["rs_user_rating_sqrt"] = np.sqrt(books["rs_user_rating"])

books[["rs_user_rating_log", "rs_user_rating_sqrt"]].agg(['skew','kurtosis']).transpose()
                      skew     kurtosis 
rs_user_rating_log   0.895105  0.956204 
rs_user_rating_sqrt  1.176201  1.958578
  • Log dönüşümü ile karekök dönüşümüne kıyasla değişkendeki çarpıklığı azaltarak daha iyi sonuçlar elde ettik.

Aykırı değerler, değişkenlerin dağılımına etki eden, veriden yapılacak çıkarımları ve kullanılacak modellerin performansını etkileyen değerlerdir. Veri girişi veya ölçümleme sırasında yapılan hatalardan kaynaklandığı gibi değişkendeki aşırı performanslardan da kaynaklanabilir. Bu sebeple, aykırı değerler her zaman hatadan doğmaz.

Keşifçi veri analizi ve veri temizleme işlemleri sırasında mutlaka tespit edilmeli ve performansa etkisi dahilinde uygun yöntemlerden bir tanesi ile müdahale edilmelidir.

Kaynakça