Python ile Veri Temizleme: Pratik İpuçları
Gerçek dünya verisi her zaman dağınıktır. Python ile veri temizleme sürecini hızlandıracak pratik ipuçlarını keşfedin.
Veri bilimi projelerinde zamanın büyük çoğunluğu, modeli kurmakla değil veriyi temizlemekle geçer. "Garbage in, garbage out" sözü hâlâ geçerliliğini koruyor. Bu yazıda, gerçek projelerde sık karşılaştığım sorunları ve bunları Python ile nasıl hızlıca çözdüğümü paylaşacağım.
1. Eksik Verilerle Başa Çıkmak
Eksik değerler, veri temizlemenin birinci durağı. Pandas ile durumu ilk önce anlamaya çalışıyorum:
import pandas as pd
df = pd.read_csv("veri.csv")
print(df.isnull().sum())
print(df.isnull().mean() * 100) # Yüzdelik kayıp oranı
Strateji belirlemek için şu kuralları uyguluyorum:
- %5'ten az kayıp → Satırı sil (
dropna) - %5–30 arası kayıp → Medyan veya mod ile doldur (
fillna) - %30'dan fazla kayıp → Sütunu tamamen sil ya da özel imputation yöntemi kullan
df["yas"].fillna(df["yas"].median(), inplace=True)
df.dropna(subset=["kritik_sutun"], inplace=True)
2. Yinelenen Kayıtları Tespit Etmek
Veri tabanı birleştirme veya API çekimi sonrasında yinelenen satırlar kaçınılmaz oluyor:
print(df.duplicated().sum())
df.drop_duplicates(inplace=True)
# Belirli sütunlara göre tekilleştirme
df.drop_duplicates(subset=["musteri_id", "siparis_tarihi"], keep="last", inplace=True)
keep="last" parametresi, en güncel kaydı tutmak istediğimde hayat kurtarıyor.
3. Veri Tiplerini Doğrulamak
CSV'den okunan sütunlar çoğunlukla yanlış tiple geliyor. Örneğin tarih sütunları object olarak okunur:
df["tarih"] = pd.to_datetime(df["tarih"], errors="coerce")
df["fiyat"] = pd.to_numeric(df["fiyat"].str.replace(",", "."), errors="coerce")
errors="coerce" parametresi, dönüştürülemeyen değerleri NaN'a çeviriyor. Böylece hata almak yerine sonradan filtreleme yapabiliyorum.
4. Aykırı Değerleri Yakalamak
Aykırı değerler (outlier), modelin performansını sessiz sedasız mahvedebilir. IQR yöntemi benim için en sağlam başlangıç noktası:
Q1 = df["gelir"].quantile(0.25)
Q3 = df["gelir"].quantile(0.75)
IQR = Q3 - Q1
alt_sinir = Q1 - 1.5 * IQR
ust_sinir = Q3 + 1.5 * IQR
temiz_df = df[(df["gelir"] >= alt_sinir) & (df["gelir"] <= ust_sinir)]
Aykırı değeri silmek her zaman doğru değil; bazen gerçek bir olayı temsil ediyor. Bu yüzden önce görselleştirip karar veriyorum.
5. Metin Verilerini Standartlaştırmak
Kategorik ve metin sütunlarında tutarsızlıklar çok yaygın:
df["sehir"] = df["sehir"].str.strip().str.lower()
df["sehir"] = df["sehir"].replace({"i̇stanbul": "istanbul", "ıstanbul": "istanbul"})
Büyük veri setlerinde replace yerine str.contains + regex kombinasyonu daha esnek oluyor.
6. Pipeline ile Süreci Otomatikleştirmek
Tüm bu adımları fonksiyonlara sarıp tek bir pipeline'da birleştiriyorum. Böylece yeni veri geldiğinde tek satırla temizleme başlıyor:
def temizle(df: pd.DataFrame) -> pd.DataFrame:
df = df.drop_duplicates()
df["tarih"] = pd.to_datetime(df["tarih"], errors="coerce")
df["fiyat"] = pd.to_numeric(df["fiyat"], errors="coerce")
df.dropna(subset=["tarih", "fiyat"], inplace=True)
df["sehir"] = df["sehir"].str.strip().str.lower()
return df
temiz_veri = temizle(ham_veri.copy())
Son Söz
Veri temizleme monoton görünse de aslında verinin hikâyesini anladığınız yerdir. Her anomali, veri üretim sürecinde bir şeyin yanlış gittiğine işaret eder. Temizleme yaparken veriyi silmek yerine anlamaya çalışmak, uzun vadede çok daha değerli içgörüler sağlıyor.
Bir sonraki yazıda Great Expectations kütüphanesi ile veri kalitesini otomatik olarak nasıl izleyebileceğimizi inceleyeceğim. Takipte kalın!