Site Loader

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.

Tüm Veri Bilimi Dersleri

Post Author: Python Earth

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir