"Garbage In, Garbage Out" — Veri Kalitesi Neden Kritik?

Veri ambarı projelerinde en çok ihmal edilen ama en yüksek etkiye sahip alan: veri kalitesi. Raporlarınız teknik olarak mükemmel çalışabilir ama altındaki veri kirli, eksik veya tutarsızsa, iş kararları yanlış olur. Forumlarda sıkça paylaşılan hikaye: _"CEO dashboard'a baktı, rakamlar tutmadı, tüm BI projesine güven sarsıldı."_

Bu rehberde veri kalitesinin boyutlarını, ölçüm yöntemlerini ve otomatik kalite kontrol pipeline'larını ele alıyoruz.

Veri Kalitesinin 6 Boyutu

| Boyut | Tanım | Örnek Sorun | Ölçüm |

|---|---|---|---|

| Doğruluk | Veri gerçeği yansıtıyor mu? | Yanlış fiyat, yanlış adres | Kaynak ile karşılaştırma |

| Tamlık | Eksik veri var mı? | NULL müşteri telefonu | NULL oran % |

| Tutarlılık | Sistemler arası uyum | CRM'de "İstanbul", ERP'de "IST" | Cross-system match |

| Güncellik | Veri ne kadar taze? | 3 gün eski stok verisi | Gecikme süresi |

| Benzersizlik | Duplikasyon var mı? | Aynı müşteri 3 kez kayıtlı | Duplikasyon oranı % |

| Geçerlilik | Format/kural uyumu | "31/02/2024" geçersiz tarih | Kural ihlali sayısı |

Data Profiling: İlk Adım

Veri kalitesini iyileştirmeden önce mevcut durumu ölçün. Data profiling, verilerinizin istatistiksel analizini yapar.

SQL
-- SQL Server: Temel veri profilleme sorguları

-- 1. NULL Analizi — Her kolondaki NULL oranı
SELECT 
    'MusteriAd' AS Kolon,
    COUNT(*) AS ToplamSatir,
    SUM(CASE WHEN MusteriAd IS NULL THEN 1 ELSE 0 END) AS NullSayisi,
    CAST(SUM(CASE WHEN MusteriAd IS NULL THEN 1 ELSE 0 END) * 100.0 / COUNT(*) AS DECIMAL(5,2)) AS NullYuzde
FROM DimMusteri
UNION ALL
SELECT 'Email', COUNT(*), SUM(CASE WHEN Email IS NULL THEN 1 ELSE 0 END),
    CAST(SUM(CASE WHEN Email IS NULL THEN 1 ELSE 0 END) * 100.0 / COUNT(*) AS DECIMAL(5,2))
FROM DimMusteri;

-- 2. Duplikasyon Analizi
SELECT MusteriAd, Telefon, COUNT(*) AS Tekrar
FROM DimMusteri
GROUP BY MusteriAd, Telefon
HAVING COUNT(*) > 1
ORDER BY Tekrar DESC;

-- 3. Kardinalite Analizi
SELECT 
    'Sehir' AS Kolon,
    COUNT(DISTINCT Sehir) AS BenzersizDeger,
    COUNT(*) AS ToplamSatir
FROM DimMusteri;
Veri Kalitesi Dashboard Örneği
Toplam Satış₺2.4M▲ %12Müşteri Sayısı1,842▲ %8Ortalama Sipariş₺1,305▼ %3Dönüşüm%4.2▲ %1.5

Veri Temizleme Stratejileri

1. Standardizasyon

SQL
-- Şehir isimlerini standartlaştır
UPDATE DimMusteri SET Sehir = 
    CASE 
        WHEN UPPER(Sehir) IN ('IST', 'ISTANBUL', 'İSTANBUL', 'İst.') THEN 'İstanbul'
        WHEN UPPER(Sehir) IN ('ANK', 'ANKARA', 'Ank.') THEN 'Ankara'
        WHEN UPPER(Sehir) IN ('IZM', 'IZMIR', 'İZMİR', 'İzm.') THEN 'İzmir'
        ELSE Sehir
    END;

-- Telefon formatını standartlaştır
UPDATE DimMusteri SET Telefon = 
    REPLACE(REPLACE(REPLACE(REPLACE(Telefon, ' ', ''), '-', ''), '(', ''), ')', '')
WHERE Telefon IS NOT NULL;

2. Duplikasyon Tespiti ve Birleştirme

SQL
-- Fuzzy matching ile potansiyel duplikasyonlar
-- (Basit örnek — gerçek projede Levenshtein distance veya ML kullanın)
SELECT a.MusteriID, a.MusteriAd, b.MusteriID AS DupID, b.MusteriAd AS DupAd
FROM DimMusteri a
JOIN DimMusteri b ON a.MusteriID < b.MusteriID
WHERE SOUNDEX(a.MusteriAd) = SOUNDEX(b.MusteriAd)
   OR a.Telefon = b.Telefon
   OR a.Email = b.Email;

3. Otomatik Kalite Kontrol Pipeline

ETL sürecinize kalite kontrol adımları ekleyin:

SQL
-- Otomatik kalite kontrol stored procedure
CREATE PROCEDURE sp_VeriKaliteKontrol
    @TabloAdi NVARCHAR(100),
    @KaliteSkoru DECIMAL(5,2) OUTPUT
AS
BEGIN
    DECLARE @ToplamSatir INT, @HataliSatir INT;
    
    -- NULL kontrolü
    SELECT @ToplamSatir = COUNT(*), 
           @HataliSatir = SUM(CASE 
               WHEN MusteriAd IS NULL OR Sehir IS NULL THEN 1 
               ELSE 0 END)
    FROM DimMusteri;
    
    -- Kalite skoru hesapla (0-100)
    SET @KaliteSkoru = (1.0 - CAST(@HataliSatir AS DECIMAL) / @ToplamSatir) * 100;
    
    -- Eşik altındaysa uyarı
    IF @KaliteSkoru < 95.0
    BEGIN
        INSERT INTO VeriKaliteLog (Tarih, Tablo, Skor, Mesaj)
        VALUES (GETDATE(), @TabloAdi, @KaliteSkoru, 'Kalite eşiği altında!');
    END
END;

Veri Kalitesi KPI'ları

Her veri ambarı projesinde şu metrikleri takip edin:

| KPI | Hedef | Kırmızı Alarm |

|---|---|---|

| NULL oranı (kritik alanlar) | < %1 | > %5 |

| Duplikasyon oranı | < %0.5 | > %2 |

| Referans bütünlüğü ihlali | 0 | > 0 |

| ETL hata oranı | < %0.1 | > %1 |

| Veri gecikme süresi | < 1 saat | > 4 saat |

💡Veri kalitesi KPI'larını ayrı bir Power BI dashboard'unda takip edin. İş kullanıcılarına "verinize güvenebilirsiniz" mesajını somut rakamlarla verin.

Fabric'te Veri Kalitesi

Microsoft Fabric'te veri kalitesi kontrolleri için:

Python
class="code-comment"># Fabric Notebook - PySpark ile veri kalitesi kontrolü
from pyspark.sql import functions as F

df = spark.read.format(class="code-string">"delta").load(class="code-string">"Tables/dim_musteri")

class="code-comment"># Kalite metrikleri
toplam = df.count()
null_ad = df.filter(F.col(class="code-string">"MusteriAd").isNull()).count()
null_sehir = df.filter(F.col(class="code-string">"Sehir").isNull()).count()
duplikasyon = df.count() - df.dropDuplicates([class="code-string">"MusteriAd", class="code-string">"Telefon"]).count()

kalite_skoru = ((toplam - null_ad - null_sehir - duplikasyon) / toplam) * class="code-number">100

class="code-comment"># Sonuçları kalite tablosuna yaz
from pyspark.sql import Row
from datetime import datetime

kalite_row = spark.createDataFrame([
    Row(Tarih=datetime.now(), Tablo=class="code-string">"dim_musteri", Skor=kalite_skoru,
        NullAd=null_ad, NullSehir=null_sehir, Duplikasyon=duplikasyon)
])
kalite_row.write.format(class="code-string">"delta").mode(class="code-string">"append").save(class="code-string">"Tables/veri_kalite_log")

Sonuç

Veri kalitesi, veri ambarı projesinin güvenilirlik temelidir. Profiling ile mevcut durumu ölçün, standardizasyon ve duplikasyon tespiti ile temizleyin, otomatik kalite kontrol pipeline'ları ile sürekli izleyin. Kalite skoru %95'in altına düştüğünde alarm verin. Unutmayın: En güzel dashboard bile kirli veriyle çalışıyorsa, yanlış kararlar üretir.