---
title: 'Adalet Ölçütleri'
source: 'https://academia.sh/tr/kurslar/model-etik-ve-yorum/adalet-olcutleri'
course: 'Model Değerlendirme, Yorumlanabilirlik ve Etik'
language: tr
updated: '2026-08-17T18:10:13+00:00'
license: 'CC BY-SA 4.0'
---

# Adalet Ölçütleri

Üç adalet ölçütünün aynı anda sağlanamadığının sayılması: taban oranı 0,4578 olan doğu bölgesi ile 0,1663 olan diğer dört bölge arasında tek eşikte oran açıklığı 0,3984, yakalama açıklığı 0,4842, isabet açıklığı 0,1242. Aynı sayıda abone işaretlenirken eşik çiftini oran eşitliğine ayarlamak isabet açıklığını 0,4800'e, yakalama eşitliğine ayarlamak 0,4262'ye, isabet eşitliğine ayarlamak ise yakalama açıklığını 0,7038'e çıkarıyor. Seçilme oranının duyarlılık ile taban oranın çarpımının kesinliğe bölümü olduğu kimliği doğrulanıyor ve iki ölçüt eşitlendiğinde seçilme oranlarının oranının taban oranların oranı olan 2,7535'e kilitlendiği gösteriliyor; kapasite sabitken üçünü birlikte veren eşik çifti yok, en iyi deneme 0,2727 açıklık bırakıyor.

Önceki ders bir alt grubun sayısı öbüründen düşük çıktığında bunun bir zarar olduğunu varsaydı ve
açıklığı doğrudan raporladı. Hangi sayının açıklığı sorusu ise açıkta kaldı. İki alt grupta
işaretlenen abonelerin **oranını** eşitlemek, yakalanan şüphelilerin **oranını** eşitlemek ve
işaretlenenlerin ne kadarının gerçekten şüpheli olduğunu eşitlemek üç ayrı taleptir. Üçü de
makul, üçü de ölçülebilir, ve üçü aynı model üzerinde aynı anda karşılanamaz.

Bu ders o üç ölçütü kurar ve aralarındaki çatışmayı sayar. Sonuç bir ayar hatası değildir: iki
grubun taban oranları farklı olduğu sürece ölçütlerin tanımları birbirini dışlar. Kursun ikinci
iddiası budur ve burada bir kimlikle gösterilir.

- **ME9.** Küme, bölme, model ve alt grup tanımları önceki dersten aynen sürer: 756 satırlık
  eğitim kümesi, 504 abonelik ayrılmış küme, on iki sütunlu doğrusal model, **on üç alt grup**.
- **ME10.** Çatışmanın ölçüldüğü iki grup **bölge ekseninden** alınır: A doğu bölgesi, B geri
  kalan dört bölge. Seçimin gerekçesi taban oran farkıdır; batı bölgesi tek başına alınamaz,
  çünkü ayrılmış kümede tek bir şüphelisi vardır.
- **ME11.** **Oran eşitliği**, iki grupta işaretlenen abone oranlarının eşitliğidir.
- **ME12.** **Yakalama eşitliği**, iki grupta duyarlılıkların eşitliğidir: şüphelilerin ne
  kadarının işaretlendiği.
- **ME13.** **İsabet eşitliği**, iki grupta kesinliklerin eşitliğidir: işaretlenenlerin ne
  kadarının gerçekten şüpheli olduğu.
- **ME14.** Ölçütü sağlamanın aracı **gruba ayrı eşik** vermektir. Model, ağırlıkları ve puanları
  hiç değişmez; yalnız hangi puandan sonra işaretleneceği değişir.
- **ME15.** Eşik çiftleri 0,02'den 0,98'e 0,01 adımlı bir ızgarada aranır ve **işaretlenen toplam
  abone sayısı sabit tutulur** (63 abone, en çok üç kayma). Bu kısıt olmadan her ölçüt hiç kimseyi
  işaretlemeyerek sağlanır ve karşılaştırma anlamsızlaşır.
- **ME16.** Açıklık, iki grubun sayısı arasındaki mutlak farktır; sıfıra ne kadar yaklaştığından
  çok **öbür iki açıklığın ne yaptığı** okunur.

## Üç Ölçüt, Üç Ayrı Eşitlik

Kurulum önceki dersin modelini yeniden üretir, ayrılmış kümedeki her aboneye bir puan verir ve
beş bölgeyi tek eşikte yan yana koyar.

```python
# adalet.py — MODELDIR. Ayni KURGU abone tablosu, ayni tohum, ayni bolme ve
# onceki dersin on iki sutunlu dogrusal modeli; esik disinda hicbir sey degismez.
import math
import statistics

TOHUM, HAM, M32 = 20260218, 1400, 0xFFFFFFFF
BOLGE = [("kuzey", 0.28, 21, 0.00), ("guney", 0.22, 17, -0.10),
         ("dogu", 0.18, 26, 0.30), ("bati", 0.14, 14, -0.05),
         ("merkez", 0.18, 23, 0.05)]


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


def ayrik(u, w):
    t = 0.0
    for i, x in enumerate(w):
        t += x
        if u < t:
            return i
    return len(w) - 1


ABONE, VERI = [], []
for i in range(HAM):
    r = uretec(TOHUM + i)
    b = BOLGE[ayrik(r(), [x[1] for x in BOLGE])]
    hane = 1 + ayrik(r(), [0.06, 0.24, 0.30, 0.24, 0.11, 0.05])
    memnun = 1 + ayrik(r(), [0.08, 0.14, 0.27, 0.34, 0.17])
    if r() >= 0.046:
        ABONE.append({"no": 10001 + i, "bolge": b, "hane": hane, "memnuniyet": memnun})
for k in ABONE:
    r, v = uretec(TOHUM + 7000 + k["no"]), []
    for d in range(ayrik(r(), [0.05, 0.12, 0.21, 0.62])):
        v.append(0.0 if r() < 0.038 else math.floor(
            k["bolge"][2] * math.exp((r() + r() + r() - 1.5) * 0.62)
            * (1 - d * 0.05) * 100 + 0.5) / 100)
        r()
    if not v:
        continue
    ort, oyn, r = sum(v) / len(v), max(v) - min(v), uretec(TOHUM + 51000 + k["no"])
    z = (0.052 * (ort - 20) + 0.85 * (min(v) == 0.0) + 0.026 * oyn
         + 0.24 * (k["hane"] >= 5) - 0.20 * (k["memnuniyet"] >= 4) + k["bolge"][3]
         + 0.9 * (k["no"] - 10001) / 1399 + (r() + r() + r() - 1.5) * 1.30)
    x = {"hane": k["hane"], "memnuniyet": k["memnuniyet"], "donem": len(v),
         "ort_tuketim": round(ort, 2), "oynaklik": round(oyn, 2), "il": k["bolge"][0],
         "sifir_okuma": int(min(v) == 0.0), "supheli": int(z > 1.35)}
    x["kisi_basi"] = round(x["ort_tuketim"] / x["hane"], 3)
    for b in BOLGE:
        x["b_" + b[0]] = int(k["bolge"][0] == b[0])
    VERI.append(x)


def karistir(veri, tohum):
    r, s = uretec(tohum), list(range(len(veri)))
    for i in range(len(s) - 1, 0, -1):
        j = int(r() * (i + 1))
        s[i], s[j] = s[j], s[i]
    return [veri[i] for i in s]


K = karistir(VERI, TOHUM + 90000)
EGT, AYR = K[:756], K[756:]
ALAN = ["ort_tuketim", "oynaklik", "hane", "memnuniyet", "donem", "sifir_okuma",
        "kisi_basi", "b_kuzey", "b_guney", "b_dogu", "b_bati", "b_merkez"]
ORT = {a: statistics.fmean(x[a] for x in EGT) for a in ALAN}
SAP = {a: max(1e-9, statistics.pstdev([x[a] for x in EGT])) for a in ALAN}


def olcekli(x):
    return [1.0] + [(x[a] - ORT[a]) / SAP[a] for a in ALAN]


def sikistir(z):
    if z >= 0:
        return 1.0 / (1.0 + math.exp(-z)) if z < 700 else 1.0
    e = math.exp(z) if z > -700 else 0.0
    return e / (1.0 + e)


def egit(kume, etiket):                  # MODELDIR: dogrusal model, egim inisi
    X = [olcekli(x) for x in kume]
    Y = [x[etiket] for x in kume]
    w = [0.0] * len(X[0])
    for _ in range(200):
        g = [0.0] * len(w)
        for i in range(len(X)):
            h = sikistir(sum(w[j] * X[i][j] for j in range(len(w)))) - Y[i]
            for j in range(len(w)):
                g[j] += h * X[i][j]
        for j in range(len(w)):
            w[j] -= 0.3 * g[j] / len(X)
    return w


def olasilik(w, x):
    return sikistir(sum(a * b for a, b in zip(w, olcekli(x))))


def gruplar(x):
    t = 10 if x["ort_tuketim"] <= 10 else 25 if x["ort_tuketim"] <= 25 else 40
    return ["bolge " + x["il"], "tarife %d" % t,
            "hane " + ("1-2" if x["hane"] <= 2 else "3-4" if x["hane"] <= 4 else "5+"),
            "okuma " + ("az" if x["donem"] <= 2 else "tam")]


W = egit(EGT, "supheli")
PUAN = [(olasilik(W, x), x["supheli"], x["il"]) for x in AYR]
A = [p for p in PUAN if p[2] == "dogu"]
B = [p for p in PUAN if p[2] != "dogu"]


def olc(s, e):                           # secilme, duyarlilik, kesinlik, dogru, isaretli
    sup = sum(y for _, y, _ in s)
    n = sum(1 for p, _, _ in s if p > e)
    dp = sum(y for p, y, _ in s if p > e)
    return (n / len(s), dp / sup, dp / n if n else float("nan"),
            sum(1 for p, y, _ in s if (p > e) == bool(y)), n)


print(f"egitim {len(EGT)}, ayrilmis {len(AYR)}, bakilan alt grup "
      f"{len({g for x in AYR for g in gruplar(x)})}, taban "
      f"{sum(x['supheli'] == 0 for x in AYR) / len(AYR):.4f}")
print(f"{'bolge':<10}{'n':>5}{'supheli':>9}{'taban oran':>12}{'secilme':>10}"
      f"{'duyarlilik':>12}{'kesinlik':>10}")
for b in ("kuzey", "guney", "dogu", "bati", "merkez"):
    s = [p for p in PUAN if p[2] == b]
    m = olc(s, 0.5)
    print(f"{b:<10}{len(s):>5}{sum(y for _, y, _ in s):>9}"
          f"{sum(y for _, y, _ in s) / len(s):>12.4f}{m[0]:>10.4f}{m[1]:>12.4f}{m[2]:>10.4f}")
ta = sum(y for _, y, _ in A) / len(A)
tb = sum(y for _, y, _ in B) / len(B)
a0, b0 = olc(A, 0.5), olc(B, 0.5)
print(f"\nA = dogu: n {len(A)}, taban oran {ta:.4f} | B = diger dort bolge: "
      f"n {len(B)}, taban oran {tb:.4f}, oranlarin orani {ta / tb:.4f}")
print(f"tek esik 0.50, isaretlenen {a0[4] + b0[4]}: oran acikligi "
      f"{abs(a0[0] - b0[0]):.4f}, yakalama acikligi {abs(a0[1] - b0[1]):.4f}, "
      f"isabet acikligi {abs(a0[2] - b0[2]):.4f}")
```

```
egitim 756, ayrilmis 504, bakilan alt grup 13, taban 0.7857
bolge         n  supheli  taban oran   secilme  duyarlilik  kesinlik
kuzey       144       23      0.1597    0.0694      0.1739    0.4000
guney       117       17      0.1453    0.0256      0.1176    0.6667
dogu         83       38      0.4578    0.4578      0.6842    0.6842
bati         63        1      0.0159    0.0000      0.0000       nan
merkez       97       29      0.2990    0.1237      0.2759    0.6667

A = dogu: n 83, taban oran 0.4578 | B = diger dort bolge: n 421, taban oran 0.1663, oranlarin orani 2.7535
tek esik 0.50, isaretlenen 63: oran acikligi 0.3984, yakalama acikligi 0.4842, isabet acikligi 0.1242
```

Tablonun okunması gereken sütunu **taban orandır**: doğuda şüpheli oranı 0,4578, batıda 0,0159.
Bu fark modelin ürettiği değil kurgunun içinde duran bir şeydir; doğu bölgesinin gizli puanı 0,30
daha yüksektir. Model bu farkı görüyor ve doğuda abonelerin 0,4578'ini, güneyde 0,0256'sını
işaretliyor.

Alt satır dersin başlangıç noktasıdır. Tek bir eşikle üç açıklık da sıfırdan uzaktır: oran
açıklığı 0,3984, yakalama açıklığı 0,4842, isabet açıklığı 0,1242. Hangisinin düzeltileceği bir
seçim hâline gelir, çünkü üçü ayrı taraftan bakar: oran eşitliği bir abonenin komşularından daha
sık işaretlenmemesini, yakalama eşitliği hiçbir bölgede şüphelilerin öbüründen çok gözden
kaçmamasını, isabet eşitliği ise işaretlenmenin her bölgede aynı şeyi ifade etmesini ister.

## Birini Düzeltmek Öbürünü Bozar

Ölçütü sağlamanın yolu iki gruba ayrı eşik vermektir. Aşağıdaki arama, işaretlenen toplam abone
sayısını sabit tutarak her ölçütü tek tek sıfıra en yakın noktaya çeker ve öbür iki açıklığı
yanına yazar.

```python
GRID = [i / 100 for i in range(2, 99)]
CA = {e: olc(A, e) for e in GRID}
CB = {e: olc(B, e) for e in GRID}
HEDEF = a0[4] + b0[4]


def esitle(k):                           # k: 0 secilme, 1 duyarlilik, 2 kesinlik
    en = None
    for ea in GRID:
        u = CA[ea]
        for eb in GRID:
            v = CB[eb]
            if abs(u[4] + v[4] - HEDEF) > 3 or v[2] != v[2] or u[2] != u[2]:
                continue
            f, d = abs(u[k] - v[k]), (u[3] + v[3]) / len(AYR)
            if en is None or f < en[0] - 1e-12 or (abs(f - en[0]) < 1e-12 and d > en[3]):
                en = (f, ea, eb, d)
    return en


def yaz(ad, ea, eb):
    u, v = CA[ea], CB[eb]
    print(f"{ad:<22}{ea:>7.2f}{eb:>7.2f}{u[4] + v[4]:>12}"
          f"{abs(u[0] - v[0]):>12.4f}{abs(u[1] - v[1]):>14.4f}{abs(u[2] - v[2]):>12.4f}"
          f"{(u[3] + v[3]) / len(AYR):>10.4f}")


print(f"{'yapilandirma':<22}{'esik A':>7}{'esik B':>7}{'isaretli':>12}"
      f"{'oran acik':>12}{'yakalama acik':>14}{'isabet acik':>12}{'dogruluk':>10}")
yaz("tek esik", 0.5, 0.5)
for k, ad in ((0, "oran esitligi"), (1, "yakalama esitligi"), (2, "isabet esitligi")):
    f, ea, eb, d = esitle(k)
    yaz(ad, ea, eb)
```

```
yapilandirma           esik A esik B    isaretli   oran acik yakalama acik isabet acik  dogruluk
tek esik                 0.50   0.50          63      0.3984        0.4842      0.1242    0.8194
oran esitligi            0.81   0.40          60      0.0017        0.0632      0.4800    0.7857
yakalama esitligi        0.76   0.40          63      0.0379        0.0105      0.4262    0.7877
isabet esitligi          0.34   0.65          66      0.6365        0.7038      0.0000    0.7976
```

Her satırda köşegen üstündeki sayı sıfıra iniyor ve öbürleri yükseliyor. Oran eşitliği isteniyorsa
doğuya 0,81, geri kalana 0,40 eşiği verilir; işaretlenen abone oranları 0,0017 farkla eşitlenir,
ama isabet açıklığı 0,1242'den 0,4800'e çıkar — doğuda işaretlenen abonelerin 0,9000'i gerçekten
şüpheliyken geri kalanda 0,4200'ü şüphelidir. Yakalama eşitliği isteniyorsa eşikler 0,76 ve 0,40
olur, duyarlılıklar 0,0105 farkla buluşur, isabet açıklığı 0,4262'de kalır. İsabet eşitliği
isteniyorsa doğuya 0,34, geri kalana 0,65 verilir; kesinlikler tam eşitlenir ama yakalama açıklığı
0,7038'e fırlar, çünkü doğuda şüphelilerin 0,7895'i, geri kalanda 0,0857'si yakalanır.

Bedelin bir kısmı doğruluktan gelir: bütün doğruluk üç yapılandırmada 0,7857, 0,7877 ve 0,7976'ya
iniyor ve oran eşitliğinde model tabanın tam üstünde duruyor. Ama asıl bedel doğrulukta değil öbür
iki açıklıktadır; hiçbir yapılandırma üç sütunu birden küçültemiyor.

## Bu Bir Ayar Hatası Değil

Tablodaki örüntü daha iyi bir arama ya da daha ince bir ızgarayla düzelmez, çünkü kaynağı
tanımların kendisidir. Üç ölçüt bağımsız değildir; aralarında bir kimlik vardır. Bir grupta
seçilme oranı $s$, duyarlılık $d$, kesinlik $k$ ve taban oran $t$ ise, işaretlenen doğru sayısı
iki yoldan yazılabilir ve

$$s = \frac{d \cdot t}{k}$$

çıkar. Aşağıdaki blok önce bu kimliği iki grupta doğruluyor, sonra yakalama ile isabeti
**birlikte** eşitlemeyi deniyor.

```python
print(f"\nkimlik: secilme = duyarlilik * taban oran / kesinlik   (esik 0.50)")
for ad, m, t in (("A", a0, ta), ("B", b0, tb)):
    print(f"  {ad}: {m[1] * t / m[2]:.6f} = {m[0]:.6f}")


def birlikte(tol):
    en = None
    for ea in GRID:
        u = CA[ea]
        for eb in GRID:
            v = CB[eb]
            if v[2] != v[2] or u[2] != u[2]:
                continue
            if tol and abs(u[4] + v[4] - HEDEF) > tol:
                continue
            f = max(abs(u[1] - v[1]), abs(u[2] - v[2]))
            if en is None or f < en[0] - 1e-12:
                en = (f, ea, eb)
    return en


SUP = sum(y for _, y, _ in PUAN)
print(f"\nyakalama ile isabeti birlikte esitleme denemesi ({SUP} supheli var)")
print(f"{'kapasite kisiti':<20}{'esik A':>7}{'esik B':>7}{'en buyuk aciklik':>18}"
      f"{'isaretli':>10}{'yakalanan':>11}{'secilme orani':>15}")
for tol, ad in ((0, "yok"), (3, "63 kayma 3"), (15, "63 kayma 15")):
    f, ea, eb = birlikte(tol)
    u, v = CA[ea], CB[eb]
    yak = round(u[1] * sum(y for _, y, _ in A)) + round(v[1] * sum(y for _, y, _ in B))
    print(f"{ad:<20}{ea:>7.2f}{eb:>7.2f}{f:>18.4f}{u[4] + v[4]:>10}{yak:>11}"
          f"{u[0] / v[0]:>15.4f}")
print(f"taban oranlarin orani {ta / tb:.4f}")
```

```

kimlik: secilme = duyarlilik * taban oran / kesinlik   (esik 0.50)
  A: 0.457831 = 0.457831
  B: 0.059382 = 0.059382

yakalama ile isabeti birlikte esitleme denemesi (108 supheli var)
kapasite kisiti      esik A esik B  en buyuk aciklik  isaretli  yakalanan  secilme orani
yok                    0.86   0.82            0.0120         2          2         5.0723
63 kayma 3             0.74   0.43            0.2727        60         33         1.8445
63 kayma 15            0.72   0.46            0.2486        48         29         2.7816
taban oranlarin orani 2.7535
```

Kimlik iki grupta da altıncı basamağa kadar tutuyor. Sonucu şudur: duyarlılık ile kesinlik iki
grupta eşitlenirse $s_A / s_B = t_A / t_B$ olur, yani seçilme oranlarının oranı taban oranların
oranına, burada 2,7535'e **kilitlenir**. Oran eşitliği bu oranın 1 olmasını ister. İkisi ancak
taban oranlar eşitse ya da hiç kimse işaretlenmiyorsa birlikte doğru olabilir.

Alt tablo bunu deneyerek gösteriyor. Kapasite kısıtı kaldırıldığında arama gerçekten üç açıklığı
birden küçük yapan bir eşik çifti buluyor — 0,86 ve 0,82 — ama o noktada 504 abonenin yalnız
ikisi işaretleniyor ve 108 şüphelinin ikisi yakalanıyor. Eşitlik hiçbir şey yapmayarak
sağlanmıştır. Kapasite 63'e sabitlendiğinde en iyi deneme 0,2727 açıklık bırakıyor; 48 abonelik
daha gevşek bir kısıtta açıklık 0,2486'ya iniyor ve seçilme oranlarının oranı 2,7816 ile taban
oranların oranı olan 2,7535'e oturuyor — kimliğin öngördüğü yere.

Buradan çıkan kural bir öneri değil bir sınırdır: **taban oranlar farklı olduğu sürece üç ölçüt
aynı anda sağlanamaz.** Yapılacak iş ölçütü seçmek, seçimi yazmak ve öbür iki açıklığı sayıyla
birlikte raporlamaktır; "adil model" diye tek bir sayı yoktur.

## Özet

- Doğu bölgesinde şüpheli oranı 0,4578, geri kalan dört bölgede 0,1663; bu taban oran farkı
  dersin bütün sonuçlarını belirler ve tek eşikte üç açıklık da büyüktür: oran 0,3984, yakalama
  0,4842, isabet 0,1242.
- İşaretlenen abone sayısı sabit tutulduğunda oran eşitliği isabet açıklığını 0,4800'e, yakalama
  eşitliği 0,4262'ye, isabet eşitliği ise yakalama açıklığını 0,7038'e çıkarıyor; bütün doğruluk
  0,7857 ile 0,7976 arasına iniyor.
- Seçilme oranı, duyarlılık ile taban oranın çarpımının kesinliğe bölümüne eşittir; iki ölçüt
  eşitlendiğinde seçilme oranlarının oranı taban oranların oranına, 2,7535'e kilitlenir.
- Kapasite sabitken üçünü birlikte veren eşik çifti yoktur: en iyi deneme 0,2727 açıklık
  bırakıyor, kısıt kaldırıldığında ise eşitlik yalnız iki abone işaretleyerek sağlanıyor.

## Sonraki Adım

İki derste ölçülen şey modelin **kime ne yaptığıydı**. Modelin, üzerinde eğitildiği kayıtlar
hakkında **ne söylediği** hiç sorulmadı. Eğitim kümesindeki tek bir abonenin tabloya girip çıkması
çıktıyı ne kadar oynatıyor, ve abone numarasını silmek o aboneyi gerçekten görünmez kılıyor mu.
Sonraki ders bunları sayar: tek bir kaydın çıktıda bıraktığı iz ölçülür, gürültü eklemenin
doğruluktan ne götürdüğü süpürülür, ve kimliksizleştirilmiş bir tabloda kaç abonenin kendi alan
birleşiminde tek başına kaldığı sayılır.
