Ders 03 / 18
Kategorik Görselleştirme
Beş bölge ve dört tarife basamağından oluşan çapraz tablo iki gösterimle kodlanıyor ve fark taban çizgisinde çıkıyor: yığılmış gösterimde alttaki dilim konum kanalından okunuyor ve oransal hatası yüzde 2,7, üstteki dilimler uzunluk kanalından okunuyor ve hata üçüncü dilimde yüzde 22,0, dördüncüde yüzde 47,2 oluyor. Kuzeyin 8 okumalık dördüncü dilimi ile batının 11 okumalık üçüncü dilimi sıfır okunuyor, yani gösterimden tamamen çıkıyor. Ayrılması gereken 39 bölge çiftinden yığılmış gösterim 35'ini ayırıyor, gruplu gösterim 39'unu; hiçbir çift ters okunmuyor, kaybolan şey sıra değil ayrım. Aynı yığılmış gösterim toplamı tek okumayla veriyor: 921 gözlem 920 olarak geri geliyor.
İçindekiler
Bir önceki ders sürekli bir değerin dağılımını üç gösterimle kodladı. Rapordaki soruların bir bölümü ise sürekli değil kategoriktir: beş bölgenin dört tarife basamağındaki okuma sayısı, bu sayıların bölge içindeki payı, bir basamağın bölgeler arasındaki sırası. Kategorik veri bir çapraz tabloda durur ve o tablo iki farklı biçimde gösterilebilir — dilimler ya üst üste yığılır ya da yan yana dizilir.
Bu iki biçim arasındaki fark bir üslup tercihi değil, bir kanal farkıdır. Yığılmış gösterimde yalnız en alttaki dilim eksenin sıfırından başlar; öbürleri eksenin üzerinde yüzer ve okuyucunun elinde onları ölçecek bir başlangıç noktası yoktur. Dersin sayısı bu farkın gözlem cinsinden karşılığıdır.
- GT14. Yığılmış gösterimde tek bir taban çizgisi vardır. Alttaki dilim eksenin sıfırından başlar ve konum kanalından okunur; üstteki dilimlerin alt kenarı eksende değil, bir önceki dilimin bittiği yerdedir.
- GT15. Yüzen dilim uzunluk kanalından okunur. Okuyucu iki konumu okuyup çıkarmaz, dilimin uzunluğuna bakar. Birinci dersin çözünürlükleri sürer: konum 100, uzunluk 40 basamak.
- GT16. Eksen açıklığı gösterimden gelir. Yığılmış eksen toplamı taşımak zorundadır, gruplu eksen yalnız en büyük dilimi. Aynı basamak sayısı iki gösterimde farklı büyüklükte bir basamak demektir.
- GT17. Eksen basamağının yarısından küçük dilim sıfır okunur. Kaynakta duran bir dilim gösterimden tamamen çıkar ve okuyucunun eline “yok” olarak geçer.
- GT18. Kategorik sorunun karşılaştırması kategoriler arasıdır. Ölçü, aynı basamakta ayrılması gereken bölge çiftlerinden kaçının ayrıldığıdır.
- GT19. Yığılmış gösterim toplamı tek okumayla verir. Yığının üst kenarı eksenin sıfırından ölçülür; o kenarın taşıdığı sayı toplamdır, parçalar değil.
Çapraz Tablo ve İki Eksen
# kategorik.py — MODELDIR: K03-K05'in kurgu olcum agi ayni tohumla uretilir. # Bes bolge ve dort tarife basamagindan olusan capraz tablo girdidir; bu # tablo iki ayri gosterimle kodlanip geri okunacak. 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() TARIFE = [10, 25, 40] AD = [b[0] for b in BOLGE] def basamak(x): return (1 if x < TARIFE[0] else 2 if x < TARIFE[1] else 3 if x < TARIFE[2] else 4) K = len(TARIFE) + 1 CAPRAZ = {a: [0] * K for a in AD} for o in OKUMA: CAPRAZ[o["bolge"]][basamak(o["tuketim_m3"]) - 1] += 1 TOPLAM = {a: sum(CAPRAZ[a]) for a in AD} # Eksen acikligi gosterime gore degisir: yigilmis eksen toplami tasimak # zorundadir, gruplu eksen yalnizca en buyuk dilimi. Ust sinir bir sonraki # yuzluge yuvarlanir, cunku eksen etiketi yuvarlak sayilarda durur. COZ_KONUM = 100 def yuvarla_yuz(x): return (int(x) // 100 + 1) * 100 EKSEN_Y = yuvarla_yuz(max(TOPLAM.values())) EKSEN_G = yuvarla_yuz(max(max(CAPRAZ[a]) for a in AD)) def izgara(v, eksen, n): return eksen * round(n * v / eksen) / n print(f"kurgu capraz tablo: {len(OKUMA)} okuma, tarife basamaklari " f"{TARIFE[0]}/{TARIFE[1]}/{TARIFE[2]} m3") print(f"{'bolge':8s}" + "".join(f"{'basamak ' + str(i + 1):>12s}" for i in range(K)) + f"{'toplam':>9s}") for a in AD: print(f"{a:8s}" + "".join(f"{c:12d}" for c in CAPRAZ[a]) + f"{TOPLAM[a]:9d}") print(f"yigilmis eksen 0-{EKSEN_Y}, bir basamak {EKSEN_Y / COZ_KONUM:.1f} gozlem; " f"gruplu eksen 0-{EKSEN_G}, bir basamak {EKSEN_G / COZ_KONUM:.1f} gozlem")
kurgu capraz tablo: 3199 okuma, tarife basamaklari 10/25/40 m3 bolge basamak 1 basamak 2 basamak 3 basamak 4 toplam kuzey 42 661 210 8 921 guney 59 538 48 0 645 dogu 21 281 225 30 557 bati 88 377 11 0 476 merkez 30 352 198 20 600 yigilmis eksen 0-1000, bir basamak 10.0 gozlem; gruplu eksen 0-700, bir basamak 7.0 gozlem
Çapraz tablo kaynağın kendisidir ve yirmi sayı taşır. Sayıların büyüklükleri çok farklıdır: ikinci basamak 281 ile 661 arasında, dördüncü basamak 0 ile 30 arasında değişir. Kategorik gösterimin zorluğu buradan başlar, çünkü tek bir eksen bu iki büyüklüğü aynı anda taşımak zorunda kalır.
İki gösterimin eksen açıklığı farklıdır ve fark bir tercih değil bir zorunluluktur. Yığılmış gösterimde bir bölgenin çubuğu bütün dilimlerin toplamı kadar uzar, dolayısıyla eksen en büyük toplamı, 921’i taşımalıdır ve bir sonraki yuvarlak sayı olan 1000’de biter. Gruplu gösterimde çubuklar yan yana durur ve eksen yalnız en büyük dilimi, 661’i taşır; üst sınır 700’dür. Yüz basamaklı aynı konum ızgarası birinde 10 gözlemlik, öbüründe 7 gözlemlik bir adım demektir.
Yığılmış: Taban Çizgisi Olmayan Dilim
# yigilmis.py — dilimler ust uste konur. Alttaki dilim eksenin sifirindan # baslar ve konum kanalindan okunur; ustteki dilimler eksenin uzerinde yuzer, # okuyucu iki konumu cikarmak yerine dilimin uzunluguna bakar ve uzunluk # kanalinin 40 basamagi ile okur (birinci ders). GEN, COZ_UZUNLUK = 40, 40 def yigilmis_oku(c): return [izgara(c[0], EKSEN_Y, COZ_KONUM)] + [ izgara(x, EKSEN_Y, COZ_UZUNLUK) for x in c[1:]] def gruplu_oku(c): return [izgara(x, EKSEN_G, COZ_KONUM) for x in c] def cizgi(c): s, t = "", 0.0 for i, x in enumerate(c): t += x s += str(i + 1) * (round(GEN * t / EKSEN_Y) - len(s)) return s print(f"yigilmis gosterim, {GEN} basamakli eksen (okuyucunun gordugu):") for a in AD: print(f"{a:8s}|{cizgi(CAPRAZ[a]):<40s}| toplam {TOPLAM[a]}") print(f"\n{'bolge':8s}" + "".join(f"{'dilim ' + str(i + 1):>14s}" for i in range(K))) mut = [[] for _ in range(K)] ora = [[] for _ in range(K)] kayip = 0 for a in AD: g = yigilmis_oku(CAPRAZ[a]) for i in range(K): mut[i].append(abs(g[i] - CAPRAZ[a][i])) if CAPRAZ[a][i] > 0: ora[i].append(100 * abs(g[i] - CAPRAZ[a][i]) / CAPRAZ[a][i]) kayip += g[i] == 0 print(f"{a:8s}" + "".join(f"{c:>7d}/{x:<6.0f}" for c, x in zip(CAPRAZ[a], g))) print(f"\n{'dilim':6s}{'kanal':>10s}{'|hata|':>9s}{'oransal':>10s}") for i in range(K): print(f"{i + 1:<6d}{'konum' if i == 0 else 'uzunluk':>10s}" f"{sum(mut[i]) / len(AD):9.1f}{sum(ora[i]) / len(ora[i]):9.1f}%") print(f"kaynakta sifirdan buyukken sifir okunan dilim: {kayip}") _t = izgara(max(TOPLAM.values()), EKSEN_Y, COZ_KONUM) print(f"ayni gosterimde toplam tek okumayla geliyor: kuzey {TOPLAM['kuzey']} " f"-> {_t:.0f}")
yigilmis gosterim, 40 basamakli eksen (okuyucunun gordugu): kuzey |1122222222222222222222222222333333333 | toplam 921 guney |11222222222222222222222233 | toplam 645 dogu |1222222222223333333334 | toplam 557 bati |1111222222222222222 | toplam 476 merkez |122222222222222333333334 | toplam 600 bolge dilim 1 dilim 2 dilim 3 dilim 4 kuzey 42/40 661/650 210/200 8/0 guney 59/60 538/550 48/50 0/0 dogu 21/20 281/275 225/225 30/25 bati 88/90 377/375 11/0 0/0 merkez 30/30 352/350 198/200 20/25 dilim kanal |hata| oransal 1 konum 1.2 2.7% 2 uzunluk 6.6 1.4% 3 uzunluk 5.0 22.0% 4 uzunluk 3.6 47.2% kaynakta sifirdan buyukken sifir okunan dilim: 2 ayni gosterimde toplam tek okumayla geliyor: kuzey 921 -> 920
Çubukların kendisi dersin en açık kanıtıdır. Kuzeyin dördüncü dilimi, yani 40 m³ üstünde okuma yapan sekiz abone, kırk basamaklık çubukta hiç görünmez; batının üçüncü dilimi de öyle. Bunlar gösterimin sildiği değil, gösterimin taşıyamadığı sayılardır: 1000 birimlik bir eksende 40 basamağa bölünmüş bir çubukta bir basamak 25 gözlem eder ve 11 gözlem yarım basamağın altındadır.
Hata tablosu dilim sırasına göre okunur. Alttaki dilim konum kanalından geçer ve oransal hatası yüzde 2,7’de kalır. Üstteki dilimler uzunluk kanalından geçer ve oransal hata üçüncü dilimde yüzde 22,0’ye, dördüncüde yüzde 47,2’ye çıkar. İkinci dilimin yüzde 1,4’lük hatası bu düzeni bozuyor gibi görünür ama bozmaz: ikinci dilim kümenin en büyük dilimidir ve mutlak hatası 6,6 gözlemle en yüksek olanıdır — büyük olduğu için oransal hatası küçük kalır. Hatayı belirleyen iki şey vardır: dilimin taban çizgisi olup olmadığı ve dilimin eksene göre büyüklüğü.
Aynı gösterimin kaybetmediği tek şey toplamdır. Yığının üst kenarı eksenin sıfırından ölçülür, tek bir konum okumasıyla gelir ve kuzeyin 921 gözlemi 920 olarak geri okunur. Yığılmış gösterim bu yüzden vardır: toplamı ve toplamın büyüklük sırasını tek bakışta verir. Parçaları vermeyi ise yalnız en alttaki dilim için başarır.
Bir itiraz burada yerinde durur: dikkatli bir okuyucu dilimin iki kenarını da eksende okuyup çıkarabilir ve daha iyi bir sayı elde eder. Doğrudur, ama o okuyucu artık grafiğe bakmıyor, grafiğin üzerinde aritmetik yapıyordur. Bir sayıyı çıkarma işlemiyle elde etmek gerekiyorsa gösterimin yerini bir tablo alır.
Gruplu: Her Dilime Bir Taban Çizgisi
# gruplu.py — ayni sayilar yan yana dizilir: her dilim kendi taban cizgisinden # baslar, hepsi konum kanalindan okunur, eksen yalniz en buyuk dilimi tasir. # Soru bolgeler arasidir: ayni basamakta hangi bolge daha yuksek. from itertools import combinations print(f"{'basamak':8s}{'kaynak':>26s}{'yigilmis':>26s}{'gruplu':>26s}") SERI = [] for i in range(K): s = ([CAPRAZ[a][i] for a in AD], [yigilmis_oku(CAPRAZ[a])[i] for a in AD], [gruplu_oku(CAPRAZ[a])[i] for a in AD]) SERI.append(s) print(f"{i + 1:<8d}" + "".join(f"{x:>26s}" for x in ["/".join(f"{v:.0f}" for v in t) for t in s])) print(f"\n{'basamak':8s}{'ayrilmasi gereken cift':>24s}{'yigilmis':>10s}" f"{'gruplu':>8s}{'ters okunan':>13s}") top = [0, 0, 0, 0] for i, (k, y, g) in enumerate(SERI): c = [(p, q) for p, q in combinations(range(len(AD)), 2) if k[p] != k[q]] ay = sum(1 for p, q in c if y[p] != y[q]) ag = sum(1 for p, q in c if g[p] != g[q]) ters = sum(1 for p, q in c if (k[p] - k[q]) * (y[p] - y[q]) < 0) for j, v in enumerate((len(c), ay, ag, ters)): top[j] += v print(f"{i + 1:<8d}{len(c):>24d}{ay:>10d}{ag:>8d}{ters:>13d}") print(f"{'toplam':8s}{top[0]:>24d}{top[1]:>10d}{top[2]:>8d}{top[3]:>13d}")
basamak kaynak yigilmis gruplu 1 42/59/21/88/30 40/60/20/90/30 42/56/21/91/28 2 661/538/281/377/352 650/550/275/375/350 658/539/280/378/350 3 210/48/225/11/198 200/50/225/0/200 210/49/224/14/196 4 8/0/30/0/20 0/0/25/0/25 7/0/28/0/21 basamak ayrilmasi gereken cift yigilmis gruplu ters okunan 1 10 10 10 0 2 10 10 10 0 3 10 9 10 0 4 9 6 9 0 toplam 39 35 39 0
Karşılaştırma sorusu kategoriler arasındadır ve ölçü, kaynakta birbirinden farklı olan bölge çiftlerinden kaçının gösterimden sonra da farklı okunduğudur. Dördüncü basamakta on çiftin dokuzu kaynakta farklıdır — güney ile batı gerçekten de aynı, sıfır. Yığılmış gösterim bu dokuzun altısını ayırıyor, gruplu gösterim dokuzunu birden.
Yığılmış gösterimin kaybettiği üç çift bellidir. Doğunun 30 gözlemi ile merkezin 20 gözlemi ikisi de 25 okunuyor, kuzeyin 8 gözlemi ise sıfıra düşüp gerçekten sıfır olan iki bölgeyle aynı hale geliyor. Üçüncü basamakta batının 11 gözlemi aynı biçimde kayboluyor ve dokuz yerine on çiftin dokuzu ayrılıyor. Toplamda ayrılması gereken 39 çiftten yığılmış gösterim 35’ini, gruplu gösterim 39’unu ayırıyor.
Son sütun bu dersin ince bulgusudur: ters okunan çift yok. Yığılmış gösterim hiçbir yerde küçük bölgeyi büyük göstermiyor; yaptığı tek şey farkları silmek. Bu, hatanın yönsüz olmasından gelir — ızgaraya yuvarlama iki bölgeyi birbirine yaklaştırır, ama yer değiştirtmez. Rapora yazılacak cümle buradan çıkar: yığılmış gösterimden okunan sıralama yanlış değildir, eksiktir. Sıralamanın kaç basamağının okunabildiği ayrı bir sayıdır ve o sayı 39’un 35’idir.
Gruplu gösterimin bedeli geri okumada değil, yerdedir: dört dilim beş bölgede yirmi çubuk demektir ve bir dilim daha eklendiğinde yirmi beş olur. Yığılmış gösterim aynı sayıları beş çubuğa sığdırır. İki gösterim arasındaki seçim, toplam mı yoksa parçalar mı sorulacağına bağlıdır ve bu soru verinin değil raporun sorusudur.
Özet
- Yığılmış gösterimde yalnız alttaki dilimin taban çizgisi vardır; o dilim konum kanalından, yüzen dilimler uzunluk kanalından okunur ve eksen toplamı taşıdığı için bir basamak 25 gözleme çıkar.
- Oransal geri okuma hatası dilim sırasına göre yüzde 2,7 · 1,4 · 22,0 · 47,2 çıkar; hatayı belirleyen iki şey dilimin taban çizgisi olup olmadığı ve dilimin eksene göre büyüklüğüdür.
- Kuzeyin 8 okumalık dördüncü dilimi ile batının 11 okumalık üçüncü dilimi sıfır okunur, yani kaynakta duran iki dilim gösterimden tamamen çıkar.
- Ayrılması gereken 39 bölge çiftinden yığılmış gösterim 35’ini, gruplu gösterim 39’unu ayırır; ters okunan çift yoktur, kaybolan şey sıra değil ayrımdır.
- Yığılmış gösterim toplamı tek okumayla verir — kuzeyin 921 gözlemi 920 olarak geri okunur — ve kaybettiği şey yalnız parçalardır.
Sonraki Adım
Üç derste kategoriler sayıldı, dağılımlar aralıklara bölündü ve her seferinde eksenin bir yanında bir etiket, öbür yanında bir sayı vardı. Rapordaki soruların bir kısmı ise iki sayıyı birden sorar: bir bölgede tüketim arttıkça basamak da yükseliyor mu, iki dönemin okumaları birlikte mi oynuyor. Birinci ders bu sorunun yalnız konum kanalıyla cevaplanabileceğini göstermişti, çünkü kanalın ikinci bağımsız kopyası yalnız orada var. Sonraki ders o iki kopyayı kullanır ve nokta sayısı arttıkça ne olduğunu sayar: kaç nokta üst üste biniyor, okunamayan bölge nereden başlıyor ve aynı ilişki bir ısı haritasının renk basamağına konduğunda kaç ayrı düzey geri okunuyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.