---
title: 'İş Zekâsı Araçları'
source: 'https://academia.sh/tr/kurslar/gorsellestirme-ve-raporlama/is-zekasi-araclari'
course: 'Görselleştirme, Raporlama ve Ölçekli Analiz'
language: tr
updated: '2026-08-17T18:08:49+00:00'
license: 'CC BY-SA 4.0'
---

# İş 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.

Ö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 $10^{-9}$'dur ve gerekçesi kayan
  noktalı toplamanın basamak birikimidir.

## Kaynağa Bağlanma

```python
# 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

```python

# 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.

```python

# 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

```python

# 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.
