---
title: 'Çevrimiçi Deneyler'
source: 'https://academia.sh/tr/kurslar/model-izleme/cevrimici-deneyler'
course: 'Model İzleme ve Yönetişim'
language: tr
updated: '2026-08-17T18:08:54+00:00'
license: 'CC BY-SA 4.0'
---

# Çevrimiçi Deneyler

İki modelin üretimde karşılaştırılmasının bu küme büyüklüğünde ne kadar küçük bir farkı ayırt edebildiğinin sayılması: dönem başına iki yüz satırla çözünürlük 0,0050, altı dönemle 0,0008'dir, ama tek dönemlik ölçümler aynı aday için 0,0400 genişliğinde bir bant içinde oynar ve işaret değiştirir. Yüz otuz beş adayın taraması sınırı verir: altı dönemin altısında da aynı işareti taşıyan 133 adayın en küçük farkı 0,0275, işareti oynayan tek adayın farkı 0,0050'dir. Aradaki aralıkta ölçülmüş aday yoktur ve ayırt edilebilir en küçük fark bu iki sayının arasında kalır; altında kalan her karşılaştırma sonuçsuzdur.

Bir önceki ders gölge yerleşimin adayı iki yüz satırın tamamında ölçtüğünü ve `2026-12`'de **0,9650** verdiğini gösterdi; eski model aynı dönemde **0,9800**'dü. Aradaki **0,0150** bir karar için yeterli göründü. Bu sayının altında yanıtlanmamış bir soru duruyor: iki modelin farkı **ne kadar küçüldüğünde** bu kümeyle okunamaz hâle gelir.

Soru bir deney tasarımı sorusudur. İki kolun karşılaştırılması, örneklem büyüklüğü ve güven aralığı Kullanıcı Deneyimi ve Davranış Tasarımı kursunda kuruldu, dağılım varsayımları ve aralık yordamı İstatistiksel Analiz ve Keşifsel Veri Analizi kursunda ölçüldü; ikisi de burada tekrarlanmaz. Bu ders yalnız bir sayıyı hesaplar: **bu küme büyüklüğünün ayırt edebildiği en küçük fark.** Bulunan sayının altındaki her karşılaştırma, hangi yordamla yapılırsa yapılsın **sonuçsuzdur** ve ders bunun tek örneğini işaretiyle birlikte gösterir.

- **MY11.** Kaynak, hat ve model **kurgudur**; hiçbir deney platformu, dağıtım aracı ya da izleme ürünü çağrılmaz. Tohum 20260218.
- **MY12.** Etiket `abone_ort + 6 x isyeri > 30` kuralına bağlıdır, karar eşiği ayrı bir ayardır ve eğitim ölçütü dengeli isabettir. İzleme dönemlerinde **taban sınıf oranı 0,5342**.
- **MY13.** Deney ufku altı izleme dönemidir: dönem başına **200 satır**, toplam **1200**. Dönem isabetinin adımı **0,0050**, altı dönemin adımı **0,0008**.
- **MY14.** Karşılaştırılan iki kol **aynı satırları** görür ve aynı etiketle ölçülür. Kol ayrımından gelen bir seçim yanlılığı yoktur; bu, gerçek bir deneyde ayrıca gösterilmesi gereken bir varsayımdır ve burada kurgu gereği sağlanmıştır.
- **MY15.** Üretim verisi **veri kaymalıdır** ve kural değişmemiştir.
- **MY16.** Adaylar önceki dersin yeniden eğitim aramasının ilk dört sırasıdır; ızgara 27 ağırlık ile 5 karar eşiğinden **135 adaydır**.

## Aynı Adayın Dönemden Döneme Oynaması

İlk blok kurulumu kurar, dört adayı alır ve her birinin taban modele göre farkını **dönem dönem** ölçer.

```python
# KURGUDUR. Olcum aginin sayac okumalari , hattin tuketim asamasi , oznitelik
# yolu ve uc agirlikli esik modeli ders icinde uretilir; hicbir ogrenme
# kitapligi , deney platformu ya da izleme urunu 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 satirlar():
    """Kaynak okumalari ve donem farkindan tuketim: hattin ilk uc asamasi."""
    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})
    t = {(k["abone"], k["donem"]): k["endeks"] for k in kayit}
    return [dict(k, m3=k["endeks"] - t[(k["abone"], DONEM[DONEM.index(k["donem"]) - 1])])
            for k in kayit if DONEM.index(k["donem"])]


def oznitelikler(kayitlar):
    """Agirliktan bagimsizdir ve BIR KEZ hesaplanir; tam gecmisi gorur."""
    ab, bo = {}, {}
    for k in sorted(kayitlar, key=lambda k: DONEM.index(k["donem"])):
        ab.setdefault(k["abone"], []).append((DONEM.index(k["donem"]), k["m3"]))
        bo.setdefault(k["bolge"], []).append((DONEM.index(k["donem"]), k["m3"]))

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

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


KURAL_ESIK, KURAL_ISYERI = 30, 6          # etiketi ureten KURAL , yani kavram
IZLEME = DONEM[6:]                        # uretimde izlenen alti donem
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)       # karar esigi AYRI bir ayardir


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


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 dengeli_isabet(kume, oz, w, karar):
    """Egitim olcutu: duyarlilik ile ozgullugun ortalamasi."""
    dp = dn = yp = yn = 0
    for k in kume:
        o = oz[(k["abone"], k["donem"])]
        t, g = tahmin(o, w, karar), etiket(o)
        if t and g:
            dp += 1
        elif t:
            yp += 1
        elif g:
            yn += 1
        else:
            dn += 1
    du = dp / (dp + yn) if dp + yn else 0.0
    oz_ = dn / (dn + yp) if dn + yp else 0.0
    return (du + oz_) / 2, round(du, 4), round(oz_, 4)


def egit(kayitlar, oz, donemler):
    """Agirlik ve karar esigi birlikte aranir: 27 x 5 = 135 aday."""
    kume = [k for k in kayitlar if k["donem"] in donemler]
    sirali = sorted(((dengeli_isabet(kume, oz, w, kr)[0], w, kr)
                     for w in IZGARA for kr in KARAR_IZGARA), key=lambda a: -a[0])
    en = sirali[0]
    return {"agirlik": en[1], "karar": en[2], "dengeli": round(en[0], 4),
            "sirali": sirali, "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]


TUM = satirlar()
OZ = oznitelikler(TUM)
TABAN = egit(TUM, OZ, DONEM[1:9])
URETIM = kaydir(TUM)                      # uretimde girdi kaymis durumda
OZU = oznitelikler(URETIM)
izl = [k for k in TUM if k["donem"] in IZLEME]
e = [etiket(OZ[(k["abone"], k["donem"])]) for k in izl]
print(f"taban model {TABAN['agirlik']}/{TABAN['karar']}"
      f" , izleme {len(izl)} satir , taban sinif orani {round(1 - sum(e) / len(e), 4)}")

YE = egit(URETIM, OZU, DONEM[5:11])       # onceki dersin yeniden egitim aramasi
ADAY = [{"ad": ad, "agirlik": s[1], "karar": s[2], "egitim": round(s[0], 4)}
        for ad, s in zip("ABCD", YE["sirali"][:4])]


def fark(m, kume):
    """Adayin taban modele gore isabet farki. Ayni satirlar , ayni etiket."""
    def dogru(x):
        return sum(1 for k in kume
                   if tahmin(OZU[(k["abone"], k["donem"])], x["agirlik"], x["karar"])
                   == etiket(OZU[(k["abone"], k["donem"])]))
    return round((dogru(m) - dogru(TABAN)) / len(kume), 4)


DONEMLIK = {m["ad"]: [fark(m, [k for k in URETIM if k["donem"] == d]) for d in IZLEME]
            for m in ADAY}
print("aday  agirlik/karar         egitim dengeli isabeti  ayrisan tahmin")
for m in ADAY:
    ayr = sum(1 for k in URETIM if k["donem"] in IZLEME and
              tahmin(OZU[(k["abone"], k["donem"])], m["agirlik"], m["karar"])
              != tahmin(OZU[(k["abone"], k["donem"])], TABAN["agirlik"], TABAN["karar"]))
    print(f"{m['ad']}     {str(m['agirlik']) + '/' + str(m['karar']):<20}"
          f"  {m['egitim']:>20}  {ayr:>14}")
print("\ndonem      A        B        C        D")
for i, d in enumerate(IZLEME):
    print(f"{d}  " + "  ".join(f"{DONEMLIK[m['ad']][i]:+.4f}" for m in ADAY))
tumu = {m["ad"]: fark(m, [k for k in URETIM if k["donem"] in IZLEME]) for m in ADAY}
print("6 donem  " + "  ".join(f"{tumu[m['ad']]:+.4f}" for m in ADAY))
print("bant      " + "   ".join(f"{max(DONEMLIK[m['ad']]) - min(DONEMLIK[m['ad']]):.4f}"
                                for m in ADAY))
```

```
taban model (0.6, 0.0, 4)/18 , izleme 1200 satir , taban sinif orani 0.5342
aday  agirlik/karar         egitim dengeli isabeti  ayrisan tahmin
A     (0.6, 0.0, 4)/18                      0.98               0
B     (0.8, 0.4, 4)/34                    0.9741              60
C     (1.0, 0.0, 8)/30                    0.9492              33
D     (1.0, 0.2, 4)/34                    0.9434              97

donem      A        B        C        D
2026-07  +0.0000  +0.0250  -0.0200  -0.0150
2026-08  +0.0000  +0.0000  -0.0400  -0.0250
2026-09  +0.0000  -0.0150  -0.0350  -0.0500
2026-10  +0.0000  -0.0150  -0.0250  -0.0450
2026-11  +0.0000  -0.0100  -0.0250  -0.0400
2026-12  +0.0000  -0.0150  -0.0200  -0.0400
6 donem  +0.0000  -0.0050  -0.0275  -0.0358
bant      0.0000   0.0400   0.0200   0.0350
```

A sütunu tamamen sıfırdır ve bu bir ölçüm sonucu değil, bir **tanım** sonucudur: A'nın ayrışan tahmini 0'dır, yani iki model her satırda aynı şeyi söyler. Aralarındaki fark hiçbir küme büyüklüğüyle ölçülemez, çünkü ortada ölçülecek bir fark yoktur. Deneye başlamadan önce sorulacak ilk soru budur.

B sütunu asıl bulgudur. Altı dönemin toplamında B, taban modelden **0,0050** kötüdür — tek dönemin çözünürlüğünün tam bir adımı. Ama dönemlik değerler **+0,0250** ile **−0,0150** arasında, **0,0400** genişliğinde bir bantta oynar ve **işaret değiştirir**. `2026-07`'de yapılmış tek dönemlik bir deney B'yi taban modelden **beş çözünürlük adımı daha iyi** ilan eder. Sayı yanlış değildir; o dönemde gerçekten öyledir. Yanlış olan, o sayıdan bir sıralama çıkarmaktır.

C ile D'de bant da geniştir (0,0200 ve 0,0350) ama **hiçbir dönemde işaret dönmez**. İkisi de her dönemde taban modelin altındadır ve tek dönemlik bir deney onları doğru sıralar.

## Ayırt Edilebilir En Küçük Fark

İkinci blok iki şey yapar. Önce deney kümesini büyütür ve farkın nereye yerleştiğini izler; sonra ızgaradaki **135 adayın tamamını** tarayarak sınırı arar.

```python
# Bu blok ilk bloktaki ADAY , fark , IZLEME , URETIM , TABAN ,
# IZGARA ve KARAR_IZGARA tanimlarini surdurur.
print("donem sayisi  satir  cozunurluk        B        C        D")
for n in range(1, 7):
    alt = [k for k in URETIM if k["donem"] in IZLEME[:n]]
    print(f"{n:>12}  {len(alt):>5}  {1 / len(alt):>10.4f}  " +
          "  ".join(f"{fark(m, alt):+.4f}" for m in ADAY[1:]))

# 135 adayin tamami: tek donemlik bir deney 6 donemlik sonucu dogru siraliyor mu
KUME = {d: [k for k in URETIM if k["donem"] == d] for d in IZLEME}
TUMKUME = [k for k in URETIM if k["donem"] in IZLEME]
uyan, oynayan = [], []
for w in IZGARA:
    for kr in KARAR_IZGARA:
        m = {"agirlik": w, "karar": kr}
        h = fark(m, TUMKUME)
        if h == 0:
            continue
        isaret = (h > 0) - (h < 0)
        ps = [fark(m, KUME[d]) for d in IZLEME]
        (uyan if all((p > 0) - (p < 0) == isaret for p in ps) else oynayan).append(abs(h))
print(f"\n6 donemlik farki sifir olmayan aday: {len(uyan) + len(oynayan)}")
print(f"alti donemin altisinda da ayni isaret: {len(uyan)} aday"
      f" , en kucuk farki {min(uyan):.4f}")
print(f"isareti donemden doneme oynayan: {len(oynayan)} aday"
      f" , en buyuk farki {max(oynayan):.4f}")
```

```
donem sayisi  satir  cozunurluk        B        C        D
           1    200      0.0050  +0.0250  -0.0200  -0.0150
           2    400      0.0025  +0.0125  -0.0300  -0.0200
           3    600      0.0017  +0.0033  -0.0317  -0.0300
           4    800      0.0013  -0.0013  -0.0300  -0.0338
           5   1000      0.0010  -0.0030  -0.0290  -0.0350
           6   1200      0.0008  -0.0050  -0.0275  -0.0358

6 donemlik farki sifir olmayan aday: 134
alti donemin altisinda da ayni isaret: 133 aday , en kucuk farki 0.0275
isareti donemden doneme oynayan: 1 aday , en buyuk farki 0.0050
```

Üstteki tablo çözünürlüğün küme büyüklüğüyle düzeldiğini gösterir: 200 satırda 0,0050, 1200 satırda **0,0008**. Bunun altındaki hiçbir fark **temsil bile edilemez**; 1200 satırlık bir deneyin verebileceği en küçük sıfırdan farklı sayı budur. B'nin işareti **dördüncü dönemde**, yani 800 satırda döner ve orada bile değeri −0,0013'tür, o kümenin tam bir adımı. C ile D ilk dönemden itibaren doğru işareti taşır ve büyütmek yalnız değeri oturtur.

Alttaki tarama sınırı verir. Izgaradaki 134 adayın 6 dönemlik farkı sıfırdan farklıdır. Bunların **133'ü** altı dönemin altısında da aynı işareti taşır, yani hangi tek dönemde ölçülürse ölçülsün doğru sıralanır; bu grubun **en küçük farkı 0,0275**'tir. İşareti oynatan **tek aday** B'dir ve farkı **0,0050**'dir. Buradan çıkan sayı bir aralıktır: **bu kümede tek dönemlik bir deneyin güvenle ayırt edebildiği en küçük fark 0,0050 ile 0,0275 arasında bir yerdedir.** Izgara bu aralıkta hiç aday içermediği için daha dar söylenemez ve **söylenmemelidir**; ölçünün kendi belirsizliği de ölçünün bir parçasıdır.

Pratik karşılığı tektir: **0,0275'ten küçük bir farkı tek dönemlik bir deneyle ilan eden her karşılaştırma sonuçsuzdur** ve B bunun işaretli örneğidir. Neden bu kadar büyük bir eşik gerektiği ayrışan tahmin sütununda yazar. B ile taban model 1200 satırın **1140'ında aynı şeyi söyler**; deneyin gerçek örneklemi 1200 değil, ayrıştıkları **60 satırdır**. İki tahmin ayrıştığında yalnız biri doğru olabileceğine göre, altı satırlık toplam fark bu altmışın 33'ünde tabanın, 27'sinde B'nin doğru olması demektir. Payda 1200'dür ama bilgi 60 satırdan gelir; ayrışmayan 1140 satır deneye hiçbir şey katmaz, yalnız farkı küçük gösterir. **Bir deneyin ayırt edebildiği en küçük fark, kümenin büyüklüğüyle değil, iki modelin ayrıştığı satır sayısıyla sınırlıdır.**

## Özet

- Aynı aday altı dönemde **−0,0050**, tek dönemlerde **+0,0250** ile **−0,0150** arasında ölçülür; bandı **0,0400** ve işareti döner. Taban sınıf oranı 0,5342, dönem çözünürlüğü 0,0050, altı dönemin çözünürlüğü **0,0008**.
- Ayrışan tahmini **0** olan aday hiçbir deneyle ayırt edilemez, çünkü fark yoktur; deneyden önce sorulacak soru budur.
- Izgaranın 134 adayının **133'ü** her dönemde aynı işareti taşır ve bu grubun en küçük farkı **0,0275**; işareti oynayan tek adayın farkı **0,0050**. Ayırt edilebilir en küçük fark bu iki sayının arasındadır ve ızgara aralığı daraltacak aday içermez.
- **0,0275'ten küçük bir farkı tek dönemle ilan eden karşılaştırma sonuçsuzdur.** Küme büyütmek çözünürlüğü 0,0008'e indirir ama B'nin işaretini ancak dördüncü dönemde, 800 satırda çevirir.
- Deneyin gerçek örneklemi 1200 satır değil, iki modelin ayrıştığı **60 satırdır**; toplam fark bu altmışın 33'ünde tabanın, 27'sinde adayın doğru olmasından gelir ve kalan 1140 satır yalnız paydayı büyütür.

## Sonraki Adım

Deney, iki modeli karşılaştırmanın ne kadar pahalı olduğunu gösterdi: ayırt edilebilir bir fark için ya ayrışmanın büyük olması ya da çok sayıda dönem beklenmesi gerekiyor. Bu, ardındaki soruyu daha da keskinleştirir: **yeni model neden eğitiliyor.** Bir uyarı ateşlediği için mi, takvim geldiği için mi, yoksa isabet gerçekten düştüğü için mi. Sonraki ders üç tetikleyici türünü iki ayrı bozulma senaryosunda koşturur, her birinin kaç model eğitilmesine yol açtığını sayar ve kazanılan isabeti yanına yazar. Veri kaymalı veride yeniden eğitim pencerelerinin üçü de aynı sayıyı verir ve o sayı eski modelin sayısıdır.
