---
title: 'Kategorik Kodlama'
source: 'https://academia.sh/tr/kurslar/veri-hazirlama/kategorik-kodlama'
course: 'Veri Toplama ve Hazırlama'
language: tr
updated: '2026-08-17T18:08:45+00:00'
license: 'CC BY-SA 4.0'
---

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

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ı

```js
// 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

```js
// 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ı `bati` bö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.
