Ders 10 / 11
Temel Grafikler
On grafik önerisinin dördü çizilebilir ama alanın ölçeğine ya da ölçünün toplanabilirliğine uymaz: sınıflayıcı bir eksen üzerine çizgi, sıralayıcı bir eksen üzerine çizgi, etiket olan bir alan üzerine dağılım ve ortalamalardan pasta. Aynı beş bölge ortalaması iki eksen başlangıcıyla çizildiğinde doğu ile batı arasındaki gerçek 1,67'lik oran, eksen sıfırdan başlarken 1,63 uzunluk oranı verir, 13 m³'ten başlarken 13,00 verir; aynı fark 8,0 kat büyük görünür ve tek bir okuma değişmez. Grafik sayfaya yalnız çizdiği aralığı bildirir: dört karardan grafikli sayfada biri, not düşülmüş sayfada ikisi, izli sayfada dördü geri okunur.
İçindekiler
Bir önceki ders özet tablonun dört kararını saydı ve ikisinin sayfada hiç durmadığını gösterdi. Rapora giren şey çoğu zaman o sayı değil, sayının resmidir. Grafik özetin üstüne iki karar daha ekler: hangi tür seçilecek ve eksen nereden başlayacak. İlki bir uyum sorusudur, ikincisi bir büyütme sorusu.
Bu dersin iki sayısı bunlardır: bir grafik kümesinin kaçının alanın ölçeğine uymadığı ve eksen başlangıcı değişince aynı farkın kaç kat büyük göründüğü. Yanlarında kursun ikinci ölçüsü durur: grafiğin kararlarından kaçı sayfadan geri okunabiliyor.
- TO13. Elektronik tablo yine
nodeile modellenir, veri kümesi kurgudur. Grafik bu modelde bir aralık ile birkaç ayardan ibarettir ve ayarlar sayfanın hücrelerinde durmaz. - TO14. Alanların hangi ölçekte olduğu bu müfredatın ilk kursunda belirlendi ve burada tekrarlanmaz. Sayılan tek şey grafik türünün o ölçekle uyup uymadığıdır.
- TO15. Her tür ekseninden ve ölçüsünden bir şey ister: çizgi grafiği sıralı ve eşit aralıklı bir eksen, pasta ve yığılmış sütun dilimlerin bütün vermesi, dağılım grafiği iki sayısal eksen. Ortalama ve oran toplanamaz, bu yüzden dilim olamaz.
- TO16. Kurtarılabilirlik ölçüsü sürer: karar bir hücre formülünde yazılıysa bir adımda, ayrı bir not hücresinde iki adımda okunur, hiçbir hücrede yoksa okunamaz.
Kaç Grafik Ölçeğine Uymuyor
// grafik.mjs — elektronik tablo MODELIDIR: hucre bir eslemede durur, formul // kendi metnini tasir, grafik bir aralik ile birkac ayardan ibarettir. Hicbir // uygulama taklit edilmez, hicbir arac adi gecmez. Veri kumesi kurgudur: // onceki dersin ozetlenen 1761 satirlik sayfasi. 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); 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"; if (durum === "erisilemedi") continue; const okuma = durum === "okundu" ? Math.round(taban * (d === "2026-02" ? 0.94 : 1) * 100) / 100 : 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 }); } } // Alanlarin olcekleri onceki kursta belirlendi; burada yalnizca grafik turunun // o olcekle uyup uymadigi sayilir. Olcek sirasi kapsama sirasidir. export const OLCEK = { siniflayici: 0, siralayici: 1, aralik: 2, oran: 3 }; export const ALAN = { bolge: "siniflayici", abone_no: "siniflayici", basamak: "siralayici", donem: "aralik", okuma_m3: "oran" }; // Her grafik turu ekseninden ve olcusunden bir sey ister. // eksenEnAz / eksenEnCok: eksen alaninin olcegi bu araligin disindaysa tur uymaz. // butun: dilimlerin toplaminin bir butun vermesi gerekir. export const TUR = { "sutun": { eksenEnAz: 0, eksenEnCok: 3, butun: false }, "cizgi": { eksenEnAz: 2, eksenEnCok: 3, butun: false }, "pasta": { eksenEnAz: 0, eksenEnCok: 1, butun: true }, "yigilmis sutun": { eksenEnAz: 0, eksenEnCok: 1, butun: true }, "dagilim": { eksenEnAz: 2, eksenEnCok: 3, butun: false }, }; // Onerilen grafikler: eksen alani, olcu, tur ve olcunun toplanip toplanamadigi. // Ortalama ve oran toplanamaz: dilimleri toplandiginda bir butun vermez. export const ONERI = [ ["bolge / toplam m3", "bolge", "sutun", true], ["bolge / toplam m3", "bolge", "pasta", true], ["bolge / toplam m3", "bolge", "cizgi", true], ["bolge / ortalama m3", "bolge", "sutun", false], ["bolge / ortalama m3", "bolge", "pasta", false], ["basamak / abone sayisi", "basamak", "sutun", true], ["basamak / abone sayisi", "basamak", "cizgi", true], ["bolge x basamak / abone", "bolge", "yigilmis sutun", true], ["donem / ortalama m3", "donem", "cizgi", false], ["abone_no / okuma_m3", "abone_no", "dagilim", false], ]; export const uyum = ([, alan, tur, toplanir]) => { const o = OLCEK[ALAN[alan]], t = TUR[tur]; if (o < t.eksenEnAz || o > t.eksenEnCok) return "eksen olcegi"; if (t.butun && !toplanir) return "dilimler butun vermiyor"; return "uygun"; }; 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, ` + `toplam ${topla(SATIR.map((s) => s.okuma_m3)).toFixed(1)} m3`); const y1 = y([24, 16, 14, 16, 25]); console.log("\n" + y1(["onerilen grafik", "eksen alani", "olcek", "tur", "sonuc"])); let uymaz = 0; for (const o of ONERI) { const s = uyum(o); if (s !== "uygun") uymaz++; console.log(y1([o[0], o[1], ALAN[o[1]], o[2], s])); } console.log(`\n${ONERI.length} grafik onerisinin ${uymaz} tanesi cizilebilir ama ` + `alanin olcegine ya da olcunun toplanabilirligine uymuyor; ` + `${ONERI.length - uymaz} tanesi uyuyor`); }
model (tohum 20260218): sayfa 1761 satir, toplam 33866.8 m3 onerilen grafik eksen alani olcek tur sonuc bolge / toplam m3 bolge siniflayici sutun uygun bolge / toplam m3 bolge siniflayici pasta uygun bolge / toplam m3 bolge siniflayici cizgi eksen olcegi bolge / ortalama m3 bolge siniflayici sutun uygun bolge / ortalama m3 bolge siniflayici pasta dilimler butun vermiyor basamak / abone sayisi basamak siralayici sutun uygun basamak / abone sayisi basamak siralayici cizgi eksen olcegi bolge x basamak / abone bolge siniflayici yigilmis sutun uygun donem / ortalama m3 donem aralik cizgi uygun abone_no / okuma_m3 abone_no siniflayici dagilim eksen olcegi 10 grafik onerisinin 4 tanesi cizilebilir ama alanin olcegine ya da olcunun toplanabilirligine uymuyor; 6 tanesi uyuyor
On önerinin onu da çizilebilir ve hiçbiri hata üretmez. Altısı uyar, dördü uymaz ve uymama üç ayrı biçimde ortaya çıkar.
Üç grafik eksen ölçeğinde takılır. Bölge alanı sınıflayıcıdır: beş bölge arasında bir sıra yoktur, dolayısıyla noktaları birleştiren bir çizgi iki bölge arasında bir ara değer olduğunu iddia eder ve öyle bir değer yoktur. Aynı çizgi, bölgeler sayfada başka bir sırayla dizilseydi bambaşka bir eğri verirdi. Basamak alanı sıralayıcıdır ve sıra vardır, ama basamaklar arası uzaklık tanımsızdır; eğimin bir birimi yoktur. Abone numarası bir etikettir ve dağılım grafiğinin yatay eksenine konduğunda numara büyüdükçe artan bir eğilim gösterir; gösterdiği tek şey abonelerin kayıt sırasıdır.
Dördüncüsü eksende değil, ölçüde takılır. Bölge ortalamalarından pasta çizmek dilimleri toplanamayan bir ölçüden dilim yapar: beş ortalamanın toplamı hiçbir şeydir ve her dilimin yüzdesi o hiçbir şeye oranla hesaplanır. Aynı beş bölgenin toplam tüketiminden çizilen pasta uyar, çünkü toplamlar gerçekten bir bütün verir. Ölçek doğru olduğunda bile ölçünün toplanabilirliği ayrı bir koşuldur.
Aynı Beş Sayı, İki Eksen
// eksen.mjs — ayni bes sayi, iki eksen baslangici; sonra grafigin kararlarinin // sayfadan geri okunup okunamadigi. Cubuklar metin olarak cizilir, cunku // olculen sey bicim degil uzunluk oranidir. import { SATIR, BOLGE, Tablo, formul, ortala, y } from "./grafik.mjs"; const GENIS = 26; const deger = BOLGE.map((b) => ({ ad: b.ad, v: ortala(SATIR.filter((s) => s.bolge === b.ad).map((s) => s.okuma_m3)) })); const enAz = Math.min(...deger.map((d) => d.v)), enCok = Math.max(...deger.map((d) => d.v)); const EKSEN = [0, Math.floor(enAz)]; const cubuk = (v, alt) => "#".repeat(Math.max(0, Math.round(GENIS * (v - alt) / (enCok - alt)))); const y1 = y([9, 8]); for (const alt of EKSEN) { console.log(`bolge basina ortalama, dusey eksen ${alt} m3'ten baslarsa`); for (const d of deger) console.log(y1([d.ad, d.v.toFixed(2)]) + " " + cubuk(d.v, alt)); console.log(""); } const [a, b] = [deger.find((d) => d.ad === "dogu"), deger.find((d) => d.ad === "bati")]; const oran = (alt) => cubuk(a.v, alt).length / Math.max(1, cubuk(b.v, alt).length); console.log(`dogu ile bati arasindaki gercek oran ${(a.v / b.v).toFixed(2)}; cubuk orani ` + `eksen 0'dan baslarken ${oran(0).toFixed(2)}, eksen ${EKSEN[1]} m3'ten baslarken ` + `${oran(EKSEN[1]).toFixed(2)}`); console.log(`ayni fark ${(oran(EKSEN[1]) / oran(0)).toFixed(1)} kat buyuk gorunuyor ve ` + `tek bir okuma degismedi`); // Kararin kurtarilabilirligi: karar bir hucre formulunde yaziliysa bir adim, // ayri bir not hucresinde iki adim, hicbir hucrede yoksa okunamaz. Grafigin // ayari sayfanin hucrelerinde durmaz; grafik nesnesinin icinde durur. const KOD = ["C1 grafik turu", "C2 eksen baslangici", "C3 cizilen aralik", "C4 dilimler butun veriyor mu"]; const geriOku = (t) => KOD.map((k) => { const n = k.slice(0, 2), v = [...t.h.values()]; 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 = ["bolge", "ortalama_m3"]; const kayit = deger.map((d) => ({ bolge: d.ad, ortalama_m3: Math.round(d.v * 100) / 100 })); // Grafik sayfadan yalnizca cizdigi araligi bildirir; turu, eksen ayari ve // dilimlerin butun verip vermedigi hicbir hucrede yazmaz. const grafikli = new Tablo(BAS, kayit) .yaz("D1", formul("C3 grafik A2:B6 araligini cizer", () => kayit.length)); const notlu = new Tablo(BAS, kayit) .yaz("D1", formul("C3 grafik A2:B6 araligini cizer", () => kayit.length)) .yaz("D2", `karar C2: dusey eksen ${EKSEN[1]} m3'ten baslatildi`); const izli = new Tablo(BAS, kayit) .yaz("D1", formul("C3 grafik A2:B6 araligini cizer", () => kayit.length)) .yaz("D2", formul("C1 grafik turu sutundur, cunku eksen alani siniflayici", () => "sutun")) .yaz("D3", formul(`C2 dusey eksen ${EKSEN[1]} m3'ten baslar; sifirdan baslasaydi ` + `cubuk orani ${oran(0).toFixed(2)} olurdu`, () => EKSEN[1])) .yaz("D4", formul("C4 olcu ortalamadir, dilimleri toplanmaz, pasta cizilemez", () => false)); const y2 = y([30, 17, 13, 11]); console.log("\ngrafigin karari sayfadan geri okunabiliyor mu"); console.log(y2(["karar", "grafikli sayfa", "notlu sayfa", "izli sayfa"])); const sonuc = [grafikli, notlu, izli].map(geriOku); KOD.forEach((k, j) => console.log(y2([k, ...sonuc.map((s) => (s[j] ? `${s[j]} adim` : "okunamaz"))]))); console.log(["grafikli", "notlu", "izli"].map((ad, j) => `${ad} ${sonuc[j].filter(Boolean).length}/${KOD.length}`).join(", ") + " karar geri okunabiliyor");
bolge basina ortalama, dusey eksen 0 m3'ten baslarsa kuzey 20.58 ####################### guney 16.97 ################### dogu 22.80 ########################## bati 13.62 ################ merkez 21.70 ######################### bolge basina ortalama, dusey eksen 13 m3'ten baslarsa kuzey 20.58 #################### guney 16.97 ########### dogu 22.80 ########################## bati 13.62 ## merkez 21.70 ####################### dogu ile bati arasindaki gercek oran 1.67; cubuk orani eksen 0'dan baslarken 1.63, eksen 13 m3'ten baslarken 13.00 ayni fark 8.0 kat buyuk gorunuyor ve tek bir okuma degismedi grafigin karari sayfadan geri okunabiliyor mu karar grafikli sayfa notlu sayfa izli sayfa C1 grafik turu okunamaz okunamaz 1 adim C2 eksen baslangici okunamaz 2 adim 1 adim C3 cizilen aralik 1 adim 1 adim 1 adim C4 dilimler butun veriyor mu okunamaz okunamaz 1 adim grafikli 1/4, notlu 2/4, izli 4/4 karar geri okunabiliyor
İki çubuk kümesi aynı beş sayıyı çiziyor. Üstteki eksen sıfırdan başlar ve çubuk uzunluklarının oranı 1,63 çıkar; doğu ile batı arasındaki gerçek oran 1,67’dir, aradaki küçük fark çubukların tam karakterlere yuvarlanmasından gelir. Alttaki eksen en küçük değerin altındaki tam sayıdan, 13 m³’ten başlar ve aynı iki çubuğun oranı 13,00 olur. Aynı fark 8,0 kat büyük görünür ve tek bir okuma değişmemiştir.
Eksen başlangıcını yükseltmek kendiliğinden bir kusur değildir. Beş bölgenin ortalaması 13,62 ile 22,80 arasında sıkışıktır ve sıfırdan başlayan bir eksende aradaki farklar görünmez hale gelir; eksen kırpıldığında görünür olurlar. Bedeli şudur: sütun grafiğinde okunan şey uzunluk oranıdır, ve eksen sıfırdan başlamayınca o oran veriye ait olmaktan çıkar. Çizgi grafiğinde okunan şey eğimdir, uzunluk değil; orada eksen kırpılabilir. Karar kuralı buradan çıkar: uzunluk okunuyorsa eksen sıfırdan başlar, kırpılıyorsa nereden başladığı yazılır.
Karar Nerede Duruyor
Son tablo dersin ikinci sayısıdır. Grafikli sayfa dört karardan yalnız birini verir: çizdiği aralığı. Grafik hangi hücreleri okuduğunu söyler, o hücrelerden neyi nasıl gösterdiğini söylemez. Tür, eksen başlangıcı ve dilimlerin bütün verip vermediği grafik nesnesinin içinde durur, sayfanın hiçbir hücresinde değil; sayfayı açan ikinci kişi grafiği silip yeniden çizerse aynı resmi elde edeceğinin bir güvencesi yoktur.
Not düşülmüş sayfa ikiye çıkar ve eklediği tek karar eksen başlangıcıdır. Bunun bir nedeni var: eksen ayarı bilinçli olarak değiştirilmiş tek karardır, öbür ikisi seçilmemiş, varsayılan olarak kalmıştır. Elle tutulan not değiştirilen kararı yazar, kalan kararı yazmaz — oysa ortalamalardan çizilen pasta da tam olarak yazılmamış bir karardır.
İzli sayfa dördünü de bir adımda verir, çünkü grafik ayarları sayfaya taşınmıştır: eksen başlangıcı bir hücrede durur, grafik o hücreyi okur, hücrenin formülü sıfırdan başlansaydı oranın ne olacağını da yazar. Bedeli üç fazladan hücredir. Kursun kuralı burada da aynı biçimde çıkıyor — elektronik tablo bir hesap aracıdır, bir kayıt aracı değildir; kayıt hücreyle satın alınır.
Özet
- On grafik önerisinin altısı uyar, dördü çizilebilir ama uymaz ve hiçbiri hata üretmez.
- Üç uyumsuzluk eksen ölçeğindedir: sınıflayıcı bir eksen üzerine çizgi ara değer, sıralayıcı bir eksen üzerine çizgi birimsiz eğim, etiket olan bir alan üzerine dağılım kayıt sırası gösterir.
- Dördüncüsü ölçüdedir: ortalamaların dilimleri toplanmaz, aynı bölgelerin toplamlarından çizilen pasta ise uyar.
- Aynı beş sayının çubuk oranı eksen sıfırdan başlarken 1,63, 13 m³’ten başlarken 13,00 çıkar; aynı fark 8,0 kat büyük görünür.
- Grafik sayfaya yalnız çizdiği aralığı bırakır: dört karardan grafikli sayfada biri, not düşülmüş sayfada ikisi, izli sayfada dördü geri okunur.
Sonraki Adım
Dört ders boyunca her işlem bir karar taşıdı ve kararların çoğu sayfada durmadı. Bu bir kullanım hatası değil, aracın biçimi: elektronik tablo hesabı hücreye yazar, kararı yazmaz. Sonraki ders bu biçimin sınırını üç yerde ölçer — sayfa kaç satırda ağırlaşır, aynı sayfayı ikinci kez açan biri aynı sayıyı bulur mu, tek bir yanlış aralık kaç hücreye yayılır. Kurs orada kapanır ve on bir dersin kararlarını tek bir tabloda sayar.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.