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

# Maliyet Yönetimi

Eğitim ile çıkarımın ayrı izlenmesi ve tek toplamın hangi kararı gizlediğinin sayılması: iş birimi bir puan hesabıdır, altı izleme döneminin çıkarımı 1200 puan hesabı tutar ve sıklık ne olursa olsun sabit kalır, bir yeniden eğitim ise 162.000 tutar. Yeniden eğitim sıklığı altı dönemde bire indiğinde eğitim kalemi 162.000'den 972.000'e çıkar, eğitim payı 0,9926'dan 0,9988'e yükselir ve 2026-12 isabeti beş kurulumun beşinde de 0,9800'de kalır; kazanılan isabet 0,0000 olduğu için kazanç başına maliyet tanımsızdır. Toplamdan okunan tahmin başına maliyet 811,00, çıkarımdan okunan 1,00'dir: çıkarımı tümüyle bedavaya indirmek toplamın 0,0012'sini siler, sıklığı bire birden altıya indirmek 0,8323'ünü siler ve karşılığında 0,0000 isabet ödenir. Kesişme noktası dönem başına 27.000 ile 162.000 istek arasındadır.

Bir önceki ders dışarıya karşı olan borcu alan ve kayıt olarak yazdı: dört yükümlülük sınıfı,
karar başına yedi alan, 8402 saklanan değer. Sayılan her şey **saklamaya** yazıldı. Modeli
çalışır tutmanın kendisi, yani her dönem tekrar tekrar yapılan iş, hiçbir satıra girmedi.

O iş tek parça değildir. Bir üretim modeli iki ayrı iş yapar: dönem dönem **yeniden eğitilir**
ve her dönem **çıkarım** üretir. İkisi genellikle tek bir bütçe kalemine yazılır ve tek bir
toplam olarak okunur. Bu ders o toplamı ikiye ayırır, yeniden eğitim sıklığını süpürür ve
tek sayıda okumanın hangi kararı görünmez kıldığını sayar.

- **MY47.** Kaynak, hat, öznitelik yolu, model ve maliyet sayacı **kurgudur**. Hiçbir bulut
  servisi, hızlandırıcı, ürün ya da fiyat çağrılmaz; para birimi yazılmaz. Tohum 20260218.
- **MY48.** İş birimi **bir puan hesabıdır**: bir satırın özniteliklerinin ağırlıklarla
  çarpılıp toplanması. Eğitim de çıkarım da yalnız bunu yapar, bu yüzden ikisi **aynı birimle**
  aynı tabloya girer. Sayaç `puan` işlevinin içindedir; maliyet varsayılmaz, **ölçülür**.
- **MY49.** Süre yazılmaz. Maliyet **puan hesabı** olarak sayılır, gecikme **dönem** olarak.
- **MY50.** Taban çizgisi **yeniden eğitimsiz kurulumdur**: ilk model bir kez eğitilir ve altı
  izleme dönemi boyunca hiç değişmez.
- **MY51.** Üretimde girdi kayıyor: `2026-09`'dan sonra işyeri tüketimi dönem başına 0,06
  büyüyor. Model `(0.6, 0.0, 4)`, karar eşiği 18, aday 135, eğitim satırı 1600. İzleme altı
  dönem, **taban sınıf oranı 0,5342**, dönem isabetinin adımı 0,0050.
- **MY52.** Çıkarım hacmi dönem başına 200 istektir ve son bölümde bir **serbest değişken**
  olarak süpürülür.

Tahmin başına maliyet muhasebesi Model API'leri ile Uygulama Geliştirme kursunda ve MLOps
Temelleri kursunun ölçekleme dersinde ölçüldü; yordamları **tekrarlanmaz** ve buradaki ölçü
onların üstüne tek bir şey ekler: **eğitim ile çıkarım ayrı sayılır.**

## İki Kalemin Ayrı Sayılması

İlk blok kaynağı, öznitelik yolunu ve modeli kurar, `puan` işlevine bir sayaç yerleştirir ve
yeniden eğitim sıklığını süpürür.

```python
# KURGUDUR. Kaynak , hattin tuketim asamasi , oznitelik yolu , esik modeli ve
# maliyet sayaci ders icinde uretilir; hicbir bulut servisi , hizlandirici ,
# urun ya da fiyat 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):
    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
SAYAC = {"puan": 0}          # tek is birimi: bir puan hesabi


def puan(o, w):
    SAYAC["puan"] += 1
    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, donemler):
    """Egitim olcutu dengeli isabet; karar esigi AYRI bir ayardir ve aranir."""
    kume = [k for k in kayitlar if k["donem"] in donemler]
    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),
            "satir": len(kume)}


def kaydir(kayitlar, baslangic="2026-09", egim=0.06):
    """KURGU veri kaymasi: isyeri tuketimi her donem `egim` kadar buyuyor."""
    b = DONEM.index(baslangic)
    return [dict(k, m3=round(k["m3"] * (1.0 + egim * (DONEM.index(k["donem"]) - b + 1)), 4))
            if DONEM.index(k["donem"]) >= b and k["tip"] == "isyeri" else dict(k)
            for k in kayitlar]


def isabet(kayitlar, m, oz, donem):
    kume = [k for k in kayitlar if k["donem"] == donem]
    d = sum(1 for k in kume
            if tahmin(oz[(k["abone"], k["donem"])], m["agirlik"], m["karar_esigi"])
            == etiket(oz[(k["abone"], k["donem"])]))
    return round(d / len(kume), 4)


TEMIZ = tuketim(kaynak_uret())
OZ_T = oznitelikler(TEMIZ)
IZL_T = [k for k in TEMIZ if k["donem"] in IZLEME]
p1 = sum(etiket(OZ_T[(k["abone"], k["donem"])]) for k in IZL_T) / len(IZL_T)
KAYAN = kaydir(TEMIZ)                    # uretimde girdi kayiyor
OZ = oznitelikler(KAYAN)

SAYAC["puan"] = 0
ILK = egit(KAYAN, OZ, DONEM[1:9])
ILK_MALIYET = SAYAC["puan"]
print(f"taban sinif orani {round(max(p1, 1 - p1), 4)} , izleme donemi {len(IZLEME)} ,"
      f" donem basina istek 200")
print(f"ilk egitim: agirlik {ILK['agirlik']} , karar esigi {ILK['karar_esigi']} ,"
      f" satir {ILK['satir']} , aday {len(IZGARA) * len(KARAR_IZGARA)}")
print(f"olculen egitim maliyeti (puan hesabi): {ILK_MALIYET}")

SAYAC["puan"] = 0
son = isabet(KAYAN, ILK, OZ, "2026-12")
print(f"bir donemlik cikarim maliyeti (puan hesabi): {SAYAC['puan']} ,"
      f" 2026-12 isabeti {son}")

PENCERE = 6
print("\nsiklik  yeniden egitim  egitim maliyeti  cikarim maliyeti  toplam"
      "  egitim payi  2026-12 isabeti")
SONUC = []
for f in (0, 6, 3, 2, 1):
    SAYAC["puan"] = 0
    m = ILK
    if f:
        for i, d in enumerate(IZLEME):
            if (i + 1) % f == 0:
                j = DONEM.index(d)
                m = egit(KAYAN, OZ, [x for x in DONEM
                                     if j - PENCERE < DONEM.index(x) <= j])
    egitim = SAYAC["puan"]
    SAYAC["puan"] = 0
    isb = isabet(KAYAN, m, OZ, "2026-12")
    cikarim = len(IZLEME) * 200
    toplam = egitim + cikarim
    SONUC.append((f, egitim, cikarim, toplam, isb))
    print(f"{f if f else '-':>6}  {len(IZLEME) // f if f else 0:>14}  {egitim:>15}"
          f"  {cikarim:>16}  {toplam:>6}  {round(egitim / toplam, 4):>11}  {isb:>15}")
```

```
taban sinif orani 0.5342 , izleme donemi 6 , donem basina istek 200
ilk egitim: agirlik (0.6, 0.0, 4) , karar esigi 18 , satir 1600 , aday 135
olculen egitim maliyeti (puan hesabi): 216000
bir donemlik cikarim maliyeti (puan hesabi): 200 , 2026-12 isabeti 0.98

siklik  yeniden egitim  egitim maliyeti  cikarim maliyeti  toplam  egitim payi  2026-12 isabeti
     -               0                0              1200    1200          0.0             0.98
     6               1           162000              1200  163200       0.9926             0.98
     3               2           324000              1200  325200       0.9963             0.98
     2               3           486000              1200  487200       0.9975             0.98
     1               6           972000              1200  973200       0.9988             0.98
```

İki kalem arasındaki ölçek farkı doğrudan sayaçtan gelir. Bir dönemlik çıkarım **200 puan
hesabıdır** ve altı dönemde 1200 eder; ilk eğitim 1600 satırı 135 adayla tarar ve **216.000**
tutar. Altı dönemlik pencereyle yapılan bir yeniden eğitim **162.000**'dir, yani bütün izleme
ufkunun çıkarımının **135 katı**. Sıklık sütunu boyunca çıkarım kalemi **hiç değişmez**; değişen
yalnız eğitim kalemidir ve altı dönemde birden her döneme geçildiğinde 162.000'den
**972.000**'e çıkar.

Son sütun bu artışın karşılığını yazar. `2026-12` isabeti beş kurulumun beşinde de
**0,9800**'dür — hiç yeniden eğitilmeyen modelinkiyle **birebir aynı**. Bu, kursun ikinci
iddiasının maliyet tarafındaki karşılığıdır: girdi kaydı, uyarı ateşledi, altı yeniden eğitim
koşuldu ve **isabet tek bir adım bile oynamadı**. Dönem adımı 0,0050 olduğuna göre 0,0000
gerçekten sıfırdır, ölçülemeyen küçük bir kazanç değil. Kural değişmediği sürece doğru bir
model kaymış girdide de doğru kalır ve yeniden eğitim yalnız **bedeli** getirir.

## Tek Toplamın Gizlediği

İkinci blok aynı sonuçları tahmin başına okur ve çıkarım hacmini süpürür.

```python
# Bu blok ilk bloktaki SONUC , IZLEME , ILK_MALIYET ve PENCERE tanimlarini surdurur.
taban_isabet = SONUC[0][4]
n_tahmin = len(IZLEME) * 200
print("siklik  toplamdan tahmin basina  cikarimdan tahmin basina"
      "  kazanilan isabet  kazanc basina maliyet")
for f, egitim, cikarim, toplam, isb in SONUC:
    kazanc = round(isb - taban_isabet, 4)
    bas = "tanimsiz" if kazanc <= 0 else str(round(egitim / kazanc))
    print(f"{f if f else '-':>6}  {round(toplam / n_tahmin, 2):>22}"
          f"  {round(cikarim / n_tahmin, 2):>24}  {kazanc:>16}  {bas:>21}")

print(f"\ncikarimi tumuyle bedavaya indirmenin toplamdan sildigi pay:"
      f" {round(SONUC[-1][2] / SONUC[-1][3], 4)}")
print(f"siklik 1'den siklik 6'ya inmenin toplamdan sildigi pay:"
      f" {round((SONUC[-1][3] - SONUC[1][3]) / SONUC[-1][3], 4)}"
      f" , odenen isabet {round(SONUC[1][4] - SONUC[-1][4], 4)}")

print("\ndonem basina istek  cikarim (6 donem)  egitim siklik 6  egitim siklik 1"
      "  cikarim hangisini gecti")
for istek in (200, 2000, 20000, 50000, 200000):
    c = len(IZLEME) * istek
    gecen = [str(f) for f, e, _, _, _ in SONUC[1:] if c > e]
    print(f"{istek:>18}  {c:>17}  {SONUC[1][1]:>15}  {SONUC[-1][1]:>15}"
          f"  {(' , '.join(gecen) if gecen else 'hicbiri'):>23}")
print(f"\nkesisme noktasi (donem basina istek): siklik 6 -> {SONUC[1][1] // len(IZLEME)}"
      f" , siklik 1 -> {SONUC[-1][1] // len(IZLEME)}")

# Izlemenin kendi kalemi: uc gosterge her donem hesaplanir.
gosterge = len(IZLEME) * 200          # tahmin payi , cikarim tahminleri yeniden kullanilirsa 0
print(f"izleme kalemi (puan hesabi): en cok {gosterge} , cikarim tahminleri"
      f" yeniden kullanildiginda 0 ; bir yeniden egitim {ILK_MALIYET}")
```

```
siklik  toplamdan tahmin basina  cikarimdan tahmin basina  kazanilan isabet  kazanc basina maliyet
     -                     1.0                       1.0               0.0               tanimsiz
     6                   136.0                       1.0               0.0               tanimsiz
     3                   271.0                       1.0               0.0               tanimsiz
     2                   406.0                       1.0               0.0               tanimsiz
     1                   811.0                       1.0               0.0               tanimsiz

cikarimi tumuyle bedavaya indirmenin toplamdan sildigi pay: 0.0012
siklik 1'den siklik 6'ya inmenin toplamdan sildigi pay: 0.8323 , odenen isabet 0.0

donem basina istek  cikarim (6 donem)  egitim siklik 6  egitim siklik 1  cikarim hangisini gecti
               200               1200           162000           972000                  hicbiri
              2000              12000           162000           972000                  hicbiri
             20000             120000           162000           972000                  hicbiri
             50000             300000           162000           972000                        6
            200000            1200000           162000           972000            6 , 3 , 2 , 1

kesisme noktasi (donem basina istek): siklik 6 -> 27000 , siklik 1 -> 162000
izleme kalemi (puan hesabi): en cok 1200 , cikarim tahminleri yeniden kullanildiginda 0 ; bir yeniden egitim 216000
```

İlk iki sütun dersin sorusunu yanıtlar. Toplam tek bir sayı olarak okunup tahmin sayısına
bölündüğünde tahmin başına maliyet **811,00**'dir; aynı hesap yalnız çıkarım kaleminden
yapıldığında **1,00**. Aradaki 810 katın tamamı eğitimdir ve **hiçbir tahmine ait değildir**.
Bu tek sayıyı gören bir okur, tahminin pahalı olduğu sonucuna varır ve çıkarımı ucuzlatmaya
yönelir: toplu istek, önbellek, küçültme. **O yolun tavanı 0,0012'dir** — çıkarım tümüyle
bedava olsaydı bile toplamın binde birinden azı silinirdi.

Görünmez kalan karar öbür yöndedir. Sıklığı her dönemden altı dönemde bire indirmek toplamın
**0,8323'ünü** siler ve karşılığında **0,0000 isabet** ödenir. Tek toplam bu kararı gizler,
çünkü toplamda eğitim ile çıkarımı birbirinden ayıran hiçbir işaret yoktur; eğitim payı
0,9926 ile 0,9988 arasındadır ve **hangi sıklıkta olunduğu toplamdan okunamaz**. İki kalem
ayrı sayıldığında karar tek satırdır. Kazanç başına maliyet sütunu aynı şeyi bir kez daha
söyler: beş kurulumun beşinde **tanımsız**, çünkü bölen sıfırdır. **Bir maliyet kaleminin
gerekçesi ancak bir kazançla birlikte yazılabilir; kazancı gösterilmeyen harcama ölçülmemiş
sayılır.**

Son süpürme kararın hacme bağlı olduğunu gösterir. Dönem başına 200 istekte çıkarım hiçbir
eğitim kalemini geçmez; 50.000 istekte yalnız en seyrek sıklığı geçer; 200.000 istekte
dördünü birden geçer. **Kesişme noktası** sıklık 6 için dönem başına **27.000**, sıklık 1
için **162.000** istektir. Bu, "eğitim her zaman baskındır" gibi bir sonucun yazılamayacağı
anlamına gelir: baskın kalem hacmin hangi yanında durulduğuna bağlıdır ve **tek toplam o
yanı da göstermez**.

İzlemenin kendi kalemi bu tablonun en küçük satırıdır. Üç göstergeyi altı dönem boyunca
hesaplamak en çok 1200 puan hesabıdır ve çıkarımda üretilmiş tahminler yeniden kullanıldığında
sıfıra iner. Ama izlemenin **tetiklediği** iş küçük değildir: ateşleyen tek bir uyarının
başlattığı yeniden eğitim 162.000'dir. **İzlemenin bedeli göstergenin kendisinde değil,
göstergeye verilen yanıttadır.**

## Özet

- İş birimi bir **puan hesabıdır** ve sayaç `puan` işlevinin içindedir; eğitim ile çıkarım
  aynı birimle aynı tabloya girer. Bir dönemlik çıkarım 200, ilk eğitim 216.000, altı
  dönemlik pencereyle bir yeniden eğitim **162.000** puan hesabıdır.
- Sıklık süpürmesinde çıkarım kalemi **1200'de sabit kalır**, eğitim kalemi 162.000'den
  **972.000'e** çıkar ve eğitim payı 0,9926'dan 0,9988'e yükselir.
- `2026-12` isabeti beş kurulumun beşinde de **0,9800**'dür. Dönem adımı 0,0050 olduğuna göre
  kazanılan isabet gerçekten **0,0000**'dır ve kazanç başına maliyet **tanımsızdır**.
- Toplamdan okunan tahmin başına maliyet **811,00**, çıkarımdan okunan **1,00**'dir. Çıkarımı
  bedavaya indirmek toplamın 0,0012'sini, sıklığı seyreltmek **0,8323'ünü** siler; ikincisi
  0,0000 isabete mal olur ve **tek toplamda görünmez**.
- Kesişme noktası dönem başına **27.000** ile **162.000** istek arasındadır; hangi kalemin
  baskın olduğu hacme bağlıdır. İzlemenin kendi kalemi en çok 1200'dür, tetiklediği yeniden
  eğitim 162.000.

## Sonraki Adım

İki kalem ayrıldı ve ikisinin de karşılığı yazıldı: yeniden eğitim 0,0000 isabet kazandırıyor,
çıkarım ise dönem başına 200 istek karşılığında modelin bütün değerini üretiyor. Bu tabloda
eksik olan tek sütun **sonun** sütunudur. Yeniden eğitim seyreltilebilir, çıkarım
ucuzlatılabilir, kayıt kısaltılabilir; ama bir modelin ne zaman **biteceği** hiçbir yerde
yazılı değildir. Sonraki ders emekliye ayırma kararının ölçüsünü kurar ve modeli kaldırmanın
geriye dönük ne bıraktığını sayar: kaldırıldığında kaç dönemin kararı **açıklanamaz** hâle
geliyor.
