İçeriğe geç
academia.sh

Ders 03 / 11

Ödünleşim Çözümlemesi

Alternatiflerin nitelik ekseninde puanlandığı tablonun kayda geçmiş halinin ölçülmesi: üçüncü bir kişinin kayıttaki tabloyla aynı sonuca varıp varamadığı sayılır, eksik ölçüt, yazılmamış ağırlık ve kaynağı belirsiz puan üç ayrı kusur olarak ayrılır, her kusur tek tek giderilerek yeniden üretilebilen karar oranı ölçülür ve tamamlamanın dakika cinsinden bedeli kazanılan çözümleme başına hesaplanır.

İçindekiler

Önceki ders bir değerlendirme turunun kararı çevirdiğini ölçtü ve geriye “şu bilgi yüzünden değişti” biçiminde tek satırlık bir gerekçe bıraktı. O satırın arkasında birden çok alternatif, birden çok nitelik ve her alternatifin her nitelikteki durumu vardı. Ödünleşim çözümlemesi bu tablonun adıdır.

Tablonun nasıl kurulacağı, ağırlıkların kazananı nasıl belirlediği ve ağırlık uzayının taranmasıyla kararın ne kadar dayanıklı olduğu önceki kursta ölçüldü. Burada tekrarlanmaz. Bu dersin sorusu başkadır: çözümleme yapıldıktan ve kayda geçtikten sonra, o kaydı okuyan üçüncü bir kişi aynı sonuca varabiliyor mu. Ölçülecek nicelik budur — yeniden üretilebilirlik.

Kayıttaki Tablo ve Üçüncü Kişi

Bir çözümlemenin yeniden üretilebilmesi için kayıtta dört şeyin bulunması gerekir: alternatifler, ölçütler, puanlar ve ağırlıklar. Pratikte üç kusur görülür ve üçü farklı biçimde bozar.

Eksik ölçüt. Kararda etkili olmuş bir nitelik tabloya hiç girmemiştir. Tablo eksiksiz görünür, çünkü eksik olan sütunun yeri boş kalmaz — sütun yoktur.

Yazılmamış ağırlık. Ölçütler yazılmıştır, ağırlıklar yazılmamıştır. Okuyan kişi bir varsayım yapmak zorunda kalır ve yapacağı varsayım eşit ağırlıktır; önceki kursta ölçüldüğü gibi eşit ağırlık da bir ağırlık kümesidir, yalnızca seçildiği söylenmemiştir.

Kaynağı belirsiz puan. Puan yazılıdır ama nereden geldiği yazılı değildir. Bu kusur kazananı değiştirmez, doğrulamayı engeller: okuyan kişi aynı sonuca varır, ama vardığı sonucun doğru olup olmadığını sınayamaz.

Aşağıdaki model beş çözümleme kaydı içerir. Her kaydın yanında modelin girdisi olarak kayda girmemiş olan gerçek bilgi durur: eksik ölçütün adı ve puanları ile kararın gerçekten dayandığı ağırlık vektörü (KK10). Üçüncü kişi bunları görmez; yalnızca kaydı okur. Kurgu bir modeldir.

// odun/tablo.mjs — kayda gecmis odunlesim cozumlemeleri; kurgu bir modeldir
// Kayittaki tablo, eksik olan olcut ve gercek agirlik modelin girdisidir (KK10).
export const COZUMLEME = [
  { ad: "arama-dizini", alt: ["katalog-ici", "ayri-servis", "dis-hizmet"],
    olcut: ["yanit-suresi", "isletme-yuku", "maliyet"],
    puan: [[2, 2, 2], [5, 4, 3], [4, 5, 2]], agirlik: null, kaynaksiz: 2,
    eksik: { ad: "veri-tazeligi", puan: [5, 2, 2] }, gercek: [0.20, 0.15, 0.15, 0.50],
    kayitli: "katalog-ici" },
  { ad: "rapor-uretimi", alt: ["merkez", "sube", "gece-toplu"],
    olcut: ["tazelik", "sunucu-yuku", "gelistirme-suresi"],
    puan: [[4, 2, 4], [5, 4, 2], [2, 5, 5]], agirlik: [0.50, 0.30, 0.20], kaynaksiz: 1,
    eksik: null, gercek: [0.50, 0.30, 0.20], kayitli: "sube" },
  { ad: "uye-kimligi", alt: ["merkezi-servis", "sube-tablosu", "gunluk-kopya"],
    olcut: ["tutarlilik", "kesinti-dayanimi", "isletme-yuku"],
    puan: [[5, 2, 3], [2, 5, 4], [3, 4, 2]], agirlik: null, kaynaksiz: 0,
    eksik: null, gercek: [0.55, 0.25, 0.20], kayitli: "merkezi-servis" },
  { ad: "ceza-motoru", alt: ["odunc-servisi", "katalog-modulu", "sube-ayari"],
    olcut: ["degistirilebilirlik", "kurulum-yuku"],
    puan: [[5, 3], [2, 5], [3, 4]], agirlik: [0.60, 0.40], kaynaksiz: 2,
    eksik: { ad: "sube-istisnasi", puan: [2, 3, 5] }, gercek: [0.35, 0.25, 0.40],
    kayitli: "sube-ayari" },
  { ad: "yedekleme-yolu", alt: ["gece-penceresi", "surekli-akis", "haftalik-tam"],
    olcut: ["veri-kaybi-penceresi", "isletme-yuku", "maliyet"],
    puan: [[4, 4, 4], [5, 2, 2], [2, 5, 5]], agirlik: [0.45, 0.30, 0.25], kaynaksiz: 3,
    eksik: null, gercek: [0.45, 0.30, 0.25], kayitli: "gece-penceresi" },
];

export const kazanan = (alt, puan, w) => alt
  .map((ad, i) => ({ ad, toplam: puan[i].reduce((t, p, j) => t + p * w[j], 0) }))
  .sort((a, b) => b.toplam - a.toplam)[0].ad;

export const esit = (n) => Array(n).fill(1 / n);

// Okuyanin elindeki tablo: eksik olcut yok, agirlik yazilmamissa esit varsayilir.
export function okunan(c, duzelt = {}) {
  const olcut = duzelt.olcutEkle && c.eksik ? [...c.olcut, c.eksik.ad] : [...c.olcut];
  const puan = c.alt.map((_, i) => duzelt.olcutEkle && c.eksik
    ? [...c.puan[i], c.eksik.puan[i]] : [...c.puan[i]]);
  let w = duzelt.agirlikYaz ? c.gercek.slice(0, olcut.length)
    : c.agirlik ? c.agirlik.slice(0, olcut.length) : esit(olcut.length);
  while (w.length < olcut.length) w = [...w, 1 / olcut.length];  // eklenen olcut icin varsayilan
  const s = w.reduce((t, x) => t + x, 0);
  return { olcut, puan, w: w.map((x) => x / s) };
}

if (import.meta.url.endsWith(process.argv[1].split("/").pop())) {
  const k = (a) => COZUMLEME.filter(a).length;
  console.log(`${COZUMLEME.length} cozumleme; kusur: eksik olcut ${k((c) => c.eksik)}, ` +
    `yazilmamis agirlik ${k((c) => !c.agirlik)}, kaynagi belirsiz puan ` +
    `${COZUMLEME.reduce((t, c) => t + c.kaynaksiz, 0)}\n`);
  console.log("kayittaki tabloyla yeniden uretim:");
  for (const c of COZUMLEME) {
    const o = okunan(c);
    const kusur = [c.eksik && "eksik olcut", !c.agirlik && "yazilmamis agirlik",
      c.kaynaksiz && `${c.kaynaksiz} kaynaksiz puan`].filter(Boolean);
    console.log(`  ${c.ad.padEnd(15)} kayitli ${c.kayitli.padEnd(15)} okunan ` +
      `${kazanan(c.alt, o.puan, o.w).padEnd(15)} kusur: ${kusur.join(", ") || "-"}`);
  }
  const DUZELTME = [["kayitta oldugu gibi", {}], ["agirlik yazilinca", { agirlikYaz: true }],
    ["eksik olcut eklenince", { olcutEkle: true }],
    ["ikisi de", { agirlikYaz: true, olcutEkle: true }],
    ["kaynaklar da yazilinca", { agirlikYaz: true, olcutEkle: true, kaynakYaz: true }]];
  console.log("\nduzeltme etkisi (yeniden uretilebilen / ayrica dogrulanabilen):");
  for (const [ad, d] of DUZELTME) {
    const uret = COZUMLEME.filter((c) => {
      const o = okunan(c, d);
      return kazanan(c.alt, o.puan, o.w) === c.kayitli;
    });
    const dogrulanan = uret.filter((c) => d.kaynakYaz || c.kaynaksiz === 0);
    console.log(`  ${ad.padEnd(22)} ${uret.length}/${COZUMLEME.length}   ${dogrulanan.length}/${COZUMLEME.length}`);
  }
}
5 cozumleme; kusur: eksik olcut 2, yazilmamis agirlik 2, kaynagi belirsiz puan 8

kayittaki tabloyla yeniden uretim:
  arama-dizini    kayitli katalog-ici     okunan ayri-servis     kusur: eksik olcut, yazilmamis agirlik, 2 kaynaksiz puan
  rapor-uretimi   kayitli sube            okunan sube            kusur: 1 kaynaksiz puan
  uye-kimligi     kayitli merkezi-servis  okunan sube-tablosu    kusur: yazilmamis agirlik
  ceza-motoru     kayitli sube-ayari      okunan odunc-servisi   kusur: eksik olcut, 2 kaynaksiz puan
  yedekleme-yolu  kayitli gece-penceresi  okunan gece-penceresi  kusur: 3 kaynaksiz puan

duzeltme etkisi (yeniden uretilebilen / ayrica dogrulanabilen):
  kayitta oldugu gibi    2/5   0/5
  agirlik yazilinca      3/5   1/5
  eksik olcut eklenince  3/5   0/5
  ikisi de               5/5   1/5
  kaynaklar da yazilinca 5/5   5/5

Beş çözümlemenin ikisi kayıttaki haliyle yeniden üretilebiliyor. Üçünde okuyan kişi kayıtta yazan karardan farklı bir kazanana varıyor: arama-dizini kaydında katalog-ici yazıyor ama tablo ayri-servis veriyor, uye-kimligi kaydında merkezi-servis yazıyor ama tablo sube-tablosu veriyor. Bu, kaydı okuyanın kararı yanlış anlaması değildir; kayıttaki tablo gerçekten o sonucu üretir. Kararın kendisi doğrudur, kaydı yanlıştır.

Düzeltme tablosu üç kusurun ağırlığını ayırıyor. Ağırlıkları yazmak yeniden üretilebilen çözümleme sayısını 2’den 3’e çıkarıyor; eksik ölçütü eklemek de 2’den 3’e. Tek başına ikisi de yetmiyor, çünkü arama-dizini her iki kusuru birden taşıyor: ağırlık yazıldığında eksik sütun hâlâ yok, sütun eklendiğinde ağırlık hâlâ eşit varsayılıyor. İkisi birden giderildiğinde beş çözümlemenin beşi yeniden üretilebilir oluyor. Kusurlar toplanmıyor, çarpışıyor.

Üçüncü kusurun etkisi ikinci sütundadır. Beş çözümleme yeniden üretilebilir hale geldiğinde bile yalnızca biri doğrulanabilir: kalan dördünde puanların kaynağı yazılı değil, dolayısıyla okuyan kişi aynı kazanana varıyor ama puanların doğru olduğunu sınayamıyor. Bu iki durum arasındaki fark küçük görünüp büyüktür. Yeniden üretilebilen bir çözümleme kararın tutarlı olduğunu gösterir; doğrulanabilen bir çözümleme kararın dayanaklı olduğunu gösterir. yedekleme-yolu kaydı kayıttaki haliyle doğru kazananı veriyor, ama üç puanın hiçbirinin nereden geldiği yazılmamış — üçünün de yanlış olması ve kazananın yine de aynı çıkması mümkündür.

Soru Kümesi ve Tamamlama

Aynı beş kayıt bir soru kümesine uygulanır. Yanıt önceki derste ayrıldığı gibi doğru, eksik ya da yanlış olabilir; ayrım burada özellikle önemlidir, çünkü eksik ölçüt taşıyan bir tablo “hangi ölçütler kullanıldı” sorusuna yanlış yanıt verir: liste eksiktir ama tam görünür.

// odun/soru.mjs — soru kumesi cozumleme kayitlarina uygulanir; tamamlama maliyeti olculur
import { COZUMLEME, kazanan, okunan } from "./tablo.mjs";

const uretilebilir = (c, d) => {
  const o = okunan(c, d);
  return kazanan(c.alt, o.puan, o.w) === c.kayitli;
};
const SORU = [
  ["O1", "hangi olcutler kullanildi", (c, t) => (!t && c.eksik ? "yanlis" : "dogru")],
  ["O2", "olcutlerin agirligi neydi", (c, t) => (!t && !c.agirlik ? "eksik" : "dogru")],
  ["O3", "bu puan nereden geldi", (c, t) => (!t && c.kaynaksiz ? "eksik" : "dogru")],
  ["O4", "ayni tabloyla ayni sonuc cikar mi",
    (c, t) => (uretilebilir(c, t ? { agirlikYaz: true, olcutEkle: true } : {}) ? "dogru" : "yanlis")],
  ["O5", "hangi alternatifler degerlendirildi", () => "dogru"],
];

const durum = {};
for (const tam of [false, true]) {
  const say = { dogru: 0, eksik: 0, yanlis: 0 };
  for (const c of COZUMLEME)
    for (const [kod, , kural] of SORU) {
      const d = kural(c, tam);
      say[d] += 1;
      (durum[kod] ??= { false: [], true: [] })[tam].push(d);
    }
  console.log(`${tam ? "tamamlandiktan sonra" : "kayitta oldugu gibi  "}: ` +
    `dogru ${say.dogru}, eksik ${say.eksik}, yanlis ${say.yanlis} ` +
    `(${SORU.length} soru x ${COZUMLEME.length} cozumleme)`);
}
console.log("\nkayitta oldugu haliyle soru basina dogru olmayan yanit (y = yanlis, e = eksik):");
for (const [kod, metin] of SORU) {
  const d = durum[kod][false];
  const y = d.filter((x) => x === "yanlis").length, e = d.filter((x) => x === "eksik").length;
  console.log(`  ${kod} ${metin.padEnd(36)} ${y ? `${y}y` : e ? `${e}e` : "-"}`);
}

// Tamamlama sureleri modelin girdisidir (KK11).
const DK = { agirlik: 15, olcut: 20, kaynak: 5 };
const say = { agirlik: COZUMLEME.filter((c) => !c.agirlik).length,
  olcut: COZUMLEME.filter((c) => c.eksik).length,
  kaynak: COZUMLEME.reduce((t, c) => t + c.kaynaksiz, 0) };
const toplam = Object.entries(say).reduce((t, [a, n]) => t + n * DK[a], 0);
console.log("\ntamamlama maliyeti:");
for (const [a, n] of Object.entries(say))
  console.log(`  ${a.padEnd(8)} ${n} kalem x ${DK[a]} dk = ${n * DK[a]} dk`);
const once = COZUMLEME.filter((c) => uretilebilir(c, {})).length;
const sonra = COZUMLEME.filter((c) => uretilebilir(c, { agirlikYaz: true, olcutEkle: true })).length;
console.log(`  toplam ${toplam} dk; yeniden uretilebilen ${once}/${COZUMLEME.length} -> ` +
  `${sonra}/${COZUMLEME.length}, kazanilan cozumleme basina ${(toplam / (sonra - once)).toFixed(1)} dk`);
kayitta oldugu gibi  : dogru 14, eksik 6, yanlis 5 (5 soru x 5 cozumleme)
tamamlandiktan sonra: dogru 25, eksik 0, yanlis 0 (5 soru x 5 cozumleme)

kayitta oldugu haliyle soru basina dogru olmayan yanit (y = yanlis, e = eksik):
  O1 hangi olcutler kullanildi            2y
  O2 olcutlerin agirligi neydi            2e
  O3 bu puan nereden geldi                4e
  O4 ayni tabloyla ayni sonuc cikar mi    3y
  O5 hangi alternatifler degerlendirildi  -

tamamlama maliyeti:
  agirlik  2 kalem x 15 dk = 30 dk
  olcut    2 kalem x 20 dk = 40 dk
  kaynak   8 kalem x 5 dk = 40 dk
  toplam 110 dk; yeniden uretilebilen 2/5 -> 5/5, kazanilan cozumleme basina 36.7 dk

Yirmi beş yanıtın on dördü doğru, altısı eksik, beşi yanlış. Yanlışların dağılımı kusurların niteliğini gösteriyor: eksik ölçüt ve yeniden üretilemezlik yanlış üretiyor, yazılmamış ağırlık ve kaynağı belirsiz puan eksik üretiyor. Aradaki fark okuyanın davranışını belirler. Ağırlığın yazılmadığını gören kişi bir şeyin eksik olduğunu bilir ve sorabilir; eksik ölçütü gören kişi hiçbir şey görmez, çünkü tablo tamdır.

Tamamlamanın bedeli 110 dakika: iki ağırlık vektörü, iki ölçüt sütunu ve sekiz puan kaynağı. Bu sürenin sonunda yeniden üretilebilen çözümleme sayısı 2’den 5’e çıkıyor, yani kazanılan çözümleme başına 36,7 dakika. Sayının kendisi modelin girdilerine bağlıdır; taşıdığı bilgi oranlardadır. Puan kaynaklarını yazmak toplam sürenin yüzde 36’sını alıyor ve yeniden üretilebilirliği hiç değiştirmiyor — yalnızca doğrulanabilirliği sıfırdan beşe çıkarıyor. Ağırlıkları yazmak ise 30 dakikada üç çözümlemeye dokunuyor.

Buradan çıkan sıra şudur: önce eksik ölçüt, sonra ağırlık, en son puan kaynağı. Bu sıra kusurların ağırlığından değil, fark edilebilirliklerinden gelir. En sinsi kusur en ucuz olanı değil, kendini göstermeyenidir.

Özet

  • Bir ödünleşim çözümlemesinin kayda geçmiş hali, üçüncü bir kişinin aynı kazanana varıp varamamasıyla ölçülür; beş kaydın ikisi kayıttaki haliyle yeniden üretilebildi.
  • Üç kusur farklı biçimde bozar: eksik ölçüt tabloyu tam gösterir, yazılmamış ağırlık okuyanı eşit ağırlık varsaymaya iter, kaynağı belirsiz puan kazananı değiştirmeden doğrulamayı engeller.
  • Ağırlıkları yazmak yeniden üretilebilen sayıyı 2’den 3’e, eksik ölçütü eklemek de 2’den 3’e çıkardı; iki kusuru birden taşıyan çözümleme yalnızca ikisi birden giderildiğinde üretilebilir oldu ve sayı 5’e çıktı.
  • Yeniden üretilebilirlik ile doğrulanabilirlik ayrı ölçülerdir: beş çözümleme üretilebilir hale geldiğinde bile puan kaynakları yazılmadan yalnızca biri doğrulanabiliyordu.
  • Soru kümesinde eksik ölçüt ve yeniden üretilemezlik yanlış yanıt, yazılmamış ağırlık ve kaynaksız puan eksik yanıt üretti; tamamlamanın bedeli 110 dakika, kazanılan çözümleme başına 36,7 dakika.

Sonraki Adım

Buraya kadar ölçülen her şey verilmiş bir kararla ilgiliydi: kararın kaydı, verilme süreci ve dayandığı tablo. Üçünde de karar bir noktada kesinleşiyor ve kayıt kapanıyor. Oysa her kararın yanında kapanmayan bir şey kalır: kararın dayandığı varsayımın tutmama ihtimali. arama-dizini çözümlemesinde veri-tazeligi ölçütüne 0,50 ağırlık verildi, çünkü tazeliğin kritik olduğu varsayıldı; o varsayım yanlışsa karar da yanlıştır ve bunu ancak zaman gösterir. Bu, kayda geçirilecek bir karar değil, izlenecek bir belirsizliktir. Sonraki ders belirsizliği olasılık ve etkiyle modelleyip bir dönem koşturur, kaydedilen riskin gerçekleşme oranını ve hiç kaydedilmemiş olduğu halde gerçekleşen riski sayar.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat