"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 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 Temizleme Stratejileri
1. Standardizasyon
-- Ş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
-- 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:
-- 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 |
Fabric'te Veri Kalitesi
Microsoft Fabric'te veri kalitesi kontrolleri için:
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.
