---
title: 'Kısmi Bağımlılık ve Etkileşim'
source: 'https://academia.sh/tr/kurslar/model-etik-ve-yorum/kismi-bagimlilik-ve-etkilesim'
course: 'Model Değerlendirme, Yorumlanabilirlik ve Etik'
language: tr
updated: '2026-08-17T18:10:14+00:00'
license: 'CC BY-SA 4.0'
---

# Kısmi Bağımlılık ve Etkileşim

Bir sütunun modele bütün olarak ne yaptığının sayı olarak basılması ve ortalamanın ne gizlediğinin sayılması: karar ağacında beş sütunun üçü bütünde düz görünüyor, bunların ikisinde alt gruplar ters yönde eğimli. Hane büyüklüğünün kısmi bağımlılığı bütünde -0,0069 ile düzdür, üçüncü tarife basamağında +0,1301, doğu bölgesinde -0,1891 ve açıklık 0,3192'dir. Memnuniyette açıklık 0,2189'dur. Okuma sayısı hem bütünde hem on iki alt grupta tam olarak 0,0000 eğimlidir: düz görünen her sayı bir etkileşim gizlemiyor.

Önceki iki ders açıklamayı ya modelin bütününe ya da tek bir aboneye bağladı. Aradaki soru
sorulmadı: bir sütunun değeri bir uçtan öbür uca gezdirilirken modelin çıktısı **ortalamada**
nasıl davranıyor. Bu, kısmi bağımlılıktır ve tek bir sütunun modeldeki etkisini bir eğri olarak
özetler. Burada eğri çizilmez, ızgara noktalarındaki sayılar basılır — çünkü bu dersin sorusu tam
olarak o ortalamanın içinde kaybolan şeyle ilgilidir.

Kısmi bağımlılık bir ortalamadır ve her ortalama gibi ters yönlü iki hareketi birbirine
götürebilir. Bir sütun bir alt grupta puanı yukarı, başka bir alt grupta aşağı itiyorsa bütündeki
eğri **düz** çıkar ve sütunun modelde hiçbir rolü yokmuş gibi görünür. Bu dersin ölçüsü budur:
bütünde düz görünen kaç sütunda alt gruplar ters yönde eğimli.

- **YO19.** Kurulum önceki derslerinkidir: aynı kurgu abone tablosu, tohum 20260218, bölme
  756/252/252, sınama kümesinde taban çizgisi 0,7579. Alt gruplar ve 25 kayıtlık okuma eşiği
  sürer; **bakılan alt grup sayısı 13'tür**.
- **YO20.** Bu ders açıklanan modeli değiştirir. Doğrusal model sütunları birbiriyle çarpmaz,
  dolayısıyla bir sütunun kısmi bağımlılığı her alt grupta aynı işareti taşır ve bu dersin sorusu
  orada sorulamaz. Açıklanan model M27/K03'ün karar ağacı ailesidir; burada budanmamış derinlik 6
  ağacı kullanılır ve sınamada 0,7897 verir. Ailenin M27/K03'te budamayla ulaştığı sayı 0,7857'dir.
- **YO21.** Kısmi bağımlılık şöyle hesaplanır: bir sütun ızgaradaki değere çekilir, öbür sütunlar
  kümenin kendi değerlerinde bırakılır, puanların ortalaması alınır. Izgara eğitim kümesindeki
  farklı değerlerin en fazla beş noktasıdır; farklı değeri beşten az olan sütunda nokta sayısı o
  kadardır.
- **YO22.** Türetilmiş kişi başına tüketim her ızgara noktasında kaynağıyla birlikte yeniden
  hesaplanır.
- **YO23.** Eğim, ızgaranın son noktasındaki kısmi bağımlılıktan ilk noktasındakinin
  çıkarılmasıdır. Bütünde mutlak eğimi 0,05'in altında olan sütun **düz** sayılır; bir alt grupta
  mutlak eğimi 0,02'yi geçen sütun **eğimli** sayılır. İki eşik de puan ölçeğindedir ve puan 0 ile
  1 arasında değişir.
- **YO24.** Grafik çizilmez; kısmi bağımlılık ızgara noktalarındaki sayılarla basılır.

## Kısmi Bağımlılık Sayı Olarak

Kurulum önceki derslerinkiyle aynıdır.

```python
# yorum.py — MODELDIR. M27/K01–K07'nin KURGU abone tablosu ayni tohumla uretilir;
# on iki sutunluk oznitelik kumesi ve bolme kurs boyunca sabittir.
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),
         "sifir_okuma": int(min(v) == 0.0), "supheli": int(z > 1.35),
         "bolge": k["bolge"][0]}
    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, DOG, SIN = K[:756], K[756:1008], K[1008:]
ALAN = ["ort_tuketim", "oynaklik", "hane", "memnuniyet", "donem", "sifir_okuma",
        "kisi_basi", "b_kuzey", "b_guney", "b_dogu", "b_bati", "b_merkez"]
TABAN = sum(x["supheli"] == 0 for x in SIN) / len(SIN)


def basamak(x):
    return ("tarife 10" if x["ort_tuketim"] <= 10 else
            "tarife 25" if x["ort_tuketim"] <= 25 else "tarife 40")


def hane_grup(x):
    return "hane 1-2" if x["hane"] <= 2 else ("hane 3-4" if x["hane"] <= 4
                                              else "hane 5+")


def okuma_grup(x):
    return "okuma az" if x["donem"] <= 2 else "okuma tam"


def esitse(f, deger):
    return lambda x: f(x) == deger


ALTGRUP = ([("bolge " + b[0], esitse(lambda x: x["bolge"], b[0])) for b in BOLGE]
           + [(t, esitse(basamak, t)) for t in ("tarife 10", "tarife 25", "tarife 40")]
           + [(h, esitse(hane_grup, h)) for h in ("hane 1-2", "hane 3-4", "hane 5+")]
           + [(o, esitse(okuma_grup, o)) for o in ("okuma az", "okuma tam")])
ENAZ = 25
BOY = {ad: sum(1 for x in SIN if f(x)) for ad, f in ALTGRUP}
print(f"egitim {len(EGT)}, dogrulama {len(DOG)}, sinama {len(SIN)}; alt grup "
      f"sayisi {len(ALTGRUP)}, esigin altinda {[a for a in BOY if BOY[a] < ENAZ]}")
```

```
egitim 756, dogrulama 252, sinama 252; alt grup sayisi 13, esigin altinda ['tarife 10']
```

Ağaç M27/K03'teki biçimiyle kurulur ve kısmi bağımlılık beş sütun için ızgara noktalarında
basılır.

```python
def oran(s):
    return sum(x["supheli"] for x in s) / len(s) if s else 0.0


def safliksizlik(s):
    p = oran(s)
    return 2 * p * (1 - p)


def en_iyi_bolme(s, enaz=2):
    en = None
    for a in ALAN:
        d = sorted({x[a] for x in s})
        for v in (d[1:] if len(d) < 10 else
                  [d[int(i * len(d) / 10)] for i in range(1, 10)]):
            sol = [x for x in s if x[a] < v]
            sag = [x for x in s if x[a] >= v]
            if min(len(sol), len(sag)) < enaz:
                continue
            k = safliksizlik(s) - (len(sol) * safliksizlik(sol)
                                   + len(sag) * safliksizlik(sag)) / len(s)
            if en is None or k > en[0]:
                en = (k, a, v, sol, sag)
    return en


def agac(s, derinlik, enaz=2):        # MODELDIR: karar agaci, M27/K03'un ailesi
    p = oran(s)
    en = (en_iyi_bolme(s, enaz) if derinlik and len(s) >= 2 * enaz
          and 0.0 < p < 1.0 else None)
    if en is None or en[0] <= 1e-9:
        return {"oran": p}
    return {"alan": en[1], "esik": en[2], "sol": agac(en[3], derinlik - 1, enaz),
            "sag": agac(en[4], derinlik - 1, enaz)}


def agac_puan(d, x):
    while "oran" not in d:
        d = d["sol"] if x[d["alan"]] < d["esik"] else d["sag"]
    return d["oran"]


AGAC = agac(EGT, 6)
AD = sum((agac_puan(AGAC, x) > 0.5) == x["supheli"] for x in SIN) / len(SIN)
print(f"taban cizgisi {TABAN:.4f}, karar agacinin sinama dogrulugu {AD:.4f}")

IZGARA_SUTUN = ["ort_tuketim", "oynaklik", "hane", "memnuniyet", "donem"]


def izgara(a, nokta=5):
    d = sorted({x[a] for x in EGT})
    k = min(nokta, len(d))
    return [d[int(i * (len(d) - 1) / (k - 1))] for i in range(k)]


def kismi(st, a, gr):                 # kismi bagimlilik: sayi olarak, cizilmez
    p = []
    for v in gr:
        t = 0.0
        for x in st:
            d = dict(x)
            d[a] = v
            d["kisi_basi"] = round(d["ort_tuketim"] / max(1, d["hane"]), 3)
            t += agac_puan(AGAC, d)
        p.append(t / len(st))
    return p


DUZ, EGIM = 0.05, {}
IZG = {a: izgara(a) for a in IZGARA_SUTUN}
for a in IZGARA_SUTUN:
    p = kismi(SIN, a, IZG[a])
    EGIM[a] = p[-1] - p[0]
    print(f"{a:<13}" + "  ".join(f"{v:g}:{q:.4f}" for v, q in zip(IZG[a], p))
          + f"   egim {EGIM[a]:+.4f}")
YASSI = [a for a in IZGARA_SUTUN if abs(EGIM[a]) < DUZ]
print(f"\nbutunde duz gorunen sutun ({DUZ} esigiyle) {YASSI}")
```

```
taban cizgisi 0.7579, karar agacinin sinama dogrulugu 0.7897
ort_tuketim  0:0.0848  15.23:0.1380  19.51:0.2234  23.81:0.2250  42.9:0.3838   egim +0.2990
oynaklik     0:0.1374  5.52:0.1374  9.89:0.1945  15.64:0.3158  40.57:0.7731   egim +0.6357
hane         1:0.2546  2:0.2510  3:0.2274  4:0.2165  6:0.2477   egim -0.0069
memnuniyet   1:0.2926  2:0.2588  3:0.2315  4:0.2354  5:0.2460   egim -0.0466
donem        1:0.2491  2:0.2491  3:0.2491   egim +0.0000

butunde duz gorunen sutun (0.05 esigiyle) ['hane', 'memnuniyet', 'donem']
```

Ortalama tüketim ve oynaklık okunması kolay iki satır: ızgara boyunca puan tek yönde artıyor,
eğimler +0,2990 ve +0,6357. Kalan üç sütun düz. Hane büyüklüğünün eğimi -0,0069, yani puanın
binde yedisi; memnuniyetinki -0,0466; okuma sayısınınki tam olarak sıfır.

Bu üç satıra bakan biri şu cümleyi yazar: model kararını hane büyüklüğüne, memnuniyete ve okuma
sayısına dayandırmıyor. Cümle üç sütun için de aynı gerekçeyle yazılıyor ama üçünde de aynı şeyi
anlatmıyor, ve hangisinde neyi anlattığı bütünden okunamaz.

Hesabın kendisi de bir varsayım taşır ve varsayım burada açıkça yazılmalıdır. Bir sütun ızgara
noktasına çekilirken öbür sütunlar oldukları yerde bırakılıyor; yani sütunların birbirinden
bağımsız oynatılabildiği varsayılıyor. Hane büyüklüğü 6'ya çekilen bir abonenin ortalama tüketimi
değişmiyor, oysa kurguda ikisi birlikte hareket eder. Önceki dersin bozarak ölçülen önemi de aynı
varsayıma dayanıyordu ve orada ilişkili iki sütunun önemi bölüşmüştü. Kısmi bağımlılık, kümede hiç
görülmemiş bileşimler üzerinde de puan hesaplar; ızgara uçlarındaki sayılar bu yüzden ortadaki
sayılardan daha az güvenilirdir.

## Ortalamanın Gizlediği Etkileşim

Aynı hesap on iki okunabilir alt grupta ayrı ayrı yapılır.

```python
ESIK = 0.02
E = {a: {} for a in YASSI}
for ad, f in ALTGRUP:
    if BOY[ad] < ENAZ:
        continue
    g = [x for x in SIN if f(x)]
    for a in YASSI:
        p = kismi(g, a, IZG[a])
        E[a][ad] = p[-1] - p[0]
KISA = [(ad.replace("bolge ", "").replace("tarife ", "t").replace("hane ", "h")
         .replace("okuma ", "ok "), ad) for ad in E[YASSI[0]]]
print("alt grup " + "".join(f"{a:>13}" for a in YASSI))
print("butun    " + "".join(f"{EGIM[a]:>+13.4f}" for a in YASSI))
for kisa, ad in KISA:
    print(f"{kisa:<9}" + "".join(f"{E[a][ad]:>+13.4f}" for a in YASSI))
KIRIK = [a for a in YASSI if max(E[a].values()) > ESIK and min(E[a].values()) < -ESIK]
print(f"\nokunan alt grup {len(E[YASSI[0]])}/{len(ALTGRUP)}, egim esigi {ESIK}")
print(f"butunde duz gorunen sutun {len(YASSI)}, bunlardan alt gruplarda ters "
      f"yonde egimli olan {len(KIRIK)}")
for a in KIRIK:
    y = max(E[a], key=lambda k: E[a][k])
    d = min(E[a], key=lambda k: E[a][k])
    print(f"  {a}: en yuksek {y} {E[a][y]:+.4f}, en dusuk {d} {E[a][d]:+.4f}, "
          f"aciklik {E[a][y] - E[a][d]:.4f}")
```

```
alt grup          hane   memnuniyet        donem
butun          -0.0069      -0.0466      +0.0000
kuzey          +0.0916      -0.1146      +0.0000
guney          -0.0477      -0.0108      +0.0000
dogu           -0.1891      +0.0278      +0.0000
bati           -0.0442      -0.0313      +0.0000
merkez         +0.0522      -0.0573      +0.0000
t25            -0.0264      -0.0143      +0.0000
t40            +0.1301      -0.1911      +0.0000
h1-2           -0.0354      -0.0665      +0.0000
h3-4           +0.0049      -0.0533      +0.0000
h5+            +0.0040      +0.0205      +0.0000
ok az          +0.0155      -0.0359      +0.0000
ok tam         -0.0183      -0.0520      +0.0000

okunan alt grup 12/13, egim esigi 0.02
butunde duz gorunen sutun 3, bunlardan alt gruplarda ters yonde egimli olan 2
  hane: en yuksek tarife 40 +0.1301, en dusuk bolge dogu -0.1891, aciklik 0.3192
  memnuniyet: en yuksek bolge dogu +0.0278, en dusuk tarife 40 -0.1911, aciklik 0.2189
```

Hane büyüklüğü bütünde -0,0069 ile düzdür. En üst tarife basamağında +0,1301, doğu bölgesinde
-0,1891; açıklık 0,3192, yani bütündeki eğimin kırk altı katı. Yüksek tüketimli abonelerde hane
büyüdükçe şüphe artıyor, doğu bölgesinde hane büyüdükçe azalıyor. İki hareket bütünde birbirini
götürüyor ve geriye binde yedilik bir sayı kalıyor. **Bütünde okunan düzlük bir yokluk değil, bir
toplamdır.**

Memnuniyette aynı şey daha küçük ölçekte oluyor: bütünde -0,0466, en üst tarife basamağında
-0,1911, doğu bölgesinde +0,0278, açıklık 0,2189. İki sütunun da en uç değerleri **aynı iki alt
grupta** ve ters sırada duruyor; bu, ağacın bu iki sütunu birbirinden bağımsız değil, tüketim
düzeyi ve bölgeyle birlikte kullandığı anlamına gelir. Etkileşim tam olarak budur.

Okuma sayısı üçüncü tür bir düzlüktür ve bu dersin kontrolüdür. Hem bütünde hem on iki alt grubun
hepsinde eğim tam olarak 0,0000: ağaç bu sütuna hiç bölme koymamış. Düz görünen her sayının altında
bir etkileşim yoktur; bazen sütun gerçekten kullanılmamıştır. İki durumu ayırmanın yolu bütüne
bakmak değil, alt gruplara bakmaktır — ve bakılmadığında ikisi aynı satır olarak okunur.

Kararın değişip değişmediği burada da okunur. Bütüne bakan biri üç sütunu birden modelden
çıkarmayı önerir. Alt gruplara bakan biri bunu yalnız okuma sayısı için önerir; öbür ikisi
kullanılıyor, yalnız **kimin için ne yönde** kullanıldığı bütünde görünmüyor.

## Özet

- Kısmi bağımlılık bir sütunu ızgara boyunca gezdirip puanların ortalamasını alır; burada eğri
  çizilmedi, ızgara noktalarındaki sayılar basıldı.
- Hesap sütunların bağımsız oynatılabildiğini varsayar ve kümede hiç görülmemiş bileşimler üretir;
  ızgara uçlarındaki sayılar ortadakilerden daha az güvenilirdir.
- Beş sütunun ikisi bütünde açıkça eğimli (+0,2990 ve +0,6357), üçü düz görünüyor.
- Bütünde düz görünen üç sütunun ikisinde alt gruplar ters yönde eğimli: hane büyüklüğünde açıklık
  0,3192, memnuniyette 0,2189.
- Hane büyüklüğünün eğimi bütünde -0,0069 iken üçüncü tarife basamağında +0,1301, doğu bölgesinde
  -0,1891'dir; bütündeki düzlük bir yokluk değil, ters yönlü iki hareketin toplamıdır.
- Okuma sayısı hem bütünde hem on iki alt grupta tam olarak 0,0000 eğimlidir: düz görünen her sayı
  bir etkileşim gizlemez, bazen sütun gerçekten kullanılmamıştır.

## Sonraki Adım

Dört derste açıklama hep **modelin dışından** üretildi: kurulmuş bir modelin kararı sonradan
okundu, bozuldu, taklit edildi ve ortalandı. Her seferinde açıklamanın kendisi bir yaklaşımdı ve
sadakati ayrıca ölçülmek zorunda kaldı. Başka bir yol vardır: modeli baştan okunabilir kurmak.
Kararı birkaç kuralın sırayla uygulanmasıyla veren bir model, açıklamayı ayrıca üretmez — modelin
kendisi açıklamadır ve sadakati tanım gereği tamdır. Sonraki ders bu yolun bedelini ölçer: kaç
kuralda M27/K03'ün en iyi ailesinin sayısına yaklaşılıyor, ve hangi alt grupta hiç yaklaşılamıyor.
