---
title: 'Veriyle Anlatı Kurma'
source: 'https://academia.sh/tr/kurslar/gorsellestirme-ve-raporlama/veriyle-anlati-kurma'
course: 'Görselleştirme, Raporlama ve Ölçekli Analiz'
language: tr
updated: '2026-08-17T18:08:48+00:00'
license: 'CC BY-SA 4.0'
---

# Veriyle Anlatı Kurma

Bulgudan öneriye giden beş adımlık zincirden bir adım çıkarıldığında okuyucunun kendisinin tamamlamak zorunda kaldığı önerme sayılır: bulgu çıkarılınca 4, karşılaştırma çıkarılınca 3, sebep adayı çıkarılınca 2, belirsizlik çıkarılınca 3, öneri çıkarılınca 3 çıkarım açıkta kalır. Zincirin taşıdığı on bir yanlış varsayılandan dokuzu öneriyi güçlendirir, ikisi zayıflatır — boşluklar rastgele dolmaz. K05'in oynama payının yeri karara bağlanır: pay hiç yazılmazsa 4 çıkarım ve 3 yanlış varsayılan, yalnız sonda bir kısıtlar paragrafında yazılırsa 1 çıkarım ve 1 yanlış varsayılan kalır, bulgunun yanında ve belirsizlik adımında yazıldığında ikisi de sıfırlanır.

Önceki üç ders sayıyı düzeltti: düzen kararı destekleyecek biçimde bölündü, ölçütün tanımı
oynatılamaz hâle getirildi, sayının yanına veri kesme anı ile yenileme gecikmesi yazıldı. Okuyucunun
elinde duran şey hâlâ bir sayı. Bir sayının karara dönüşmesi için bir zincire oturması gerekir ve
zincirin halkaları eksikse okuyucu onları kendisi tamamlar.

Bu dersin ölçüsü **atlanan adımın bıraktığı boşluktur**: bir halka çıkarıldığında okuyucunun
yapmak zorunda kaldığı çıkarım sayısı. Yanına ikinci bir sayı yazılır — bu çıkarımların kaçının
varsayılanı kümeye göre yanlıştır ve o yanlış varsayılanların kaçı öneriyi **güçlendirir**.

- **RP19.** Küme K03'ten devralınır ve **kurgudur**: 3.199 satırlık okuma tablosu, 1.329 abone,
  üç dönem, beş bölge. Tohum koda yazılıdır.
- **RP20.** Bulgu K05'ten gelir: doğu ortalaması 24,674 m³ (557 okuma), kuzey 20,210 m³ (921 okuma),
  fark 4,463 m³. **Sınama hesabı burada tekrarlanmaz**, sayılar oradan okunur.
- **RP21.** Payın iki sayısı da K05'ten okunur: bölge etiketleri 2.000 kez yeniden karıştırıldığında
  gözlenen fark hiçbir koşumda aşılmadı; kütle, örneklem, sıfır okuma ve dönem sayısı üzerine
  verilen dört savunulabilir kararın açıklığı 0,206 m³'tür.
- **RP22.** Anlatı zinciri **kurgudur**: beş adım, on altı önerme, on beşi önerinin savunulması
  için gerekli.
- **RP23.** Bir adım çıkarıldığında okuyucunun o adımın önermelerini kendisi tamamladığı
  varsayılır. Her önermenin varsayılanı ve varsayılanın yönü ders içinde yazılıdır.
- **RP24.** Öneri de **kurgudur**: doğu bölgesinde tarife basamağı sınırının gözden geçirilmesi.

## Zincir

```python
# anlati.py — MODELDIR. K03'un kurgu kumesi ayni tohumla uretilir; uzerine bulgudan
# oneriye giden bes adimlik bir anlati zinciri kurulur.
import math

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


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, ELENEN = [], []
for i in range(HAM):
    r = uretec(TOHUM + i)
    b = BOLGE[ayrik(r(), [x[1] for x in BOLGE])]
    ayrik(r(), [0.06, 0.24, 0.30, 0.24, 0.11, 0.05])
    ayrik(r(), [0.08, 0.14, 0.27, 0.34, 0.17])
    (ELENEN if r() < 0.046 else ABONE).append(
        {"abone_no": 10001 + i, "bolge": b[0], "taban": b[2]})
GECERLI = {k["abone_no"] for k in ABONE}
OKUMA = {}
for k in ABONE + ELENEN:
    r = uretec(TOHUM + 7000 + k["abone_no"])
    for d in range(ayrik(r(), [0.05, 0.12, 0.21, 0.62])):
        t = 0.0 if r() < 0.038 else math.floor(
            k["taban"] * math.exp((r() + r() + r() - 1.5) * 0.62) * (1 - d * 0.05) * 100
            + 0.5) / 100
        if k["abone_no"] in GECERLI:
            OKUMA.setdefault(k["abone_no"], {})[d + 1] = t
        r()

ORT = {}
for b, _, _ in BOLGE:
    v = [t for k in ABONE if k["bolge"] == b
         for t in OKUMA.get(k["abone_no"], {}).values()]
    ORT[b] = (sum(v) / len(v), len(v))
FARK = ORT["dogu"][0] - ORT["kuzey"][0]
EN_GENIS = max(ORT.values())[0] - min(ORT.values())[0]
UC = sorted(ORT, key=lambda b: -ORT[b][0])

# Anlati zinciri: her adim bir onerme kumesi tasir. Onerme alanlari: kod, adim,
# icerik, adim yoksa okuyucunun dustugu varsayilan, varsayilan kumeye gore yanlis mi,
# onerinin savunulmasi icin gerekli mi, varsayilan oneriyi guclendiriyor mu (+1/-1).
ONERME = [
    ("O1", "bulgu", f"dogu ortalamasi {ORT['dogu'][0]:.3f} m3",
     "sayi bilinmiyor", False, True, 0),
    ("O2", "bulgu", f"kuzey ortalamasi {ORT['kuzey'][0]:.3f} m3",
     "sayi bilinmiyor", False, True, 0),
    ("O3", "bulgu", f"sayilar {ORT['dogu'][1]} ve {ORT['kuzey'][1]} okumaya dayaniyor",
     "gozlem sayisi buyuktur", True, True, 1),
    ("O4", "bulgu", "bulgudaki sayi payiyla birlikte yazildi",
     "sayi kesindir", True, True, 1),
    ("O5", "karsilastirma", f"fark {FARK:.3f} m3", "fark bilinmiyor", False, True, 0),
    ("O6", "karsilastirma", f"fark kuzeyin yuzde {FARK / ORT['kuzey'][0] * 100:.1f}'i",
     "fark kucuktur", True, True, -1),
    ("O7", "karsilastirma",
     f"bes bolgenin en genis farki {EN_GENIS:.3f} m3 ({UC[0]}-{UC[-1]})",
     "fark tek onemli farktir", True, True, 1),
    ("O8", "sebep adayi", "aday: dogu taban tuketimi daha yuksek",
     "sebep yoktur", False, True, 0),
    ("O9", "sebep adayi", "rakip aday: okuma kapsamasi farki",
     "tek sebep vardir", True, True, 1),
    ("O10", "sebep adayi", "rakip aday: tarife basamagi dagilimi",
     "tek sebep vardir", True, False, 1),
    ("O11", "belirsizlik", "K05: 2.000 karistirmada asilmadi", "pay olculmedi", False, True, 0),
    ("O12", "belirsizlik", "K05: dort kararin acikligi 0,206 m3", "pay sifirdir", True, True, 1),
    ("O13", "belirsizlik", "payin kapsamadigi adlandirildi",
     "pay her seyi kapsar", True, True, 1),
    ("O14", "oneri", "onerilen eylem yazildi", "eylem okuyucunun secimidir", True, True, -1),
    ("O15", "oneri", "eylemin geri alinabilirligi yazildi",
     "eylem geri alinabilir", True, True, 1),
    ("O16", "oneri", "eylem hangi olcutle olculecek", "olcum yapilmayacak", True, True, 1),
]
ADIM = ["bulgu", "karsilastirma", "sebep adayi", "belirsizlik", "oneri"]
print(f"kurgu kume (tohum {TOHUM}): {len(ABONE)} abone, "
      f"{sum(len(v) for v in OKUMA.values())} okuma")
print(f"bulgu: dogu {ORT['dogu'][0]:.3f} m3 ({ORT['dogu'][1]} okuma), "
      f"kuzey {ORT['kuzey'][0]:.3f} m3 ({ORT['kuzey'][1]} okuma), fark {FARK:.3f} m3")
print(f"zincir: {len(ADIM)} adim, {len(ONERME)} onerme, "
      f"{sum(1 for o in ONERME if o[5])} tanesi onerinin savunulmasi icin gerekli")
for a in ADIM:
    print(f"  {a:<15} " + ", ".join(o[0] for o in ONERME if o[1] == a))
```

```
kurgu kume (tohum 20260218): 1329 abone, 3199 okuma
bulgu: dogu 24.674 m3 (557 okuma), kuzey 20.210 m3 (921 okuma), fark 4.463 m3
zincir: 5 adim, 16 onerme, 15 tanesi onerinin savunulmasi icin gerekli
  bulgu           O1, O2, O3, O4
  karsilastirma   O5, O6, O7
  sebep adayi     O8, O9, O10
  belirsizlik     O11, O12, O13
  oneri           O14, O15, O16
```

Anlatı burada bir üslup değil bir **önerme kümesidir**. Öneri savunulabilir olacaksa arkasında
duran önermelerin okuyucuya verilmiş olması gerekir; verilmeyen her önermeyi okuyucu kendisi
üretir. Modelin yaptığı iş bu üretimi saymaktır.

Üçüncü adımın adı da bilerek "sebep" değil **sebep adayıdır**. Rapor doğu bölgesinin taban
tüketiminin daha yüksek olduğunu bir aday olarak yazar, iki rakip adayı da yanına koyar ve
aralarında karar vermez; kümede bu kararı verecek bir düzenek yoktur. Adayları yazmak bir kaçamak
değil, okuyucunun tek adaya düşmesini engelleyen tek yoldur.

## Atlanan Adım

```python

# Zincirden bir adim cikarilir ve okuyucunun kendisinin tamamlamasi gereken
# gerekli onerme sayilir. Yanlis varsayilan: kumeye gore dogru olmayan tamamlama.
def bosluk(cikan=None, elenen=frozenset()):
    eksik = [o for o in ONERME if o[5] and (o[1] == cikan or o[0] in elenen)]
    yanlis = [o for o in eksik if o[4]]
    return eksik, yanlis, sum(1 for o in yanlis if o[6] > 0)


print(f"{'cikarilan adim':<22}{'okuyucunun cikarimi':>20}{'yanlis varsayilan':>19}"
      f"{'oneriyi guclendiren':>21}")
for a in [None] + ADIM:
    e, y, g = bosluk(a)
    print(f"{a or 'hicbiri (tam zincir)':<22}{len(e):>20}{len(y):>19}{g:>21}")
print(f"\ntum zincirdeki yanlis varsayilanlar ve yonleri")
for o in ONERME:
    if o[4]:
        print(f"  {o[0]:<4} {o[1]:<14} okuyucu su varsayilana duser: {o[3]:<28}"
              f"{'oneriyi guclendirir' if o[6] > 0 else 'oneriyi zayiflatir'}")
tumu = [o for o in ONERME if o[4]]
print(f"toplam {len(tumu)} yanlis varsayilandan {sum(1 for o in tumu if o[6] > 0)} tanesi "
      f"oneriyi guclendiriyor, {sum(1 for o in tumu if o[6] < 0)} tanesi zayiflatiyor")
```

```
cikarilan adim         okuyucunun cikarimi  yanlis varsayilan  oneriyi guclendiren
hicbiri (tam zincir)                     0                  0                    0
bulgu                                    4                  2                    2
karsilastirma                            3                  2                    1
sebep adayi                              2                  1                    1
belirsizlik                              3                  2                    2
oneri                                    3                  3                    2

tum zincirdeki yanlis varsayilanlar ve yonleri
  O3   bulgu          okuyucu su varsayilana duser: gozlem sayisi buyuktur      oneriyi guclendirir
  O4   bulgu          okuyucu su varsayilana duser: sayi kesindir               oneriyi guclendirir
  O6   karsilastirma  okuyucu su varsayilana duser: fark kucuktur               oneriyi zayiflatir
  O7   karsilastirma  okuyucu su varsayilana duser: fark tek onemli farktir     oneriyi guclendirir
  O9   sebep adayi    okuyucu su varsayilana duser: tek sebep vardir            oneriyi guclendirir
  O10  sebep adayi    okuyucu su varsayilana duser: tek sebep vardir            oneriyi guclendirir
  O12  belirsizlik    okuyucu su varsayilana duser: pay sifirdir                oneriyi guclendirir
  O13  belirsizlik    okuyucu su varsayilana duser: pay her seyi kapsar         oneriyi guclendirir
  O14  oneri          okuyucu su varsayilana duser: eylem okuyucunun secimidir  oneriyi zayiflatir
  O15  oneri          okuyucu su varsayilana duser: eylem geri alinabilir       oneriyi guclendirir
  O16  oneri          okuyucu su varsayilana duser: olcum yapilmayacak          oneriyi guclendirir
toplam 11 yanlis varsayilandan 9 tanesi oneriyi guclendiriyor, 2 tanesi zayiflatiyor
```

Tablonun ilk satırı zincirin tanımını doğruluyor: tam zincirde okuyucuya hiçbir çıkarım kalmıyor,
çünkü önerinin savunulması için gereken on beş önermenin on beşi de yazılmış durumda. Bu satır bir
başarı ölçüsü değil, ölçüm aracının kendi sıfır noktasıdır; geri kalan beş satır ona göre okunur.

Beş adımın hiçbiri ücretsiz değil. Bulgu çıkarıldığında dört, belirsizlik ve öneri çıkarıldığında
üçer, karşılaştırma çıkarıldığında üç, sebep adayı çıkarıldığında iki çıkarım okuyucuya kalıyor.
Sayılar birbirine yakın ve tek başına okunduğunda hangi adımın atlanmasının daha pahalı olduğunu
söylemiyor.

Ayrımı ikinci ve üçüncü sütun yapıyor. On bir yanlış varsayılanın dokuzu öneriyi
**güçlendiriyor**, yalnız ikisi zayıflatıyor. Boşluklar rastgele dolmuyor: okuyucu bir sayının
yanında pay göremediğinde payı sıfır sayıyor, rakip bir sebep adayı göremediğinde tek sebep
olduğunu varsayıyor, gözlem sayısı yazılmadığında sayının büyük bir kümeden geldiğini kabul ediyor.
Üçü de öneriyi olduğundan sağlam gösteriyor.

Bunun sonucu yöntemsel bir kuraldır. Bir anlatı adımını atlamak, öneriyi savunmayı **kolaylaştırır**
ve bu kolaylık yazarın niyetinden bağımsızdır. Zayıflatan iki varsayılan da bu kuralı bozmuyor,
tersine açıklıyor: okuyucu farkın büyüklüğünü görmediğinde onu küçük sayar, önerilen eylem
yazılmadığında eylemi kendisi seçer. Bu ikisi yazarın işine yaramadığı için atlanmaz; atlanan
adımlar, atlanınca işe yarayan adımlardır.

## Payın Yeri

Bu noktada K05'in oynama payının zincirin neresinde duracağı karara bağlanabilir. Üç yerleşim
denenir.

```python

# Payin anlatidaki yeri uc yerlesimle denenir. Pay K05'te olculdu ve burada
# yeniden hesaplanmaz; sorulan sey payin zincirin hangi adiminda durdugudur.
YERLESIM = [("pay hic yazilmaz", {"O4", "O11", "O12", "O13"}),
            ("pay yalniz sonda, kisitlar paragrafinda", {"O4"}),
            ("pay bulgunun yaninda ve belirsizlik adiminda", set())]
print(f"{'payin yerlesimi':<46}{'cikarim':>9}{'yanlis':>8}{'guclendiren':>13}")
for ad, el in YERLESIM:
    e, y, g = bosluk(elenen=el)
    print(f"{ad:<46}{len(e):>9}{len(y):>8}{g:>13}")

print("\n--- ucuncu yerlesimin zinciri ---------------------------------")
for a in ADIM:
    print(f"  [{a}]")
    for o in ONERME:
        if o[1] == a:
            print(f"     {o[0]:<4} {o[2]}{'' if o[5] else '   (gerekli degil)'}")
```

```
payin yerlesimi                                 cikarim  yanlis  guclendiren
pay hic yazilmaz                                      4       3            3
pay yalniz sonda, kisitlar paragrafinda               1       1            1
pay bulgunun yaninda ve belirsizlik adiminda          0       0            0

--- ucuncu yerlesimin zinciri ---------------------------------
  [bulgu]
     O1   dogu ortalamasi 24.674 m3
     O2   kuzey ortalamasi 20.210 m3
     O3   sayilar 557 ve 921 okumaya dayaniyor
     O4   bulgudaki sayi payiyla birlikte yazildi
  [karsilastirma]
     O5   fark 4.463 m3
     O6   fark kuzeyin yuzde 22.1'i
     O7   bes bolgenin en genis farki 10.896 m3 (dogu-bati)
  [sebep adayi]
     O8   aday: dogu taban tuketimi daha yuksek
     O9   rakip aday: okuma kapsamasi farki
     O10  rakip aday: tarife basamagi dagilimi   (gerekli degil)
  [belirsizlik]
     O11  K05: 2.000 karistirmada asilmadi
     O12  K05: dort kararin acikligi 0,206 m3
     O13  payin kapsamadigi adlandirildi
  [oneri]
     O14  onerilen eylem yazildi
     O15  eylemin geri alinabilirligi yazildi
     O16  eylem hangi olcutle olculecek
```

İkinci yerleşim yaygın olanıdır ve bir çıkarım açık bırakıyor. Pay yazılmıştır, ama sonda
yazılmıştır: okuyucu bulguyu okurken sayının yanında hiçbir aralık görmemiş ve "sayı kesindir"
varsayılanını çoktan kurmuştur. Sonda gelen kısıtlar paragrafı bu varsayılanı geri almaz; yalnız
yazarın kaydını temizler. Payın bir yeri değil **iki yeri** vardır ve birincisi bulgudaki sayının
yanıdır.

İkincisi belirsizlik adımıdır ve orada pay iki farklı şey söyler. K05'in 2.000 yeniden
karıştırmada aşılmayan farkı tek bir soruyu kapatır: bölge etiketleri rastgele dağılsaydı bu fark
çıkar mıydı. Dört savunulabilir kararın 0,206 m³'lük açıklığı bambaşka bir belirsizliktir ve
karıştırma payı onu hiç ölçmez. Bu yüzden zincirde üçüncü bir önerme duruyor: **payın kapsamadığı
adlandırılır.** Adlandırılmadığında okuyucunun düştüğü varsayılan "pay her şeyi kapsar" olur ve
bu varsayılan da öneriyi güçlendirenler arasındadır.

Zincirin son üç önermesi öneriyi bir eyleme bağlar: eylem yazılır, geri alınabilir olup olmadığı
yazılır, hangi ölçütle ölçüleceği yazılır. Sonuncusu önceki iki dersi buraya bağlar. Ölçüt yazılmazsa
öneri hiç sınanmaz; ölçüt yazılırsa tanımının sıkı olması gerekir, yoksa öneriyi değerlendiren
sayı ölçtüğü şeyi oynatmadan oynatılabilir.

## Özet

- Anlatı bir üslup değil beş adımlık bir önerme zinciridir: bulgu, karşılaştırma, sebep adayı,
  belirsizlik, öneri. Zincir on altı önerme taşır ve on beşi önerinin savunulması için gereklidir.
- Bir adım çıkarıldığında okuyucuya kalan çıkarım sayısı 2 ile 4 arasındadır; tek başına bu sayı
  hangi adımın daha pahalı olduğunu söylemez.
- Zincirin on bir yanlış varsayılanından dokuzu öneriyi güçlendirir, ikisi zayıflatır; bir adımı
  atlamak öneriyi savunmayı kolaylaştırır ve bu kolaylık yazarın niyetinden bağımsızdır.
- Oynama payının bir değil iki yeri vardır: bulgudaki sayının yanı ve belirsizlik adımı. Sonda
  ayrı bir kısıtlar paragrafı 1 çıkarım açık bırakır ve o çıkarım "sayı kesindir" varsayılanıdır.
- Belirsizlik adımı payın kapsamadığını da adlandırır: K05'in 2.000 karıştırmalık payı yalnız
  etiketlerin rastgele dağılması sorusunu kapatır, dört kararın 0,206 m³'lük açıklığını ölçmez.
- Üçüncü adım sebebi değil sebep adaylarını yazar; zincirin son üç önermesi öneriyi bir eyleme,
  eylemin geri alınabilirliğine ve onu sınayacak ölçüte bağlar.

## Sonraki Adım

Rapor artık bir zincir üzerinde duruyor: sayılar geri okunabilen bir düzende, ölçütlerin tanımı
sıkı, kaynağın kesme anı yazılı, anlatının halkaları tam. Bunların hepsi tek bir raporun **bir
kez** üretilmesiyle ilgili. Aynı raporun üç ay sonra, başka bir kişi tarafından, aynı sayıları
verecek biçimde yeniden üretilmesi hiç sorulmadı. Sonraki ders bunu sayar: aynı raporu ikinci kez
üretmek için kaç kalem sabit olmalı, biri eksik kaldığında sayı ne kadar oynuyor ve M26/K03 ile
M26/K04'ün saydığı kalemlerin üstüne raporun eklediği kaç kalem var.
