İçeriğe geç
academia.sh

Ders 07 / 18

Görsel Yanıltma

Doğu ile kuzey arasındaki 1,2208'lik gerçek oran, eksen 18 m³'ten başlatıldığında 3,0769 çubuk oranı veriyor ve uzunluğu değerle orantılı sanan okuyucu kuzeyi 20,210 yerine 8,019 m³ okuyor. Aynı oran bir kareye kodlandığında iki kenar da çarpıldığı için alan oranı 1,4905 çıkıyor ve doğu 30,123 m³ okunuyor. Farklı birimli iki dizi için dokuz savunulabilir eksen çiftinden yedi ayrı kesişme dönemi çıkıyor. Düzensiz aralıklı 12 dönem eşit aralıklarla dizildiğinde -0,2079 m³/dönemlik eğim -0,6635 okunuyor. Dördü de savunulabilir bir varsayılan davranıştan doğuyor.

İçindekiler

Önceki ders bir çarpıtmayı hiçbir tercihe bağlamadan ölçtü: bölgelerin alanı ızgarada verilidir ve esneme düz bir yüzeye basmanın bedelidir. Yine de geri okunan sayı 1,228 m³ kaydı. Bu ders aynı soruyu genişletir ve dört ayrı çarpıtmayı tek bir aile olarak ele alır. Ailenin ortak özelliği şudur: her üye kanalın kendi tanımından doğar, hiçbiri hesap hatası değildir ve hiçbiri kasıt gerektirmez.

Eksen kırpmanın çubuk uzunluklarının oranını bozması Elektronik Tablolarla Analiz kursunun temel grafikler dersinde ölçüldü ve o sayı burada tekrarlanmaz. Orada ölçü gösterimin meşruluğuydu — bu grafik bu ölçekte olur mu. Burada kırpma, ailenin dört üyesinden yalnız biridir ve aynı veriye sırayla uygulanan dört işlemin ilkidir. Ölçülen şey her üyenin geri okuttuğu sayıdır.

  • GT37. Çarpıtma kanalın tanımından doğar. Uzunluk kanalı tabana göre okunur, alan kanalı iki boyutta birden büyür, konum kanalı eksen aralığına bağlıdır. Hiçbiri hesabı bozmaz, üçü de geri okumayı bozar.
  • GT38. Okuyucunun çözücüsü değiştirilemez. Okuyucu uzunluğu değerle, alanı değerle, komşu noktaları eşit dönem aralığıyla orantılı sayar. Gösterim bu varsayımı yanlışlarsa hata gösterime değil okuyucuya yazılır.
  • GT39. Alan kanalı oranı karesiyle büyütür. Bir oranı “büyük göstermek” için şeklin iki kenarı birden çarpılırsa alan oranı değer oranının karesi olur.
  • GT40. İkili eksende kesişmenin veride karşılığı yoktur. İki dizi farklı birimdeyse kesişme dönemi iki eksen aralığının seçimiyle belirlenir ve seçimler savunulabilir olduğu halde tek bir sayı vermez.
  • GT41. Düzensiz aralık eşit dizildiğinde eğim adım sayısıyla ölçülür. Okuyucu adımı dönem sanar; büyütme çarpanı dönem açıklığının adım sayısına bölümüdür.
  • GT42. Diziler kurgudur. 36 dönemlik tüketim ve okuma sayısı dizileri aynı tohumla türetildi ve kurgu olduğu koda yazılıdır.

Uzunluk: Eksen Kırpma

# yaniltma.py — MODELDIR: K03-K05'in kurgu olcum agi ayni tohumla uretilir.
# 36 donemlik iki dizi de KURGUDUR ve ayni tohumla turetildi: tuketim
# ortalamasi (m3) ve donem basina okuma sayisi (adet).
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]
DEGER = {a: sum(o["tuketim_m3"] for o in OKUMA if o["bolge"] == a)
         / sum(1 for o in OKUMA if o["bolge"] == a) for a in AD}
N = 36
_g = uretec(TOHUM + 505)
TUKETIM = [round(DEGER["kuzey"] - 0.140 * t
                 + 2.20 * math.sin(2 * math.pi * t / 12)
                 + (_g() + _g() + _g() - 1.5) * 0.60, 3) for t in range(N)]
_h = uretec(TOHUM + 917)
SAYAC = [round(1066 + 6.4 * t + 40 * math.sin(2 * math.pi * t / 12)
               + (_h() + _h() + _h() - 1.5) * 26) for t in range(N)]

GENIS = 40


def uzunluk(v, taban, tepe):
    """Kodlayici: deger -> uzunluk. Cubuk tam karaktere yuvarlanir."""
    return max(0, round(GENIS * (v - taban) / (tepe - taban)))


def coz_uzunluk(u, taban, tepe):
    """Cozucu: uzunluk -> deger. Okuma cozunurlugu bir karakterdir."""
    return taban + u / GENIS * (tepe - taban)


a, b = DEGER["dogu"], DEGER["kuzey"]
GERCEK = a / b
print(f"dogu {a:.3f} m3, kuzey {b:.3f} m3, gercek oran {GERCEK:.4f}")
for taban in (0.0, 18.0):
    ua, ub = uzunluk(a, taban, a), uzunluk(b, taban, a)
    print(f"eksen {taban:4.0f} m3'ten: dogu  |{'#' * ua}")
    print(f"              kuzey |{'#' * ub}")
    print(f"  cubuk orani {ua / ub:.4f}; uzunlugu degerle orantili sanan "
          f"okuyucu kuzeyi {coz_uzunluk(ub, 0.0, a):.3f} m3 okur")
KIRPIK = uzunluk(a, 18.0, a) / uzunluk(b, 18.0, a)
print(f"kirpma orani {GERCEK:.4f} -> {KIRPIK:.4f}, buyutme carpani "
      f"{KIRPIK / GERCEK:.3f}; kuzeyde geri okuma hatasi "
      f"{coz_uzunluk(uzunluk(b, 18.0, a), 0.0, a) - b:+.3f} m3")
dogu 24.674 m3, kuzey 20.210 m3, gercek oran 1.2208
eksen    0 m3'ten: dogu  |########################################
              kuzey |#################################
  cubuk orani 1.2121; uzunlugu degerle orantili sanan okuyucu kuzeyi 20.356 m3 okur
eksen   18 m3'ten: dogu  |########################################
              kuzey |#############
  cubuk orani 3.0769; uzunlugu degerle orantili sanan okuyucu kuzeyi 8.019 m3 okur
kirpma orani 1.2208 -> 3.0769, buyutme carpani 2.520; kuzeyde geri okuma hatasi -12.191 m3

İki çubuk kümesi aynı iki sayıyı taşıyor. Sıfırdan başlayan eksende oran 1,2121 çıkıyor; gerçek oran 1,2208’dir ve aradaki fark çubukların tam karaktere yuvarlanmasından, yani okuma çözünürlüğünden gelir. 18 m³’ten başlayan eksende aynı iki sayının oranı 3,0769 oluyor.

Asıl sayı son satırdadır. Uzunluğu değerle orantılı sayan bir okuyucu kırpılmış gösterimden kuzeyi 8,019 m³ okur; gerçek değer 20,210’dur ve geri okuma hatası -12,191 m³’tür. Ne veri değişti ne de bir hesap yanlış yapıldı.

Bu kararın nereden geldiği önemlidir. İki bölgenin ortalaması 20,210 ile 24,674 arasında sıkışık ve sıfırdan başlayan bir eksende iki çubuk neredeyse aynı görünüyor. “Farkı görünür kıl” bir tasarım gereğidir ve bir önceki kurs bunu meşru bir karar olarak ele almıştı — çizgi grafiğinde okunan şey eğim olduğu için orada eksen kırpılabilir. Aynı karar uzunluk kanalında uygulandığında okuyucunun çözücüsünü yanlışlar. Karar aynıdır, kanal farklıdır, sonuç 12 m³’lük bir hatadır.

Alan: Oranın Karesi

# alan.py — "iki kat buyuk goster" karari sekli iki boyutta birden buyutur;
# okuyucu alani okur ve oran karesiyle geri doner.
KENAR = 12


def alan_kodla(oran):
    """Kodlayici: oran -> alan. Iki kenar da oranla carpilir."""
    k = KENAR * oran
    return k * k


def alan_coz(al):
    """Cozucu: alan -> deger. Okuyucu alani degerle orantili sanar."""
    return b * al / (KENAR * KENAR)


al_a, al_b = alan_kodla(GERCEK), alan_kodla(1.0)
print(f"kuzey karesi {KENAR}x{KENAR} = {al_b:.0f} birim alan")
print(f"dogu karesi {KENAR * GERCEK:.2f}x{KENAR * GERCEK:.2f} = {al_a:.1f} birim alan")
print(f"alan orani {al_a / al_b:.4f} = gercek oranin karesi {GERCEK ** 2:.4f}")
print(f"geri okunan dogu degeri {alan_coz(al_a):.3f} m3, gercek {a:.3f} m3, "
      f"hata {alan_coz(al_a) - a:+.3f} m3")
kuzey karesi 12x12 = 144 birim alan
dogu karesi 14.65x14.65 = 214.6 birim alan
alan orani 1.4905 = gercek oranin karesi 1.4905
geri okunan dogu degeri 30.123 m3, gercek 24.674 m3, hata +5.449 m3

Ailenin ikinci üyesi eksene hiç dokunmaz. Doğunun kuzeyden 1,2208 kat büyük olduğunu göstermek için doğunun karesi 1,2208 ile ölçeklenir; ölçekleme iki kenara birden uygulanır çünkü kare kare kalmalıdır. Sonuç, alan oranının 1,4905 olmasıdır ve bu sayı değer oranının karesidir.

Okuyucu alanı görür, kenarı değil. Alanı değerle orantılı sayan bir okuyucu doğuyu 30,123 m³ okur; gerçek değer 24,674’tür ve geri okuma hatası +5,449 m³’tür. Büyütme çarpanı 1,2208, yani oranın kendisi kadardır — oran ne kadar büyükse çarpıtma da o kadar büyür.

Bu üye eksen kırpmadan iki bakımdan farklıdır. Birincisi, düzeltilemez: kenar oranını değerin karekökü yapmak alanı düzeltir ama bu kez kenar oranı veriye ait olmaktan çıkar ve kenarı okuyan biri yanılır. İkincisi, kararın kendisi görünmez; eksen tabanı bir sayıdır ve yazılabilir, “hangi boyut ölçeklendi” ise gösterimde hiçbir yerde durmaz.

Konum: İkili Eksen ve Düzensiz Aralık

# ikili.py — iki dizi iki ayri birimde. Her eksen kendi araligina cekildiginde
# kesisme donemi eksen secimiyle belirlenir.
SATIR = 12


def konum(v, alt, ust):
    return max(0, min(SATIR - 1, round((v - alt) / (ust - alt) * (SATIR - 1))))


def secenekler(v):
    en, ec = min(v), max(v)
    return {"sifirdan": (0.0, ec),
            "veri araligi": (math.floor(en), math.ceil(ec)),
            "genis": (math.floor(en) - (ec - en) * 0.5, math.ceil(ec))}


sa, sb = secenekler(TUKETIM), secenekler(SAYAC)
print("tuketim ekseni  sayac ekseni    kesisme donemi")
kesisme = set()
for na, (aa, au) in sa.items():
    for nb, (ba, bu) in sb.items():
        k = next((t for t in range(N)
                  if konum(TUKETIM[t], aa, au) <= konum(SAYAC[t], ba, bu)), None)
        kesisme.add(k)
        print(f"{na:14s}  {nb:14s} {str(k):>15s}")
print(f"{len(sa) * len(sb)} savunulabilir eksen ciftinden "
      f"{len(kesisme)} farkli kesisme donemi cikiyor")
print(f"iki dizinin birimleri farkli (m3 ve adet); kesisme donemi veride "
      f"karsiligi olmayan bir sayidir")
tuketim ekseni  sayac ekseni    kesisme donemi
sifirdan        sifirdan                     5
sifirdan        veri araligi                25
sifirdan        genis                       19
veri araligi    sifirdan                     0
veri araligi    veri araligi                18
veri araligi    genis                        8
genis           sifirdan                     0
genis           veri araligi                19
genis           genis                       17
9 savunulabilir eksen ciftinden 7 farkli kesisme donemi cikiyor
iki dizinin birimleri farkli (m3 ve adet); kesisme donemi veride karsiligi olmayan bir sayidir

İkili eksen, ailenin en zor savunulan üyesidir çünkü var olma nedeni meşrudur: tüketim ortalaması m³, dönem başına okuma sayısı adet cinsindendir ve ikisini tek eksene koymak bir seriyi düz bir çizgiye indirger. Her seriyi kendi aralığına çekmek doğal çözümdür.

Bedeli tablodadır. Dokuz savunulabilir eksen çiftinden yedi ayrı kesişme dönemi çıkıyor ve aralarında 0. dönemle 25. dönem gibi birbirinden tamamen farklı yanıtlar var. Okuyucunun bu gösterimden çıkardığı “şu dönemde biri ötekini geçti” cümlesi veride hiçbir şeye karşılık gelmez; iki farklı birimin karşılaştırılabilir olduğu izlenimi tümüyle eksen seçiminin ürünüdür. Diğer üç üyede geri okunan sayının bir hatası vardı; burada geri okunan sayının kaynağı yoktur.

# aralik.py — elde bulunan donemler esit araliklarla dizilirse egim bozulur.
ELDE = [0, 1, 2, 3, 4, 5, 6, 12, 18, 24, 30, 35]


def egim(xs, ys):
    n = len(xs)
    ox, oy = sum(xs) / n, sum(ys) / n
    return (sum((xs[i] - ox) * (ys[i] - oy) for i in range(n))
            / sum((x - ox) ** 2 for x in xs))


y = [TUKETIM[t] for t in ELDE]
ara = [ELDE[i + 1] - ELDE[i] for i in range(len(ELDE) - 1)]
dogru = egim(ELDE, y)
cizilen = egim(list(range(len(ELDE))), y)
print(f"{len(ELDE)} donem elde var, {ELDE[0]}. donemden {ELDE[-1]}. doneme "
      f"yayiliyor; aralar {min(ara)}-{max(ara)} donem")
print(f"gercek egim {dogru:+.4f} m3/donem ({ELDE[-1] - ELDE[0]} donemlik yayilim)")
print(f"esit araliklarla cizilen gosterimden okunan egim {cizilen:+.4f} "
      f"m3/donem ({len(ELDE) - 1} adim), buyutme {cizilen / dogru:.2f} kat")
print("adim  gercek aralik  gercek egim  cizilen egim")
for i in (0, 6, 7, len(ara) - 1):
    print(f"{i:4d} {ara[i]:14d} {(y[i + 1] - y[i]) / ara[i]:+12.4f} "
          f"{y[i + 1] - y[i]:+13.4f}")

TABLO = [("eksen kirpma", "uzunluk", f"{GERCEK:.4f}", f"{KIRPIK:.4f}",
          f"{KIRPIK / GERCEK:.2f} kat", "eksen tabani"),
         ("alan buyutme", "alan", f"{GERCEK:.4f}", f"{al_a / al_b:.4f}",
          f"{(al_a / al_b) / GERCEK:.2f} kat", "kenar mi alan mi olceklendi"),
         ("ikili eksen", "konum", "yok", f"{len(kesisme)} ayri donem",
          "-", "iki eksenin araligi"),
         ("duzensiz aralik", "konum", f"{dogru:.4f}", f"{cizilen:.4f}",
          f"{cizilen / dogru:.2f} kat", "donem araliklari")]
print("carpitma         kanal    kaynak    geri okunan   buyutme   yazilmayan karar")
for ad, kanal, kay, geri, buy, satir in TABLO:
    print(f"{ad:16s} {kanal:8s} {kay:>8s} {geri:>13s} {buy:>9s}   {satir}")
12 donem elde var, 0. donemden 35. doneme yayiliyor; aralar 1-6 donem
gercek egim -0.2079 m3/donem (35 donemlik yayilim)
esit araliklarla cizilen gosterimden okunan egim -0.6635 m3/donem (11 adim), buyutme 3.19 kat
adim  gercek aralik  gercek egim  cizilen egim
   0              1      +1.3370       +1.3370
   6              6      -0.1895       -1.1370
   7              6      -0.0655       -0.3930
  10              5      -0.3822       -1.9110
carpitma         kanal    kaynak    geri okunan   buyutme   yazilmayan karar
eksen kirpma     uzunluk    1.2208        3.0769  2.52 kat   eksen tabani
alan buyutme     alan       1.2208        1.4905  1.22 kat   kenar mi alan mi olceklendi
ikili eksen      konum         yok  7 ayri donem         -   iki eksenin araligi
duzensiz aralik  konum     -0.2079       -0.6635  3.19 kat   donem araliklari

Dördüncü üye en sık ve en fark edilmeden ortaya çıkanıdır. Elde 12 dönem var ve bunlar 0. dönemden 35. döneme yayılıyor; aralar 1 ile 6 dönem arasında değişiyor. Gösterim onları sırayla ve eşit aralıklarla diziyor, çünkü elde bulunanı sırayla dizmek varsayılan davranıştır.

Eğim -0,2079 m³/dönem yerine -0,6635 okunuyor, 3,19 kat büyük. Çarpan dönem açıklığının adım sayısına bölümüdür: 35 bölü 11. Adım tablosu bunun adım adım nasıl oluştuğunu gösteriyor — 0. adımda gerçek aralık bir dönemdir ve iki sayı çakışıyor, 6. adımda aralık altı döneme çıkıyor ve dönem başına -0,1895 olan düşüş gösterimde -1,1370 olarak okunuyor.

Son tablo dört üyeyi yan yana koyuyor. Son sütun, dördünün ortak yanıdır: her birinde geri okumayı düzeltecek bilgi gösterimin dışında kalmıştır. Eksen tabanı bir sayıdır ve yazılabilir; dönem aralıkları da öyle. “Hangi boyut ölçeklendi” ve “iki eksenin aralığı ne” ise ancak gösterimin yapıldığı yerde bilinir ve okuyucuya hiç ulaşmaz. Dördü de bir savunulabilir varsayılandan doğdu: farkı görünür kıl, şekli oranla büyüt, iki seriyi kendi aralığına çek, elde bulunanı sırayla diz. Yanıltma bunların hiçbirinde kasıt gerektirmedi.

Özet

  • Dört çarpıtma tek bir ailedir: kanalın kendi tanımından doğar, hesabı bozmaz, geri okumayı bozar.
  • Eksen 18 m³’ten başlatıldığında 1,2208’lik oran 3,0769 okunuyor ve uzunluğu değerle orantılı sayan okuyucu kuzeyi 20,210 yerine 8,019 m³ okuyor, hata -12,191 m³.
  • Aynı oran bir kareye kodlandığında iki kenar birden çarpıldığı için alan oranı 1,4905, yani oranın karesi oluyor; doğu 30,123 m³ okunuyor ve hata +5,449 m³.
  • Farklı birimli iki dizide dokuz savunulabilir eksen çiftinden yedi ayrı kesişme dönemi çıkıyor; geri okunan sayının kaynakta karşılığı yok.
  • Düzensiz aralıklı 12 dönem eşit dizildiğinde -0,2079 m³/dönemlik eğim -0,6635 okunuyor; çarpan dönem açıklığının adım sayısına bölümü, 35 bölü 11’dir.
  • Dördünde de geri okumayı düzeltecek bilgi gösterimin dışında kalıyor ve dördü de savunulabilir bir varsayılan davranıştan doğuyor.

Sonraki Adım

Bu ders çarpıtmanın kasıt gerektirmediğini gösterdi; her üyede gösterim doğru kurulmuş, tek bir sayı yanlış hesaplanmamıştı. Bir varsayım hâlâ el değmeden duruyor: okuyucunun kanalı okuyabildiği. Sonraki ders bunu ölçer. Renk tek kodlama kanalıyken kaç seri birbirinden ayırt edilemez kalıyor sayılır, ve şekil, doğrudan etiketleme ile sıralamadan oluşan yedekli kodlama bu sayıyı kaça indiriyor ölçülür. Karşıtlık oranı hesabı ve renk sistemi arayüz kurslarının işidir ve tekrarlanmaz; burada sayılan yalnız veriye özgü olandır.

İ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