Ders 02 / 18
Dağılım Görselleştirme
Kuzeyin 921 okuması ile aynı beş sayıyı veren ikiz küme üç gösterimden geçiriliyor ve geri okunan şey bir sayı değil bir biçim özelliği oluyor: aralık sayımı ve yoğunluk ikizin iki tepesini geri okuyor, kutu özeti tepe bilgisi hiç taşımıyor. Uzunluk kanalından geçen sayımlarda üç aralık sıfıra düşüyor ve 7 okuma gösterimden siliniyor, ikizin 45,47 m³'lük uç değeri kayboluyor; aynı uç değer kuzeyde geri okunuyor, çünkü en yüksek çubuk 329 değil 234. Aralık genişliği 12 m³ olduğunda geri okunan tepe sayısı ikide birden bire düşüyor, çekirdek genişliği 0,5 m³ olduğunda kuzeyde olmayan dört tepe görünüyor.
İçindekiler
Bir önceki ders her bölgeyi tek bir sayıya indirdi ve kanal o tek sayıyı taşıdı. Rapordaki soruların bir kısmı tek sayıyla cevaplanmaz: kuzeyin 921 okuması tek bir değer çevresinde mi toplanıyor yoksa iki ayrı abone grubu mu var, en büyük okumalar gösterimde duruyor mu. Bu sorular bir dağılıma bakar ve dağılım tek bir konuma sığmaz.
Bir önceki kursta bu dağılım sayı olarak kurulmuştu: beş sayı özeti hesaplanmış ve aynı beş sayıyı veren ikinci bir küme üretilmişti. O hesap tekrarlanmaz, girdi olarak alınır. Bu dersin sorusu bir adım sonrasıdır: aynı dağılım üç ayrı gösterimle kodlandığında okuyucu hangi biçim özelliğini geri okuyabiliyor.
- GT8. Dağılım gösterimi de bir kanaldır. Aralık sayımı sayımları uzunluk kanalına, kutu özeti ve yoğunluk gösterimi değerleri konum kanalına koyar. Önceki dersin çözünürlükleri aynen sürer: uzunluk 40, konum 100 basamak.
- GT9. Geri okunan şey bir biçim özelliğidir. Üç özellik sayılır: tepe sayısı, çarpıklık yönü ve uç değerin görünüp görünmediği.
- GT10. Tepe kuralı yazılır. Bir nokta, iki yanındaki kendisinden farklı ilk değerlerin ikisinden de büyükse ve en yüksek değerin 0,3 katından aşağı değilse tepedir. Kural üç gösterimde de aynıdır ve geri okunan değerlere uygulanır.
- GT11. Aralık genişliği ve çekirdek genişliği birer karardır. İkisi de kaynağı değil, geri okunan biçimi değiştirir.
- GT12. Uç değerin görünürlüğü uç değere bağlı değildir. Çubuklar en yüksek sayıma göre ölçeklenir; aynı uç değer, komşusu daha yüksek olan bir gösterimde kaybolur.
- GT13. Kutu özetinin tepe taşımaması kusur değil kapsamdır. Beş sayı sıralamanın beş noktasını bildirir; o noktalar arasındaki diziliş kutuya hiç girmez.
Kaynaktaki Biçim
# gosterim.py — MODELDIR: K03-K05'in kurgu olcum agi ayni tohumla uretilir. # Kuzeyin 921 okumasi ile K05'in ikiz kumesi girdidir; ikisi de burada # yeniden hesaplanmaz, gosterim kanalindan gecirilir. 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() kuzey = sorted(o["tuketim_m3"] for o in OKUMA if o["bolge"] == "kuzey") def itele(dilim, uc, p=4): a, z = dilim[0], dilim[-1] u = [(x - a) / (z - a) for x in dilim] return [z - (z - a) * (1 - t) ** p if uc == "ust" else a + (z - a) * t ** p for t in u] C = [0, 230, 460, 690, len(kuzey) - 1] ikiz = (itele(kuzey[C[0]:C[1] + 1], "ust")[:-1] + itele(kuzey[C[1]:C[2] + 1], "alt")[:-1] + itele(kuzey[C[2]:C[3] + 1], "ust")[:-1] + itele(kuzey[C[3]:], "alt")) # Kanallar: histogram cubugu uzunluk, kutu ve yogunluk ortak eksende konum. COZ = {"uzunluk": 40, "konum": 100} def izgara(t, n): return round(t * n) / n def coz_uzunluk(v, ust): return izgara(v / ust, COZ["uzunluk"]) * ust if ust > 0 else 0.0 def coz_konum(v, alt, ust): return alt + (ust - alt) * izgara((v - alt) / (ust - alt), COZ["konum"]) def yuzdelik(v, p): s = sorted(v) i = p * (len(s) - 1) a = int(i) b = min(a + 1, len(s) - 1) return s[a] + (s[b] - s[a]) * (i - a) # Kaynaktaki bicim: tepe sayisi kurgunun kendisinden bilinir (kuzey tek tabandan # uretildi, ikiz iki uca itildi). Carpiklik yonu ortalama-ortanca isaretidir; # esik 0,05 m3, cunku rapora iki ondalikla yazilan sayida bundan kucuk fark # yaziya gecmez. Uc deger: en buyuk gozlemin dustugu bolge. ESIK_CARP = 0.05 KUME = [("kuzey", kuzey, 1), ("ikiz", ikiz, 2)] def yon(d): return "saga" if d > ESIK_CARP else ("sola" if d < -ESIK_CARP else "simetrik") KAYNAK = {} for ad, v, tepe in KUME: ort, med = sum(v) / len(v), yuzdelik(v, 0.50) KAYNAK[ad] = (tepe, yon(ort - med), max(v)) print(f"{ad:6s} n={len(v)} ortalama {ort:.3f} ortanca {med:.3f} " f"en buyuk {max(v):.2f} m3") print(f" kaynaktaki bicim: {tepe} tepe, {yon(ort - med)} carpik, " f"uc deger {max(v):.2f} m3")
kuzey n=921 ortalama 20.210 ortanca 19.660 en buyuk 45.47 m3
kaynaktaki bicim: 1 tepe, saga carpik, uc deger 45.47 m3
ikiz n=921 ortalama 19.754 ortanca 19.660 en buyuk 45.47 m3
kaynaktaki bicim: 2 tepe, saga carpik, uc deger 45.47 m3
Kaynaktaki tepe sayısı tahmin edilmez, bilinir: iki küme de kurgudur ve nasıl kuruldukları koddadır. Kuzeyin 921 okuması tek bir taban değerden üretildi, ikiz küme kuzeyin sıralı değerlerinin çeyrek dilimler içinde iki uca itilmesiyle elde edildi — birinde bir, öbüründe iki toplanma merkezi vardır.
Çarpıklık yönü ortalama ile ortancanın işaretinden okunur; eşik 0,05 m³ yazıldı, çünkü iki ondalıkla raporlanan bir sayıda bundan küçük fark yazıya geçmez. Kuzeyde fark 0,550 m³, ikizde 0,094 m³’tür ve ikincisi eşiğin hemen üstündedir.
Aynı Dağılım Üç Gösterimden Geçiyor
# uc_gosterim.py — ayni dagilim uc gosterimle kodlanir ve uc bicim ozelligi # geri okunmaya calisilir. Tepe kurali her gosterimde ayni: iki yanindaki # farkli degerlerden buyuk ve en yuksegin 0,3 katindan asagi olmayan nokta. GEN, EKSEN, N = 4.0, 48.0, 12 H, M = 2.0, 60 def sayim(v, gen, n): c = [0] * n for x in v: c[min(int(x / gen), n - 1)] += 1 return c def tepeler(y, oran=0.3): m, t = max(y), [] for i in range(len(y)): if i and y[i] == y[i - 1]: continue s = next((y[j] for j in range(i - 1, -1, -1) if y[j] != y[i]), None) z = next((y[j] for j in range(i + 1, len(y)) if y[j] != y[i]), None) if s is not None and z is not None and y[i] > s and y[i] > z and y[i] >= oran * m: t.append(i) return t def ozet(x, w): t = sum(w) ort, k = sum(a * b for a, b in zip(x, w)) / t, 0.0 for a, b in zip(x, w): k += b if k >= t / 2: return ort, a return ort, x[-1] def gost_aralik(v, gen=GEN): n = round(EKSEN / gen) c = sayim(v, gen, n) g = [round(coz_uzunluk(x, max(c))) for x in c] ort, med = ozet([(i + 0.5) * gen for i in range(n)], g) return len(tepeler(g)), yon(ort - med), g[min(int(max(v) / gen), n - 1)] > 0, g def gost_kutu(v): b = [min(v), yuzdelik(v, 0.25), yuzdelik(v, 0.50), yuzdelik(v, 0.75), max(v)] g = [coz_konum(x, 0.0, EKSEN) for x in b] ac = g[3] - g[1] a_cit, u_cit = g[1] - 1.5 * ac, g[3] + 1.5 * ac disi = [x for x in v if x < a_cit or x > u_cit] nokta = len({coz_konum(x, 0.0, EKSEN) for x in disi}) return None, yon((g[3] - g[2]) - (g[2] - g[1])), nokta > 0, (len(disi), nokta) def gost_yogunluk(v, h=H): x = [EKSEN * i / (M - 1) for i in range(M)] y = [sum(math.exp(-0.5 * ((a - t) / h) ** 2) for t in v) for a in x] g = [coz_konum(t, 0.0, max(y)) for t in y] ort, med = ozet(x, g) return (len(tepeler(g)), yon(ort - med), g[round((M - 1) * max(v) / EKSEN)] > 0, g) GOSTERIM = [("aralik sayimi", gost_aralik), ("kutu ozeti", gost_kutu), ("yogunluk", gost_yogunluk)] print(f"aralik genisligi {GEN:.0f} m3, cekirdek genisligi {H:.0f} m3, " f"eksen 0-{EKSEN:.0f} m3, {M} ornekleme noktasi") _c = sayim(ikiz, GEN, N) _g = [round(coz_uzunluk(x, max(_c))) for x in _c] print("\nikiz kumesi, sayimlar uzunluk kanalindan gecince (kaynak / geri okunan):") for i in range(N): print(f"{i * GEN:5.0f}-{(i + 1) * GEN:<3.0f}{_c[i]:5d}{_g[i]:6d} " f"|{'#' * round(40 * _g[i] / max(_g))}") _kayip = [(i, _c[i]) for i in range(N) if _c[i] > 0 and _g[i] == 0] print(f"geri okunanda sifira dusen aralik: {len(_kayip)}, " f"icindeki okuma: {sum(x for _, x in _kayip)}\n") print(f"{'kume':7s}{'gosterim':16s}{'tepe':>12s}{'carpiklik':>12s}{'uc deger':>11s}" f"{'gecen ozellik':>15s}") for ad, v, _ in KUME: kt, kc, _ku = KAYNAK[ad] for g_ad, f in GOSTERIM: t, c, u, _ek = f(v) gecen = sum([t == kt, c == kc, u]) print(f"{ad:7s}{g_ad:16s}{str(t) if t is not None else 'okunamaz':>12s}" f"{c:>12s}{'evet' if u else 'hayir':>11s}{gecen:>12d}/3")
aralik genisligi 4 m3, cekirdek genisligi 2 m3, eksen 0-48 m3, 60 ornekleme noktasi
ikiz kumesi, sayimlar uzunluk kanalindan gecince (kaynak / geri okunan):
0-4 32 33 |####
4-8 0 0 |
8-12 0 0 |
12-16 318 321 |#######################################
16-20 114 115 |##############
20-24 110 107 |#############
24-28 329 329 |########################################
28-32 11 8 |#
32-36 4 0 |
36-40 0 0 |
40-44 2 0 |
44-48 1 0 |
geri okunanda sifira dusen aralik: 3, icindeki okuma: 7
kume gosterim tepe carpiklik uc deger gecen ozellik
kuzey aralik sayimi 1 saga evet 3/3
kuzey kutu ozeti okunamaz saga evet 2/3
kuzey yogunluk 1 saga evet 3/3
ikiz aralik sayimi 2 saga hayir 2/3
ikiz kutu ozeti okunamaz saga evet 2/3
ikiz yogunluk 2 sola hayir 1/3
Çubuk tablosu kanalın ne yaptığını doğrudan gösteriyor. Kırk basamaklık bir çubuk en yüksek sayıma göre ölçeklenir; ikizde en yüksek sayım 329’dur, yani bir basamak 8,2 okumaya karşılık gelir. Sekiz okumadan az olan her aralık yarım basamağın altında kalır ve sıfır olarak geri okunur. Üç aralık böyle silinir ve içlerindeki 7 okuma gösterimden tamamen çıkar; aralarında 45,47 m³’lük uç değer de vardır.
Aynı uç değer kuzeyde geri okunuyor ve tek sebebi GT12’dir: kuzeyde en yüksek sayım 234, bir basamak 5,9 okumadır ve 44–48 m³ aralığındaki üç okuma bir basamağı doldurmaya yeter. Uç değer iki kümede de aynı yerde ve aynı sayıdadır; görünmesini belirleyen şey en yüksek çubuğun yüksekliğidir.
Özellik tablosunda hiçbir gösterim üçünü birden geçirmiyor ve her biri ötekilerin kaçırdığı bir şeyi tutuyor. Kutu özeti tepe sayısını hiç taşımıyor — sütunda “okunamaz” yazıyor, çünkü beş sayıdan tepe türetilecek bir yol yoktur. Buna karşılık uç değeri iki kümede de geri okutan tek gösterim odur: çit dışındaki gözlemler ayrı nokta olarak basılır, ölçeklenmez ve komşularına bakmaz. Aralık sayımı ile yoğunluk ise ikizin iki tepesini geri okuyan tek gösterimlerdir ve ikisi de uç değeri kaybeder, çünkü ikisi de en yüksek değere göre ölçeklenir.
Yoğunluk gösteriminin ikizde çarpıklığı ters okuması bir gösterim kusuru değil, eşiğe yakın duran bir kaynağın sonucudur: 0,094 m³’lük bir asimetri altmış örnekleme noktasına ve yüz basamaklı bir konum ızgarasına indirgendiğinde yönünü koruyamaz. Karar eşiğine bu kadar yakın bir biçim özelliği için sonucu gösterim seçimi belirler ve o özellik raporlanmaz.
Aralık Genişliği Bir Karardır
# karar.py — aralik genisligi ve cekirdek genisligi birer karardir; ikisi de # geri okunan tepe sayisini oynatir. Kaynaktaki tepe sayisi degismez. print(f"{'genislik':>9s}{'aralik':>8s}" + "".join(f"{ad:>9s}" for ad, _, _ in KUME)) for gen in (2.0, 3.0, 4.0, 6.0, 8.0, 12.0): print(f"{gen:8.0f} m3{round(EKSEN / gen):8d}" + "".join(f"{gost_aralik(v, gen)[0]:9d}" for _, v, _ in KUME)) print(f"{'cekirdek':>9s}{'ornek':>8s}" + "".join(f"{ad:>9s}" for ad, _, _ in KUME)) for h in (0.5, 1.0, 2.0, 3.0, 5.0, 8.0): print(f"{h:8.1f} m3{M:8d}" + "".join(f"{gost_yogunluk(v, h)[0]:9d}" for _, v, _ in KUME)) print("kaynaktaki tepe sayisi: " + ", ".join(f"{ad} {t}" for ad, _, t in KUME))
genislik aralik kuzey ikiz
2 m3 24 1 2
3 m3 16 1 2
4 m3 12 1 2
6 m3 8 1 2
8 m3 6 1 2
12 m3 4 1 1
cekirdek ornek kuzey ikiz
0.5 m3 60 4 2
1.0 m3 60 1 2
2.0 m3 60 1 2
3.0 m3 60 1 2
5.0 m3 60 1 1
8.0 m3 60 1 1
kaynaktaki tepe sayisi: kuzey 1, ikiz 2
Kaynaktaki tepe sayısı iki satırda da değişmiyor: kuzey bir, ikiz iki. Değişen tek şey geri okunan sayı ve onu değiştiren tek şey bir karar.
Aralık genişliği 2 ile 8 m³ arasındayken ikizin iki tepesi geri okunuyor. 12 m³’te sayı bire düşüyor, çünkü iki toplanma merkezi arasındaki mesafe yaklaşık 12 m³’tür ve tek bir aralık ikisini birden yutar. Bir önceki kurs bu tuzağı bir cümleyle işaret etmişti; burada eşiğin yeri sayılıyor.
Çekirdek genişliği ters yönde de yanılıyor. 0,5 m³’te kuzeyde dört tepe geri okunuyor, oysa kaynakta bir tane var. Bu genişlikte çekirdek örnekleme noktaları arasındaki 0,81 m³’lük aralıktan dardır; eğri veriyi düzleştirmek yerine tek tek okumaları izler ve okuma yoğunluğundaki rastgele oynamalar tepe olarak geri okunur. 5 m³ ve üstünde ise ikizin iki tepesi birleşir. İki karar arasında bir tercih değil, iki ayrı hata vardır: dar seçim olmayan tepeyi üretir, geniş seçim var olanı siler. Kural GT11’in somut halidir — iki genişlik de çıktının altında yazılır, yoksa geri okunan tepe sayısı bir bulgu gibi görünür.
Özet
- Aralık sayımı sayımları uzunluk, kutu özeti ve yoğunluk ise değerleri konum kanalına koyar; geri okunan şey bir m³ değeri değil tepe sayısı, çarpıklık yönü ve uç değerdir.
- Hiçbir gösterim üç özelliği birden geçirmiyor: kutu özeti tepeyi hiç taşımıyor ama uç değeri iki kümede de geri okutan tek gösterim; aralık sayımı ile yoğunluk iki tepeyi geri okuyor ama uç değeri kaybediyor.
- Uzunluk kanalından geçen sayımlarda üç aralık sıfıra düşüyor ve 7 okuma siliniyor; aynı 45,47 m³’lük uç değer kuzeyde görünüyor çünkü orada en yüksek çubuk 329 değil 234.
- Aralık genişliği 12 m³’te ikizin geri okunan tepe sayısını ikiden bire düşürüyor, çekirdek genişliği 0,5 m³’te kuzeyde olmayan dört tepe gösteriyor; kaynaktaki tepe sayısı değişmiyor.
- İkizin 0,094 m³’lük çarpıklığı eşiğin hemen üstündedir ve yönü gösterime göre değişir; bu kadar eşiğe yakın bir biçim özelliği raporlanmaz.
Sonraki Adım
Bu derste eksenin bir yanında sürekli bir değer vardı ve gösterim onu aralıklara ya da bir eğriye çevirdi. Rapordaki soruların çoğu ise kategoriktir: beş bölgenin dört tarife basamağındaki abone sayısı ve bu sayıların bölge içindeki payı. Kategorik gösterimin kendine özgü bir kararı vardır — dilimler üst üste mi yığılacak yoksa yan yana mı dizilecek — ve bu bir kanal sorunudur: yığılmış gösterimde yalnız alttaki dilimin taban çizgisi olur. Sonraki ders üstteki dilimlerin geri okuma hatasını dilim sırasına göre sayar ve gruplu gösterimle karşılaştırır.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.