Ders 11 / 18
İş Zekâsı Araçları
Aynı ölçüt üç yenileme düzeninde farklı bir değer verir ve fark sayılır: dönem 3 kapanışından on iki gün sonra üretilen raporda okuma oranı anlık sorguyla 56,659, dönemsel çekmeyle 48,081, önceden toplanmış modelle 36,042 çıkar; kaynağın nihai değeri 63,055'tir. Aynı gecikme ortalama tüketimi yalnız 0,038 m³ oynatır. Rapor veri modelinin sabitlediği tane ve alan kümesi altı sorunun üçünü kalıcı olarak kapatır: yalnız ortalama saklayan model bir soruda 0,192 m³ yanlış yanıt üretir, toplam ile sayı saklayan model üç soruyu doğru yanıtlar. Üç düzen ve beş rapor günü on beş rapor, beş ayrı değer ve 27,013 puanlık ayrılık üretir.
İçindekiler
Önceki ders ölçütün tanımını altı maddeyle sabitledi. Maddelerden biri “pencere dönem 3’te kapanır” diyordu. Sayaç okumaları pencerenin kapandığı anda hazır olmuyor: bir bölümü aynı gün, bir bölümü haftalar sonra kaynağa giriyor. Aynı tanım, aynı kümeye, iki ayrı gün uygulandığında iki ayrı sayı veriyor ve ikisi de tanıma uygun.
Rapor kaynağın üstünde durur ve arada bir araç vardır. Bu araç ürünüyle değil parçalarıyla anılır ve dört parçası vardır: kaynağa bağlanan veri kaynağı bağlayıcısı, kaynağın üstüne kurulan rapor veri modeli, modelin ne sıklıkta tazelendiğini belirleyen yenileme düzeni ve sayıyı okuyucuya çıkaran sunum katmanı. Bu dersin ölçüsü ikinci ile üçüncü parçadan çıkar: yenileme gecikmesinin rapora yazdığı sayı ve modelin kalıcı olarak kapattığı soru sayısı.
- RP13. Küme K03’ten devralınır ve kurgudur: 3.199 satırlık okuma tablosu, 1.329 abone, üç dönem, beş bölge. Tohum koda yazılıdır.
- RP14. Her okumanın geliş gecikmesi de kurgudur ve ayrı bir tohumla çekilir. Gecikme okumanın değerini değiştirmez, yalnız hangi anda görünür olduğunu belirler.
- RP15. İki ölçüt izlenir: dönem 3 okuma oranı (dönem 3 okuması olan abone / kayıtlı abone) ve dönem 3 ortalama tüketimi.
- RP16. Üç yenileme düzeni: anlık sorgu kaynağı rapor anında okur, dönemsel çekme yedişer günde bir tazelenir, önceden toplanmış model dönem kapanışında bir kez toplanır ve yeniden toplanmaz.
- RP17. Rapor veri modeli bölge-dönem tanesindedir; iki tasarım denenir ve yalnız sakladıkları alanlarla ayrılırlar.
- RP18. Doğruluk karşılaştırması
==ile yapılmaz; eşik ’dur ve gerekçesi kayan noktalı toplamanın basamak birikimidir.
Kaynağa Bağlanma
# yenileme.py — MODELDIR. K03'un kurgu kumesi ayni tohumla uretilir; her okumaya # kurgu bir gelis gecikmesi eklenir ve rapor uc yenileme duzeninde okunur. import math TOHUM, HAM, M32 = 20260218, 1400, 0xFFFFFFFF 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 ABONE, ELENEN = [], [] 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]) (ELENEN if r() < 0.046 else ABONE).append( {"abone_no": 10001 + i, "bolge": b[0], "taban": b[2]}) GECERLI = {k["abone_no"] for k in ABONE} OKUMA = {} for k in ABONE + ELENEN: r = uretec(TOHUM + 7000 + k["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( k["taban"] * math.exp((r() + r() + r() - 1.5) * 0.62) * (1 - d * 0.05) * 100 + 0.5) / 100 if k["abone_no"] in GECERLI: OKUMA.setdefault(k["abone_no"], {})[d + 1] = t r() # Her okuma kaynaga donem kapanisindan bir sure sonra girer. Gecikme kurgudur ve # ayri bir tohumla cekilir; okumanin degerini degistirmez, yalniz gorunurlugunu. GECIKME = {} for k in ABONE: r = uretec(TOHUM + 120000 + k["abone_no"]) for d in sorted(OKUMA.get(k["abone_no"], {})): GECIKME[(k["abone_no"], d)] = ayrik(r(), [0.58, 0.19, 0.13, 0.07, 0.03]) * 6 def goruntu(gun): """Gecikmesi gun degerini asmayan okumalarin gorundugu kaynak goruntusu.""" g = {} for (a, d), gec in GECIKME.items(): if gec <= gun: g.setdefault(a, {})[d] = OKUMA[a][d] return g def olcutler(kume): """Iki olcut: donem 3 okuma orani ve donem 3 ortalama tuketimi.""" d3 = [o[3] for o in kume.values() if 3 in o] return len(d3) / len(ABONE) * 100, sum(d3) / len(d3), len(d3) TAM = goruntu(10 ** 6) son = olcutler(TAM) print(f"kurgu kume (tohum {TOHUM}): {len(ABONE)} abone, {len(GECIKME)} okuma") print(f"gecikme dagilimi (gun): " + ", ".join( f"{g}: {sum(1 for v in GECIKME.values() if v == g)}" for g in (0, 6, 12, 18, 24))) print(f"kaynagin nihai sayilari — okuma orani {son[0]:.3f}, " f"donem 3 ortalamasi {son[1]:.3f} m3 ({son[2]} okuma)")
kurgu kume (tohum 20260218): 1329 abone, 3199 okuma gecikme dagilimi (gun): 0: 1841, 6: 608, 12: 444, 18: 213, 24: 93 kaynagin nihai sayilari — okuma orani 63.055, donem 3 ortalamasi 18.321 m3 (838 okuma)
Üç bin yüz doksan dokuz okumanın 1.841’i kapanış günü kaynakta, kalan 1.358’i sonraki günlerde giriyor. Kaynağın nihai sayıları da bu listeden okunuyor ve dersin geri kalanı bu iki sayıya karşı ölçülüyor.
Üç Yenileme Düzeni
# Uc yenileme duzeni. Rapor donem 3 kapanisindan 12 gun sonra uretilir; duzenler # yalniz kaynagi ne kadar geriden gordukleriyle ayrilir. RAPOR_GUNU = 12 DUZEN = [("anlik sorgu", RAPOR_GUNU, 0), ("donemsel cekme (7 gunde bir)", 7, RAPOR_GUNU - 7), ("onceden toplanmis model", 0, RAPOR_GUNU)] print(f"rapor gunu: donem 3 kapanisindan {RAPOR_GUNU} gun sonra\n") print(f"{'duzen':<30}{'yenileme gecikmesi':>19}{'okuma orani':>13}{'ortalama':>10}" f"{'okuma':>7}{'nihaiden fark':>15}") for ad, kes, gec in DUZEN: k, o, n = olcutler(goruntu(kes)) print(f"{ad:<30}{str(gec) + ' gun':>19}{k:>13.3f}{o:>10.3f}{n:>7}" f"{o - son[1]:>+10.3f} m3") print(f"{'kaynagin nihai degeri':<30}{'-':>19}{son[0]:>13.3f}{son[1]:>10.3f}{son[2]:>7}" f"{0.0:>+10.3f} m3")
rapor gunu: donem 3 kapanisindan 12 gun sonra duzen yenileme gecikmesi okuma orani ortalama okuma nihaiden fark anlik sorgu 0 gun 56.659 18.128 753 -0.193 m3 donemsel cekme (7 gunde bir) 5 gun 48.081 18.160 639 -0.161 m3 onceden toplanmis model 12 gun 36.042 18.166 479 -0.155 m3 kaynagin nihai degeri - 63.055 18.321 838 +0.000 m3
Üç düzen arasındaki seçim bir doğruluk seçimi değil, bir takas. Anlık sorgu en taze sayıyı verir ve bedelini kaynağa her rapor açılışında yüklenir; önceden toplanmış model kaynağı hiç yormaz ve bedelini tazelikten öder; dönemsel çekme ikisinin arasındadır. Takasın hangi ucunun seçildiği sayının kendisine yazılmaz.
Aynı gün, aynı kaynak, aynı ölçüt tanımı: okuma oranı 56,659, 48,081 ve 36,042 çıkıyor. Üçü de doğru hesaplanmış ve üçü de nihai 63,055’in altında. Anlık sorgunun bile eksik olması gecikmenin raporda değil kaynağın kendisinde olduğunu gösteriyor: rapor gününde o okumalar henüz girmemiş.
İkinci sütun asıl dersi taşıyor. Aynı gecikme ortalama tüketimi 18,128 ile 18,166 arasında, yani yalnız 0,038 m³ oynatıyor; okuma oranını 20,617 puan oynatıyor. Neden ikisinin sayım ve oran olmasıdır: geç gelen okumalar paydayı değil payı büyütür, ama değerleri erken gelenlerden sistematik olarak farklı değildir. Bir gösterge tablosunda yan yana duran iki ölçütten biri yenileme düzenine neredeyse duyarsızken öteki ona tamamen bağımlı olabilir ve bu, ölçütün tanımından değil türünden gelir.
Rapor Veri Modelinin Sabitlediği
Rapor veri modeli kaynağın kopyası değildir; tanesi ve alan kümesi seçilmiş bir yapıdır. İkisi de sonradan gevşetilemez: model bölge-dönem tanesinde toplandığında abone düzeyindeki her soru kalıcı olarak kapanır.
# Rapor veri modeli: kaynagin uzerine kurulan, tanesi ve alanlari sabitlenmis yapi. # Iki tasarim denenir; ikisi de bolge-donem tanesindedir, alanlari farklidir. MODEL_A = {} # yalniz ortalama saklanir MODEL_B = {} # toplam ve sayi saklanir for b, _, _ in BOLGE: v = [TAM[k["abone_no"]][3] for k in ABONE if k["bolge"] == b and 3 in TAM.get(k["abone_no"], {})] MODEL_A[b] = sum(v) / len(v) MODEL_B[b] = (sum(v), len(v)) ham3 = sorted(o[3] for o in TAM.values() if 3 in o) tek = [k["abone_no"] for k in ABONE if TAM.get(k["abone_no"], {}).get(3, 0.0) > 0][0] DOGRU = {"kume ortalamasi": sum(ham3) / len(ham3), "bolge ortalamasi (dogu)": MODEL_A["dogu"], "okuma orani": len(ham3) / len(ABONE) * 100, "ortanca tuketim": (ham3[len(ham3) // 2 - 1] + ham3[len(ham3) // 2]) / 2, "40 m3 ustu abone": float(sum(1 for v in ham3 if v > 40)), "tek abonenin okumasi": TAM[tek][3]} YANIT = { "kume ortalamasi": (sum(MODEL_A.values()) / len(MODEL_A), sum(x[0] for x in MODEL_B.values()) / sum(x[1] for x in MODEL_B.values())), "bolge ortalamasi (dogu)": (MODEL_A["dogu"], MODEL_B["dogu"][0] / MODEL_B["dogu"][1]), "okuma orani": (None, sum(x[1] for x in MODEL_B.values()) / len(ABONE) * 100), "ortanca tuketim": (None, None), "40 m3 ustu abone": (None, None), "tek abonenin okumasi": (None, None)} EPS = 1e-9 def durum(v, d): if v is None: return "uretilemez" return "dogru" if abs(v - d) < EPS else f"yanlis ({v - d:+.3f})" print(f"{'soru':<26}{'kaynak (abone-donem tanesi)':>28}{'model A':>18}{'model B':>18}") sayac = [0, 0, 0] for s, d in DOGRU.items(): a, b = YANIT[s] for i, v in enumerate((d, a, b)): sayac[i] += 1 if v is not None and abs(v - d) < EPS else 0 print(f"{s:<26}{format(d, '.3f'):>28}{durum(a, d):>18}{durum(b, d):>18}") print(f"\ndogru yanitlanan soru: kaynak {sayac[0]}/6, model A {sayac[1]}/6, " f"model B {sayac[2]}/6")
soru kaynak (abone-donem tanesi) model A model B kume ortalamasi 18.321 yanlis (-0.192) dogru bolge ortalamasi (dogu) 22.394 dogru dogru okuma orani 63.055 uretilemez dogru ortanca tuketim 17.845 uretilemez uretilemez 40 m3 ustu abone 8.000 uretilemez uretilemez tek abonenin okumasi 21.570 uretilemez uretilemez dogru yanitlanan soru: kaynak 6/6, model A 1/6, model B 3/6
İki model aynı tanededir ve tek farkları sakladıkları alandır: biri ortalamayı, öteki toplam ile sayıyı saklar. Bu fark üç soruyu açıp kapatıyor. Toplam ve sayı saklandığında küme ortalaması bölgelerin toplamları toplanıp sayılarına bölünerek doğru kurulur; yalnız ortalama saklandığında kurulamaz, çünkü ağırlıklar atılmıştır.
Birinci satır bu dersin en önemli sonucudur. Model A küme ortalaması sorusuna üretilemez demiyor, 0,192 m³ yanlış bir sayı veriyor. Beş bölge ortalamasının ortalaması matematiksel olarak bir işlem sonucudur ve bir gösterge tablosunda küme ortalaması diye görünür. Üretilemeyen bir yanıt kendini belli eder; yanlış üretilen yanıt etmez.
Alt üç satır tanenin bedelidir. Ortanca, eşik üstü abone sayısı ve tek bir abonenin okuması iki modelde de üretilemez, çünkü bunlar toplanabilir alanlar değildir: ortancayı bir bölgenin ortancasından, küme ortancasını da beş bölgenin ortancasından kurmak olanaksızdır. Rapor veri modeli bir hız kararı gibi görünür; sorulabilecek soruların kümesini daraltan bir karardır ve altı sorunun üçünü kalıcı olarak kapatmıştır.
Aynı Ölçüt, On Beş Rapor
# Ayni olcut, ayni kaynak, bes ayri rapor gunu. Onceden toplanmis model donem # kapanisinda bir kez toplanir ve yeniden toplanmaz; cekme yediser gunde bir tazelenir. GUNLER = (0, 6, 12, 24, 40) KES = {"anlik sorgu": lambda g: g, "donemsel cekme": lambda g: 7 * (g // 7), "onceden toplanmis model": lambda g: 0} print(f"{'duzen':<26}" + "".join(f"{'gun ' + str(g):>10}" for g in GUNLER)) degerler = set() for ad, f in KES.items(): satir = [] for g in GUNLER: v = olcutler(goruntu(f(g)))[0] degerler.add(round(v, 3)) satir.append(v) print(f"{ad:<26}" + "".join(f"{v:>10.3f}" for v in satir)) print(f"{'kaynagin nihai degeri':<26}" + "".join(f"{son[0]:>10.3f}" for g in GUNLER)) print(f"\n{len(KES)} duzen x {len(GUNLER)} rapor gunu = {len(KES) * len(GUNLER)} rapor, " f"{len(degerler)} ayri deger; hepsi dogru hesaplanmistir") print(f"en genis ayrilik: {max(degerler) - min(degerler):.3f} puan " f"({min(degerler):.3f} ile {max(degerler):.3f})") print(f"rapora yazilan sayi bu yuzden tek basina yazilamaz: " f"deger, veri kesme ani ve yenileme gecikmesi birlikte yazilir")
duzen gun 0 gun 6 gun 12 gun 24 gun 40 anlik sorgu 36.042 48.081 56.659 63.055 63.055 donemsel cekme 36.042 36.042 48.081 60.873 63.055 onceden toplanmis model 36.042 36.042 36.042 36.042 36.042 kaynagin nihai degeri 63.055 63.055 63.055 63.055 63.055 3 duzen x 5 rapor gunu = 15 rapor, 5 ayri deger; hepsi dogru hesaplanmistir en genis ayrilik: 27.013 puan (36.042 ile 63.055) rapora yazilan sayi bu yuzden tek basina yazilamaz: deger, veri kesme ani ve yenileme gecikmesi birlikte yazilir
İlk iki satır yakınsıyor: anlık sorgu yirmi dördüncü günde, dönemsel çekme kırkıncı günde nihai değere oturuyor. Üçüncü satır hiç yakınsamıyor ve 36,042’de kalıyor, çünkü dönem kapanışında bir kez toplanmış ve bir daha toplanmamıştır. Bu satır bir kusur değil bir karardır; kusur, o kararın raporda yazılı olmamasıdır.
On beş raporun beş ayrı değeri var ve en uçtaki ikisi arasında 27,013 puan bulunuyor. Hepsi aynı kaynaktan, aynı tanımla ve doğru hesapla üretildi. Bir raporun okuyucusu “okuma oranı 36,042” ile “okuma oranı 63,055” arasındaki farkı sayıya bakarak çözemez; farkı çözen tek şey sayının yanında duran veri kesme anı ile yenileme gecikmesidir. Raporda bu ikisi yoksa değerin kendisi geri okunamaz.
Özet
- Bir iş zekâsı aracı dört parçayla anılır: veri kaynağı bağlayıcısı, rapor veri modeli, yenileme düzeni ve sunum katmanı. Ölçü ikinci ile üçüncü parçadan çıkar.
- Aynı gün üretilen raporda okuma oranı anlık sorguyla 56,659, dönemsel çekmeyle 48,081, önceden toplanmış modelle 36,042 çıkar; kaynağın nihai değeri 63,055’tir ve üç sayı da doğrudur.
- Aynı gecikme ortalama tüketimi yalnız 0,038 m³, okuma oranını 20,617 puan oynatır; duyarlılık ölçütün tanımından değil türünden gelir.
- Rapor veri modeli tane ve alan kümesi sabitler: yalnız ortalama saklayan model küme ortalamasını 0,192 m³ yanlış üretir, toplam ile sayı saklayan model aynı soruyu doğru yanıtlar.
- Toplanabilir olmayan üç soru (ortanca, eşik üstü abone sayısı, tek abonenin okuması) iki modelde de üretilemez; tane kararı altı sorunun üçünü kalıcı olarak kapatır.
- Üç düzen ve beş rapor günü on beş rapor, beş ayrı değer ve 27,013 puanlık ayrılık üretir; farkı çözen tek şey sayının yanındaki veri kesme anı ile yenileme gecikmesidir.
Sonraki Adım
Sayı artık doğru tanımla, doğru modelden ve yazılı bir kesme anıyla geliyor. Okuyucunun elinde duran şey ise hâlâ bir sayı. Bir kararın çıkması için sayının bir zincire oturması gerekir: bulgu, karşılaştırma, sebep adayı, belirsizlik ve öneri. Zincirin bir halkası eksik kaldığında okuyucu onu kendisi tamamlar ve tamamlarken hangi yöne gideceği yazılı değildir. Sonraki ders bu zinciri kurar ve halkaları teker teker çıkararak okuyucunun yapmak zorunda kaldığı çıkarımı sayar; K05’in oynama payının bu zincirin tam olarak neresinde durduğu da orada karara bağlanır.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.