Site Loader

Merhaba Arkadaşlar bu dersimizde Missing Data(Eksik Veri) Nedir? Eksik veri sebepleri ve Missing Data Imputation  eksik veri için kullanılan yöntemleri ve Complete Case Analysis ne olduğunu ve nasıl yapıldığını Python ile yapacağım. Keyifli okumalar 🙂

Missing Data(Eksik Veri) Nedir?

Eksik veriler tanımlı olan değişkenlerdeki eksik olan gözlemlerdir. Eksik veri çoğu veri kümesinde sık rastlanan bir durumdur. Eksik veriler makine öğrenme algoritmalarının sonuçlarını verisetine bağlı olarak büyük oranda etkileyebilir.

Missing Data(Eksik Veri)Sebepleri

Eksik veri oluşumunun sebepleri nelerdir ve nasıl meydana gelir?Veri kayıplarının birçok sebepleri : Yazılımsal, donanımsal veya kullanıcı kaynaklı olabilir. Veriler hatalı girilmiş veya uygun bir şekilde toplanmamıştır.

 

Missing Data(Eksik Veri) Türleri

Eksik veri türleri 3’e ayırabiliriz.

Missing Completely at Random (MCAR):

Eksik olma olasılığı tüm gözlemler için aynıdır . Veri kümesi içinde eksik veriler ile gözlemlenen veya eksik olan diğer değerler arasında kesinlikle bir ilişki yoktur

Missing at Random (MAR):

Yanıtların eksik olma olasılığı gözlemlenen yanıtların kümesine bağlı olduğunda, ancak elde edilmesi beklenen spesifik eksik değerlerle ilişkili olmadığında veriler.

 Missing Not at Random (MNAR):

Yanıt vermeme olarak da bilinir, ne MAR ne de MCAR olmayan verilerdir (yani eksik değişkenin değeri eksik olmasının nedeni ile ilgilidir). Örneğin kadınlar genel olarak kilo ve yaş bilgileri paylaşmak istemezler.

Missing Data Imputation (Eksik Veri Atama İşlemleri)

Eksik verileri işlemenin iki temel yöntemi var;

  • Eksik verileri silme
  • Eksik verilere atama işlemi yapma.

 

Eksik Verileri Silme Yöntemleri

Eksik verileri silmenin birçok yöntemi var ama ben bu yazıda Listwise(Complete Case Analysis) konusunu tek ele alacağım.

Complete Case Analysis(Tam vaka analizi)

Complete Case Analysis, bu yöntem veriseti içinde ki var olan gözlemlerin analiz edilmesini gerektirir. Başka bir deyişle, tam vaka analizinde eksik değerlere sahip tüm gözlemleri kaldırıyoruz. Bu yöntem, veri kümesinde eksik veriler az  olduğunda uygundur. Ancak, veri kümesi içinde eksik veri sayısı çok faz ise ve eğer değişkenler arasında bir bağ varsa. Tam Vaka Analizi yapmamız verisetimizin yapısını bozar. O zaman net ve açık şekilde Tam vaka analizi ne zaman yapmalıyız iki madde ile verelim:

  • Eğer veri setimizdeki eksiz veri sayısı verisetinin %5 den az ise
  • Kayıp veriler Missing Completely at Random (MCAR) ise bu yöntemi kullanabiliriz.

Complete Case Analysis Avantajları

  • Bu yöntemi uygulamak çok kolaydır.
  • Veri manipülasyonu gerekmez.
  • Orijinal verisetinin değişken dağılımını korur.

Teorik bilgiyi aldığımıza göre artık parmakları çalıştırmanın zamanı hemen uygulamaya geçelim.

Ben işlemleri Mall_Customers  dataseti üzerinden yapacağım sizde buradan indirebilirsiniz İlk önce pandas kütüphanesini dahil ediyoruz.

import pandas as pd

ikinci aşamada verisetini okuyalım.

data = pd.read_csv('Mall_Customers.csv')

Hemen veriseti içinden rastgele 10 satıra bakalım.

data.sample(10)

Görüldüğü gibi bazı gözlemler eksik.  Şimdi veriseti içindeki eksik verileri bir görelim.

#Boş gözlem bulunduran sütünlar
missing_featues = [var for var in data.columns if data[var].isnull().sum() > 0]

#Sütunlarda eksik gözlem sayısı
missing_val = [data[var].isnull().sum() for var in data.columns if data[var].isnull().sum() > 0]

missing_feature_df = pd.DataFrame({
    'Feature': missing_featues,
    'Values': missing_val
})
missing_feature_df.sort_values(by='Values', ascending=False)

Biz Complete Case Analysis için iki koşul vermiştik bunlardan biri eksik verilerin sayısı ve %5 ‘den olması gerekiyordu şimdi eksik verilerin oranını bulalım.

missing_val_percentage = [data[var].isnull().mean() for var in data.columns if data[var].isnull().sum() > 0]
missing_feature_df['percentage'] = [round(var*100, 2) for var in missing_val_percentage]
missing_feature_df.sort_values(by='Values', ascending=False)

Eksik verilerin oranlarını bulduk. Biz %5 altında olanlar üzerinde işlemler yapacağız o zaman %5 altında eksik veri bulunduran feature’ları görelim.

missing_feature_clear = [missing_feature_df.feature for var in missing_feature_df.percentage if var <5]

for percen,feat in zip(missing_feature_df.percentage,missing_feature_df.feature):
    if percen <5:
        print(feat,' :',percen)


Şimdi bu feature bulunan eksik gözlemlerin bulunduğu satırları siliyoruz.

vars_cca = [var for var in data.columns if data[var].isnull().mean() < 0.05]
data_cca = data[vars_cca].dropna()

Eksik gözlemlerin bulunduğu satırları sildik. İsterseniz hemen eski ve yeni dataframe satır ve sütün sayılarına bakalım.

data.shape, data_cca.shape
((200, 5), (188, 4))

Görüldüğü gibi yeni dataFrame satır ve sütun sayıları değişti. Başarılı bir şekilde Complete Case Analysis işlemi yaptık. Şimdi bizim dikkat etmemiz gereken nokta şu eksik veriler bizim dataframe üzerinde nasıl bir etkisi oldu. Belki bu yaptığımız işlem dataframe yapısını bozdu bunun için bunu kontrol etmeliyiz.

Örneğin Age değişkeninin dağılımı nasıl değişti mi bir bakalım.

import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)

# orjinal data
data['Age'].hist(bins=50, ax=ax, density=True, color='red')

# Complete Case Analysis data
data_cca['Age'].hist(bins=50, ax=ax, color='blue', density=True, alpha=0.7)

Kırmızı bölgeler Complete Case Analysis datasının  orjinal datadan fazla olduğu bölgeler açık mavi bölgeler ise Complete Case Analysis datasının orjinal datadan eksik olduğu bölgelerdir.

Koyu mavi bölge ise her iki data’nın ortak olduğu bölgelerdir. Dikkat edilirse yeni data’nın dağılımı orjinal data ile hemen hemen aynı çok fazla bir değişiklik yok. Bu da orjnal data’nın dağılımın bozulmadığını bize gösteriyor.

Dilerseniz görsel değilde sayılarla bakalım.

data.var()
------------------------------------------
CustomerID                3350.000000
Age                        195.934338
Annual Income (k$)         573.868214
Spending Score (1-100)     673.255704
dtype: float64


data_cca.var()
----------------------------------------
CustomerID                3287.917255
Age                        197.813261
Spending Score (1-100)     677.831039
dtype: float64

Ben varyans’a baktım  sizde standart sapma, aritmetik ortalama vb. bakabilirsiniz. Sayısal olan gözlemlerin dağılımına baktık dilerseniz bide kategorik olan gözlemlerin dağılımına bakalım.

import seaborn as sns
#orjinal data
sns.countplot(x='Genre',data=data)
data['Genre'].value_counts(normalize=True)*100

 

#Complete Case Analysis data
sns.countplot(x='Genre',data=data_cca)
data_cca['Genre'].value_counts(normalize=True)*100

pythonearth.com da bu yazıda Eksik veri’nin ne olduğunu, sebeplerini ve son olarak  eksik değer atama yöntemi olan Complete Case Analysis  yani Tam Vaka Analizi konusunu ele aldık bir sonraki derste diğer eksik verilere değer atama yöntemlerini ele alacağım. Lütfen eksik veya yanlışlar için iletişime geçin bir sonraki yazıda görüşmek üzere. Bana Buradan ulaşabilirsiniz.

 

Post Author: Python Earth

Bir cevap yazın

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