Ders 16 / 17
Kategorik Kodlama
3.199 satırlık kümenin üç kategorik alanı kodlanır: sıralı kodlama 3 sütun, sırasız kodlama 14 sütun ekler ve ikisi de tek bir satır düşürmez. Sırasız bir alan olan bölge sıralı kodlandığında kod, veride bulunmayan bir sıradan gelir: üç savunulabilir sıralama aynı eşiği aynı veriye uygular ve 2.166, 1.678 ve 1.633 satır seçer, ortalamalar 19,741 — 18,480 — 20,661 m³ olur. 3.199 satırın hiçbiri üç kararın üçünde birden seçilmez, 921 satır yalnız birinde seçilir. Sıralı bir alanda aynı deney tek bir cevap verir: iki farklı kodlama memnuniyet eşiğinde aynı 1.615 satırı ve aynı 19,584 m³'ü verir.
İçindekiler
Türetme sayısal alanlardan sayısal alanlar üretti ve kümede sayı taşımayan alanlar dokunulmadan
kaldı. bolge bir addır, memnuniyet bir nottur, tarife_basamagi bir basamaktır. Bunlar üzerinde
hesap yapmanın yolu kategorik kodlamadan geçer: her kategoriye bir sayı karşılık getirilir.
İşlem mekanik görünür ve satır sayısına dokunmaz, ama verilen sayı yanında bir iddia taşır. Bir kategoriye 3, bir başkasına 5 verildiğinde ikincisinin birinciden “büyük” ve aradaki mesafenin 2 olduğu söylenmiş olur. Veri Analitiğine Giriş kursundaki Ölçüm Ölçekleri dersi bu iddianın hangi alanlarda meşru olduğunu ölçmüştü; bu ders ölçek tanımlarını tekrarlamaz, iddianın hazırlama adımında ne kadar satır oynattığını sayar.
- VD21. Kategorik kodlama, bir kategoriyi sayıya çeviren karardır. Satır sayısını değiştirmez, sütun ekler. Küme önceki dersten devralınır ve kurgudur.
- VD22. Sıralı kodlama her kategoriye bir tam sayı verir ve tek sütun üretir. Sırasız kodlama her kategori için ayrı bir 0/1 sütunu açar, kategori sayısı kadar sütun üretir ve hiçbir sıra iddia etmez.
- VD23. Sırasız bir alanı sıralı kodlamak, veride bulunmayan bir sırayı veriye ekler. O sıra keyfîdir: aynı alan üzerinde savunulabilir birden çok sıralama vardır ve hangisinin seçildiği kodlanmış sütunda görünmez.
- VD24. Sıralı bir alanda artan her kodlama aynı sıra bilgisini taşır; kategoriyle tanımlanan bir eşiğin sonucu kodlamadan bağımsızdır. Sırasız bir alanda aynı eşiğin sonucunu tamamen kodlama belirler.
İki Kodlama, Aynı Satır Sayısı
// kodla.mjs — MODELDIR: onceki derslerin 3.199 satirlik kumesi ve kategorik // alanlarin kodlanmasi. Veri kumesi kurgudur; hicbir arayuz taklit edilmez. export const TOHUM = 20260218, HAM = 1400, DONEM = ["2026-01", "2026-02", "2026-03"]; const 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; }; const BOLGE = [["kuzey", 0.28, 21], ["guney", 0.22, 17], ["dogu", 0.18, 26], ["bati", 0.14, 14], ["merkez", 0.18, 23]]; const ABONE = [], ELENEN = []; for (let i = 0; i < HAM; i++) { const r = uretec(TOHUM + i), b = BOLGE[ayrik(r(), BOLGE.map((x) => x[1]))]; const k = { abone_no: 10001 + i, bolge: b[0], taban: b[2], hane_kisi: ayrik(r(), [0.06, 0.24, 0.30, 0.24, 0.11, 0.05]), memnuniyet: ayrik(r(), [0.08, 0.14, 0.27, 0.34, 0.17]) + 1 }; (r() < 0.046 ? ELENEN : ABONE).push(k); } // Onceki derslerin cikardigi kume; elenen abonelerin ve tekillestirilen ikinci // kaydin cekimleri korunuyor ki tuketim degerleri ayni kalsin. const MEM = new Map(ABONE.map((a) => [a.abone_no, a.memnuniyet])); const anahtar = new Set(ABONE.map((a) => a.abone_no)); export const UZUN = []; for (const k of [...ABONE, ...ELENEN]) { const r = uretec(TOHUM + 7000 + k.abone_no), adet = ayrik(r(), [0.05, 0.12, 0.21, 0.62]); for (let d = 0; d < adet; d++) { const t = r() < 0.038 ? 0 : Math.round(k.taban * Math.exp((r() + r() + r() - 1.5) * 0.62) * (1 - d * 0.05) * 100) / 100; if (!anahtar.has(k.abone_no)) { r(); continue; } UZUN.push({ abone_no: k.abone_no, bolge: k.bolge, donem: DONEM[d], tuketim_m3: t, memnuniyet: MEM.get(k.abone_no), basamak: t < TARIFE[0] ? 1 : t < TARIFE[1] ? 2 : t < TARIFE[2] ? 3 : 4 }); r(); } } export const ALAN = [ ["bolge", "sirasiz", (o) => o.bolge], ["memnuniyet", "sirali", (o) => o.memnuniyet], ["tarife_basamagi", "sirali", (o) => o.basamak], ]; // Sirali kodlama her kategoriye bir tam sayi verir: tek sutun. Sirasiz kodlama // her kategori icin ayri bir 0/1 sutunu acar ve hicbir sira iddia etmez. export const kod = (d) => Object.fromEntries(d.map((a, j) => [a, j + 1])); export const gosterge = (o, f, d) => d.map((a) => (f(o) === a ? 1 : 0)); // Sirasiz bir alanda sira alanin kendisinden gelmez; bir siralama secilir. const ADLAR = [...new Set(UZUN.map((o) => o.bolge))]; const sikl = (a) => UZUN.filter((o) => o.bolge === a).length; export const SIRALAMA = [ ["S1 alfabetik", [...ADLAR].sort()], ["S2 kumede ilk gorulme", [...ADLAR]], ["S3 satir sikligina gore azalan", [...ADLAR].sort((a, b) => sikl(b) - sikl(a))], ]; export const ort = (a) => a.reduce((x, y) => x + y, 0) / a.length; export const gen = (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]}`) { const T = UZUN.reduce((a, o) => a + o.tuketim_m3, 0); console.log(`model (tohum ${TOHUM}): giren ${UZUN.length} satir, ${T.toFixed(1)} m3, ` + `${ALAN.length} kategorik alan — onceki ders ile ayni`); const y = gen([18, 10, 11, 12, 11, 8, 8]); console.log("\n" + y(["alan", "olcek", "kategori", "sirali kod", "gosterge", "giren", "cikan"])); let s1 = 0, s2 = 0; for (const [ad, olcek, f] of ALAN) { const d = [...new Set(UZUN.map(f))]; s1 += 1; s2 += d.length; console.log(y([ad, olcek, d.length, 1, d.length, UZUN.length, UZUN.length])); } console.log(`\nkodlama satir uretmez: ${UZUN.length} -> ${UZUN.length}. Sirali kodlama ` + `${s1} sutun, sirasiz kodlama ${s2} sutun ekler; ikisi de hicbir satiri dusurmez`); const o1 = UZUN[0], d1 = [...new Set(UZUN.map((o) => o.bolge))]; console.log(`ornek satir ${o1.abone_no} ${o1.bolge}: gosterge sutunlari ` + `[${gosterge(o1, (o) => o.bolge, d1).join(" ")}] (sutun sirasi ${d1.join(" ")})`); console.log(`\nbolge icin uc savunulabilir siralama ve verdikleri kodlar:`); const y2 = gen([32, 44]); for (const [ad, d] of SIRALAMA) { const k = kod(d); console.log(y2([ad, d.map((a) => `${a}=${k[a]}`).join(" ")])); } console.log(`ucu de veriden okunmadi; bolge adlari arasinda bir sira yoktur ve ` + `hangi siralamanin secildigi kodlanmis sutunda hic gorunmez`); }
model (tohum 20260218): giren 3199 satir, 63060.6 m3, 3 kategorik alan — onceki ders ile ayni alan olcek kategori sirali kod gosterge giren cikan bolge sirasiz 5 1 5 3199 3199 memnuniyet sirali 5 1 5 3199 3199 tarife_basamagi sirali 4 1 4 3199 3199 kodlama satir uretmez: 3199 -> 3199. Sirali kodlama 3 sutun, sirasiz kodlama 14 sutun ekler; ikisi de hicbir satiri dusurmez ornek satir 10001 merkez: gosterge sutunlari [1 0 0 0 0] (sutun sirasi merkez kuzey guney bati dogu) bolge icin uc savunulabilir siralama ve verdikleri kodlar: S1 alfabetik bati=1 dogu=2 guney=3 kuzey=4 merkez=5 S2 kumede ilk gorulme merkez=1 kuzey=2 guney=3 bati=4 dogu=5 S3 satir sikligina gore azalan kuzey=1 guney=2 merkez=3 dogu=4 bati=5 ucu de veriden okunmadi; bolge adlari arasinda bir sira yoktur ve hangi siralamanin secildigi kodlanmis sutunda hic gorunmez
Kodlama, bu kursta satır sayısını değiştirmeyen ikinci adımdır: giren ve çıkan sütunları üç alanda da 3.199’dur. Değişen sütun sayısıdır. Sıralı kodlama alan başına tek sütun üretir ve üç alan için 3 sütun eder; sırasız kodlama her kategori için bir sütun açar ve aynı üç alan için 14 sütun eder. Sırasız kodlamanın bedeli budur ve kategori sayısıyla birlikte büyür; kazancı, hiçbir kategoriyi bir başkasının önüne ya da arkasına koymamasıdır.
Örnek satır bunu somutlaştırıyor: merkez bölgesindeki bir satır beş göstergeden yalnız birini 1
yapar, kalan dördü 0’dır. Bu beş sayıda hiçbir bölge bir diğerinden büyük değildir. Sıralı kodlamada
ise aynı bilgi tek bir sayıya iner ve o sayı bir yere yerleşir.
Alt blok dersin çekirdek sorusunu açıyor. bolge alanının kodu nereden gelecek. Alanın
kendisinde bir sıra yoktur, bu yüzden bir sıralama seçilir ve üç seçim de savunulabilir:
kategori adlarını alfabetik dizmek, kümede ilk görüldükleri sırayı korumak, satır sıklığına göre
azalan dizmek. Üçü üç ayrı kod verir. bati alfabetik sırada 1, sıklık sırasında 5’tir. Kodlanmış
sütuna bakan biri yalnız bir sayı görür; hangi sıralamanın seçildiği o sütunda hiçbir iz bırakmaz.
memnuniyet ve tarife_basamagi alanlarında böyle bir seçim yoktur. Basamaklar arasındaki sıra
alanın kendisinden gelir ve kodlayan kişi onu değiştiremez, yalnız hangi sayılarla temsil edileceğini
seçebilir. Fark buradadır ve bir sonraki bölüm bunu satır sayısıyla ölçer.
Aynı Eşik, Üç Farklı Satır Kümesi
// esik.mjs — ayni esik uc siralamada uc ayri satir kumesi secer. Sirali bir // alanda ayni deney tek bir kume verir; fark kodlamadan degil olcekten gelir. import { UZUN, SIRALAMA, kod, ort, gen } from "./kodla.mjs"; const ESIK = 3; // bes kategorinin ust yarisi; kod 3, 4 ve 5 secilir const y = gen([32, 25, 9, 13]); console.log(`esik: "bolge kodu ${ESIK} ve ustunde olan satirlar"`); console.log("\n" + y(["siralama", "secilen bolgeler", "satir", "ortalama m3"])); const kume = []; for (const [ad, d] of SIRALAMA) { const k = kod(d), sec = UZUN.filter((o) => k[o.bolge] >= ESIK); kume.push(new Set(sec.map((o) => `${o.abone_no}|${o.donem}`))); console.log(y([ad, d.filter((a) => k[a] >= ESIK).join(" "), sec.length, ort(sec.map((o) => o.tuketim_m3)).toFixed(3)])); } const kacinda = UZUN.map((o) => kume.filter((s) => s.has(`${o.abone_no}|${o.donem}`)).length); const say = (n) => kacinda.filter((x) => x === n).length; console.log(`\n${UZUN.length} satirin ${say(3)} tanesi uc kararin ucunde de secildi, ` + `${say(2)} tanesi ikisinde, ${say(1)} tanesi yalnizca birinde, ${say(0)} tanesi hicbirinde`); const n = kume.map((s) => s.size); const m = kume.map((s) => ort(UZUN.filter((o) => s.has(`${o.abone_no}|${o.donem}`)) .map((o) => o.tuketim_m3))); console.log(`ayni veri, ayni esik, ayni hesap: ${Math.min(...n)} ile ${Math.max(...n)} satir ` + `arasi ve ${Math.min(...m).toFixed(3)} ile ${Math.max(...m).toFixed(3)} m3 arasi`); // Sirali alanda esik kategoriyle tanimlanir: "iyi ve ustu". Artan her kodlama // ayni kategoriyi ayni tarafa koyar, cunku sira alanin kendisindedir. const NOT = ["cok kotu", "kotu", "orta", "iyi", "cok iyi"]; const KOD = [["K1 esit araliklar", [1, 2, 3, 4, 5]], ["K2 genisleyen araliklar", [2, 5, 9, 14, 20]]]; const y2 = gen([26, 22, 12, 9, 13]); console.log(`\nesik: "memnuniyet ${NOT[3]} ve ustunde olan satirlar"`); console.log("\n" + y2(["kodlama", "kodlar", "esik kodu", "satir", "ortalama m3"])); for (const [ad, K] of KOD) { const e = K[NOT.indexOf("iyi")], sec = UZUN.filter((o) => K[o.memnuniyet - 1] >= e); console.log(y2([ad, K.join(" "), e, sec.length, ort(sec.map((o) => o.tuketim_m3)).toFixed(3)])); } console.log(`iki kodlama da ayni satirlari secti: sira kodda degil alanda oldugu icin ` + `esik kodlamadan bagimsizdir`);
esik: "bolge kodu 3 ve ustunde olan satirlar" siralama secilen bolgeler satir ortalama m3 S1 alfabetik guney kuzey merkez 2166 19.741 S2 kumede ilk gorulme guney bati dogu 1678 18.480 S3 satir sikligina gore azalan merkez dogu bati 1633 20.661 3199 satirin 0 tanesi uc kararin ucunde de secildi, 2278 tanesi ikisinde, 921 tanesi yalnizca birinde, 0 tanesi hicbirinde ayni veri, ayni esik, ayni hesap: 1633 ile 2166 satir arasi ve 18.480 ile 20.661 m3 arasi esik: "memnuniyet iyi ve ustunde olan satirlar" kodlama kodlar esik kodu satir ortalama m3 K1 esit araliklar 1 2 3 4 5 4 1615 19.584 K2 genisleyen araliklar 2 5 9 14 20 14 1615 19.584 iki kodlama da ayni satirlari secti: sira kodda degil alanda oldugu icin esik kodlamadan bagimsizdir
Üst tablo dersin bulgusudur. Eşik tek bir cümledir ve makul görünür: “bölge kodu 3 ve üstünde olan satırlar”, yani beş kategorinin üst yarısı. Aynı cümle, aynı veri üzerinde, üç savunulabilir sıralamayla üç ayrı bölge kümesi seçer. Seçilen satır sayısı 2.166, 1.678 ve 1.633’tür; ortalama tüketim 18,480 m³ ile 20,661 m³ arasında gider gelir. Üç sayı da doğru hesaplanmıştır ve hiçbiri bir hata üretmez.
Alt satır işin ölçüsünü veriyor: 3.199 satırın hiçbiri üç kararın üçünde birden seçilmez. 2.278 satır iki kararda, 921 satır yalnız bir kararda seçilir. Yani “kodu 3 ve üstü olan bölgeler” ifadesinin sabit bir karşılığı yoktur; her sıralama başka bir üçlü seçer ve üç seçim birbirini kesmez. Bu, sırasız bir alanı sıralı kodlamanın ürettiği yanlış sonucun tam tanımıdır: sonuç yanlış hesaplanmış bir sayı değil, veriye ait olmayan bir sayıdır. Sayının kaynağı bölge adlarının nasıl dizildiğidir.
İkinci tablo aynı deneyi sıralı bir alanda tekrarlıyor ve fark açık. Eşik yine bir cümledir: “memnuniyet iyi ve üstünde olan satırlar”. İki kodlama arasındaki mesafeler tamamen farklıdır — biri basamakları eşit aralıklı sayar, öteki üst basamaklar arasını açar — ama ikisi de aynı 1.615 satırı seçer ve aynı 19,584 m³’ü verir. Sebep basittir: sıra alanın kendisindedir, kodun görevi onu bozmadan taşımaktır ve artan her kodlama bunu yapar.
İki tablo yan yana konduğunda karar kuralı çıkar. Bir alan sıralıysa sıralı kodlama meşrudur ve kod seçimi kategoriye dayalı eşikleri oynatmaz. Bir alan sırasızsa sıralı kodlama, kararı koddan okunamaz hale getirir: eşik veriye değil, kodlama sırasına uygulanmış olur. Sırasız kodlama bu tuzağı kapatır, çünkü gösterge sütunlarında “3 ve üstü” diye bir şey yoktur; hangi kategorilerin seçildiği adlarıyla yazılmak zorundadır ve o anda seçim görünür hale gelir.
Dersin satır hesabı böyle kapanır: 3.199 satır girdi, 3.199 satır çıktı, kodlama tek bir satır düşürmedi. Buna karşılık kodlamadan sonra gelen tek bir eşik, aynı kümeden 1.633 ile 2.166 arasında değişen satır kümeleri seçti ve 921 satırın sayılıp sayılmaması yalnız bir sıralama kararına bağlı kaldı. Kodlamanın kendisi kayıpsızdır; kayıp, kodun taşıdığı sahte sıranın kullanıldığı ilk adımda ortaya çıkar.
Özet
- Kodlama satır sayısını değiştirmez: 3.199 satır girdi, 3.199 satır çıktı. Sıralı kodlama üç alan için 3 sütun, sırasız kodlama aynı üç alan için 14 sütun ekler.
- Sırasız bir alanda kod veriden gelmez, seçilen bir sıralamadan gelir: alfabetik, kümede ilk
görülme ve sıklık sıralamaları
batibölgesine 1 ile 5 arasında farklı kodlar verir. - Aynı eşik üç sıralamada 2.166, 1.678 ve 1.633 satır seçer; ortalama 18,480 ile 20,661 m³ arasında değişir ve hiçbir hesap hata üretmez.
- 3.199 satırın hiçbiri üç kararın üçünde birden seçilmez; 921 satırın sayılması yalnız bir sıralama kararına bağlıdır.
- Sıralı bir alanda kod seçimi eşiği oynatmaz: iki farklı kodlama aynı 1.615 satırı ve aynı 19,584 m³’ü verir, çünkü sıra kodda değil alanın kendisindedir.
Sonraki Adım
Bu konu kümeyi soruya göre yeniden biçimlendirdi: tablolar birleştirildi, şekil değiştirildi, gruplar özetlendi, yeni alanlar türetildi ve kategoriler kodlandı. Her adımda giren, çıkan ve kaybolan satır sayıldı — ama bu sayımların hepsi tek tek, elle yazılmış küçük kodlarla yapıldı ve hiçbiri bir yerde toplu olarak durmuyor. Aynı kümeyi ikinci kez hazırlayan biri, hangi eşiğin hangi gerekçeyle seçildiğini ya da hangi sıralamanın kullanıldığını bulamaz. Sonraki ders hazırlama adımlarının betikle belgelenmesini ele alır: kaç adımın yeniden üretilebildiğini sayar ve kursun on yedi dersindeki satır hesabını uçtan uca toplar.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.