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

Log Dönüşümü ile Çarpıklık Giderme

Log-Transform skewed data

Çarpıklık (skewness) sürekli ya da diğer bir deyiş ile kategorik olmayan veri setlerinde veri dağılımında simetrinin bozuk olma durumuna verilen isimdir denilebilir. Diğer bir deyiş ile asimetri ölçütüdür. Özetle gerçekte veri setlerinin dağılımının normal dağılım (normal distribution) göstermesi umulurken eldeki veriler buna aykırı bir durum sergiliyor ise veride çarpıklıktan söz edilebilir. Bu çarpıklıklar kategorik veriler için kullanılan dengesiz veri setlerinin (imbalanced dataset) yarattığı etkiye benzer şekilde bir kısım makine öğrenmesi modellerinin veriden öğrenmesine engel teşkil eden nedenlerdendir.

Karar ağacı temelli makine öğrenmesi yöntemleri çarpık verilere karşı daha dayanıklıdır.

Çarpıklığı teorik olarak tanımlamadan önce mean, median ve mode değerlerinin anlamlarını bilmek kavramayı kolaylaştıracaktır.

Mean (ortalama), setteki tüm sayıların toplamının toplam sayı adedine bölünmesi ile elde edilir.

Median setteki sayılar sıralandığında tam ortadaki sayı bulunarak elde edilir.

Mode ise sette en çok tekrar eden sayı anlamına gelir.

Eğer mode, median ve mean değerleri birbiri ile örtüşüyor ise burada bir çarpıklık bulunmadığı anlamına gelir.

Aşağıdaki görselde üç farklı veri setine ait kayıt sayılarını gösteren grafik mevcut. Yeşil grafikteki gibi simetrik dağılıma sahip veri setinde mode median ve mean değerleri eşittir. Yani en sıklıkla bulunan sayı hem ortanca sayıdır hem de ortalamadır. Turuncu grafikteki durum pozitif çarpıklık, mavi grafikteki durum ise negatif çarpıklık olarak ifade edilir.

skewness types, mode, mean, median
Çarpıklık (skewness) çeşitleri ve mode, median, mean değerlerini gösteren sıklık (frequency) grafikleri

Kayıt sayılarına (record count) ait yukarıdakilere benzer grafikler çizdirmeden ya da bu grafiğin yorumlanmasına gerek kalmadan verinin çarpık olup olmadığını ve ne kadar çarpık olduğunu anlamak elbette mümkün.

Çarpıklık değerini hesaplamak için bir çok yöntem kullanılmaktadır. Veri Bilimi için Python uygulamalarında sıkça kullanılan Pandas kütüphanesi çarpıklık hesabı için aşağıdaki formülü kullanmaktadır:

S = \frac{n}{(n-1)(n-2)}\sum_{i}^{n}(\frac{x_i-x_m}{\sigma})^3

Formülde n örnek sayısını, xm dizinin aritmetik ortalamasını (sample mean), sigma ise standart sapmasını belirtmektedir.

Çarpıklık değeri artı sonsuza doğru ilerledikçe pozitif, eksi sonsuza doğru ilerledikçe negatif çarpıklık kuvveti artmaktadır.

Çarpıklık değerinin python’da hem sıfırdan (from scratch) hem de pandas ile hesaplamak üzere bir örnek yapalım.

Öncelikle örnek bir pandas DataFrame yaratalım:

import pandas as pd
df = pd.DataFrame({'a':[2, 8, 0, 4 , 1, 9, 9, 0],'b':[2, 8, 3, 4 , 1, 9, 8, 0]})

a ve b kolonları için ayrı ayrı formüle göre çarpıklık değerini hesaplamak için aşağıdaki kodu kullanmamız gerekir:

S_a = sum(((df.a-df.a.mean())/df.a.std())**3)*(df.a.count()/((df.a.count()-1)*(df.a.count()-2)))
S_b = sum(((df.b-df.b.mean())/df.b.std())**3)*(df.b.count()/((df.b.count()-1)*(df.b.count()-2)))

pandas.DataFrame.skew() fonksiyonundan faydalanmak istersek:

df.skew()

bize df’e ait tüm kolonlar için çarpıklık değerini döndürecektir. Sadece a kolonu için çarpıklık değeri hesaplamak için ise aşağıdaki kod kullanılabilir:

df.a.skew()

Aykırı verilerden (outliers) kaynaklı çarpıklık değerini azaltmak için ise log dönüşümü yapmak en sık başvurulan yöntemlerden.

df_log_transformed = df.apply(lambda x: np.log(x))

Örneğin aşağıdaki şekilde bir veri için çarpıklık değeri 1.39 olarak hesaplanırken log dönüşümü sonrası çarpıklık değeri -0.055 olarak hesaplanır. Görsel olarak da çarpıklığın azalmış olduğu anlaşılmaktadır:

df.a.hist()
log dönüşümü öncesi
df_log_transformed.a.hist()
log dönüşümü sonrası

Log dönüşümü yaparken unutulmaması gereken nokta 0 değerinin logaritmasının eksi sonsuza yakınsaması sebebi ile bu değerlerin dönüşüm öncesi sıfır yerine küçük değerlere dönüştürülmesi gerekliliğidir.

İlgili Github repo’su için tıklayın.

Keyifli öğrenmeler 🙂

İlk Yorumu Siz Yapın

Bir Cevap Yazın

Translate »
%d blogcu bunu beğendi: