İçeriğe geç
academia.sh

Ders 11 / 13

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.

İçindekiler

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.

# 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.

# 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.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat