
Merhaba arkadaşlar Missing Data Imputation Ortalama ve Medyan Atama Tekniği yazısı ile birlikteyiz. Bir önceki yazıda Feature Engineering nedir? Missing data nedir? komularını ele almıştık ve eksik veri atama işlemi olan complete case analysis(tam vaka analizinin) ne olduğuna göz atıp Python ile uygulamasını yapmıştık. Dilerseniz buradan bakabilirsiniz. Bu derste ise eksik veri atama işlemlerinin diğer teknikleri göreceğiz.
Ortalama ve Medyan Atama
Bu yöntem numerik sütunlar üzerinde geçerli olan bir işlemdir. Peki nedir bu yöntem? Bu yöntem veri seti içinde boş olan gözlemlere o gözlemin bulunduğu sütunun ortalama veya medyan değerinin atanmasıdır. Şimdi burada size bir soru, hangi çıktı durumunda ortalama işlemi yapacağım hangi durumda medyan değerini atayacağım.
Burada üç farklı dağılım var; (a) grafiğinde sola dağılım şeklinde, (b) grafiğinde normal dağılım, (c) grafiğinde ise sağa doğru dağılım göstermektedir.
Bizim istediğimiz grafik (b) grafiğindeki dağılımdır. Peki (a) ve (c) grafiği neden bu şekilde bir dağılım göstermektedir?
Bunun birçok sebebi vardır. Bunlardan bir tanesi aykırı değer ilerde bunu detaylı bir şekilde işleyeceğiz ama kısaca bir değinelim. Örneğin sizden personel maaşlarıni sisteme girmeniz istenmektedir. Teker teker giriyorsunuz ama bir yanlışlık yaptınız 10.000 tl girmeniz gerekirken siz son üç rakamı unuttunuz sadece 10 tl girdiniz bu bir aykırı değerdir ve çok düşük bir değer olduğundan grafiğin dağılımını sola doğru yayılım göstermesine sebep oldu. Veya o şirkette ki çalışanların çoğu maaşları düşük sadece bir kaç çalışanın maaşı tek yüksek yine aynı şekilde sola doğru dağılım gösterecektir. (c) grafiği yine aynı sebeplerden dolayı sağa doğru yayılım gösterir. Örneğin genel olarak maaş aralığı 3 – 10 bin arasında olan bir şirkete yanlışlıkla Elon Musk maaşını eklerseniz sağa doğru yayılım gösterecektir. Burada ki Elon Musk maaşı aykırı değerdir. Biraz önce belirttiğim gibi bunun birçok sebebi olabilir. Örneğin elinizde covid-19 sebebiyle ölen kişilerin yaş bilgisi elinizde elbette bu bilgilerin grafiği sağa doğru dağılım gösterecektir çünkü bu hastalık daha çok yaşlı insanları etkilemiştir. Başka bir örnek daha verelim kalp krizi geçiren insanların yaş dağılımı yine sağa doğru dağılım gösterecektir.
O zaman hemen uygulama kısmına geçelim. Kullanacağımız Mall_Customers veri seti olacak. Hemen kullanacağımız veri setini okuyalım.
Verisetini Okuma İşlemi
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns train = pd.read_csv("Mall_Customers.csv") train.sample(6)
Şimdi eksik verileri görelim.
Eksik Veri Miktarı
train.isnull().sum()
Şimdi eksik verilerin yüzdeliklere bakalım;
percent = train.isnull().mean()*100 percent
Tamam eksik veri yüzdeliklerin gördük şimdi veri setinde ortalama veya medyan atama ikisinden birini eksik değerlerin yerine atama işlemi yapacağız.
O zaman ilk önce veri setinin ortalama ve medyan değerlerini görelim daha sonra hangi değeri kullanacağımıza karar verelim.
# Yaş sütunun ortalaması mean = train.Age.mean() mean 39.01 # Yaş sütunun medyanı median = train.Age.median() median 36.0
Bu iki değer birbirine çok yakın değerler olduğu için herhangi bir tanesini kullanabiliriz. Biz bu yazıda ikisini de alacağız. O zaman hemen fonksiyonumuzu yazalım.
Eksik Veri Atama İşlemi Yapma
def impute_na(dataFrame, variable, mean_median): return dataFrame[variable].fillna(mean_median) #Eksik değerlere medyan değerini atama train['Age_median'] = impute_na(train, 'Age', median) #Eksik değerlere ortalama değerini atama train['Age_mean'] = impute_na(train, 'Age', mean) #ortalama değer bir float değer olabilir bu yüzden küsürat değeri en yakın tamsayıya yuvarlama işlemi yaptık train['Age_mean'] = np.round(train['Age_mean'], 1) train.head(10)
Şimdi verisetine iki featue(sütun) daha eklemiş olduk. Eksik olan yaş değerlerine bakarsanız medyan olarak 36.0 ve ortalama değer olarak 39.0 değeri geldiğini göreceksiniz.
Şimdi burada eklediğimiz yeni değerlerin veri seti dağılımını değiştirip değiştirmediğini kontrol etmeliyiz.
Onun için varyans değerlerine bakıyorum.
print('Orjinal Yaş değerinin varyansı: ', train['Age'].var()) print('Eksik değerleri Medyan ile değiştirdikten sonraki varyans: ', train['Age_median'].var()) print('Eksik değerleri Ortalama ile değiştirdikten sonraki varyans: ', train['Age_mean'].var())
Dikkat ederseniz ortalama ve medyan atama işlemi yapıldıktan sonra varyans değeri oldukça az değişti. Buda yeni değerler sonucu veri setimizde çok fazla bozulma olmadığının bir göstergesi dilerseniz görsel olarak grafik üzerinde görelim.
fig = plt.figure() ax = fig.add_subplot(111) # orjinal değerler train['Age'].plot(kind='kde', ax=ax) #Eksik değerlere medyan değerini atama train['Age_median'].plot(kind='kde', ax=ax, color='red') # Eksik değerlere ortalama değerini atama train['Age_mean'].plot(kind='kde', ax=ax, color='green') lines, labels = ax.get_legend_handles_labels() ax.legend(lines, labels, loc='best')
Bu tekniği yapabilmek için iki şart vardı bunlardan biride eksik verinin %5 den fazla olmaması idi. Peki %5 den fazla ise nasıl bir sonuç ile karşılaşırız hemen görelim. Bunun için %10.5 oranın eksik veriye sahip “Annual Income (k$)” feature ele alalım.
fig = plt.figure() ax = fig.add_subplot(111) # orjinal değer train['Annual Income (k$)'].plot(kind='kde', ax=ax) # Eksik değerlere medyan değerini atama train['Annual Income mean'].plot(kind='kde', ax=ax, color='red') lines, labels = ax.get_legend_handles_labels() ax.legend(lines, labels, loc='best')
Grafiğe baktığımız zaman orijinal sütun,medyan ve ortalama değeri atanmış feature arasındaki fark dağılımı görebiliyoruz. İsterseniz bide bu sütunların(feature) bide varyans değerlerine bakalım.
print('Orjinal Annual Income feature varyansı: ', train['Annual Income (k$)'].var()) print('Eksik değerleri Ortalama ile değiştirilen feature varyansı: ', train['Annual Income mean'].var()) print('Eksik değerleri Medyan ile değiştirilen feature varyansı: ', train['Annual Income (k$)'].var())
Görüldüğü gibi eksik değer atama işlemi yapılan feature varyans değeri ile orjinal feature varyansı arasında çok fazla fark var.
Aynı zamanda dikkat etmemiz gereken bir konuda atama işlemi yaparken aykırı değerlere dikkat etmektir. Hemen uygulamamızı yapalım.
train[['Annual Income (k$)','Annual Income mean','Annual Income median']].boxplot()
Eksik değer atama işlemi yaptığımız feature’larda aykırı değer sayısının fazla daha fazla olduğunu farketmişsinizdir.
pythonearth.com da bu yazıda eksik veri atama teknikleri olan ortalama ve medyan atama işlemini yaptık. Bir sonraki yazıda diğer eksik veri atama tekniklerini ele alacağız. Lütfen eksik veya yanlışlar için iletişime geçin bir sonraki yazıda görüşmek üzere. Bana Buradan ulaşabilirsiniz.