---
title: 'Uyumluluk Gereksinimleri'
source: 'https://academia.sh/tr/kurslar/model-izleme/uyumluluk-gereksinimleri'
course: 'Model İzleme ve Yönetişim'
language: tr
updated: '2026-08-17T18:08:53+00:00'
license: 'CC BY-SA 4.0'
---

# Uyumluluk Gereksinimleri

Dışarıya karşı yüklenilen dört yükümlülük sınıfının kaç ek alan ve kaç saklanan kayıt istediğinin sayılması: taban kayıt karar başına üç alan tutar ve 1200 kararın 36'sı bugünkü kaynaktan yeniden hesaplandığında ayrılır, çünkü geç gelen 80 satır 239 kararın özniteliğini değiştirmiştir. Kayıt tutma yükümlülüğü karar başına dört alan ekler ve yeniden hesabı 1200'de 1200 yapar; açıklama yükümlülüğü sıfır alan ekler, çünkü beş açıklama değeri de o dört alandan türetilir; itiraz hakkı yalnız eşiğe bir puandan yakın 108 olumsuz kararda üç alan ekler ve o 108 karar modelin 26 yanlışının 26'sını kapsar; saklama politikası ise hiç alan eklemez, kayıt siler. Üç dönemlik saklamada 600 karar kaydı düşer ve itiraz penceresi hâlâ açıkken silinmiş karar sayısı 600 olur.

Dört derste model yayına alındı, gölgede ve kanaryada ölçüldü, karşılaştırıldı ve kararları
kaydedildi. Dördünün ortak yanı şudur: ölçünün muhatabı **içeridedir**. Kanaryanın payını,
deneyin ayırt edebildiği en küçük farkı ve karar kaydının aldığı yeri kuran ekip, onların
yeterli olup olmadığına da kendisi karar verir.

Bu ders muhatabı dışarı taşır. Bir modelin ürettiği karar, o kararın öznesine karşı bir
borç doğurur ve borcun ne olduğu ekibin tercihine bırakılmaz. Ders o borcu **dört yükümlülük
sınıfı** olarak alır — kayıt tutma, açıklama, itiraz ve saklama süresi — ve her birinin tek
bir mühendislik karşılığını sayar: **karar başına kaç ek alan ve kaç saklanan kayıt.**

- **MY41.** Kaynak, hat, öznitelik yolu, model ve karar defteri **kurgudur**. Hiçbir
  düzenleme, standart, kurum, ülke, sertifika ya da denetim kuruluşu adı yazılmaz; hiçbir
  ürün, servis ya da kitaplık çağrılmaz. Tohum 20260218.
- **MY42.** Yükümlülükler **sınıflarıyla** anılır ve kaynakları değil **sistemden ne
  istedikleri** ölçülür: kayıt tutma kararın yeniden hesaplanabilmesini, açıklama tek bir
  kararın gerekçesinin gösterilmesini, itiraz hakkı incelemenin sonucunun yazılmasını,
  saklama süresi ise kaydın **belirli bir süre sonra silinmesini** ister.
- **MY43.** Taban çizgisi **yükümlülüksüz kurulumdur**: karar defteri yalnız sunmak için
  gereken üç alanı tutar ve dışarıya hiçbir şey borçlanılmadığı varsayılır.
- **MY44.** Model ve etiket ortak tanımdan gelir: ağırlık `(0.6, 0.0, 4)`, karar eşiği 18,
  dengeli isabet 0,9864. İzleme altı dönem, karar 1200, **taban sınıf oranı 0,5342** ve dönem
  isabetinin en küçük adımı 0,0050'dir.
- **MY45.** Kayıt bir **kurgu geç gelen okumayla** sınanır: `2026-04` döneminde 40 abonenin
  sayacı zamanında okunmadı, satırlar kararlar verildikten **sonra** kaynağa eklendi. Kaynak
  karar anında 2120, bugün 2200 satırdır.
- **MY46.** İtiraz penceresi **üç dönemdir**: bir karara en geç üçüncü dönemin sonunda itiraz
  edilebilir. Saklama süresi de dönem olarak yazılır.

Denetim izi, sahiplik ve saklama politikası Veri Mühendisliğine Giriş ile Yönetişim, Risk ve
Uyumluluk kurslarında ölçüldü; yordamları **tekrarlanmaz**. Bir önceki ders karar kaydını
kurdu. Bu ders o kaydı **veri** olarak alır ve tek bir soru sorar: dört sınıfın her biri
kaydın üstüne ne koyar.

## Yükümlülüğün Kayda Çevrilmesi

İlk blok kaynağı, hattın tüketim aşamasını, öznitelik yolunu ve modeli kurar; sonra aynı
kararları iki kez üretir — bir kez karar anındaki kaynaktan, bir kez bugünkü kaynaktan.

```python
# KURGUDUR. Olcum aginin sayac okumalari , hattin ilk uc asamasi , oznitelik
# yolu , esik modeli ve karar defteri ders icinde uretilir; hicbir duzenleme ,
# denetim kurulusu , urun ya da servis cagrilmaz. 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)}


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 tuketim(kayit):
    """Donem farkindan tuketim. Onceki donem yoksa satir hesaplanamaz."""
    tablo = {(k["abone"], k["donem"]): k for k in kayit}
    cikti = []
    for k in kayit:
        i = DONEM.index(k["donem"])
        onceki = tablo.get((k["abone"], DONEM[i - 1])) if i else None
        if onceki is not None:
            cikti.append(dict(k, m3=int(k["endeks"]) - int(onceki["endeks"])))
    return cikti


def oznitelikler(kayitlar):
    """Agirliktan bagimsizdir , bir kez hesaplanir."""
    sirali = sorted(kayitlar, key=lambda k: DONEM.index(k["donem"]))
    ab, bo = {}, {}
    for k in sirali:
        ab.setdefault(k["abone"], []).append((DONEM.index(k["donem"]), k["m3"]))
        bo.setdefault(k["bolge"], []).append((DONEM.index(k["donem"]), k["m3"]))

    def ortalama(dizi, i):
        secili = [v for d, v in dizi if d < i]
        return round(sum(secili) / len(secili), 4) if secili else 0.0

    return {(k["abone"], k["donem"]): {
        "abone_ort": ortalama(ab[k["abone"]], DONEM.index(k["donem"])),
        "bolge_ort": ortalama(bo[k["bolge"]], DONEM.index(k["donem"])),
        "isyeri": 1 if k["tip"] == "isyeri" else 0} for k in kayitlar}


IZGARA = [(a, b, c) for a in (0.6, 0.8, 1.0) for b in (0.0, 0.2, 0.4) for c in (0, 4, 8)]
KARAR_IZGARA = (18, 22, 26, 30, 34)
IZLEME = DONEM[6:]
KURAL_ESIK, KURAL_ISYERI = 30, 6


def puan(o, w):
    return w[0] * o["abone_ort"] + w[1] * o["bolge_ort"] + w[2] * o["isyeri"]


def tahmin(o, w, karar):
    return 1 if puan(o, w) > karar else 0


def etiket(o, esik=KURAL_ESIK):
    return 1 if o["abone_ort"] + KURAL_ISYERI * o["isyeri"] > esik else 0


def egit(kayitlar, oz):
    """Egitim olcutu dengeli isabet; karar esigi AYRI bir ayardir ve aranir."""
    kume = [k for k in kayitlar if k["donem"] in DONEM[1:9]]
    en = (-1.0, None, None)
    for w in IZGARA:
        for karar in KARAR_IZGARA:
            dp = dn = yp = yn = 0
            for k in kume:
                o = oz[(k["abone"], k["donem"])]
                t, g = tahmin(o, w, karar), etiket(o)
                dp, yp, yn, dn = (dp + (t and g), yp + (t and not g),
                                  yn + (not t and g), dn + (not t and not g))
            d = (dp / (dp + yn) if dp + yn else 0.0) + (dn / (dn + yp) if dn + yp else 0.0)
            if d / 2 > en[0]:
                en = (d / 2, w, karar)
    return {"agirlik": en[1], "karar_esigi": en[2], "dengeli": round(en[0], 4)}


# KURGU gec gelen okuma: 2026-04'te 40 abonenin sayaci zamaninda okunmadi ve
# satirlar kararlar verildikten SONRA kaynaga eklendi.
HAM = kaynak_uret()
KARAR_ANI = tuketim([k for k in HAM
                     if not (k["donem"] == "2026-04" and k["abone"] <= "A040")])
BUGUN = tuketim(HAM)
OZ_A, OZ_B = oznitelikler(KARAR_ANI), oznitelikler(BUGUN)
M = egit(BUGUN, OZ_B)
IZL = [k for k in BUGUN if k["donem"] in IZLEME]
pay1 = sum(etiket(OZ_B[(k["abone"], k["donem"])]) for k in IZL) / len(IZL)
print(f"model: agirlik {M['agirlik']} , karar esigi {M['karar_esigi']} ,"
      f" dengeli isabet {M['dengeli']}")
print(f"izleme donemi {len(IZLEME)} , karar {len(IZL)} ,"
      f" taban sinif orani {round(max(pay1, 1 - pay1), 4)}")

# Taban kayit: sunmak icin gereken en az sey.
TABAN_ALAN = ("abone", "donem", "tahmin")
# Kayit tutma yukumlulugunun karsiligi: kararin OKUDUGU her sey saklanir.
S1_ALAN = ("model_surum", "abone_ort", "bolge_ort", "isyeri")
S1_MODEL_ALAN = ("agirlik", "karar_esigi")
SURUM = {"s1": {"agirlik": M["agirlik"], "karar_esigi": M["karar_esigi"]}}

defter = []
for k in [k for k in KARAR_ANI if k["donem"] in IZLEME]:
    o = OZ_A[(k["abone"], k["donem"])]
    defter.append({"abone": k["abone"], "donem": k["donem"], "model_surum": "s1",
                   "tahmin": tahmin(o, M["agirlik"], M["karar_esigi"]),
                   "abone_ort": o["abone_ort"], "bolge_ort": o["bolge_ort"],
                   "isyeri": o["isyeri"]})

d_ayni = sum(1 for r in defter if tahmin(r, SURUM[r["model_surum"]]["agirlik"],
                                         SURUM[r["model_surum"]]["karar_esigi"]) == r["tahmin"])
oz_fark = sum(1 for r in defter
              if OZ_B[(r["abone"], r["donem"])]["abone_ort"] != r["abone_ort"])
k_fark = sum(1 for r in defter
             if tahmin(OZ_B[(r["abone"], r["donem"])], M["agirlik"], M["karar_esigi"])
             != r["tahmin"])
print(f"\nkaynak satiri: karar aninda {len(KARAR_ANI)} , bugun {len(BUGUN)}")
print(f"defterden yeniden hesap    : birebir {d_ayni}/{len(defter)} , ayrilan"
      f" {len(defter) - d_ayni}")
print(f"bugunku kaynaktan yeniden hesap: birebir {len(defter) - k_fark}/{len(defter)} ,"
      f" ayrilan {k_fark} , oznitelik degeri degisen {oz_fark}")
```

```
model: agirlik (0.6, 0.0, 4) , karar esigi 18 , dengeli isabet 0.9864
izleme donemi 6 , karar 1200 , taban sinif orani 0.5342

kaynak satiri: karar aninda 2120 , bugun 2200
defterden yeniden hesap    : birebir 1200/1200 , ayrilan 0
bugunku kaynaktan yeniden hesap: birebir 1164/1200 , ayrilan 36 , oznitelik degeri degisen 239
```

Son iki satır kayıt tutma yükümlülüğünün neden bir **alan** sorusu olduğunu gösterir. Karar
defteri özniteliklerin karar anındaki değerini taşıdığında 1200 kararın 1200'ü birebir
yeniden hesaplanır. Aynı kararlar bugünkü kaynaktan yeniden üretilmeye kalkıldığında 239
kararın özniteliği değişmiştir ve **36 karar başka çıkar**. Kaynağa dokunan olmamıştır;
yalnızca geç kalan 80 satır yerine oturmuştur.

Bu bir uyumluluk konusundan önce bir ölçme konusudur. Bir kararın gerekçesi sorulduğunda
"kaynağa bakıp yeniden hesaplarız" yanıtı, kaynağın **karar anındaki hâli** saklanmadıkça bir
yanıt değildir. Geç gelen okuma hattın altı bozulma sınıfından biridir ve Veri Mühendisliğine
Giriş kursunda yakalama gecikmesi olarak ölçülmüştü; buradaki yenilik aynı bozulmanın
**geriye dönük** yüzüdür — hat düzelmiştir, kayıt bozulmuştur.

## Dört Sınıfın Alan Bedeli

İkinci blok dört sınıfı tek tabloda sayar ve saklama süresini süpürür.

```python
# Bu blok ilk bloktaki DONEM , IZLEME , OZ_B , M , SURUM , defter , puan ,
# tahmin ve etiket tanimlarini surdurur.
MARJ, ITIRAZ_PENCERE, SAKLAMA = 1.0, 3, 3


def aciklama(r):
    """Sinif 1'in alanlarindan TURETILIR; yeni alan istemez."""
    w = SURUM[r["model_surum"]]["agirlik"]
    e = SURUM[r["model_surum"]]["karar_esigi"]
    p = puan(r, w)
    return {"katki_abone": round(w[0] * r["abone_ort"], 4),
            "katki_bolge": round(w[1] * r["bolge_ort"], 4),
            "katki_tip": round(w[2] * r["isyeri"], 4),
            "puan": round(p, 4), "esige_uzaklik": round(p - e, 4)}


itirazli = [r for r in defter if r["tahmin"] == 1
            and abs(aciklama(r)["esige_uzaklik"]) <= MARJ]
ornek = itirazli[0]
print(f"esige en yakin olumsuz karar ornegi: {ornek['abone']} {ornek['donem']}"
      f" tahmin {ornek['tahmin']} gercek {etiket(ornek)}")
print(f"aciklama {aciklama(ornek)}")

yanlis_sinirda = sum(1 for r in itirazli if etiket(r) != r["tahmin"])
yanlis_tum = sum(1 for r in defter if etiket(r) != r["tahmin"])
n, ta, sa = len(defter), len(TABAN_ALAN), len(S1_ALAN)
s1 = n * (ta + sa) + len(S1_MODEL_ALAN)
print(f"\nsinif                  karar basina alan  saklanan deger  yeniden hesap")
print(f"taban (yukumluluksuz)  {ta:>17}  {n * ta:>14}  {n - k_fark:>9}/{n}")
print(f"kayit tutma            {ta + sa:>17}  {s1:>14}  {n:>9}/{n}")
print(f"aciklama               {ta + sa:>17}  {s1:>14}  {n:>9}/{n}")
print(f"itiraz                 {str(ta + sa) + ' (+3)':>17}  {s1 + 3 * len(itirazli):>14}"
      f"  {n:>9}/{n}")
tut = len([d for d in IZLEME if DONEM.index(d) > len(DONEM) - 1 - SAKLAMA]) * 200
print(f"saklama ({SAKLAMA} donem)      {ta + sa:>17}  {tut * (ta + sa) + 2:>14}  {tut:>9}/{n}")
print(f"\nesige {MARJ} puandan yakin olumsuz karar: {len(itirazli)}"
      f" (pay {round(len(itirazli) / n, 4)}) ; bunlarin yanlis olani {yanlis_sinirda} ,"
      f" butun defterdeki yanlis {yanlis_tum}")
print(f"izleme isabeti {round((n - yanlis_tum) / n, 4)} , adim {round(1 / 200, 4)}")

print(f"\nsaklama (donem)  tutulan kayit  silinen kayit  itiraza acikken silinmis")
for R in (1, 2, 3, 6, 12):
    tutulan = [d for d in IZLEME if DONEM.index(d) > len(DONEM) - 1 - R]
    kirik = 0
    for t in range(len(DONEM)):
        for d in IZLEME:
            i = DONEM.index(d)
            if i <= t - R and i + ITIRAZ_PENCERE >= t:
                kirik += 200
    print(f"{R:>15}  {len(tutulan) * 200:>13}  {n - len(tutulan) * 200:>13}  {kirik:>24}")
```

```
esige en yakin olumsuz karar ornegi: A002 2026-08 tahmin 1 gercek 1
aciklama {'katki_abone': 18.6, 'katki_bolge': 0.0, 'katki_tip': 0, 'puan': 18.6, 'esige_uzaklik': 0.6}

sinif                  karar basina alan  saklanan deger  yeniden hesap
taban (yukumluluksuz)                  3            3600       1164/1200
kayit tutma                            7            8402       1200/1200
aciklama                               7            8402       1200/1200
itiraz                            7 (+3)            8726       1200/1200
saklama (3 donem)                      7            4202        600/1200

esige 1.0 puandan yakin olumsuz karar: 108 (pay 0.09) ; bunlarin yanlis olani 26 , butun defterdeki yanlis 26
izleme isabeti 0.9783 , adim 0.005

saklama (donem)  tutulan kayit  silinen kayit  itiraza acikken silinmis
              1            200           1000                      2400
              2            400            800                      1400
              3            600            600                       600
              6           1200              0                         0
             12           1200              0                         0
```

Tablonun okunuşu dört sınıfın **eşit olmadığıdır**. Yalnız **kayıt tutma** karar başına
gerçekten yeni alan ister: dört alan, 3600 saklanan değerden 8402'ye çıkış. **Açıklama
yükümlülüğü sıfır alan ekler.** Örnek satır bunu tek bir kararda gösterir: `A002` abonesinin
`2026-08` kararı için üç katkı, puan ve eşiğe uzaklık yazılmıştır ve beşi de kayıt tutma
sınıfının alanlarından türetilmiştir. Ağırlıklar ile eşik saklandığı sürece açıklama bir
**hesaptır**, bir kayıt değil. **İtiraz hakkı** kısmen karşılanır: kararı yeniden hesaplama
kısmını kayıt tutma zaten ödemiştir, yeni olan yalnız incelemenin sonucudur ve o da bütün
kararlara değil **108'ine** yazılır.

O 108 sayısı dersin en keskin okumasıdır. Eşiğe bir puandan yakın duran olumsuz kararlar
1200 kararın 0,0900'ünü tutar, ama modelin **26 yanlışının 26'sı** bu bandın içindedir.
İzleme isabeti 0,9783 ve dönem adımı 0,0050 olduğuna göre 26 yanlış ölçülebilir bir
büyüklüktür. Duyarlılık 1,0000 olduğu için yanlışların hepsi **yanlış alarmdır**: karar
eşiğinin hemen üstüne düşmüş, gerçekte düşük olan aboneler. **İtiraz hakkının mühendislik
karşılığı, kararların yüzde dokuzunu incelemeye açmak ve karşılığında yanlışların tamamına
ulaşabilmektir** — sınıra yakınlık bir tesadüf değil, eşikli her modelin yapısal özelliğidir.

## Saklama Öbür Üçünü Keser

Dördüncü sınıfın karşılığı öbür üçüne benzemez, çünkü **hiçbir alan eklemez**: dönem zaten
kayıtlıdır ve süre tek bir politika sayısıdır. Saklama politikasının yaptığı şey **kayıt
silmektir** ve sildiği kayıt, ilk üç sınıfın dayandığı kayıttır. Üç dönemlik saklamada defter
1200 karardan 600'e iner, 8402 saklanan değer 4202'ye düşer ve **600 kararın gerekçesi
sorulamaz** hâle gelir. Veri Mühendisliğine Giriş kursunun son dersi bunu veri tarafında
ölçmüştü — saklama politikası geriye dönük denetlenemez dönem bırakır; karar tarafında aynı
şey aynı mekanizmayla olur.

Süpürmenin son sütunu çakışmayı sayıya çevirir. İtiraz penceresi ve saklama süresi üçer
dönemken her dönem bir dönemlik karar kümesi **itiraz hakkı hâlâ açıkken** silinir: toplam
600 karar. Süre ikiye indiğinde 1400, bire indiğinde 2400 olur; altı döneme çıktığında
sıfırlanır. Bu sayı bir uygulama hatası değil, **iki yükümlülük sınıfının birbirini
kesmesidir**: biri kaydı ister, öbürü siler ve ikisi aynı sistemde aynı anda yürürlüktedir.
Ödünleşimin ölçüsü tam olarak bu sütundur — saklama süresi en az **itiraz penceresi kadar**
olmadığında karşılanmayan yükümlülük sayısı sıfırdan büyüktür.

Buradan çıkan kural sınıfların kaynağından bağımsızdır: **bir yükümlülük sınıfı, karşılığı
karar kaydındaki bir alana ya da bir kayıt sayısına yazılmadıkça ölçülmemiş sayılır.**

## Özet

- Karar defteri karar anındaki öznitelikleri tuttuğunda 1200 kararın 1200'ü birebir yeniden
  hesaplanır; bugünkü kaynaktan hesaplandığında 239 kararın özniteliği değişir ve **36 karar
  başka çıkar**. Kaynağa dokunan yoktur; geç gelen 80 satır yerine oturmuştur.
- **Kayıt tutma** karar başına dört alan ekler ve saklanan değeri 3600'den 8402'ye çıkarır.
  Dört sınıf içinde gerçekten yeni alan isteyen tek sınıf budur.
- **Açıklama** sıfır alan ekler: üç katkı, puan ve eşiğe uzaklık kayıt tutmanın alanlarından
  türetilir. Ağırlık ile eşik saklandığı sürece açıklama bir hesaptır.
- **İtiraz** yalnız eşiğe bir puandan yakın 108 olumsuz kararda üç alan ekler; o 108 karar
  1200'ün 0,0900'üdür ve modelin **26 yanlışının 26'sını** kapsar.
- **Saklama** hiç alan eklemez, kayıt siler: üç dönemde defter 600'e iner ve itiraz penceresi
  hâlâ açıkken silinmiş karar sayısı 600 olur. İki yükümlülük sınıfı aynı sistemde
  birbirini keser.

## Sonraki Adım

Yükümlülüklerin karşılığı alan ve kayıt olarak yazıldı; hepsi saklanana bir şey ekledi ya da
ondan bir şey götürdü. Ama bu dersin hiçbir satırı, modeli çalışır tutmanın kendisinin ne
tuttuğunu sormadı. Bir model iki ayrı iş yapar: dönem dönem **yeniden eğitilir** ve her dönem
**çıkarım** üretir. İkisi aynı bütçeye yazılır ve tek bir toplam olarak okunur. Sonraki ders o
toplamı ikiye ayırır, yeniden eğitim sıklığı arttıkça hangi kalemin büyüdüğünü ve tek sayıda
okumanın hangi kararı gizlediğini sayar.
