---
title: 'Özet Tablolar'
source: 'https://academia.sh/tr/kurslar/elektronik-tablolar/ozet-tablolar'
course: 'Elektronik Tablolarla Analiz'
language: tr
updated: '2026-08-17T18:08:43+00:00'
license: 'CC BY-SA 4.0'
---

# Özet Tablolar

Aynı 1.761 satırlık sayfaya beş özet kararı uygulanır ve üç farklı bölge birinci çıkar: toplam tüketimde kuzey 10.905,8 m³, satır başına ortalamada doğu 22,80 m³, abone başına ortalamada merkez 28,39 m³. Bölge ortalaması çapraz özetin hücrelerinden üretildiğinde sıralama tutar ama güney ile batı arasındaki 3,35 m³'lük fark 0,04 m³'e iner. Aynı 20 m³ eşiği özetten sonra uygulandığında üç bölge geçer, özetten önce uygulandığında beşi de geçer ve doğu bölgesinin değeri 22,80'den 29,03 m³'e çıkar. Özet tablo dört kararından ikisini başlık satırında bir adımda verir, filtrenin yerini ve hesaplanan alanın düzeyini hiç vermez.

Bir önceki ders tek bir sütunun ortalamasını sordu ve önünde dört karar buldu. Rapor bu soruyu
sormaz; "hangi bölge birinci" diye sorar. Bu ders o soruyu **özet tabloya** devreder ve özet
tablonun kendi kararlarını sayar.

Sayfa bir önceki dersin D1 kararını almış halidir — boş okumalar dışlanmış, sıfırlar sayılmış,
1.761 satır ve 33.866,8 m³. Buradan sonrası özetin kararlarıdır: hangi alan kırılım olacak, hangi
ölçü alınacak, filtre nereye uygulanacak, hesaplanan alan hangi düzeyde üretilecek. Dersin iki
sayısı budur: **kararın ürettiği birinci** ve **kaç kararın geri okunabildiği**.

- **TO9.** Elektronik tablo yine `node` ile **modellenir**, veri kümesi **kurgudur**. Tarife
  basamağı okumadan türetilir; eşikler 10, 25 ve 40 m³'tür ve karşılaştırma küçüktür ile yapılır.
- **TO10.** Özet tablo en az iki karardan oluşur: **kırılım alanı** ve **ölçü işlevi**. İkisi de
  savunulabilir, ikisi de aynı sayfadan farklı bir sayı üretir.
- **TO11.** Kırılımın **tanesi** ayrı bir karardır: bir satır bir okumadır, bir abone bir ya da iki
  okuma taşır ve iki ölçü aynı sayfayı farklı sıralar.
- **TO12.** Kurtarılabilirlik ölçüsü sürer ve bir yer kazanır: özet tablonun **başlık satırı**
  kırılım alanını ve ölçüyü adıyla yazar, bu yüzden o iki karar **bir adımda** okunur. Filtre ve
  düzey başlıkta görünmez.

## Aynı Sayfa, Üç Farklı Birinci

```js
// ozet.mjs — elektronik tablo MODELIDIR: hucre bir eslemede durur, formul kendi
// metnini tasir, ozet tablo gruplama ve toplama kararlarinin sonucudur. Hicbir
// uygulama taklit edilmez. Veri kumesi kurgudur: onceki dersin D1 kararini
// almis sayfasi -- bos okumalar dislanmis, sifirlar sayilmis, 1761 satir.
export const TOHUM = 20260218, ABONE = 1400, TARIFE = [10, 25, 40];
const karistir = (x) => { x = Math.imul(x ^ (x >>> 16), 2246822507);
  x = Math.imul(x ^ (x >>> 13), 3266489909); return (x ^ (x >>> 16)) >>> 0; };
const uretec = (t) => { let s = karistir(t);
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };
const ayrik = (u, w) => { let t = 0;
  for (let i = 0; i < w.length; i++) { t += w[i]; if (u < t) return i; } return w.length - 1; };
export const BOLGE = [["kuzey", 0.28, 21, 0.06], ["guney", 0.22, 17, 0.03],
  ["dogu", 0.18, 26, 0.27], ["bati", 0.14, 14, 0.03], ["merkez", 0.18, 23, 0.08]]
  .map(([ad, pay, taban, eksik]) => ({ ad, pay, taban, eksik }));

const HARF = (j) => String.fromCharCode(65 + j);
export const formul = (yazi, f) => ({ tur: "formul", yazi, f });
export class Tablo {
  constructor(baslik, satirlar) {
    this.baslik = baslik; this.h = new Map(); this.n = satirlar.length;
    baslik.forEach((b, j) => this.h.set(`${HARF(j)}1`, b));
    satirlar.forEach((s, i) => baslik.forEach((b, j) =>
      this.h.set(`${HARF(j)}${i + 2}`, s[b])));
  }
  oku(ad) { const v = this.h.get(ad); return v && v.tur === "formul" ? v.f(this) : v; }
  yaz(ad, v) { this.h.set(ad, v); return this; }
}
export const topla = (a) => a.reduce((x, y) => x + y, 0);
export const ortala = (a) => (a.length ? topla(a) / a.length : 0);

// Onceki iki dersin sayfasi: tekillestirilmis 1877 satirdan okumasi olan 1761
// satir. Tarife basamagi okumadan turetilir; esikler 10, 25 ve 40 m3 ve
// karsilastirma her basamakta kucuktur ile yapilir.
export const SATIR = [];
let sira = 0;
for (let i = 0; i < ABONE; i++) {
  const r = uretec(TOHUM + i);
  const b = BOLGE[ayrik(r(), BOLGE.map((x) => x.pay))];
  const taban = Math.max(1.2, b.taban * Math.exp((r() + r() + r() - 1.5) * 0.62));
  for (const d of r() < 0.34 ? ["2026-01", "2026-02"] : ["2026-01"]) {
    const q = uretec(TOHUM + 7000 + sira++), u = q();
    const durum = u < b.eksik ? (q() < 0.72 ? "erisilemedi" : "form_sifir")
      : u < b.eksik + 0.035 ? "kapali" : "okundu";
    const gercek = Math.round(taban * (d === "2026-02" ? 0.94 : 1) * 100) / 100;
    if (durum === "erisilemedi") continue;
    const okuma = durum === "okundu" ? gercek : 0;
    SATIR.push({ abone_no: 10001 + i, bolge: b.ad, donem: d, okuma_m3: okuma,
      basamak: okuma < TARIFE[0] ? 1 : okuma < TARIFE[1] ? 2 : okuma < TARIFE[2] ? 3 : 4 });
  }
}

// Ozet tablo: bir kirilim alani, bir olcu islevi. Ikisi de karardir.
export const ozetle = (satirlar, kirilim, olcu) => {
  const g = new Map();
  for (const s of satirlar) { const k = kirilim(s);
    if (!g.has(k)) g.set(k, []); g.get(k).push(s); }
  return [...g].map(([k, l]) => ({ k, n: l.length, v: olcu(l) }))
    .sort((a, b) => b.v - a.v);
};
// Abone basina olcu: bir abonenin iki donem okumasi once kendi icinde toplanir.
// Kirilimin "tanesi" satir degil abone olur ve bu da bir karardir.
export const aboneBasina = (l) => { const m = new Map();
  for (const s of l) m.set(s.abone_no, (m.get(s.abone_no) ?? 0) + s.okuma_m3);
  return ortala([...m.values()]); };
export const KIRILIM = [
  ["K1 bolge / toplam tuketim", (l) => topla(l.map((s) => s.okuma_m3)), 1],
  ["K2 bolge / okuma sayisi", (l) => l.length, 0],
  ["K3 bolge / abone sayisi", (l) => new Set(l.map((s) => s.abone_no)).size, 0],
  ["K4 bolge / satir basina ortalama", (l) => ortala(l.map((s) => s.okuma_m3)), 2],
  ["K5 bolge / abone basina ortalama", aboneBasina, 2],
];
export const y = (w) => (h) => h.map((v, j) => (j ? String(v).padStart(w[j])
  : String(v).padEnd(w[0]))).join("");

if (import.meta.url === `file://${process.argv[1]}`) {
  console.log(`model (tohum ${TOHUM}): sayfa ${SATIR.length} satir, ` +
    `${new Set(SATIR.map((s) => s.abone_no)).size} abone, toplam ` +
    `${topla(SATIR.map((s) => s.okuma_m3)).toFixed(1)} m3`);
  const bad = BOLGE.map((b) => b.ad), y1 = y([32, 9, 8, 8, 8, 9, 9]);
  console.log("\n" + y1(["ayni sayfa, bes ozet karari", ...bad, "birinci"]));
  const birinci = new Set();
  for (const [ad, o, d] of KIRILIM) {
    const t = ozetle(SATIR, (s) => s.bolge, o); birinci.add(t[0].k);
    const m = Object.fromEntries(t.map((x) => [x.k, x.v]));
    console.log(y1([ad, ...bad.map((a) => m[a].toFixed(d)), t[0].k]));
  }
  console.log(`\nbes karar ${birinci.size} farkli bolgeyi birinci yapiyor: ` +
    `${[...birinci].join(", ")}; tek bir okuma degismedi`);
}
```

```
model (tohum 20260218): sayfa 1761 satir, 1345 abone, toplam 33866.8 m3

ayni sayfa, bes ozet karari         kuzey   guney    dogu    bati   merkez  birinci
K1 bolge / toplam tuketim         10905.8  6023.5  5791.5  3963.8   7182.3    kuzey
K2 bolge / okuma sayisi               530     355     254     291      331    kuzey
K3 bolge / abone sayisi               400     276     209     207      253    kuzey
K4 bolge / satir basina ortalama    20.58   16.97   22.80   13.62    21.70     dogu
K5 bolge / abone basina ortalama    27.26   21.82   27.71   19.15    28.39   merkez

bes karar 3 farkli bolgeyi birinci yapiyor: kuzey, dogu, merkez; tek bir okuma degismedi
```

Beş karar da doğrudur, beşi de aynı 1.761 satırı okur, üçü farklı bir bölgeyi birinci yapar.
**K1 toplam tüketim** kuzeyi verir, 10.905,8 m³; nedeni hemen altındadır — kuzey 530 okuma ve 400
abone taşır. Toplam bir düzey ölçüsü değil, bir **hacim** ölçüsüdür ve en kalabalık bölgeyi öne
çıkarır.

**K4 satır başına ortalama** doğuyu verir, 22,80 m³. Doğu sayfada yalnız 254 okuma tutar ve okuma
sayısında sonuncudur, okuma başına tüketimde birincidir. "Tüketimin en yüksek olduğu bölge" cümlesi
böylece kuzey ile doğu arasında değişir ve ikisi de doğrudur: iki ayrı soruyu cevaplarlar.

**K5 abone başına ortalama** üçüncü bir bölgeyi, merkezi verir, 28,39 m³. Buradaki fark ölçüde
değil, kırılımın **tanesindedir**: K4 her satırı bir tane sayar, K5 önce her abonenin dönem
okumalarını kendi içinde toplar. Merkez bölgesinin 331 okuması 253 aboneden, doğununki 254 okuma
209 aboneden gelir ve ikinci dönemi okunmuş abone payı merkezi 0,68 m³ öne geçirir.

Üç cümle de rapora yazılabilir ve üçü de hesap hatasızdır. Aralarındaki fark tek bir karardır ve o
karar üretilen sayının yanında durmaz.

## Filtre ve Hesaplanan Alan Nerede Duruyor

```js
// kirilim.mjs — ayni sayfa, uc soru: hesaplanan alan hangi duzeyde uretiliyor,
// filtre ozetten once mi sonra mi uygulaniyor, ozet tablonun kararlari sayfadan
// geri okunuyor mu.
import { SATIR, BOLGE, Tablo, formul, ozetle, topla, ortala, y } from "./ozet.mjs";

// Hesaplanan alan iki duzeyde uretilebilir: ham satirlardan ya da bolge ile
// tarife basamaginin caprazindan. Ikincisi her basamak hucresine esit agirlik
// verir: en az okuma tasiyan basamak hucresi en cok tasiyani kadar agirlikli olur.
const duzey = Object.fromEntries(BOLGE.map((b) => {
  const l = SATIR.filter((s) => s.bolge === b.ad);
  return [b.ad, [ortala(l.map((s) => s.okuma_m3)),
    ortala(ozetle(l, (s) => s.basamak,
      (g) => ortala(g.map((s) => s.okuma_m3))).map((h) => h.v))]];
}));
const sira = (j) => Object.entries(duzey).sort((a, b) => b[1][j] - a[1][j]).map((x) => x[0]);
console.log(`bolge ortalamasi ham satirlardan alininca siralama ${sira(0).join(" > ")}, ` +
  `capraz ozetin hucrelerinden alininca ${sira(1).join(" > ")}`);
console.log(`siralama tuttu, araliklar tutmadi: kuzey ${duzey.kuzey[0].toFixed(2)} m3'ten ` +
  `${duzey.kuzey[1].toFixed(2)} m3'e cikar, guney ile bati arasindaki fark ` +
  `${(duzey.guney[0] - duzey.bati[0]).toFixed(2)} m3 iken ` +
  `${(duzey.guney[1] - duzey.bati[1]).toFixed(2)} m3 olur`);

// Ayni filtre, iki yer: ozetten once satirlara, ozetten sonra ozet satirlarina.
const ESIK_M3 = 20;
const y2 = y([18, 7, 38]);
console.log(`\nfiltre "ortalama ${ESIK_M3} m3 ustunde" nereye uygulaniyor`);
console.log(y2(["filtrenin yeri", "sayi", "gecen bolgeler"]));
const sonra = ozetle(SATIR, (s) => s.bolge, (l) => ortala(l.map((s) => s.okuma_m3)))
  .filter((x) => x.v > ESIK_M3);
const once = ozetle(SATIR.filter((s) => s.okuma_m3 > ESIK_M3), (s) => s.bolge,
  (l) => ortala(l.map((s) => s.okuma_m3)));
console.log(y2(["ozetten sonra", sonra.length, sonra.map((x) => x.k).join(" ")]));
console.log(y2(["ozetten once", once.length, once.map((x) => x.k).join(" ")]));
console.log(`ayni esik, ayni sayfa: bir yerde ${sonra.length} bolge gecer, obur yerde ` +
  `${once.length}; ${sonra[0].k} bolgesinin degeri ${sonra[0].v.toFixed(2)} m3 iken ` +
  `${once.find((x) => x.k === sonra[0].k).v.toFixed(2)} m3 olur`);

// Kararin kurtarilabilirligi: karar baslik satirinda ya da bir hucre
// formulunde yaziliysa bir adim, ayri bir not hucresinde iki adim, hicbir
// hucrede yoksa okunamaz.
const KOD = ["G1 kirilim alani", "G2 olcu islevi", "G3 filtrenin yeri",
  "G4 hesaplanan alanin duzeyi"];
const geriOku = (t) => KOD.map((k) => {
  const n = k.slice(0, 2), v = [...t.h.values()];
  if (t.baslik.some((b) => b.includes(n))) return 1;
  if (v.some((x) => x && x.tur === "formul" && x.yazi.includes(n))) return 1;
  if (v.some((x) => typeof x === "string" && x.startsWith("karar ") && x.includes(n))) return 2;
  return null;
});
const BAS = ["G1 kirilim: bolge", "G2 olcu: toplam tuketim_m3", "okuma sayisi"];
const kayit = ozetle(SATIR, (s) => s.bolge, (l) => topla(l.map((s) => s.okuma_m3)))
  .map((x) => ({ [BAS[0]]: x.k, [BAS[1]]: Math.round(x.v * 10) / 10, [BAS[2]]: x.n }));
const ozetSayfa = new Tablo(BAS, kayit);
const notlu = new Tablo(BAS, kayit)
  .yaz("E1", "karar G3: filtre ozetten sonra ozet satirlarina uygulandi");
const izli = new Tablo([...BAS, "kaynak", "duzey"], kayit.map((x) => ({ ...x,
  kaynak: formul("G3 filtre ozetten sonra ozet satirlarina uygulanir; " +
    "ozet oncesi hicbir satir elenmez", () => x[BAS[2]]),
  duzey: formul("G4 hesaplanan alan ham satirlardan uretilir, ozet hucrelerinden degil",
    () => x[BAS[1]] / x[BAS[2]]) })));

const y3 = y([30, 15, 13, 11]);
console.log("\nozet tablonun karari sayfadan geri okunabiliyor mu");
console.log(y3(["karar", "ozet sayfasi", "notlu sayfa", "izli sayfa"]));
const sonuc = [ozetSayfa, notlu, izli].map(geriOku);
KOD.forEach((k, j) => console.log(y3([k,
  ...sonuc.map((s) => (s[j] ? `${s[j]} adim` : "okunamaz"))])));
console.log(["ozet sayfasi", "notlu", "izli"].map((ad, j) =>
  `${ad} ${sonuc[j].filter(Boolean).length}/${KOD.length}`).join(", ") +
  " karar geri okunabiliyor");
```

```
bolge ortalamasi ham satirlardan alininca siralama dogu > merkez > kuzey > guney > bati, capraz ozetin hucrelerinden alininca dogu > merkez > kuzey > guney > bati
siralama tuttu, araliklar tutmadi: kuzey 20.58 m3'ten 23.27 m3'e cikar, guney ile bati arasindaki fark 3.35 m3 iken 0.04 m3 olur

filtre "ortalama 20 m3 ustunde" nereye uygulaniyor
filtrenin yeri       sayi                        gecen bolgeler
ozetten sonra           3                     dogu merkez kuzey
ozetten once            5          dogu merkez kuzey guney bati
ayni esik, ayni sayfa: bir yerde 3 bolge gecer, obur yerde 5; dogu bolgesinin degeri 22.80 m3 iken 29.03 m3 olur

ozet tablonun karari sayfadan geri okunabiliyor mu
karar                            ozet sayfasi  notlu sayfa izli sayfa
G1 kirilim alani                       1 adim       1 adim     1 adim
G2 olcu islevi                         1 adim       1 adim     1 adim
G3 filtrenin yeri                    okunamaz       2 adim     1 adim
G4 hesaplanan alanin duzeyi          okunamaz     okunamaz     1 adim
ozet sayfasi 2/4, notlu 3/4, izli 4/4 karar geri okunabiliyor
```

İlk iki satır hesaplanan alanın hangi düzeyde üretildiğini ölçüyor. Bölge ortalaması ham satırlardan
alınırsa her okuma bir ağırlık taşır; bölge ile tarife basamağının çaprazından alınırsa az kişilik
bir basamak kalabalık bir basamak kadar söz sahibi olur. Sıralama bu kümede tutuyor ama **aralıklar
tutmuyor**: kuzey bölgesinin ortalaması 20,58'den 23,27 m³'e çıkar, güney ile batı arasındaki fark
3,35 m³'ten 0,04 m³'e iner. Sıralamanın korunması bir güvence değildir: o fark seksen katına yakın
küçülmüştür.

Sonraki tablo aynı eşiği iki ayrı yere koyuyor. "Ortalaması 20 m³'ün üstünde olan bölgeler" sorusu
özet satırlarına uygulandığında **üç** bölge geçer; aynı eşik önce ham satırlara uygulanıp özet
sonra alındığında **beşi de** geçer, çünkü ikinci durumda her bölge yalnız kendi yüksek
okumalarından hesaplanır. Doğu bölgesinin değeri 22,80 m³ iken 29,03 m³ olur. Eşik 20 m³'tür ve
tarife basamaklarının ortasında durduğu için seçilmiştir; karşılaştırma eşiğin aşılıp aşılmadığına
bakar, kayan noktalı bir eşitliğe değil.

## Karar Nerede Duruyor

Son tablo dersin ikinci sayısıdır ve kurs boyunca ilk kez sıfırdan başlamıyor. **Özet sayfası** dört
karardan ikisini bir adımda verir, çünkü başlık satırı kırılım alanını ve ölçüyü adıyla yazar. Özet
tablo, ürettiği sayının yanına kendi tanımının bir bölümünü **kendiliğinden** koyan ilk araçtır.

Taşımadığı iki karar tam da ölçülen ikisidir: filtrenin yeri üç bölge ile beş bölge arasındaki farkı
belirler, hesaplanan alanın düzeyi 3,35 m³'ü 0,04 m³'e indirir, ikisi de başlıkta görünmez. **Not
düşülmüş sayfa** filtreyi yazarak üçe çıkar ve düzeyi yazmaz, çünkü düzey bir karar gibi değil,
hesabın kendisi gibi görünür.

**İzli sayfa** iki kararı da birer formül sütununda taşır ve dördü de bir adımda okunur; bedeli yine
sütundur. Özet tablonun kendiliğinden taşıdığı bölüm en ucuzudur: adlandırması kolay olanı yazar,
sayıyı en çok oynatanı yazmaz.

## Özet

- Aynı 1.761 satırlık sayfaya beş özet kararı uygulanır ve üç farklı bölge birinci çıkar: toplamda
  kuzey 10.905,8 m³, satır başına ortalamada doğu 22,80 m³, abone başına ortalamada merkez
  28,39 m³.
- Toplam bir hacim ölçüsüdür: doğu bölgesi 254 okumayla okuma sayısında sonuncu, okuma başına
  tüketimde birincidir. Kırılımın tanesi de ayrı bir karardır ve abone başına ölçü merkezi doğunun
  0,68 m³ önüne geçirir.
- Bölge ortalaması çapraz özetin hücrelerinden üretildiğinde sıralama tutar ama güney ile batı
  arasındaki fark 3,35 m³'ten 0,04 m³'e iner.
- Aynı 20 m³ eşiği özetten sonra üç bölge, özetten önce beş bölge geçirir ve doğu bölgesinin değeri
  22,80'den 29,03 m³'e çıkar.
- Özet tablo dört kararından ikisini başlık satırında bir adımda verir; filtrenin yeri notla iki
  adımda, düzey ancak formülle okunur.

## Sonraki Adım

Özet tablo sayıyı üretti, ama rapora giren şey çoğu zaman sayı değil, sayının resmidir. Grafik özetin
üstüne iki karar daha ekler: hangi grafik türü seçilecek ve eksen nereden başlayacak. İlki bir uyum
sorusudur; ikincisi bir büyütme sorusudur — aynı fark, eksen sıfırdan başlarken bir görünür, en
küçük değere yakın başlarken başka. Sonraki ders bir grafik kümesinin kaçının ölçeğe uymadığını sayar ve eksen başlangıcı
değişince aynı farkın kaç kat büyük göründüğünü ölçer.
