Her başarılı veri bilimi projesinin temeli temiz, tutarlı verilerdir. Ancak analiz sürecinin hızlı temposunda, tecrübeli Python kullanıcıları bile önlenebilir veri ön işleme tuzaklarına düşebilirler. Veriyi bir makine öğrenmesi modeline hazırlıyor olun ya da görselleştirme için hazırlıyor olun, hangi hataların peşinde koşmanız gerektiğini bilmek sayısız saatlik hayal kırıklığını önleyebilir ve sonuçlarınızı çok daha sağlam hale getirebilir.
Python'da en yaygın (ve çoğu zaman tehlikeli) veri temizleme hatalarını, pratik ipuçları ve örneklerleBreak down beşini ele alalım ki iş akışlarınız sağlam ve verimli kalsın.
Gerçek dünya veri kümelerinin karşılaştığı ilk sorunlardan biri eksik veridir. Python'da, özellikle pandas ile NaN'leri değiştirmek veya kaldırmak kolaydır: df.dropna() veya df.fillna(0) tek satırda yapar. Ancak kolay olması doğru olduğu anlamına gelmez.
Eksik değerli satırları otomatik olarak kaldırmak veri kümesini önemli ölçüde küçültebilir ya da eksiklikler korelâsyonsa yanlılık (bias) yaratabilir. Değerleri ortalama veya sıfır ile doldurmak dağılımları bozar, özellikle sayısal olmayan sütunlarda veya aykırı değerlere sahip olanlarda.
Aşağıdaki parçacığı düşünün:
# Too hasty with missing value treatment
import pandas as pd
df = pd.read_csv('survey.csv')
df = df.dropna() # Danger: goodbye valuable data!
Satırların %30'u yalnızca yaş gibi tek bir isteğe bağlı alan için eksikse, verinin %30'unu kaybedersiniz. Eksik yaşlar belirli bir demografideyse sonuç artık nüfusu doğru temsil etmeyen bir veri kümesi olur.
df.isnull().sum() veya df.info() kullanın.sklearn.impute.SimpleImputer veya alanınıza özgü mantık kullanın.
Birden çok kaynaktan toplanan veriler nadiren tek bir formata düzgün uyum sağlar. Tarihler, kategoriler ve dize kodlamaları özellikle ince, izlenmesi güç hatalara eğilimlidir.
dtype: object), sayısal işlemleri devre dışı bırakır.Klasik Python hatası:
# Date times imported as strings, causing issues
import pandas as pd
df = pd.read_csv('sales.csv')
df['created_at'].min() # Only finds the minimum string, not chronological min
df.dtypes sayısal olması gereken sütunların olmadığını hızlıca gösterecek.pd.to_datetime(), pd.to_numeric() ve kategori dönüşümlerini kullanın..str.lower().str.strip() kullanın; eş anlamlıları veya yazım hatalarını tek bir değerle değiştirin.encoding argümanını belirtin (ör. encoding utf-8 veya cp1252).df['created_at'] = pd.to_datetime(df['created_at'], errors='coerce')
df = df.dropna(subset=['created_at']) # Dates could not be parsed removed
Küçük bir dikkat burada sonradan garip analitik hatalarını önler.
Uç değerler, veri temizlemede kısaltılmış yoldur—bazen veri girişi hatalarını belirtir; diğer zamanlarda ise gerçekten incelenmeye değer olaylardır!
Bağlamı düşünmeden belirli bir aralığın dışındaki değerleri kaldıran otomatik betikler, veriden hataları ve önemli sinyalleri tek seferde giderir.
Bir sağlık veri kümesinde kan basıncı sütunu vardır. Bazı değerler 400 olarak kaydedilmiş olabilir; bu potansiyel bir veri hatasıdır (birim veya giriş hatası). Diğerleri uç durumlar olabilir, örneğin hipertansif aciller. 200'ün üzerindeki tüm değerlerin tek seferde kaldırılması gerçek, nadir hastaları da silebilir ki bunlar tıbbi çalışmalarda hayati öneme sahip olabilir.
# Bağlam olmadan >200 olan değerleri kaldırmayın
bp_outliers = df[df['blood_pressure'] > 200]
print(bp_outliers) # İnceleyin: bunlar hatalar mı yoksa tıbbi olarak anlamlı durumlar mı?
df.describe() ve kutu grafikleri ya da histogramlar gibi görselleştirmelerle uç değerleri keşfedin.Uç değerler geçerli çıktılar olduğunda, veriye dayalı iş içgörülerini yeniden şekillendirebilirler.
Çift veriler yaygındır—veri girişi hataları, web kazıma veya sistem sorunları bunları ortaya çıkarabilir. Python ile anında df.drop_duplicates() yapabilirsiniz; gerçek tehlike, yinelenenlerin nereden geldiğini ya da bunları en iyi nasıl çözeceğinizi yanlış anlamanızdır.
Bir perakende veritabanında aynı müşteri siparişi için tekrarlanan sistem gönderimleri nedeniyle birden çok satır olabilir. Tüm sütunlar aynıysa tek satırı bırakıp diğerlerini kaldırmak işe yarar; aksi halde bazı bilgiler kaybolabilir.
# Problemli: sadece order_id üzerinde yinelenenleri düşürmek
df = df.drop_duplicates(subset=['order_id']) # farklı adresler veya notlar birleştirilmişse kayıp olabilir
Satırlar arasındaki delivery_notes gibi sütunlar farklıysa, yinelenenleri körü körüne kaldırmak ya veriyi kaybettirir ya da tutarsız bilgiyi uzlaştırmaz.
df.duplicated(subset=key_cols, keep=False) kullanın.İşte deduplikasyon öncesinde işlevsel olabilecek alanları bir araya toplamak için bir örnek:
def collapse_order_notes(notes):
return '; '.join(sorted(set(x for x in notes if pd.notnull(x))))
rollup = df.groupby('order_id').agg({
'customer_id': 'first',
'total_amount': 'sum',
'delivery_notes': collapse_order_notes
}).reset_index()
Bu, önemli yardımcı verileri korumaya yardımcı olur.
Birçok güçlü algoritma sayısal girdiler gerektirir, doğrudan dize etiketleri veya kategoriler değil. Kategorik sütunları kodlamak kritik bir adımdır, ancak acele etmek ya da yanlış yöntemi seçmek model performansını düşürebilir ve hatalar doğurabilir.
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
# Label encoding ignores category meaning
le = LabelEncoder()
df['city_code'] = le.fit_transform(df['city']) # Problem: Model numbers matematiksel olarak yorumlar
pd.get_dummies(df, drop_first=True, dummy_na=False) kullanın ya da yüksek kardinaliteli özellikler için hashing veya hedef kodlama düşünün.city_counts = df['city'].value_counts()
# Only encode cities appearing at least 10 times
common_cities = city_counts[city_counts > 10].index
df['city'] = df['city'].apply(lambda x: x if x in common_cities else 'Other')
df = pd.get_dummies(df, columns=['city'], drop_first=True)
Bu yaklaşım, özellik boyutunu makul tutar ve modelleri sağlam kılar.
Python'da veri temizleme, hızlılık kadar ince ayrıntılara da saygı göstermeyi gerektirir. Mekanik ya da bağlamdan bağımsız temizlemeden kaçınmak, veri bilimi ve analitik çalışmalarınızı ortalamanın çok üstüne çıkarır. Eksik değerlere kasıtlı yaklaşım gösterin, biçimlerde tutarlılık sağlayın, uç değerleri yalnızca gürültü olarak değil sinyaller olarak görün ve yinelenenleri dikkatle inceleyin; kategorik kodlama konusunda da taktiksel düşünün.
Bu derslerle ve veriniz üzerinde eleştirel bir göze sahip olarak, geri adım atmaktan kaynaklanan zaman kaybını azaltacak, üretimde utanç verici hataları en aza indirecek ve analistlerin güvendiği veri boru hatları tasarlama konusunda ün kazanacaksınız. Ve sürekli büyüyen veri bilimi alanında, içgörü için gerçekten hazır olan veriye sahip olan kişi olmak gerçek bir süper güçtür.