İçeriğe geç
academia.sh

Ders 01 / 18

Grafik Türü Seçimi

Aynı beş bölge ortalaması beş kodlama kanalından geçirilip geri okunuyor ve ortalama geri okuma hatası şöyle çıkıyor: konum 0,070 m³, uzunluk 0,183 m³, açı 0,543 m³, renk basamağı 0,931 m³, alan 2,468 m³. Doğu ile kuzey arasındaki 4,463 m³'lük fark alan kanalından 2,500 m³, açı kanalından 5,426 m³ olarak geri okunuyor ve tek bir okuma değişmiyor. Renk basamağı beş bölgeden dördünü ayırıyor, doğu ile merkez aynı basamağa düşüyor. Dört soru türünün her biri başka bir şeyin geri okunmasını istiyor ve kanal eşleştirmesi bu istekten çıkıyor.

İçindekiler

Bir önceki kurs on üç derste her sayının yanına oynama payını yazdı ve şu soruyla kapandı: bütün bu sayılar analistin ekranında, çıktı bloğu olarak duruyor. Kararı verecek kişi ne payı gördü ne de sayıyı. Sayı ekrandan çıkıp bir karar vericiye giderken bir gösterime biniyor ve o gösterimde ne olduğu hiç sorulmadı.

Bu kurs o soruyla açılır ve ölçüyü değiştirir. Önceki beş kursta sayı analistin elinde oynuyordu; burada sayı okuyucuya giderken oynuyor. Bir gösterim bir kodlama kanalıdır: sayı bir uzunluğa, konuma, açıya, alana ya da renk basamağına çevrilir, okuyucu da onu geri çevirir. Bu derste hiçbir resim üretilmez; her kanal iki işlevle kurulur ve ikisi de koşar. Dersin sayısı, aynı beş bölge ortalamasının beş kanaldan geçtikten sonra geri okunan halidir.

  • GT1. Bir gösterim bir kodlama kanalıdır. Kanal iki işlevle tanımlanır: kodlayıcı sayıyı kanala çevirir, çözücü kanaldan sayıyı geri okur. İkisi de kodda durur ve koşar.
  • GT2. Okuma çözünürlüğü bir sayıdır. Okuyucu bir kanalı sonsuz duyarlıkla okumaz; her kanalda ayırt edebildiği bir basamak sayısı vardır. Bu sayılar modelin varsayımıdır ve çıktının altında yazılıdır; ölçülen şey basamak sayısı değil, ondan çıkan farktır.
  • GT3. Ölçü farktır. çözücü(kodlayıcı(x)) ile x arasındaki fark geri okuma hatasıdır. Kaynaktaki sayı hiç değişmez; oynayan şey okuyucuya ulaşan sayıdır.
  • GT4. Alan kanalının çözücüsü alanı okumaz. Okuyucu şekli taşıyan doğrusal ölçüyü okur ve değeri ona oranla bildirir. Bu, çözünürlükten bağımsız, kanalın kendi ürettiği bir sapmadır.
  • GT5. Renk sürekli görünür, basamaklıdır. Değer bir gösterge çizelgesinin sınırlı sayıdaki basamağından birine düşer ve o basamağın orta değeri olarak geri okunur. Renk burada bir ad değil, bir basamak numarasıdır.
  • GT6. Kanalın başarısı soruya bağlıdır. Aynı kanal mutlak değeri kötü, payı iyi geri okutabilir. Hangi sorunun sorulduğu yazılmadan kanal seçilemez.
  • GT7. Karar eşiği yazılır. Bir geri okuma hatası ancak bir eşikle karşılaştırıldığında büyük ya da küçüktür ve eşik raporun vereceği karardan gelir.

Kanal, Kodlayıcı ve Çözücü

# kanal.py — MODELDIR: K03-K05'in kurgu olcum agi ayni tohumla yeniden uretilir
# (3.199 satirlik uzun bicimli okuma tablosu, 1.329 abone, uc donem, bes bolge).
# Grafik cizilmez: her gosterim bir kodlayici ile bir cozucuden ibarettir.
import math

TOHUM, HAM, M32 = 20260218, 1400, 0xFFFFFFFF
DONEM = ["2026-01", "2026-02", "2026-03"]
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


_k, _e = [], []
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])
    (_e if r() < 0.046 else _k).append(
        {"abone_no": 10001 + i, "bolge": b[0], "taban": b[2]})
GECERLI = {a["abone_no"] for a in _k}

OKUMA = []
for a in _k + _e:
    r = uretec(TOHUM + 7000 + a["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(
            a["taban"] * math.exp((r() + r() + r() - 1.5) * 0.62)
            * (1 - d * 0.05) * 100 + 0.5) / 100
        if a["abone_no"] not in GECERLI:
            r()
            continue
        OKUMA.append({"abone_no": a["abone_no"], "bolge": a["bolge"],
                      "donem": DONEM[d], "tuketim_m3": t})
        r()

AD = [b[0] for b in BOLGE]
ORT, GOZLEM = {}, {}
for ad in AD:
    v = [o["tuketim_m3"] for o in OKUMA if o["bolge"] == ad]
    ORT[ad], GOZLEM[ad] = sum(v) / len(v), len(v)
TOPLAM = sum(ORT.values())
ALT, UST = 0.0, 25.0

# Okuma cozunurlugu: okuyucunun o kanalda ayirt edebildigi basamak sayisi.
# Sayilar modelin varsayimidir; olculen sey bu varsayimdan cikan farktir.
COZ = {"konum": 100, "uzunluk": 40, "aci": 36, "alan": 20, "renk": 7}


def izgara(t, n):
    return round(t * n) / n


def kodla_konum(v):
    return (v - ALT) / (UST - ALT)


def coz_konum(p):
    return ALT + (UST - ALT) * izgara(p, COZ["konum"])


def kodla_uzunluk(v):
    return (v - ALT) / (UST - ALT)


def coz_uzunluk(u):
    return ALT + (UST - ALT) * izgara(u, COZ["uzunluk"])


def kodla_aci(v):
    return 360.0 * v / TOPLAM


def coz_aci(a):
    return TOPLAM * izgara(a / 360.0, COZ["aci"])


def kodla_alan(v):
    return (v - ALT) / (UST - ALT)


def coz_alan(al):
    # Okuyucu alani degil, sekli tasiyan dogrusal olcuyu okur: yaricap.
    return ALT + (UST - ALT) * izgara(math.sqrt(al), COZ["alan"])


def kodla_renk(v):
    return (v - ALT) / (UST - ALT)


def coz_renk(t):
    n = COZ["renk"]
    b = min(n - 1, int(t * n))
    return ALT + (UST - ALT) * (b + 0.5) / n


KANAL = [("konum", kodla_konum, coz_konum), ("uzunluk", kodla_uzunluk, coz_uzunluk),
         ("aci", kodla_aci, coz_aci), ("alan", kodla_alan, coz_alan),
         ("renk", kodla_renk, coz_renk)]

print(f"kurgu kume: {len(OKUMA)} okuma, {len(GECERLI)} abone, {len(AD)} bolge")
print("bolge ortalamalari: " + ", ".join(f"{ad} {ORT[ad]:.3f}" for ad in AD) + " m3")
print(f"toplam {TOPLAM:.3f} m3, deger ekseni {ALT:.0f}-{UST:.0f} m3")
print("okuma cozunurlugu (basamak): " + ", ".join(f"{k} {v}" for k, v in COZ.items()))
kurgu kume: 3199 okuma, 1329 abone, 5 bolge
bolge ortalamalari: kuzey 20.210, guney 16.602, dogu 24.674, bati 13.778, merkez 22.396 m3
toplam 97.659 m3, deger ekseni 0-25 m3
okuma cozunurlugu (basamak): konum 100, uzunluk 40, aci 36, alan 20, renk 7

Küme kurgudur ve önceki üç kursun kullandığı ölçüm ağının aynısıdır: aynı tohum, aynı 3.199 satır, aynı 1.329 abone. Bölge ortalamaları da aynı sayılardır; doğunun 24,674 m³’ü ile kuzeyin 20,210 m³’ü bir önceki kursta hesaplanmıştı ve burada girdi olarak alınır.

Beş kanalın çözünürlüğü şu gerekçelerle yazıldı. Konum ortak bir eksende okunur ve okuyucunun yanında bir ölçek durur; eksen üzerinde 100 basamak ayırt edilebilir kabul edildi. Uzunluk kendi tabanından ölçülür ve karşılaştırma ölçeğe değil komşu çubuğa yapılır; 40 basamak yazıldı. Açı bir dik açıya ve onun bölümlerine göre okunur, dokuzda biri kadar bir duyarlık varsayıldı ve daire 36 basamağa bölündü. Alan için basamak sayısı 20’dir ama asıl sorun orada değildir: çözücü alanı değil, alanı taşıyan doğrusal ölçüyü okur. Renk bir gösterge çizelgesinden okunur ve çizelgede birbirinden ayırt edilebilen basamak sayısı 7 kabul edildi.

Bu beş sayı tartışılabilir ve okuyucudan okuyucuya değişir. Dersin iddiası sayıların kendisi değil, sıralamanın onlardan çıkmasıdır: aynı değer bu beş kanaldan geçtiğinde geri okunan sayılar birbirinden ayrılır ve ayrılmanın yönü çözünürlük seçiminden bağımsız olarak aynı kalır.

Aynı Sayı Beş Kanaldan Geçiyor

# olcum.py — ayni bes sayi bes kanaldan gecer ve geri okunur. Olcu,
# cozucu(kodlayici(x)) ile x arasindaki farktir.
G = 40


def cubuk(v):
    return "#" * round(G * (v - ALT) / (UST - ALT))


print("uzunluk kanali, taban cizgisinden 40 basamak (okuyucunun gordugu):")
for ad in AD:
    print(f"{ad:8s}{ORT[ad]:7.3f} |{cubuk(ORT[ad]):<40s}| "
          f"geri okunan {coz_uzunluk(kodla_uzunluk(ORT[ad])):6.3f}")

print(f"\n{'bolge':8s}{'gozlem':>7s}{'kaynak':>9s}"
      + "".join(f"{k[0]:>10s}" for k in KANAL))
hata = {k[0]: [] for k in KANAL}
for ad in AD:
    x = ORT[ad]
    satir = f"{ad:8s}{GOZLEM[ad]:7d}{x:9.3f}"
    for k, kod, coz in KANAL:
        g = coz(kod(x))
        hata[k].append(abs(g - x))
        satir += f"{g:10.3f}"
    print(satir)
print(f"{'|hata|':8s}{sum(GOZLEM.values()):7d}{'':9s}"
      + "".join(f"{sum(hata[k[0]]) / len(AD):10.3f}" for k in KANAL))
uzunluk kanali, taban cizgisinden 40 basamak (okuyucunun gordugu):
kuzey    20.210 |################################        | geri okunan 20.000
guney    16.602 |###########################             | geri okunan 16.875
dogu     24.674 |####################################### | geri okunan 24.375
bati     13.778 |######################                  | geri okunan 13.750
merkez   22.396 |####################################    | geri okunan 22.500

bolge    gozlem   kaynak     konum   uzunluk       aci      alan      renk
kuzey       921   20.210    20.250    20.000    18.989    22.500    19.643
guney       645   16.602    16.500    16.875    16.277    20.000    16.071
dogu        557   24.674    24.750    24.375    24.415    25.000    23.214
bati        476   13.778    13.750    13.750    13.564    18.750    12.500
merkez      600   22.396    22.500    22.500    21.702    23.750    23.214
|hata|     3199              0.070     0.183     0.543     2.468     0.931

Çubuklar dersin bütün gösterim aygıtıdır: okuyucu kırk basamaklık bir çizgide bir uç görür ve o uçtan bir sayı çıkarır. Kuzeyin 20,210 m³’ü kırk basamağın otuz ikisini doldurur ve otuz iki basamak 20,000 m³ olarak geri okunur; aradaki 0,210 m³ kaybolmuştur çünkü otuz ikinci ile otuz üçüncü basamak arasında bir yer yoktur.

Beş kanalın ortalama geri okuma hatası 0,070 ile 2,468 m³ arasında değişir; en iyi kanal ile en kötüsü arasında otuz beş kat vardır. Sıra şudur: konum, uzunluk, açı, renk basamağı, alan. İlk ikisi arasındaki fark yalnız çözünürlüktendir. Açıdan sonrası ise başka bir şey söyler.

Alan kanalı tek başına ele alınmayı hak eder, çünkü hatası çözünürlüğü artırarak küçültülemez. Batının 13,778 m³’ü 18,750 olarak geri okunur, yani beş m³’ten fazla yukarı çıkar; doğunun 24,674 m³’ü ise neredeyse yerinde kalır. Sapma her değerde aynı yöndedir ve küçük değerler olduklarından büyük görünür. Sebebi GT4’tedir: alan değerle orantılı büyür, okuyucu ise alanı değil onu taşıyan doğrusal ölçüyü okur. Bu, kanalın kullanım hatası değil kendisidir.

Renk basamağı başka bir biçimde takılır. Doğu 23,214, merkez de 23,214 okunur — iki bölge aynı basamağa düşmüştür ve okuyucu için artık iki ayrı sayı değil tek bir sayıdır. Yedi basamaklı bir çizelgede 25 m³’lük eksen 3,571 m³’lük dilimlere bölünür ve bu dilimden dar olan her fark yok olur.

Bir önceki kursun başlık sayısı burada sınanır. Doğu ile kuzey arasındaki fark 4,463 m³’tü ve oynama payıyla birlikte raporlanmıştı. Aynı fark alan kanalından 2,500 m³ olarak, açı kanalından 5,426 m³ olarak geri okunur. Kaynaktaki tek bir okuma değişmemiştir; değişen tek şey sayının hangi kanala bindiğidir. M26/K02’nin tablo-ozet/04 dersi aynı türden bir oynamayı eksen kırpmasıyla ölçmüştü ve orada ölçülen şey gösterimin meşruluğuydu: bu grafik bu ölçekte olur mu. Buradaki ölçü başkadır ve gösterim tamamen meşruyken de çalışır — pasta da, kabarcık da, ısı haritası da kurallara uygundur, yine de sayıyı oynatırlar.

Soru Türü Kanalı Seçer

# soru.py — dort soru turu, dort ayri geri okuma. Bir kanalin o soruya
# uygunlugu, sorunun istedigi seyin karar esigi icinde geri okunmasidir.
ESIK_FARK, ESIK_PAY = 0.5, 1.0
fark = ORT["dogu"] - ORT["kuzey"]
pay = {ad: ORT[ad] / TOPLAM for ad in AD}
print(f"kaynaktaki fark dogu-kuzey {fark:.3f} m3; karar esigi {ESIK_FARK} m3, "
      f"pay esigi {ESIK_PAY} puan")
print(f"{'kanal':9s}{'geri okunan fark':>18s}{'sapma':>8s}{'ayirt':>8s}"
      f"{'en buyuk pay hatasi':>21s}")
sonuc = {}
for k, kod, coz in KANAL:
    g = {ad: coz(kod(ORT[ad])) for ad in AD}
    gf = g["dogu"] - g["kuzey"]
    t = sum(g.values())
    gp = max(abs(100 * g[ad] / t - 100 * pay[ad]) for ad in AD)
    ayri = len({round(g[ad], 6) for ad in AD})
    sonuc[k] = (abs(gf - fark) <= ESIK_FARK, ayri == len(AD), gp <= ESIK_PAY)
    print(f"{k:9s}{gf:18.3f}{abs(gf - fark):8.3f}{ayri:6d}/5{gp:21.2f}")

SORU = [("karsilastirma", "iki degerin farki"), ("dagilim", "bes degerin sirasi"),
        ("bilesim", "her degerin payi")]
print(f"\n{'soru':16s}{'geri okunmasi gereken':24s}"
      + "".join(f"{k[0]:>9s}" for k in KANAL))
for j, (ad, ne) in enumerate(SORU):
    print(f"{ad:16s}{ne:24s}"
          + "".join(f"{'evet' if sonuc[k[0]][j] else 'hayir':>9s}" for k in KANAL))
print(f"{'iliski':16s}{'iki deger ayni anda':24s}"
      + "".join(f"{'evet' if k[0] == 'konum' else 'hayir':>9s}" for k in KANAL))
kaynaktaki fark dogu-kuzey 4.463 m3; karar esigi 0.5 m3, pay esigi 1.0 puan
kanal      geri okunan fark   sapma   ayirt  en buyuk pay hatasi
konum                 4.500   0.037     5/5                 0.12
uzunluk               4.375   0.088     5/5                 0.31
aci                   5.426   0.962     5/5                 0.69
alan                  2.500   1.963     5/5                 2.94
renk                  3.571   0.892     4/5                 1.60

soru            geri okunmasi gereken       konum  uzunluk      aci     alan     renk
karsilastirma   iki degerin farki            evet     evet    hayir    hayir    hayir
dagilim         bes degerin sirasi           evet     evet     evet     evet    hayir
bilesim         her degerin payi             evet     evet     evet    hayir    hayir
iliski          iki deger ayni anda          evet    hayir    hayir    hayir    hayir

İki eşik yazıldı ve ikisi de rapordan gelir. 0,5 m³, bölge farkının rapora iki ondalıkla yazılmasından ve saha ekibinin hangi bölgeye gideceğine bir m³’lük farkla karar verilmesinden çıkar. 1,0 puan, payın raporda tam sayı yüzde olarak yazılmasından çıkar: bir puanlık hata yazılan rakamı değiştirir. Eşik yazılmadan hiçbir geri okuma hatası büyük ya da küçük değildir.

Tablonun ilk satırı beklenendir: karşılaştırma sorusunu yalnız konum ve uzunluk taşır. İkinci satır kanalların çoğunu geçirir, çünkü sıralamayı korumak bir kanaldan istenebilecek en hafif iştir; yalnız renk basamağı takılır ve tam olarak yukarıda görülen sebeple, iki bölge aynı basamağa düştüğü için.

Üçüncü satır beklenmediktir. Açı kanalı payı geçirir ama farkı geçirmez. Sebebi kodlayıcıdadır: açı zaten payı kodlar, mutlak değeri değil. Açının çözünürlüğü paydan yana harcanır ve pay hatası 0,69 puanda kalırken aynı kanalın mutlak fark hatası 0,962 m³’e çıkar. Bunun tersi de doğrudur: alan kanalı hiçbir soruyu geçirmez, çünkü GT4’teki sapma hem farkı hem payı bozar ve payı 2,94 puanla en çok bozan kanaldır.

Dördüncü satır ölçülmez, sayılır. İlişki sorusu iki değerin aynı anda geri okunmasını ister ve bunun için kanalın ikinci bir bağımsız kopyası gerekir. Yalnız konumun iki kopyası vardır, yatay ve düşey eksen; uzunluğun, açının, alanın ve rengin ikinci kopyası yoktur. Bu yüzden ilişki sorusu bir kanal tercihi değil, bir kanal zorunluluğudur.

Buradan çıkan kural GT6’nın somut halidir: kanal veriden değil sorudan seçilir. Aynı beş sayı, “hangisi daha büyük” sorusuna dört kanaldan, “ne kadar büyük” sorusuna iki kanaldan, “toplamın ne kadarı” sorusuna üç kanaldan cevap verir.

Özet

  • Bir gösterim iki işlevle modellenir: kodlayıcı sayıyı kanala çevirir, çözücü kanaldan sayıyı geri okur; ölçü ikisinin bileşimi ile kaynaktaki sayı arasındaki geri okuma hatasıdır.
  • Okuma çözünürlüğü bir sayı olarak yazılır — konum 100, uzunluk 40, açı 36, alan 20, renk 7 basamak — ve bu sayılar modelin varsayımıdır, ölçülen şey onlardan çıkan farktır.
  • Aynı beş bölge ortalamasının ortalama geri okuma hatası konumda 0,070, uzunlukta 0,183, açıda 0,543, renk basamağında 0,931, alanda 2,468 m³ çıkar.
  • Alanın hatası çözünürlükle küçültülemez, çünkü çözücü alanı değil doğrusal ölçüyü okur; renk basamağı ise beş bölgeden yalnız dördünü ayırır, doğu ile merkez aynı basamağa düşer.
  • Doğu ile kuzey arasındaki 4,463 m³’lük fark alandan 2,500 m³, açıdan 5,426 m³ olarak geri okunur ve kaynaktaki tek bir okuma değişmez.
  • Kanal veriden değil sorudan seçilir: açı payı geçirir ama farkı geçirmez, ilişki sorusu ise kanalın ikinci bağımsız kopyasını ister ve bu kopya yalnız konumda vardır.

Sonraki Adım

Bu derste her bölge tek bir sayıya indirilmişti ve kanal o tek sayıyı taşıdı. Rapordaki soruların bir kısmı ise tek sayıyla cevaplanmaz: kuzeyin 921 okuması nasıl dizilmiş, iki tepe mi var yoksa bir mi, uç değerler nerede duruyor. Sonraki ders aynı ölçüyü bir dağılıma uygular ve üç gösterimi karşılaştırır — aralık sayımı, kutu özeti ve yoğunluk. Geri okunacak şey artık bir sayı değil bir biçim özelliğidir ve ölçü, üç gösterimden hangisinin ikinci tepeyi geri okuttuğudur. Aralık genişliğinin bir karar olduğu ve bu kararın geri okunan tepe sayısını oynattığı sayıyla gösterilir.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat