Ders 07 / 13
Dağılım Karşılaştırması
Kuzey bölgesinin 921 okuması beş sayıya iniyor ve aynı beş sayıyı veren ikinci bir küme kuruluyor: iki kutu özeti de 0,00 | 15,74 | 19,66 | 24,63 | 45,47, çeyrekler açıklığı 8,89 m³ ve çitler 2,405 ile 37,965 m³. Aralık sayımları ikisini ayırıyor — kuzeyde tek tepe 16–20 m³ aralığında, ikizde iki tepe 12–16 ve 24–28 m³ aralıklarında ve ortanca çukurda kalıyor. Aynı ortancanın çentik aralığı geri koyarak örneklemeyle 0,920 m³ ve 3,146 m³ çıkıyor, çit dışında kalan gözlem sayısı 50 ile 35 arasında değişiyor.
İçindekiler
Önceki ders tek bir sayı seçti ve payını yazdı. Rapordaki soruların çoğu ise tek sayı değil, karşılaştırma ister: iki bölgenin tüketim dağılımı birbirinden farklı mı. Bu karşılaştırma alışkanlıkla beş sayı üzerinden yapılır — en küçük, birinci çeyrek, ortanca, üçüncü çeyrek, en büyük — ve beş sayı bir kutu özeti olarak yan yana konur.
Bu derste kutu özeti ve yoğunluk gösterimi çizilmez; ikisi de veri yapısı olarak kurulur ve sayı olarak basılır. Çizim, eksen ve tasarım kararları M26/K06’nın işidir. Buradaki soru daha öncedir: beş sayı bir dağılımı belirler mi. Ölçü, beş sayısı birbirinin aynısı olan iki kümenin aralık sayımlarında kaç tepe verdiğidir.
- UI6. Kutu özeti beş sayı ve iki çittir. Çeyrekler açıklığı üçüncü çeyrek ile birinci çeyreğin farkıdır; çitler bu açıklığın 1,5 katı kadar dışarıda durur. M26/K03’te bu beş sayı bir eleme kararıydı; burada eleme yoktur, sayılar dağılımın biçimini anlatmak için kullanılır.
- UI7. Beş sayı bir dağılımı belirlemez. Aynı beş sayıyı veren birden çok küme vardır ve aralarındaki fark kutu özetine hiç yansımaz.
- UI8. Aralık sayımı yoğunluğun sayısal karşılığıdır. Değer ekseni eşit genişlikte aralıklara bölünür ve her aralığa düşen gözlem sayılır; tepe sayısı bu sayımlardan okunur.
- UI9. Çentik aralığı ortancanın payıdır ve geri koyarak örneklemeyle üretilir: 1.000 çekilişte ortanca yeniden hesaplanır, çıkan değerlerin orta yüzde 95’i çentiktir.
- UI10. Çentiğin genişliği gözlem sayısına ve ortanca çevresindeki yoğunluğa bağlıdır. Aynı ortanca, ortanca çevresi seyrek olan bir kümede çok daha geniş bir çentik verir.
- UI11. İki çentiğin kesişip kesişmemesi bir gösterim ipucudur, sınama değildir; aralıkların kesişmesinin ne anlama geldiği sonraki dersin konusudur.
Kutu Özeti Bir Veri Yapısıdır
# kume.py — MODELDIR: K03-K04'un kurgu olcum agi ayni tohumla yeniden uretilir. # 3.199 satirlik uzun bicimli okuma tablosu, 1.329 abone, uc donem, bes bolge. 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() def yuzdelik2(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) def bes_sayi(v): return [min(v), yuzdelik2(v, 0.25), yuzdelik2(v, 0.50), yuzdelik2(v, 0.75), max(v)] def kutu(v): b = bes_sayi(v) ac = b[3] - b[1] return b, ac, b[1] - 1.5 * ac, b[3] + 1.5 * ac kuzey = sorted(o["tuketim_m3"] for o in OKUMA if o["bolge"] == "kuzey") b, ac, ac_alt, ac_ust = kutu(kuzey) print(f"kuzey: {len(kuzey)} okuma") print("bes sayi ozeti: " + " | ".join(f"{x:.2f}" for x in b)) print(f"ceyrekler acikligi {ac:.2f} m3, citler {ac_alt:.3f} ve {ac_ust:.3f} m3") print(f"cit disinda {sum(1 for x in kuzey if x < ac_alt or x > ac_ust)} okuma var")
kuzey: 921 okuma bes sayi ozeti: 0.00 | 15.74 | 19.66 | 24.63 | 45.47 ceyrekler acikligi 8.89 m3, citler 2.405 ve 37.965 m3 cit disinda 50 okuma var
Kutu özeti burada bir çizim değil, yedi sayıdan oluşan bir kayıttır: beş sayı, çeyrekler açıklığı ve iki çit. Kuzey bölgesinin 921 okuması bu yediye indi. Ortanca 19,66 m³, çeyrekler açıklığı 8,89 m³, çitler 2,405 ile 37,965 m³ arasındadır ve bu sınırların dışında 50 okuma kalır.
Kümenin en küçük değerinin sıfır olması, alt çitin altında kalan okumaların çoğunun sıfır okumalar olduğunu düşündürür. M26/K03 bu okumaları bir temizleme kararı olarak ele almıştı; burada hiçbiri elenmez, yalnız kaç tanesinin çit dışında kaldığı sayılır. Çit bir eleme eşiği değil, bir biçim ölçüsüdür.
Yedi sayı raporda az yer kaplar ve karşılaştırmayı hızlandırır. Bedeli ise bir sonraki bölümde ölçülür: bu yedi sayı, 921 okumanın nasıl dizildiği hakkında sanıldığından çok daha azını söyler.
Aynı Beş Sayı, Başka Bir Küme
# ikiz.py — KURGU: kuzeyin sirali degerleri her ceyrek diliminin icinde dilim # ucuna dogru itilir. Sirali dizide 0., 230., 460., 690. ve 920. degerler yerinde # kaldigi icin bes sayi ozeti birebir korunur, ic dagilim degisir. 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")) b2, ac2, alt2, ust2 = kutu(ikiz) print(f"ikiz kume: {len(ikiz)} deger (kurgu, kuzeyin sirali degerlerinden turetildi)") print("bes sayi ozeti: " + " | ".join(f"{x:.2f}" for x in b2)) print(f"ceyrekler acikligi {ac2:.2f} m3, citler {alt2:.3f} ve {ust2:.3f} m3") print(f"cit disinda {sum(1 for x in ikiz if x < alt2 or x > ust2)} deger var") print(f"iki kutu ozeti ayni mi: {[round(x, 2) for x in b] == [round(x, 2) for x in b2]}")
ikiz kume: 921 deger (kurgu, kuzeyin sirali degerlerinden turetildi) bes sayi ozeti: 0.00 | 15.74 | 19.66 | 24.63 | 45.47 ceyrekler acikligi 8.89 m3, citler 2.405 ve 37.965 m3 cit disinda 35 deger var iki kutu ozeti ayni mi: True
İkiz küme kurgudur ve nasıl kurulduğu koddadır: sıralı dizi dört çeyrek dilimine ayrılır, her dilimin içindeki değerler dilimin bir ucuna doğru itilir. İtme sıralamayı bozmaz ve dilim uçlarına denk gelen değerler yerinde kalır, bu yüzden beş sayı birebir korunur. Alt ve üst yarının itme yönü ters seçildiği için değerler ortancanın iki yanında birikir.
İki kutu özeti aynıdır: aynı ortanca, aynı çeyrekler, aynı çeyrekler açıklığı, aynı çitler. Kutu özetini yan yana koyan bir rapor iki küme arasında hiçbir fark bildiremez. Bildirebileceği tek şey son satırdadır ve o da beş sayının içinde değildir: çit dışındaki gözlem sayısı 50’den 35’e inmiştir, yani aynı çitler iki kümede farklı sayıda değeri dışarıda bırakır.
Bu, kutu özetinin bir kusuru değil, kapsamıdır. Beş sayı sıralamanın beş noktasını bildirir; o noktalar arasında değerlerin nasıl dağıldığı hakkında hiçbir şey söylemez ve söylemek üzere tasarlanmamıştır. Kutu özetinin taşıdığı bilgi, 921 okumanın dördü dışında hepsinin sıralamadaki yerinden bağımsızdır: dilim içindeki her düzenleme aynı yedi sayıyı verir.
İkiz kümenin gerçek ağda karşılığı olmayan bir kurgu olduğu bir kez daha yazılmalıdır. Amacı bir bölgeyi taklit etmek değil, kutu özetinin ayırt edemediği farkın büyüklüğünü göstermektir. Aynı etki gerçek kümelerde daha ölçülü biçimde ortaya çıkar ve genellikle iki farklı abone grubunun tek satırda toplanmasından doğar.
Aralık Sayımları
# aralik.py — yogunluk gosterimi sayi olarak: deger ekseni 4 m3'luk araliklara # bolunur, her araliktaki gozlem sayilir. Metin cubugu on gozleme bir isarettir. GEN, N = 4.0, 12 def sayim(v): c = [0] * N for x in v: c[min(int(x / GEN), N - 1)] += 1 return c def tepe(c): return [i for i in range(1, N - 1) if c[i] > c[i - 1] and c[i] > c[i + 1] and c[i] >= 0.3 * max(c)] ck, ci = sayim(kuzey), sayim(ikiz) for i in range(N): print(f"{i * GEN:5.0f}-{(i + 1) * GEN:<3.0f} {ck[i]:4d} {'#' * round(ck[i] / 10):<34}" f" {ci[i]:4d} {'#' * round(ci[i] / 10)}") print(f"tepe sayisi: kuzey {len(tepe(ck))}, ikiz {len(tepe(ci))}") print(f"ikizin tepeleri {[int(i * GEN) for i in tepe(ci)]} m3 araliklarinda, " f"ortanca {b2[2]:.2f} m3 ise cukurda")
0-4 32 ### 32 ###
4-8 0 0
8-12 41 #### 0
12-16 175 ################## 318 ################################
16-20 234 ####################### 114 ###########
20-24 182 ################## 110 ###########
24-28 130 ############# 329 #################################
28-32 66 ####### 11 #
32-36 37 #### 4
36-40 16 ## 0
40-44 5 2
44-48 3 1
tepe sayisi: kuzey 1, ikiz 2
ikizin tepeleri [12, 24] m3 araliklarinda, ortanca 19.66 m3 ise cukurda
Kutu özetinin ayıramadığı iki küme, on iki sayı çiftiyle ayrıldı. Kuzeyde sayımlar 16–20 m³ aralığında tek bir tepeye çıkıyor ve iki yana düşüyor. İkizde iki tepe var: 318 değer 12–16 m³ aralığında, 329 değer 24–28 m³ aralığında ve arada 114 ile 110’a inen bir çukur duruyor.
Çukurun yeri önemlidir: ortanca 19,66 m³’tür ve tam bu çukurun içine düşer. İkiz kümede ortancaya en yakın değerler en seyrek olanlardır. “Tipik abone 19,66 m³ tüketiyor” cümlesi kuzey için savunulabilir, ikiz küme için ise doğru olduğu halde yanıltıcıdır — o değerin çevresinde neredeyse kimse yoktur.
Aralık genişliği bir karardır ve bu kararın kendisi de sayıyı oynatır: 4 m³ yerine 10 m³ seçilseydi iki tepe tek aralığa girer ve fark yine görünmezdi. Aralık genişliğinin görsel etkisi ve seçimi M26/K06’nın konusudur; burada kaydedilen tek şey, seçilen genişliğin çıktının altında yazılı olmasıdır.
Çentik Aralığı
# centik.py — ortancanin payi: 1.000 kez geri koyarak cekilir, her cekiliste # ortanca yeniden hesaplanir, cikan degerlerin orta yuzde 95'i centik araligidir. CEKILIS = 1000 def yuzdelik(s, p): i = p * (len(s) - 1) a = int(i) z = min(a + 1, len(s) - 1) return s[a] + (s[z] - s[a]) * (i - a) def centik(v, tohum, cekilis=CEKILIS): sec = uretec(tohum) n = len(v) d = sorted(yuzdelik2([v[int(sec() * n)] for _ in range(n)], 0.50) for _ in range(cekilis)) return yuzdelik(d, 0.025), yuzdelik(d, 0.975) merkez = [o["tuketim_m3"] for o in OKUMA if o["bolge"] == "merkez"] for ad, v in (("kuzey", kuzey), ("ikiz", ikiz), ("merkez", merkez)): a, z = centik(v, TOHUM + 211) print(f"{ad:7s} n={len(v):4d} ortanca {yuzdelik2(v, 0.50):6.3f} " f"centik {a:.3f} - {z:.3f} genislik {z - a:.3f}") ka, kz = centik(kuzey, TOHUM + 211) ma, mz = centik(merkez, TOHUM + 211) print(f"kuzey ile merkez centikleri kesisiyor mu: {ka < mz and ma < kz}")
kuzey n= 921 ortanca 19.660 centik 19.230 - 20.150 genislik 0.920 ikiz n= 921 ortanca 19.660 centik 18.203 - 21.349 genislik 3.146 merkez n= 600 ortanca 21.535 centik 20.795 - 22.330 genislik 1.535 kuzey ile merkez centikleri kesisiyor mu: False
Çentik, ortancanın oynama payıdır ve önceki dersteki geri koyarak örneklemenin aynısıyla üretilir. Kuzey ile ikiz kümenin ortancası aynı sayıdır, gözlem sayıları da aynıdır, buna rağmen çentikleri 0,920 ve 3,146 m³ genişliktedir. Aradaki üç buçuk kat, gözlem sayısından değil ortanca çevresindeki yoğunluktan gelir: çukurda duran bir ortanca, çekilişten çekilişe çok daha uzağa gider.
Bu, kutu özetinin eksiğinin sayısal ifadesidir. Beş sayıyı yan yana koyan iki kutu ayırt edilemezken, aynı ortancanın payı üç katından fazla farklıdır. Ortancanın yanına çentiği yazılan bir rapor, çizim yapılmadan da iki dağılımın aynı olmadığını bildirir. Çentik burada beş sayının üzerine eklenen altıncı ve yedinci sayıdır ve maliyeti 1.000 çekilişlik tek bir koşumdur.
Son satır gerçek bir karşılaştırmadır: kuzey ile merkez bölgelerinin çentikleri kesişmiyor. Bunun “iki bölgenin ortancası farklıdır” demek olup olmadığı burada karara bağlanmaz. Kesişme ve kesişmeme üzerine kurulan yorum, sonraki dersin ilk sorusudur.
Özet
- Kutu özeti çizim değil kayıttır: beş sayı, çeyrekler açıklığı ve iki çit; kuzeyin 921 okuması 0,00 | 15,74 | 19,66 | 24,63 | 45,47 değerlerine ve 8,89 m³’lük açıklığa iner.
- Aynı beş sayıyı veren ikinci bir küme kurulabilir; iki kutu özeti birebir aynıdır ve fark yalnız çit dışındaki gözlem sayısında görünür, 50’ye karşı 35.
- Aralık sayımları iki kümeyi ayırır: kuzeyde tek tepe 16–20 m³’te, ikizde iki tepe 12–16 ve 24–28 m³ aralıklarında, ortanca ise 114 ve 110 sayımlı çukurun içindedir.
- Ortancanın çentiği geri koyarak örneklemeyle üretilir ve aynı ortanca için 0,920 m³ ile 3,146 m³ genişliğinde çıkar; genişlik gözlem sayısına ve ortanca çevresindeki yoğunluğa bağlıdır.
- Kuzey ile merkezin çentikleri kesişmiyor; bu bir gösterim ipucudur ve tek başına bir sınama sonucu değildir.
Sonraki Adım
Bu derste iki kez aralık üretildi ve iki kez genişlik yazıldı, ama aralığın ne söylediği hiç tanımlanmadı. Güven aralığı M15/K02’de bir araç olarak kullanılmıştı; sonraki ders aralığın kendisini konu eder. Genişliğin gözlem sayısına nasıl bağlandığı ölçülür — gözlem sayısı dörde katlandığında genişliğin ne olduğu sayılır — ve aralığın söylemedikleri açıkça yazılır. Sonunda iki aralığın kesişmesi ele alınır: kesişme fark yok demek değildir ve bunun ispatı, farkın kendi aralığının hesaplanmasıdır.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.