Eksik Değerlerin İşlenmesine Uçtan Uca Giriş

Kaynak Düğüm: 1121996

Bu makale, Veri Bilimi Blogathon

Genel Bakış

Veriler bize geleceğin olaylarını analiz etme ve tahmin etme gücü sağlar. Her geçen gün daha fazla şirket, tahmine dayalı tahmin, kümeleme vb. gibi veri bilimi tekniklerini benimsiyor. Karmaşık ML ve DL algoritmalarını öğrenmeye devam etmek çok ilgi çekici olsa da, temel konularda uzmanlaşmayı unutmamak gerekir. veri ön işleme. Veri ön işlemenin önemli kısımlarından biri, eksik değerlerin ele alınmasıdır. Bu, farklı türlerdeki eksik verilerle nasıl başa çıkılacağına dair eksiksiz bir kılavuzdur.

İçerik

  1. Eksik değerleri işlemek neden önemlidir?
  2. Eksik değerlerin arkasındaki nedenler
  3. Eksik değer türleri
  4. Veri kümesindeki Eksik Değerleri Kontrol Edin
  5. Eksik değerleri görselleştirme
  6. Eksik değerlere sahip satırları bırakma
  7. Eksik değerlere sahip sütunları bırakma
  8. Sürekli değişkenler için atama
    1. ortalama ile impütasyon
    2. Medyan ile İmputasyon
  9. Regresyon ile eksik değerleri tahmin etme
  10. Kategorik Verilerde eksik değerler
  11. Zaman Serisi Verilerinde eksik değerler
    1. Eksik değerleri ileri doldurma
    2. Eksik değerleri geriye doğru doldurma
    3. Doğrusal enterpolasyon
  12. Eksik değerlere dayanıklı algoritmalar
  13. Sonuç

Eksik verileri işlemek neden önemlidir?

Gerçek dünyadaki veriler çoğu durumda birçok eksik veriye sahiptir. Her bir değerin eksik olmasının farklı nedenleri olabilir. Veri kaybı veya bozulması olabilir veya belirli sebepler de olabilir. Eksik veriler, modelinizin tahmin gücünü azaltacaktır. Eksik verilere sahip algoritmalar uygularsanız, parametrelerin tahmininde yanlılık olacaktır. Eksik verileri işlemezseniz sonuçlarınızdan emin olamazsınız.

Eksik Değerlerin Arkasındaki Nedenler

Veri kümelerindeki eksik verilerin arkasındaki nedenleri hiç merak ettiniz mi?

Eksik verilerin arkasındaki olası nedenlerden bazıları şunlardır:

  • İnsanlar bir veri toplama anketinde belirli sorularla ilgili bilgi vermezler. Örneğin, bazıları maaşları, içki içmeleri ve sigara içme alışkanlıklarıyla ilgili bilgileri paylaşmaktan çekinebilirler. Bunlar kasıtlı olarak nüfus tarafından dışarıda bırakılıyor
  • Bazı durumlarda, veriler doğrudan değil, mevcut çeşitli geçmiş kayıtlardan toplanır. Bu durumda, veri bozulması önemli bir sorundur. Düşük bakım nedeniyle, verilerin bazı bölümleri bozularak eksik verilere neden olur
  • Veri toplama sürecindeki yanlışlıklar da eksik verilere katkıda bulunur. Örneğin manuel veri girişinde insan hatalarından tamamen kaçınmak zordur.
  • Hatalı ölçümlere yol açan ve sırayla kullanılamayan ekipman tutarsızlıkları.

Eksik Değer Türleri

Eksik veriler çeşitli nedenlerle ortaya çıkabilir. Bunları üç ana gruba ayırabiliriz: Tamamen Rastgele Eksik, Rastgele Eksik, Rastgele Eksik Değil.

1. Tamamen Rastgele Eksik (MCAR)

Eksik veriler belirli bir örüntüyü takip etmezler, sadece rastgeledirler. Bu verilerin eksikliği, kalan değişkenlerle ilgisiz veya bağımsızdır. Geri kalan değişken verilerle bu değerleri tahmin etmek mümkün değildir. Örneğin, verilerin toplanması sırasında belirli bir örneklem dikkatsizlik nedeniyle kaybolmaktadır. Bu, istatistiksel olarak analizin yanlı olmayacağı ideal bir durumdur. Ancak, nadir bir durum olduğundan çok emin olmadıkça MCAR'ın varlığını varsaymamalısınız.

2. Rastgele Eksik (MAR)

Burada, MCAR'dan farklı olarak, belirli alt kümeler arasında veriler eksiktir. Diğer özellikler yardımıyla verilerin var olup olmayacağını tahmin etmek mümkündür. Ancak, eksik verileri kendiniz tahmin edemezsiniz.

Örneğin, Netflix, amazon prime gibi platformlarda geçirilen süre ile ilgili bir bölümü olan internette geçirilen süre ile ilgili bir anketi ele alalım. Yaşlıların (45 yaş üstü) gençlerden daha az doldurduğu gözlemlenmiştir. Bu bir MAR örneğidir. Burada 'Yaş' parametresi verilerin eksik olup olmayacağına karar verir. MAR, MCAR'dan çok daha sık görülür.

3. Rastgele Eksik Değil (NMAR)

Bu ciddi ve zor bir durum. Diyelim ki anketin amacı sosyal medyanın aşırı kullanımını/bağımlılığını ölçmek. Sosyal medyayı aşırı kullanan kişiler, anketi bilerek doldurmuyorlarsa bir NMAR vakası var demektir. Bu büyük olasılıkla sonuçlarda bir önyargıya yol açacaktır. Satırları/sütunları bırakmak gibi olağan yöntemler, atama işe yaramaz. Bunu çözmek için, etki alanı hakkında derinlemesine bilgi gerekli olacaktır.

Artık farklı türlerde eksik veri gördükten sonra, bunları ele almanın çeşitli yollarına geçelim.

Eksik değerleri kontrol edin

Bir veri kümeniz olduğunda, ilk adım hangi sütunlarda eksik veri olduğunu ve kaç tane veri olduğunu kontrol etmektir. Veri biliminin öğrendikleri arasında en ünlü veri setini kullanalım, tabii ki Titanik kurtulan! Aşağıda gösterildiği gibi pandas read_csv işlevini kullanarak veri kümesini okuyun.

train=pd.read_csv('../input/titanic/train.csv') test=pd.read_csv('../input/titanic/test.csv') print('Eğitim verileri şekli: ', train.shape ) print('Veri şekli test ediliyor: ', test.shape) train.head()

Eksik Değerler verileri

Kaynak: Yazarın Kaggle defterinden görüntü

Artık titanik verilerin eğitim ve test veri çerçevelerine sahibiz.

Hangi sütunlarda eksik veri olduğu nasıl kontrol edilir ve kaç tane?

Bunun için “isnull()” fonksiyonu kullanılır. isnull ile birlikte toplam işlevini çağırdığınızda, her sütundaki eksik verilerin toplam toplamı çıktıdır.

miss_values=train.isnull().sum() print(missing_values)
PassengerId 0 Hayatta Kaldı 0 Pclass 0 Ad 0 Cinsiyet 0 Yaş 177 SibSp 0 Parch 0 Bilet 0 Ücret 0 Kabin 687 Bindi 2 dtype: int64

3 sütunda eksik değerler olduğuna dikkat edin: Age, Cabin, Embarked

Her sütunda kaç değerin eksik olduğunu bilmemize rağmen, bunların toplam değerlere göre yüzdesini bilmek önemlidir. Yani, bunu tek bir kod satırında hesaplayalım.

mis_value_percent = 100 * train.isnull().sum() / len(tren) print(mis_value_percent)
PassengerId 0.000000 Hayatta Kaldı 0.000000 Pclass 0.000000 İsim 0.000000 Cinsiyet 0.000000 Yaş 19.865320 SibSp 0.000000 Parch 0.000000 Bilet 0.000000 Ücret 0.000000 Kabin 77.104377 Bindi 0.224467 dtype: float64

'Kabin' Sütununun %77'sinin eksik olduğu çok açık ki bu çok önemli bir yüzdedir. Age'de verilerin yaklaşık %19'u eksik ve Embarked'ın yalnızca %0.2'si eksik. Bu, elimizdeki eksik verilerin nicel analizidir. Peki ya niteliksel? Okumaya devam et!

Missingno ile eksik değerleri görselleştirme

Bil bakalım ne oldu? Özellikle bir veri kümesinin eksik verilerini görselleştirmek ve keşfetmek için bir python paketimiz var. "Missingno" piton paketi. Devam edin ve hızlı bir şekilde kurun

pip kurulumu eksik

Bunu kullanarak ısı haritaları, çubuk grafikler ve matrisler şeklinde görselleştirmeler yapabiliriz. Nasıl dağıtıldıklarını analiz ederek, hangi kategoriye girdiklerini MCAR, MAR veya NMAR olarak belirleyebilirsiniz. Eksikleri içeren sütunların hedef sütunla korelasyonunu da bulabiliriz.

Eksik kitaplığın 'bar()' işlevini kullanarak boş olmayan değerler için bir çubuk grafik yaparak başlayın. Bu işleve pandaların veri çerçevesini geçtiniz.

missno'yu msno olarak içe aktar msno.bar(tren)

eksik | kayıp değerlerKaynak: Yazarın Kaggle defterinden görüntü

Ardından, matris görselleştirmesini çizebiliriz. Bu, eksik verilerin veriler aracılığıyla nasıl dağıtıldığını, yani bunların yerelleştirilmiş mi yoksa eşit olarak mı yayıldığını veya herhangi bir kalıp ve benzeri birçok soru olup olmadığını bilmemize yardımcı olur.

msno.matrix(tren)
desen çubuğu

Matris grafiğinde, her eksik veri için boş satırlar göreceksiniz. 'Giriş' sütununda, herhangi bir model izlemeyen yalnızca iki rastgele eksik veri olduğuna dikkat edin. Muhtemelen veri toplama sırasında kaybolmuşlardır. Yani, bu Rastgele'de Tamamen Eksik olarak sınıflandırılabilir.

Yaş ve Kabin sütunları muhtemelen MAR olabilir. Ancak aralarında hiçbir korelasyon olmadığından emin olmak istiyoruz.

Bu nasıl yapılır?

Şansımıza, eksik paket aynı zamanda 'ısı haritası' işlevini de sağlıyor. Bunu kullanarak, farklı sütunların eksik verileri arasında herhangi bir korelasyon olup olmadığını bulabiliriz.

msno.heatmap(tren)

Çıktı gösteriliyor!

ısı haritası | Eksik değer

Isı haritası, Yaş ve Kabin sütununun eksik verileri arasında bu kadar güçlü bir ilişki olmadığını gösteriyor. Bu nedenle, bu sütunların eksik verileri MAR veya Rastgele Eksik olarak sınıflandırılabilir.

Umarım eksik değerlerin nasıl analiz edileceği konusunda netsinizdir. Daha sonra, bu eksik verileri ele almanın farklı yollarını tartışmaya devam edeceğim.

Eksik değerlere sahip satırları bırakma

Belirli bir sütuna ait eksik değerleri olan tüm satırları bıraktığımız basit bir yöntemdir. Bu kadar kolay olduğu kadar büyük bir dezavantajı da beraberinde getiriyor. Sonunda verilerinizin büyük bir bölümünü kaybedebilirsiniz. Bu, veri kümenizin boyutunu küçültecek ve model tahminlerinizi önyargılı hale getirecektir. Bunu yalnızca eksik değer sayısı çok az olduğunda kullanmalısınız.

Örneğin, 'Girildi' sütununda yalnızca 2 eksik değer var. Böylece, bu sütunun eksik olduğu satırları bırakabiliriz. Aşağıdaki kod parçasını takip edin.

print('Veri kümesi :', len(tren)) train.dropna(subset=['Gemiye Girdi'],how='any',inplace=True) print('Veri kümesi after :', len(tren)) print( 'eksik değerler :',train['Embarked'].isnull().sum())
Veri kümesi öncesi : 891 Veri kümesi sonrası : 889 eksik değer : 0

Aynısını 'Yaş' sütunu için yaptığınızı hayal edin. Verilerinizin %77'sini kaybedersiniz!

Sütunları bırakma

Bir sütunda büyük eksik değerler olduğunda, sahip olduğumuz en az mevcut gerçek verilerle değerleri yüklemenin bir anlamı yoktur. Bu nedenle, herhangi bir sütunda değerlerin %80'inden fazlası eksik olduğunda, o sütunu analizinizden çıkarabilirsiniz. Bizim durumumuzda 'Kabin'de %77 eksik veri var, bu nedenle bu sütunu bırakma seçimini yapabilirsiniz.

Bırakılan sütunun analiziniz için çok önemli olmadığından emin olun. Eğer öyleyse, daha fazla veri almaya çalışmalı ve ardından eksik değerleri atmalısınız.

Sürekli değişken için atama

tren['Yaş'][:10]
0 22.0 1 38.0 2 26.0 3 35.0 4 35.0 5 NaN 6 54.0 7 2.0 8 27.0 9 14.0 İsim: Yaş, dtype: float64
tren['Yaş']=tren['Yaş'].replace(np.NaN,tren['Yaş'].mean()) tren['Yaş'][:10]
0 22.000000 1 38.000000 2 26.000000 3 35.000000 4 35.000000 5 29.699118 6 54.000000 7 2.000000 8 27.000000 9 14.000000 İsim: Yaş, dtype: float64

'NaN' değerinin 29.699 (hesaplanan ortalama) ile değiştirildiğini görebilirsiniz.

Ortalama atamanın bazı dezavantajları vardır. Veriler, çok sayıda aykırı değerle birlikte çok düzensiz bir dağılıma sahipse, Ortalama, verilerin gerçek dağılımını yansıtmaz. Ortalama, aşırı değerlerden veya aykırı değerlerden büyük ölçüde etkilenir. Bu nedenle, verilerde çok fazla aykırı değer yoksa ve normale yakın bir dağılım izliyorsa, ortalama değerlendirmeyi kullanın.

Medyan ile İmputasyon

Sürekli bir özelliğin eksik değerleri, kalan boş olmayan değerlerin medyanı ile doldurulabilir. Medyanın avantajı, ortalamanın aksine aykırı değerlerden etkilenmemesidir. Burada uygulayalım.

tren['Yaş']=tren['Yaş'].replace(np.NaN,tren['Yaş'].medyan()) tren['Yaş'][:10]

ortalama ile atama

NaN değerlerinin yerine medyan değerinin (28.0) doldurulduğunu gözlemleyebilirsiniz.

Benzer şekilde, mod ataması da yapabilirsiniz. Genel olarak, mod ile impütasyon, kategorik eksik değerler için popülerdir. Bunu daha sonraki bir bölümde derinlemesine ele alacağım

Regresyon ile eksik değerleri tahmin etme

Her yerde tek bir ortalama veya medyan değeri doldurmak yerine, elimizdeki diğer değişkenlerin yardımıyla onları tahmin edebilirsek ne olur?

Evet! Eksik değerleri tahmin etmek için null olmayan değerlere sahip özellikleri kullanabiliriz. Kayıp değerlerin tahmini için bir regresyon veya sınıflandırma modeli oluşturulabilir. Bunu titanic veri setimizin 'Yaş' sütunu için uygulayalım.

Modeli oluşturmak için verileri işleyebiliriz. “Yaş” özelliği hedef değişken olacaktır.

x_tren: “Yaş” değerine sahip veri kümesinin satırları filtrelenir. 'Yaş' hedeftir x_testi: Null olmayan değerlere sahip “Yaş” sütunudur.

The y_tren Tahmin edilmesi gereken, eksik Yaş değerlerine sahip verilere sahip olacaktır (y_pred)

pandaları pd olarak içe aktar data=pd.read_csv('../input/titanic/train.csv') data = data[["Survived", "Pclass", "Sex", "SibSp", "Parch", "Fare ", "Yaş"]] data["Cinsiyet"] = [1 if x=="male" yoksa data in x için 0["Sex"]] test_data = data[data["Yaş"].isnull()] data.dropna(inplace=True) x_train = data.drop("Yaş", eksen=1) x_test = test_data.drop("Yaş", eksen=1) y_train = veri["Yaş"]

Bu verilere bir Lineer Regresyon Modeli uyduralım. Burada sklearn kütüphanesini kullanacağım.

sklearn.linear_model'den içe aktar LinearRegression modeli = LinearRegression() model.fit(X_train, y_train) y_pred = model.predict(X_test)

Şimdi, y_pred'de tahmin edilen Age sütununun boş değerlerine sahibiz.

Daha iyi anlamanız için test girdisinin ve tahmin edilen çıktının birkaç örneğini yazdıracağım.

yazdır(x_test[:10])
Hayatta Kalmış Pclass Sex SibSp Parch Ücreti 5 0 3 1 0 0 8.4583 17 1 2 1 0 0 13.0000 19 1 3 0 0 0 7.2250 26 0 3 1 0 0 7.2250 28 1 3 0 0 0 7.8792 29 0 3 1 0 0 7.8958 31 1 1 0 1 0 146.5208 32 1 3 0 0 0 7.7500 36 1 3 1 0 0 7.2292 42 0 3 1 0 0 7.8958

Girdiler bu şekilde regresyon modeline iletilir. Öngörülen yaş değerlerine bakalım.

yazdır(y_pred[:10])
[29.07080066 30.10833306 22.44685065 29.08927347 22.43705181 29.07922599 32.43692984 22.43898701 22.15615704 29.07922599]

Yaşasın! Değerleri aldık.

Kategorik verilerde eksik değerler

Şimdiye kadar, eksik sayısal verilerle nasıl başa çıkılacağını gördük. Kategorik bir özellik olması durumunda veriler eksikse ne olur? Örneğin Titanic veri setinin “Kabin” özelliği kategoriktir. Burada ortalama ve medyanı hesaplayamayız. Böylece eksik değerleri kip veya en sık oluşan sınıf/kategori ile doldurabiliriz.

tren['Kabin']=tren['Kabin'].fillna(tren['Kabin'].value_counts().index[0])

Kayıp değerlerin yüzdesi daha az olduğunda bu yöntem tercih edilir. Büyük bir veri kaybına neden olmaz ve istatistiksel olarak önemlidir.

Ancak çok fazla eksik değeriniz varsa, o zaman en sık görülen sınıfa atfetmek mantıklı değildir. Bunun yerine “Bilinmeyen” veya “Kullanılamaz” gibi eksik değerler için ayrı bir kategori oluşturalım. Sınıf sayısı birer birer artırılacaktır.

Eksik değerler kategorik sütunlardan (dize veya sayısal) olduğunda, eksik değerler en sık görülen kategori ile değiştirilebilir. Eksik değerlerin sayısı çok fazlaysa, yeni bir kategori ile değiştirilebilir.

tren['Kabin']=tren['Kabin'].fillna('Bilinmeyen') tren['Kabin'][:10]

KABİN SIRASI | doldur

Küçük bir veri kümesiyle iyi çalışır. Ayrıca benzersiz bir kategori ekleyerek veri kaybını ortadan kaldırır.

Zaman serisi verilerinde eksik değerler nasıl ele alınır?

Zaman damgalarıyla birlikte bilgilerin düzenli bir şekilde toplandığı veri kümeleri, zaman serisi verileri olarak gösterilir. Zaman serisi verilerinde eksik değerler varsa, yukarıda tartışılan yöntemlerden herhangi birini deneyebilirsiniz. Ancak burada kullanılabilecek birkaç özel yöntem de vardır.

Bir fikir edinmek için basit bir kukla veri seti oluşturacağım.

zaman= pd.date_range("1/01/2021", periyotlar=10, freq="W") df = pd.DataFrame(index=zaman); df["Satılan birim"] = [5.0,4.0,np.nan,np.nan,1.0,np.nan,3.0,6.0,np.nan,2.0]; yazdır(df)

satılan birimler

Gelelim yöntemlere

Eksik değerleri ileri doldurma

Bir sonraki satırın değeri, eksik değeri doldurmak için kullanılacaktır. 'ffill', 'ileri doldurma' anlamına gelir. Uygulanması çok kolaydır. Fillna() fonksiyonunda “method” parametresini “ffill” olarak geçirmeniz yeterlidir.

forward_filled=df.fillna(method='ffill') print(forward_filled)

ileri dolu

Eksik değerleri geriye doğru doldurma

Burada, eksik değeri doldurmak için bir önceki satırın değerini kullanıyoruz. 'bfill' geriye doğru doldurma anlamına gelir. Burada yöntem parametresi olarak 'bfill'i geçmeniz gerekir.

backward_filled=df.fillna(method='bfill') print(backward_filled)

arka kulak dolu

Umarım yukarıdaki resimlerle her iki durumda da farkı anlayabilirsiniz.

Doğrusal enterpolasyon

Zaman serisi verilerinin birçok varyasyonu vardır. Dolgu ve ileri doldurma kullanarak yukarıdaki hesaplama yöntemleri, mümkün olan en iyi çözüm değildir. Kurtarmaya Doğrusal İnterpolasyon!

Burada değerler artan veya azalan değerlerle doldurulur. Veri noktaları arasında doğrusal bir ilişki çizmeye çalışan bir tür atama tekniğidir. Eksik noktaları hesaplamak için boş olmayan değerleri kullanır.

enterpolasyonlu=df.interpolate(limit_direction="her ikisi") print(enterpolasyonlu)

Eksik değerlerin doğrusal enterpolasyonu

Bu değerleri geriye ve ileriye doğru doldurma ile karşılaştırın ve hangisinin iyi olduğunu kendiniz kontrol edin!

Bunlar, zaman serisi verilerindeki eksik değerleri ele almanın bazı temel yollarıdır.

Eksik değerlere dayanıklı algoritmalar

Yukarıdakilerin hiçbirinin iyi çalışmadığı bazı durumlar vardır. Yine de bir analiz yapmanız gerekiyor. Ardından, eksik değerleri destekleyen algoritmaları tercih etmelisiniz. KNN (K en yakın komşu) böyle bir algoritmadır. K en yakın değerlerin çoğunluğunu alarak eksik değerleri dikkate alacaktır. Rastgele orman ayrıca eksik değerlere sahip kategorik verilere karşı dayanıklıdır. XGBoost, Catboost gibi birçok karar ağacı tabanlı algoritma, eksik değerlere sahip verileri destekler.

Sonuç

Özetlemek gerekirse, ilk adım, verileri araştırmak ve hangi değişkenlerin eksik veriye sahip olduğunu, yüzdesinin ne olduğunu ve hangi kategoriye ait olduğunu bulmaktır. Bundan sonra, hangi yöntemleri deneyebileceğiniz konusunda stratejik bir fikriniz olacak. Yararlı bir ipucu, doğrusal bir regresyon modelinden ayrı olarak K en yakın komşu algoritmasıyla İmputasyonu denemektir. Yukarıdaki yöntemler işe yaramazsa, Datawig veya Hot-Deck Imputation yöntemlerini kullanmak gibi arayabileceğiniz birkaç yeni yöntem daha vardır.

Umarım okumayı beğenmişsinizdir.

Benimle şu adresten bağlantı kurabilirsiniz: [e-posta korumalı]

Linkedin: veri ön işleme

Bu makalede gösterilen medya Analytics Vidhya'ya ait değildir ve Yazarın takdirine bağlı olarak kullanılır.

Kaynak: https://www.analyticsvidhya.com/blog/2021/10/end-to-end-introduction-to-handling-missing-values/

Zaman Damgası:

Den fazla Analitik Vidhya