---
title: 'Veri Mühendisliği Nedir'
source: 'https://academia.sh/tr/kurslar/veri-muhendisligine-giris/veri-muhendisligi-nedir'
course: 'Veri Mühendisliğine Giriş'
language: tr
updated: '2026-08-17T18:08:52+00:00'
license: 'CC BY-SA 4.0'
---

# Veri Mühendisliği Nedir

Kurgu bir ölçüm ağının 2400 sayaç okumasının beş aşamalı bir hattan geçirilip her aşamanın taşıdığı satırın sayılması: ayıklama 2400, tekilleştirme 2400, tüketim 2200, özet 55 ve sunma 5. Tüketim aşamasının düşürdüğü satır sıfır olduğu hâlde çıkışı iki yüz satır daha az, çünkü ilk dönemin farkı tanım gereği yoktur. Beş sunulan değerin arkasında 2400 kaynak satırı duruyor, değer başına ortalama 480; en büyük değer 588 kaynak satırının, en küçüğü 372 satırın üzerinde. Hat belirlenimci olduğu için bu sayıların hepsi koşum yapılmadan da türetilebilir. Denetimsiz hatta yakalanan bozulma sıfır ve yakalama gecikmesi tanımsızdır, çünkü ölçen hiçbir şey yoktur.

Yapay Zekâ Mühendisliğine Giriş kursuyla açılan müfredat, yüz otuz iki derste düzeneği modelin
çevresine kurdu ve her parçanın bedelini ayrı ayrı yazdı. Bu derslerin tamamında modele giren
verinin **hazır olduğu** varsayıldı: bir tablo vardı, okundu; bir öznitelik vardı, hesaplandı. O
tablonun nasıl dolduğu, üretimde çalışır tutulmasının ne gerektirdiği ve **bozulduğunda kimin
haberi olacağı** hiç sorulmadı.

Bu müfredatın konusu o hattır ve hattın kendine özgü bir kusuru bütün ölçüyü belirler: **bir hat
çöktüğünde haber verir, yanlış veri taşıdığında hiçbir şey söylemez.** Çöken hat bir hata kaydı
bırakır, bir uyarı tetikler, bir kuyruk biriktirir; birileri bakar. Yanlış satır taşıyan hat ise
koşar, biter, tabloyu yazar ve gösterge yeşil kalır. Bu dersin işi o hattı kurmak ve **saymaktır**:
kaç satır giriyor, her aşama kaçını taşıyor, kaçı sunulan sayıya ulaşıyor.

- **YD1.** Kod bir **kurgudur**. Gerçek bir veri deposu, dosya biçimi, orkestratör ya da çalışma
  zamanı çağrılmaz; hat düz kitaplıkla yazılmıştır. Kaynak, bir ölçüm ağının **kurgu** sayaç
  okumalarıdır ve tohum **20260218**'dir.
- **YD2.** Kaynak **200 abone x 12 dönem = 2400 okuma**. Her okuma bir endeks değeri taşır, endeks
  artandır ve birim `m3`'tür. Tüketim endeks farkından hesaplanır.
- **YD3.** Hat **beş aşamalıdır**: `ayikla`, `tekille`, `tuketim`, `ozet`, `sun`. Her aşama kendi
  düşürdüğü satırı **sayar**; sayılmayan düşüş yoktur.
- **YD4. Toplama, temizleme, eksik değer ve aykırı değer yordamı tekrarlanmaz.** Veri Toplama ve
  Hazırlama kursunda ölçüldü. Buraya eklenen tek şey **aşama sayacıdır**: bir satırın hangi adımda
  ve neden düştüğü yazılır.
- **YD5. Şema, kısıt ve normalleştirme yordamı tekrarlanmaz.** Veri Modelleme ve İlişkisel Kuram
  kursunda ölçüldü. Bu derste şema yalnız "zorunlu alan var mı" sorusuna indirgenir.
- **YD6.** Hat **belirlenimcidir**. `random` kullanılmaz, üreteç ders içinde yazılır; aynı tohum
  aynı 2400 satırı verir. Bu yüzden ölçüler koşumdan bağımsızdır ve aşağıdaki sayıların hepsi
  koşum yapılmadan da türetilebilir.
- **YD7.** Hiçbir ürün, satıcı ya da biçim adı yazılmaz; depolar ve işleyiciler **türleriyle**
  anılır. Süre ham olarak yazılmaz; gecikme **aşama** ya da **dönem** olarak yazılır.
- **YD8.** Kümenin çözünürlüğü ölçüm bandının alt sınırıdır: 2400 satırda satır oranının en küçük
  adımı **0,0004**, 55 özet hücresinde **0,0182**, 5 sunum değerinde **0,2000**. **Sunum üzerinde
  oran basılmaz**, değerin kendisi yazılır.

## Hattın Beş Aşaması

Veri mühendisliğinin sorumluluğu tek cümleyle şudur: bir yerde üretilmiş veriyi, başka bir yerde
kullanılabilir hâle getirmek. Bu cümledeki "kullanılabilir" sözcüğü bir dizi adımı gizler ve
adımlar sayılmadıkça sorumluluk da ölçülemez. Aşağıdaki hat o adımları beş parçaya ayırır: zorunlu
alanı olmayan satır **ayıklanır**, aynı abone-dönem çifti **tekilleştirilir**, endeks farkından
**tüketim** hesaplanır, bölge ve dönem başına **özet** çıkarılır, bölge başına dönem ortalaması
**sunulur**.

Bu beşlinin sırası keyfî değildir ve iki bağı kodun kendisi zorlar. `tekille` aşaması satırın
`abone` ve `donem` alanlarını doğrudan okur; bu alanlardan biri yoksa aşama hatayla durur. Yani
**ayıklama tekilleştirmeden önce gelmek zorundadır**, yoksa hat çöker. İkinci bağ daha sessizdir:
`tuketim` aşaması her giriş satırı için bir çıkış satırı üretir, `ozet` aşaması da bu satırları
toplar. Çift kayıt tekilleştirilmeden tüketime girseydi aynı abone-dönem farkı iki çıkış satırı
üretir ve özet hücresine **iki kez** eklenirdi. Birinci bağ ihlal edildiğinde hat durur ve haber
verir; ikinci bağ ihlal edildiğinde hat çalışır, biter ve **yanlış sayı yazar**. Bir hattın aşama
sırası, hangi hataların gürültülü hangilerinin sessiz olacağını belirleyen ilk karardır.

```python
# KURGU hat -- gercek bir depo, bicim ya da orkestrator cagrilmaz.
# Kaynak bir olcum aginin KURGU sayac okumalaridir, tohum 20260218.
TOHUM, M32 = 20260218, 0xFFFFFFFF


def uretec(t):
    x = ((t ^ (t >> 16)) * 2246822507) & M32
    x = ((x ^ (x >> 13)) * 3266489909) & M32
    s = [(x ^ (x >> 16)) & M32]

    def sonraki():
        s[0] = (s[0] * 1664525 + 1013904223) & M32
        return s[0] / 4294967296
    return sonraki


BOLGE = ["dogu", "bati", "kuzey", "guney", "merkez"]
TIP = ["mesken", "isyeri"]
DONEM = [f"2026-{a:02d}" for a in range(1, 13)]
ABONE = {}
for i in range(200):
    r = uretec(TOHUM + 37 * i)
    ABONE[f"A{i + 1:03d}"] = {"bolge": BOLGE[int(r() * 5)], "tip": TIP[int(r() * 2)],
                              "baslangic": 10000 + int(r() * 60000)}


# Her donem her abone icin bir okuma. Birim m3 , endeks artan.
def kaynak_uret():
    kayit = []
    for i, (ab, a) in enumerate(ABONE.items()):
        e = a["baslangic"]
        for d in DONEM:
            r = uretec(TOHUM + 101 * i + 7 * DONEM.index(d))
            e += 4 + int(r() * 46)
            kayit.append({"abone": ab, "donem": d, "bolge": a["bolge"], "tip": a["tip"],
                          "endeks": e, "birim": "m3"})
    return kayit


def a1_ayikla(kayit):
    """Zorunlu alanlari tasimayan satir dusurulur."""
    ZOR = ("abone", "donem", "bolge", "endeks", "birim")
    tut = [k for k in kayit if all(a in k for a in ZOR)]
    return tut, len(kayit) - len(tut)


def a2_tekille(kayit):
    gor, tut = set(), []
    for k in kayit:
        ad = (k["abone"], k["donem"])
        if ad in gor:
            continue
        gor.add(ad)
        tut.append(k)
    return tut, len(kayit) - len(tut)


def a3_tuketim(kayit):
    """Donem farkindan tuketim. Onceki donem yoksa satir hesaplanamaz."""
    tablo = {(k["abone"], k["donem"]): k for k in kayit}
    cikti, dusen = [], 0
    for k in kayit:
        i = DONEM.index(k["donem"])
        if i == 0:
            continue
        onceki = tablo.get((k["abone"], DONEM[i - 1]))
        if onceki is None:
            dusen += 1
            continue
        try:
            f = int(k["endeks"]) - int(onceki["endeks"])
        except (TypeError, ValueError):
            dusen += 1
            continue
        cikti.append(dict(k, m3=f))
    return cikti, dusen


def a4_ozet(kayit):
    top = {}
    for k in kayit:
        ad = (k["bolge"], k["donem"])
        top[ad] = top.get(ad, 0) + k["m3"]
    return top, 0


def a5_sun(ozet):
    """Sunum: bolge basina donem ortalamasi."""
    bolge = {}
    for (b, d), v in ozet.items():
        bolge.setdefault(b, []).append(v)
    return {b: round(sum(v) / len(v), 2) for b, v in bolge.items()}, 0


ASAMA = [("ayikla", a1_ayikla), ("tekille", a2_tekille), ("tuketim", a3_tuketim),
         ("ozet", a4_ozet), ("sun", a5_sun)]


def hat(kayit):
    iz, veri = [], kayit
    for ad, f in ASAMA:
        veri, dusen = f(veri)
        n = len(veri) if hasattr(veri, "__len__") else 0
        iz.append({"asama": ad, "kalan": n, "dusen": dusen})
    return veri, iz


kaynak = kaynak_uret()
sunum, iz = hat(kaynak)
print("kaynak satiri", len(kaynak), " abone", len(ABONE), " donem", len(DONEM))
print("asama      kalan   dusen")
for a in iz:
    print(f"{a['asama']:<10}{a['kalan']:>6}{a['dusen']:>8}")
print("sunum")
for b, v in sorted(sunum.items(), key=lambda x: -x[1]):
    print(f"  {b:<8}{v:>9.2f}")
```

```
kaynak satiri 2400  abone 200  donem 12
asama      kalan   dusen
ayikla      2400       0
tekille     2400       0
tuketim     2200       0
ozet          55       0
sun            5       0
sunum
  merkez    1321.45
  kuzey     1212.55
  guney     1065.55
  dogu       881.36
  bati       833.09
```

İz tablosunun ilk iki satırı sıfır düşüşle geçiyor: kaynak sağlam olduğu için ayıklanacak eksik
alanlı satır yok, tekilleştirilecek çift kayıt yok. Üçüncü satır ise okumanın kilit noktasıdır.
`tuketim` aşamasının **düşürdüğü satır sıfır**, buna karşılık çıkışı **iki yüz satır daha az**.
Bu fark bir kayıp değil, tanımın kendisidir: tüketim iki dönemin endeks farkıdır ve her abonenin
**ilk döneminin farkı yoktur**. İki yüz abonenin ilk dönemi hesaplanamaz, ama bunlar bozuk satır
değildir. Bir hattın izinde "kalan" ile "düşen" sütunlarının ayrı tutulmasının nedeni budur:
**tanım gereği çıkmayan satır ile hata yüzünden çıkarılan satır aynı sütuna yazılamaz.**

Bu sayıların hiçbiri koşuma bağlı değildir. Hat belirlenimci olduğu için tablo koşum yapılmadan da
türetilir: 200 abone x 12 dönem = 2400; her abone bir dönem kaybettiği için 200 x 11 = 2200; 5
bölge x 11 dönem = 55 hücre; 5 bölge = 5 değer. Aynı tohumla ikinci bir koşum aynı tabloyu verir,
bu yüzden aşağıdaki karşılaştırmalarda görülen her fark bozulmanın kendisinden gelir, oynaklıktan
değil.

## Sunulan Değerin Arkasındaki Satır

Bir hattın en çok bakılan yeri son aşamasıdır, çünkü rapor oradan okunur. Bu hattın son aşaması
**beş sayı** üretiyor. O beş sayının arkasında kaç satır durduğu, hattın ne kadarını gizlediğini
söyler.

```python
# Her sunulan degerin arkasinda kac satir duruyor
v1, _ = a1_ayikla(kaynak)
v2, _ = a2_tekille(v1)
v3, _ = a3_tuketim(v2)
ozet, _ = a4_ozet(v3)
abone, satir, hucre = {}, {}, {}
for a in ABONE.values():
    abone[a["bolge"]] = abone.get(a["bolge"], 0) + 1
for k in v3:
    satir[k["bolge"]] = satir.get(k["bolge"], 0) + 1
for b, d in ozet:
    hucre[b] = hucre.get(b, 0) + 1
print("bolge     sunulan  ozet  tuketim  kaynak  abone")
for b, v in sorted(sunum.items(), key=lambda x: -x[1]):
    print(f"{b:<9}{v:>9.2f}{hucre[b]:>6}{satir[b]:>9}{abone[b] * 12:>8}{abone[b]:>7}")
print(f"{'toplam':<9}{len(sunum):>9}{len(ozet):>6}{len(v3):>9}{len(kaynak):>8}{len(ABONE):>7}")
```

```
bolge     sunulan  ozet  tuketim  kaynak  abone
merkez     1321.45    11      539     588     49
kuzey      1212.55    11      506     552     46
guney      1065.55    11      440     480     40
dogu        881.36    11      374     408     34
bati        833.09    11      341     372     31
toplam           5    55     2200    2400    200
```

Tablo hattın **sıkıştırma oranını** açıkça yazıyor. `merkez` için raporda görünen tek sayı,
**1321,45**, kırk dokuz abonenin on iki dönemlik **588 kaynak satırının**, bunlardan hesaplanan
**539 tüketim satırının** ve on bir **özet hücresinin** üzerinde duruyor. En küçük değer olan
`bati`, **372 kaynak satırının** üzerinde. Beş değer birlikte **2400 satırı** temsil ediyor, yani
değer başına ortalama **480 kaynak satırı**.

Bu sıkıştırmanın iki yüzü var. Yararlı yüzü açıktır: kimse iki bin dört yüz satıra bakarak karar
veremez, özetin işi zaten budur. Bedeli ise ölçünün konusudur. Bir kaynak satırı bozulduğunda o
bozulma sunulan sayıya **480'de bir ağırlıkla** girer; `merkez` için 588'de bir. Tüketim
katmanının kaynağa oranı **0,9167**'dir ve bu oranın en küçük adımı 0,0004 olduğuna göre üç
haneli okunabilir; ama sunum katmanında oran yazmanın anlamı yoktur, çünkü orada yalnız beş değer
vardır ve bir değerin oransal ağırlığı 0,2000'dir. Sunum katmanında yazılacak şey **değerin
kendisidir**.

Buradan hattın ilk yapısal sonucu çıkar: **tek bir satırın bozulması sunulan sayıda görünmeyecek
kadar seyrelir, ama yüz satırın aynı yönde bozulması görünmeyecek kadar seyrelmez.** Hangi
bozulmanın hangi eşikte göründüğü bu hattın ölçülecek asıl niceliğidir ve bu ders onu henüz
ölçmüyor, yalnız zeminini kuruyor.

Sıkıştırmanın satır sayısında görünmeyen bir yanı daha var: hat yalnız satır düşürmüyor, **ayırt
edici boyut** da düşürüyor. İlk üç aşamanın çıkışı `abone` ile `donem` çiftiyle anahtarlıdır ve
tabloda iki yüz ayrı abone durur. `ozet` aşamasının çıkışı ise `bolge` ile `donem` çiftiyle
anahtarlıdır; abone sütunu orada **kalmaz**. Elli beş hücrenin hiçbirinden hangi abonelerin
toplandığı okunamaz. `sun` aşaması aynı şeyi dönem eksenine yapar: beş değerin hiçbirinden hangi
dönemin ne kadar eklediği okunamaz. Bu, bir kayıp değil özetin tanımıdır, ama sonucu üretimde
ağırdır. Sunulan bir sayı şüpheli göründüğünde geriye doğru yürümek, ara çıktıları **okumakla**
yapılamaz; hattın ilk üç aşamasının **yeniden koşturulması** gerekir. Bir hattın hangi aşamada
hangi boyutu bıraktığını yazmak, bozulma araştırmasının maliyetini önceden yazmakla aynı şeydir.

## Denetimsiz Hattın Sayısı

Yukarıdaki hat çalışıyor, bitiyor ve beş sayı yazıyor. Bu hat hakkında bilinen tek şey **kaç satır
taşıdığıdır**. Taşıdığı satırların **doğru** olup olmadığı hakkında hiçbir şey bilinmiyor, çünkü
hatta bunu soran hiçbir adım yok.

Müfredatın her dersinde bundan sonra **üç sayı yan yana** duracak:

1. **Denetimsiz hat.** Hiçbir denetim açık değil. Yakalanan bozulma **0**, yakalama gecikmesi
   **tanımsız**. Bu dersteki hat tam olarak budur.
2. **Denetimli hat.** Aynı iş yükü, denetim eklenmiş. Yakalanan bozulma ve **yakalama gecikmesi**
   aşama numarası olarak yazılır.
3. **Bedel.** Yakalama gecikmesi, yanlış engellenen iyi satır, yeniden işlenen satır ve eklenen
   aşama.

Üçüncü maddedeki kalemler bu müfredatın en sık atlanan yanıdır. Denetim eklemek bedava bir iyileşme
değildir: bir denetim iyi satırı da engelleyebilir, hattı gereksiz yere durdurabilir, yeniden
işleme sırasında satır çoğaltabilir ve **kendisi kusurlu olabilir**. Bu yüzden denetimli hat
yazılırken yalnız yakalanan bozulma değil, denetimin **kendi bedeli** de aynı tabloya girer.
Yakalanan bozulma sayısı tek başına yazıldığında iyileşme abartılmış olur.

Birinci maddedeki "tanımsız" sözcüğü dikkatle okunmalıdır. Denetimsiz hattın yakalama gecikmesi
**büyük** değildir, **yoktur**; ölçen hiçbir şey olmadığı için gecikme diye bir nicelik oluşmaz.
Bu, sıfır ile tanımsız arasındaki farktır ve raporlamada sık karıştırılır: "hiç bozulma
yakalanmadı" cümlesi, denetim yokken bir başarı bildirimi değil, **bir ölçüm yapılmadığının**
bildirimidir.

Buradan müfredatın kuralı gelir ve altı kurs boyunca sürer: **bir veri hattının sayısı taşıdığı
satır değil, yanlış satırın kaç adım sonra yakalandığıdır. Bozulmayı yakalayan denetimi yazılmayan
hat ölçülmemiş sayılır.** Yukarıdaki hattın izi kusursuz görünüyor, çünkü izin gösterdiği tek şey
aşamaların birbirine kaç satır devrettiğidir. Devredilen satırın içeriği hakkında iz sessizdir ve
sessizliği yeşil renkte yazılır.

## Özet

- Veri mühendisliğinin sorumluluğu bir yerde üretilmiş veriyi başka bir yerde kullanılabilir
  kılmaktır; bu sorumluluk ancak hattın aşamaları ve her aşamanın taşıdığı satır sayıldığında
  ölçülebilir hâle gelir.
- Bir hat çöktüğünde haber verir, yanlış veri taşıdığında hiçbir şey söylemez; bu müfredatın ölçüsü
  ikinci durumdur.
- Beş aşamalı hat 2400 kaynak satırını 2400, 2400, 2200, 55 ve 5 olarak taşıyor; `tuketim`
  aşamasının düşürdüğü satır sıfır olduğu hâlde çıkışı iki yüz satır azdır, çünkü ilk dönemin farkı
  tanım gereği yoktur.
- Sunulan beş değerin arkasında 2400 kaynak satırı duruyor: değer başına ortalama 480, en büyüğü
  588, en küçüğü 372. Bir satırın bozulması sunulan sayıya bu ağırlıkla seyrelerek girer.
- Denetimsiz hatta yakalanan bozulma 0 ve yakalama gecikmesi **tanımsızdır**; "hiç bozulma
  yakalanmadı" cümlesi ölçüm yapılmadığının bildirimidir.
- Müfredatın kuralı: bir veri hattının sayısı yanlış satırın kaç adım sonra yakalandığıdır;
  bozulmayı yakalayan denetimi yazılmayan hat ölçülmemiş sayılır.

## Sonraki Adım

Bu dersin hattı sağlam bir kaynakla koştu ve iz tablosu her aşamada beklenen sayıyı verdi. Kaynağın
sağlam olması bir varsayımdı; üretimde kaynak sağlam gelmez. Bir dönemin kayıtları geç gelir, aynı
kayıt iki kez yazılır, bir alanın adı değişir, bir okuma başka bir birimle gönderilir, bir bölgenin
bölümü hiç yazılmaz, sayı alanı metne döner. Bu kazaların hiçbiri saldırı değildir ve hepsi üretici
tarafında olur. Sonraki ders bu altı sınıfı adlarıyla tanımlar ve aynı hattan geçirir; ölçülecek
şey hangi bozulmanın **hangi aşamada** etkisini gösterdiğidir. Tablonun en rahatsız edici sütunu
sonuncusu olacak: altı sınıfın üçü, hattın sunduğu beş değeri **birebir aynı** bırakıyor.
