- Aykırı değer her zaman hata mıdır?
- Önce bakın: özet istatistik, sıralama ve grafik
- IQR yöntemiyle aykırı değer bulmak
- Z-skoru ve sağlam alternatif
- Gruplara ve zamana göre aykırı değer
- Tespitten sonra ne yapılır: işaretle, sınırla, dönüştür, çıkar
- Sık yapılan hatalar
- Bu beceriyi Mindset programlarında nerede çalışırsınız?
- Sık sorulan sorular
Pandas'ta aykırı değerleri bulma ve temizleme: kod ve karar rehberi
Pandas'ta aykırı değerleri IQR ve z-skoruyla bulmayı, clip ile sınırlamayı, işaretlemeyi ya da çıkarmayı kod örnekleri ve karar ölçütleriyle öğrenin.
Aykırı değer her zaman hata mıdır?
Aykırı değer, verinin geri kalanından belirgin biçimde uzakta kalan gözlemdir. Ancak "uzakta olmak" yanlış olmak anlamına gelmez. Farklı nitelikte durumlar ayırt edilmelidir: Veri girişi ya da ölçüm hatası (fiyat yerine yanlışlıkla telefon numarası yazılması gibi), gerçek ama nadir bir olay (kampanya günündeki rekor satış) ve farklı bir kitleye ait gözlem (kurumsal müşterinin siparişi ile bireysel müşterinin siparişinin aynı tabloda olması).
Bu ayrım karardan önce gelir. Hata ise düzeltilir ya da çıkarılır. Gerçek ama nadir ise analizin amacına göre tutulur, ayrı raporlanır ya da sağlam yöntemlerle değerlendirilir. Farklı kitle ise veriyi bölmek gerekir. Silmeden önce neden uç olduğunu anlamaya çalışın; çoğu zaman bu bilgi, silinen satırdan daha değerlidir.
Pandas, bu işin tespit, inceleme ve işlem adımlarını kolaylaştırır.
Önce bakın: özet istatistik, sıralama ve grafik
Yöntem seçmeden önce veriyi görün. İlk bakışta işe yarayan işlemler şunlardır:
- df['tutar'].describe(): ortalama, standart sapma, en küçük, en büyük ve çeyreklikler. Ortalama ile medyan (ortadaki değer) arasında büyük fark çarpıklığa ya da uç değerlere işaret eder.
- df.sort_values('tutar').head() ve .tail(): en küçük ve en büyük kayıtları bütün satır bilgisiyle gösterir. Aykırı değer olan satırı tek başına değil bağlamıyla okumak gerekir.
- Grafik: Kutu grafiği (boxplot) ve histogram dağılımın şeklini ve uçları gösterir. Grafik için matplotlib gerekir.
Ayrıca değer aralığını iş kuralıyla karşılaştırın: Yaş sütununda negatif değer, adet sütununda ondalık değer, tarih sütununda gelecekte bir gün istatistik yöntem gerektirmeden hatalıdır. Bunları df[df['yas'].abs() != df['yas']] gibi basit koşullarla yakalayabilirsiniz. İstatistiksel yöntemler, iş kuralıyla yakalanamayan geri kalan uçlar için devreye girer.
IQR yöntemiyle aykırı değer bulmak
En yaygın yöntem çeyrekler arası aralıktır (IQR). Verinin birinci çeyrekliği (Q1) ve üçüncü çeyrekliği (Q3) hesaplanır, aradaki fark IQR olur. Alt sınırın altında ya da üst sınırın üstünde kalan değerler aday aykırı değerdir. Pandas belgesine göre Series.quantile, q parametresiyle sıfır ile bir arasında bir ya da birden çok kesit değeri alır ve varsayılan olarak doğrusal interpolasyon kullanır.
q1 = df['tutar'].quantile(0.25) q3 = df['tutar'].quantile(0.75) iqr = q3 - q1 alt = q1 - 1.5 * iqr ust = q3 + 1.5 * iqr aykiri = df[(df['tutar'] < alt) | (df['tutar'] > ust)]
1.5 çarpanı yaygın bir uygulama kuralıdır, doğa kanunu değildir. Daha sıkı ya da daha gevşek bir eşik için çarpanı veri ve iş bağlamına göre değiştirebilirsiniz. Önemli olan, çarpanı bilinçli seçmek ve raporlamaktır.
Yöntemin güçlü yanı, ortalama ve standart sapmaya değil çeyreklere dayandığı için uç değerlerden az etkilenmesidir. Zayıf yanı, çok çarpık dağılımlarda (gelir, işlem tutarı gibi) sağ kuyruğu meşru değerlerle birlikte aykırı işaretleyebilmesidir. Böyle verilerde önce logaritmik dönüşüm uygulayıp IQR'yi dönüştürülmüş değerde hesaplamak daha tutarlı sonuç verir.
Z-skoru ve sağlam alternatif
Z-skoru, değerin ortalamadan kaç standart sapma uzakta olduğunu ölçer. Pandas ile doğrudan hesaplanır:
z = (df['tutar'] - df['tutar'].mean()) / df['tutar'].std() aykiri = df[z.abs() > esik]
Burada esik, sizin seçtiğiniz bir değerdir. Z-skoru yaklaşık simetrik, çan eğrisine yakın veride anlamlıdır. Sorunu şudur: Ortalama ve standart sapma aykırı değerlerin kendisinden etkilenir. Çok büyük bir uç değer, standart sapmayı şişirir ve kendini normal gösterebilir. Küçük örneklemlerde bu etki belirgindir.
Daha sağlam bir yaklaşım medyan ve mutlak sapma medyanı (MAD) kullanmaktır:
medyan = df['tutar'].median() mad = (df['tutar'] - medyan).abs().median() sapma = (df['tutar'] - medyan).abs() / mad
Medyan ve MAD uç değerlerden neredeyse etkilenmez; bu yüzden ilk iterasyonda uçları bulmak için güvenilirdir. MAD'in sıfır çıkabileceğini unutmayın: Veride çok sayıda aynı değer varsa bölme hatası alırsınız, bu durumda IQR gibi başka bir ölçüye dönün.
Çok değişkenli aykırılıkta (tek sütunda normal ama değerlerin birleşimi anormal) tek tek sütun kuralları yetmez; bu noktada yoğunluk ya da model tabanlı yöntemler gerekir ve bu başlık ayrı bir konudur.
Gruplara ve zamana göre aykırı değer
Tek bir global eşik çoğu zaman yanıltır. Bir ürün kategorisi için olağan sayılan tutar, başka bir kategori için çok uç olabilir. Çözüm eşiği grup bazında hesaplamaktır. Pandas'ta groupby ve transform bu iş için biçilmiş kaftandır:
def iqr_disinda(s): q1, q3 = s.quantile(0.25), s.quantile(0.75) iqr = q3 - q1 return (s < q1 - 1.5 * iqr) | (s > q3 + 1.5 * iqr)
df['aykiri'] = df.groupby('kategori')['tutar'].transform(iqr_disinda)
transform, her grup için hesaplanan sonucu özgün satırlarla aynı indekse yerleştirir; böylece yeni sütunu doğrudan df'ye ekleyebilirsiniz.
Zaman serilerinde ise sabit eşik mevsimselliği ve eğilimi hesaba katmaz. Aralık Kasım'daki satış zirvesi, yıl ortası için aykırı görünebilir. Çözüm olarak kayan pencere (rolling) medyanı ya da aynı dönemin geçmiş değerleriyle karşılaştırma kullanılır. Pencereyi belirlerken verinin doğal döngüsünü (günlük, haftalık, aylık) esas alın.
Grup bazlı yöntemde küçük gruplara dikkat edin: Çok az gözlemden hesaplanan çeyrekler güvenilmezdir. Küçük gruplarda ya genel eşiği kullanın ya da işaretleme yerine insan incelemesine bırakın.
Tespitten sonra ne yapılır: işaretle, sınırla, dönüştür, çıkar
Bulduğunuz aday aykırı değerlerle ne yapacağınız analizin amacına bağlıdır. Başlıca seçenekler:
- İşaretlemek: df['aykiri'] adlı mantıksal sütun eklemek, veri kaybı olmadan hem raporlamayı hem de sonraki filtrelemeyi kolaylaştırır. Belirsizliğin olduğu her durumda ilk adım budur.
- Sınırlamak (winsorize): Uç değerleri alt ve üst sınıra çekmek. df['tutar'].clip(lower=alt, upper=ust) işlevi bunu tek satırda yapar. Satır sayısı korunur; ancak dağılımın uçları yapay biçimde değişir.
- Dönüştürmek: Çarpık dağılımlarda logaritma gibi bir dönüşüm uçları sıkıştırır ve modelleme için daha uygun bir dağılım verir.
- Çıkarmak: df[~df['aykiri']] ile satırları çıkarmak yalnızca değer açıkça hataysa ve düzeltilemiyorsa tercih edilir. Çıkarılan satır sayısını ve nedenini kayıt altına alın.
- Ayrı analiz etmek: Gerçek ama farklı kitleye ait gözlemleri ayrı bir tabloda inceleyin.
Makine öğrenmesi için hazırlıkta eşikleri yalnızca eğitim verisinden hesaplayın ve sonra test verisine uygulayın. Eşiği tüm veriden hesaplayıp ardından bölerseniz, test verisinin bilgisi eğitime sızar ve sonuçlar iyimser çıkar.
Her kararı bir not olarak veri sözlüğüne ya da kodun yorum satırına yazın: hangi sütun, hangi yöntem, hangi eşik, kaç satır etkilendi. Aylar sonra bu kararı soran kişi, yani kendiniz, bundan yararlanır.
Sık yapılan hatalar
Pandas ile aykırı değer işlerinde tekrar eden hatalar şunlardır:
- Eksik değerleri unutmak. quantile ve mean eksik değerleri atlar, ama karşılaştırma yapan koşullar eksik satırları yanlış sınıflandırabilir. Önce eksik veriyi ayrıca ele alın.
- Her sütuna aynı kuralı uygulamak. Kimlik numarası gibi sayısal görünen ama sayısal olmayan sütunlarda aykırı değer aramanın anlamı yoktur.
- Silip sonra hatırlamamak. Kopya üzerinde çalışmak ve işlem öncesi satır sayısını yazdırmak güvenlik ağıdır.
- Tek yönteme güvenmek. Farklı yöntemlerin ortak yakaladığı gözlemler daha güvenilir adaylardır; yalnızca birinin yakaladığını elle inceleyin.
- Eşiği sabit kodlamak. Eşik değerleri değişkende saklanmalı ve veri güncellendiğinde yeniden hesaplanmalıdır.
- İş sahibine sormamak. "Bu kadar yüksek bir sipariş gerçek mi?" sorusunun yanıtı çoğu zaman veri tablosunda değil satış ekibindedir.
Bir kontrol listesi: Veriyi görselleştirdim mi, iş kuralıyla ayıkladım mı, istatistik yöntemi seçimimi gerekçelendirdim mi, grup farklarını düşündüm mü, ne yapacağımı kayda geçirdim mi, sonuçları iş sahibine gösterdim mi?
Bu beceriyi Mindset programlarında nerede çalışırsınız?
Aykırı değer tespiti; veri analistleri, raporlama ve finans kontrol ekipleri ile modelleme öncesi veri hazırlayan herkesin rutin işidir. Satış, iade ve işlem verisinde tek bir hatalı satır ortalamaları ve tahmin modellerini bozabilir; bu yüzden kontrol bir seferlik işlem değil tekrarlanabilir bir adım olmalıdır.
Python ile Veri Temizleme programının modül başlıkları arasında veri kalitesi tanılama ve keşif, eksik veri yönetimi ve atama stratejileri, aykırı değer tespiti ve giderme, metin ve kategorik veri temizleme ile tekrarlanabilir veri temizleme boru hatları yer alır. Pandas'a daha geniş bir bakış isteyen ekipler için Python ile Veri Analizi (Pandas) programı filtreleme, gruplama ve toplulaştırma gibi başlıkları kapsar. Kurumsal bir ekipte aykırı değer kontrollerini ortak bir fonksiyon kitaplığı olarak standartlaştırmak, farklı analistlerin farklı eşiklerle çelişen rakamlar üretmesini önler.
İlgili Mindset programı
Python ile Veri Temizleme
Sık sorulan sorular
IQR yöntemi ile z-skoru arasındaki fark nedir?
IQR çeyreklere dayanır ve uç değerlerden az etkilenir; çarpık dağılımlarda da kullanılabilir. Z-skoru ortalama ve standart sapmaya dayanır; yaklaşık simetrik veride anlamlıdır ama aykırı değerlerin kendisinden etkilenir. Emin değilseniz yöntemleri birlikte çalıştırıp ortak yakalananları öncelikli inceleyin.
Aykırı değerleri silmek mi sınırlamak mı daha doğrudur?
Değer açıkça hataysa ve düzeltilemiyorsa silmek mantıklıdır. Gerçek ama uç ise satırı korumak için sınırlama (clip) ya da dönüşüm tercih edilir. Hangisini seçerseniz seçin yaptığınız işlemi, eşiği ve etkilenen satır sayısını kaydedin; böylece karar sonradan denetlenebilir.
Pandas'ta aykırı değerleri grafikle nasıl görürüm?
Seri için kutu grafiği ve histogram en pratik başlangıçtır. Pandas, matplotlib kuruluysa doğrudan çizim yöntemleri sunar. Kutu grafiğindeki uç noktalar aday aykırı değerleri, histogramın uzun kuyruğu ise çarpıklığı gösterir. Grafiği karar için değil, hangi istatistiksel yöntemi seçeceğinize ışık tutmak için kullanın.
Eksik değer ile aykırı değeri hangi sırayla temizlemeliyim?
Önce veri girişi ve iş kuralı hatalarını, sonra eksik değerleri ele alın; ardından aykırı değer analizi yapın. Eksik değerleri ortalama ya da medyanla doldurmak, çeyrekleri ve eşikleri değiştirir. Dolgu yöntemini seçerken aykırı değerlerin etkisini de düşünün; gerekirse aykırı değerleri işaretleyip dolgudan sonra tekrar kontrol edin.
Tüm sütunlara otomatik aykırı değer kuralı uygulanabilir mi?
Önerilmez. Kimlik, posta kodu gibi sayısal görünen kategorik sütunlarda anlamsızdır; çarpık ya da kesikli sütunlarda yanıltıcıdır. Kuralı yalnızca anlamlı sürekli sütunlara uygulayın, sonuçları iş sahibiyle gözden geçirin ve otomatik silme yerine işaretleme ile başlayın.
İlgili rehberler
İlgili eğitimler
Kategori: Veri Analitiği ve İş Zekası