Modül 3 · Atölye: Veri Alımı · ⏱ 6 dk

Veri kalitesi: eksik ve saçma satırları yakala

Data quality

Bu derste neler öğreneceksin

  • Schema validation yazar
  • Alert kuralı tanımlar
  • dbt test ile benzerliği görür

Bozuk Kitapları Kim Yakalar?

Dün kütüphaneden 1000 kitap ödünç aldın. Eve gelip rafa koymaya başladın. Bir bittane kitabın sayfaları yapış yapış, başka birinin kapağı yok, bir tanesinin adında ??? işareti var. Ne yaparsın?

İlk işin: hepsini geri götür ya da “bozuk” etiketi yapıştırıp ayrı rafa koymak. Çünkü o kitap rafta dursa bile kimse okuyamaz, hatta yanındaki sağlam kitaplara da zarar verebilir.

Veri dünyasında buna “Garbage In, Garbage Out” derler: kirli veri girerse, kirli sonuç çıkar. Dünkü dlt tablolarımıza bakalım — eminim aralarında eksik başlık, boş yazar listesi, tutarsız tarih vardır.

Veri Kalitesi Neden Her Şeyden Önemli?

Bir düşün: senin limonatacın var, hangi ürünü sattığını görmek istiyorsun. SQL’e SELECT product, COUNT(*) FROM sales GROUP BY product yazdın. Ama veri girişçisi bazen “limonata”, bazen “Limonata”, bazen “LİMONATA”, bazen “limonota” (yanlışlıkla) yazdı. Sen şimdi 4 ayrı ürün zannedeceksin. Gerçekte hepsi aynı şey.

Veri kalitesi, bu tür hataları kaynağında yakalamak. Yoksa saatlerce yanlış analiz yaparsın.

Kütüphanecimizi Sıkı Bir Hale Getirelim

Geçen dersteki get_books.py dosyasını aç. Kütüphanecimize “bu kuralları çiğneyen kitapları kabul etme” diyeceğiz. dlt buna schema contract diyor.

Şu sütunları ekle (dosyanın üstünde, import’lardan sonra):

from dlt.common import SchemaContract

pipeline = dlt.pipeline(
    pipeline_name="open_library_demo_strict",
    destination="duckdb",
    dataset_name="books_data_strict",
    progress="log",
)

Şimdi get_books fonksiyonunu şöyle değiştir:

@dlt.resource(
    table_name="books",
    write_disposition="replace",
    columns={
        "title": {"data_type": "text", "nullable": False},     # Başlık şart!
        "first_publish_year": {"data_type": "bigint"},         # Yıl sayı olmalı
    },
)
def get_books():
    """Sadece başlığı ve yılı olan kitapları al."""
    for page in client.paginate(
        "/search.json",
        params={"q": "harry potter"},
        paginator=PageNumberPaginator(base_page=1, total_path=None),
    ):
        # Eksik başlığı olan sayfaları atla
        docs = page.get("docs", [])
        clean_docs = [d for d in docs if d.get("title")]
        yield clean_docs

Şimdi kütüphanecimiz:

  • Başlığı olmayan sayfaları kabul etmiyor (sessizce atlıyor).
  • title sütunu boş olamaz.
  • first_publish_year her zaman sayı olmalı.

Çalıştır: python get_books.py. Tarayıcıda aç: dlt pipeline open_library_demo_strict show. Satır sayısı biraz azalmış olabilir — işte o eksikler elendi.

Hâlâ Kirli Veri Kaçıyor mu?

Bazen kütüphanecimiz hata vermez ama içine garip veriler sızar: yıl olarak -1500, başlık olarak "" (boş string), veya null. Bunları yakalamak için alert kuralları yazalım.

Bir quality_check.py dosyası oluştur:

import duckdb

# Veritabanına bağlan (kütüphanemizin rafları)
con = duckdb.connect("open_library_demo_strict.duckdb")

# Kural 1: Hiç başlığı olmayan kitap sayısı
empty_titles = con.execute("""
    SELECT COUNT(*) FROM books_data_strict.books
    WHERE title IS NULL OR TRIM(title) = ''
""").fetchone()[0]
print(f"Boş başlık: {empty_titles}")

# Kural 2: Mantıksız yayın yılı (bugünden büyük veya çok eski)
bad_years = con.execute("""
    SELECT COUNT(*) FROM books_data_strict.books
    WHERE first_publish_year < 1450  # matbaa öncesi!
       OR first_publish_year > 2026
""").fetchone()[0]
print(f"Şüpheli yıl: {bad_years}")

# Eğer kural ihlali varsa uyar
if empty_titles > 0 or bad_years > 0:
    print("UYARI: Veri kalitesi sorunu var, kaynağı kontrol et!")
else:
    print("Veri temiz görünüyor.")

Çalıştır: python quality_check.py. Çıktıyı incele. Eğer uyarı varsa, bu gerçek bir veri kalitesi sorunu — kaynak API’ye veya senin koduna bak.

dbt Test ile Benzerlik

Modül 4’te dbt öğreneceğiz. dbt’nin not_null ve unique testleri tam da bu kuralları veritabanı seviyesinde çalıştırır. Bugün yazdığın alert script’i ile aynı mantık, sadece daha statik yazılmış hali. İki yaklaşım arasındaki farkı o zaman konuşacağız.

Kendi Denemen

q="harry potter" yerine aranmayan, çok bilinmeyen bir şey dene, mesela q="xyzabc123". Çoğu sayfa boş dönecek, bazıları garip karakterler içerecek. Kalite kontrol script’ini çalıştır — kaç sorun buldun?

Neden Önemli?

Şirketler veri kalitesi sorunları yüzünden saatlerce yanlış rapor yayınlar. Bir e-ticaret şirketi “ürün sayımız 12 bindir” raporu verdiyse ama 250 ürünün başlığı null ise, müşteri arayüzünde boş sayfa görür. Bu olay gerçek dünyada oluyor, her hafta bir şirketin başına geliyor.

Veri kalitesini pipeline’ın başına koymak, sonradan düzeltmekten 10 kat ucuz.

Sıradaki

Verimiz artık temiz. Sırada alternatif bir not defteri var →