---
title: 'Dönüşüm Hunisi'
source: 'https://academia.sh/tr/kurslar/kullanici-deneyimi/donusum-hunisi'
course: 'Kullanıcı Deneyimi ve Davranış Tasarımı'
language: tr
updated: '2026-08-17T18:09:39+00:00'
license: 'CC BY-SA 4.0'
---

# Dönüşüm Hunisi

Ödünç alma akışının adım adım terk çözümlemesi, en yüksek terk oranı ile en çok kullanıcı kaybının farklı adımlarda olması ve topluluştırılmış huninin kesim farklarını gizlemesi.

Önceki ders bir görevin bütününü ölçtü: tamamlandı mı, ne kadar sürdü, kaç hata yapıldı.
On dört oturumun üçü görevi tamamlayamamıştı. Ölçülmeyen şey, o üç oturumun **nerede**
kaldığı.

Bu soru küçük örneklemli testle değil, tüm kullanıcıların davranış kaydıyla yanıtlanır.
**Dönüşüm hunisi (conversion funnel)**, bir görevi sıralı adımlara bölüp her adımı kaç
kullanıcının geçtiğini sayan çözümlemedir. Katalog arayüzünde huninin adımları ödünç alma
akışıdır: arama, sonuç listesi, kayıt ayrıntısı, nüsha seçimi, ödünç onayı, tamamlanma.

## Huninin Üç Sütunu

Her adım için üç ayrı sayı vardır ve karıştırılırlar.

**Adım dönüşümü (step conversion)**, bir adıma girenlerin sonrakine geçme oranıdır.

**Terk oranı (drop-off rate)**, aynı adımda ayrılanların oranıdır; adım dönüşümünün
tümleyenidir.

**Kümülatif dönüşüm**, ilk adıma girenlerin o adıma kadar ulaşma oranıdır. Genel dönüşüm,
adım dönüşümlerinin **çarpımıdır** — huninin en önemli yapısal özelliği budur.

```js
// huni.mjs — odunc alma akisinin adim adim terk cozumlemesi

const HUNI = [
  ["arama yapildi", 10000],
  ["sonuc listesi goruldu", 8200],
  ["kayit ayrintisi acildi", 5330],
  ["nusha secildi", 4530],
  ["odunc onayi acildi", 2500],
  ["odunc tamamlandi", 2350],
];

function wilson(k, N, z = 1.96) {
  const p = k / N, d = 1 + z * z / N;
  const m = (p + z * z / (2 * N)) / d;
  const y = (z * Math.sqrt(p * (1 - p) / N + z * z / (4 * N * N))) / d;
  return [m - y, m + y];
}

console.log("adim                       giren  cikan  adim donusumu  terk orani  kaybedilen  kumulatif");
for (let i = 1; i < HUNI.length; i++) {
  const giren = HUNI[i - 1][1], cikan = HUNI[i][1];
  const oran = cikan / giren;
  const [a, u] = wilson(cikan, giren);
  console.log(
    `${HUNI[i][0].padEnd(24)} ${String(giren).padStart(6)} ${String(cikan).padStart(6)}` +
    ` ${((oran * 100).toFixed(1) + " %").padStart(14)} ${(((1 - oran) * 100).toFixed(1) + " %").padStart(11)}` +
    ` ${String(giren - cikan).padStart(11)} ${((cikan / HUNI[0][1] * 100).toFixed(1) + " %").padStart(10)}` +
    `   [${(a * 100).toFixed(1)}, ${(u * 100).toFixed(1)}]`
  );
}
const genel = HUNI[HUNI.length - 1][1] / HUNI[0][1];
console.log(`genel donusum: ${(genel * 100).toFixed(2)} %`);

// En buyuk terk orani ile en buyuk kullanici kaybi ayni adim mi
let enYuksekOran = 1, enYuksekOranAdim = "", enCokKayip = 0, enCokKayipAdim = "";
for (let i = 1; i < HUNI.length; i++) {
  const oran = HUNI[i][1] / HUNI[i - 1][1], kayip = HUNI[i - 1][1] - HUNI[i][1];
  if (oran < enYuksekOran) { enYuksekOran = oran; enYuksekOranAdim = HUNI[i][0]; }
  if (kayip > enCokKayip) { enCokKayip = kayip; enCokKayipAdim = HUNI[i][0]; }
}
console.log(`\nen yuksek terk orani: ${enYuksekOranAdim} (${((1 - enYuksekOran) * 100).toFixed(1)} %)`);
console.log(`en cok kullanici kaybi: ${enCokKayipAdim} (${enCokKayip} kullanici)`);

// Her adimi 0.98'e cikarmanin genel donusume etkisi (huni carpimsaldir)
console.log("\nadim                       simdiki oran  0.98'e cikarsa genel donusum  bagil kazanc");
for (let i = 1; i < HUNI.length; i++) {
  const oran = HUNI[i][1] / HUNI[i - 1][1];
  const yeni = genel * (0.98 / oran);
  console.log(
    `${HUNI[i][0].padEnd(24)} ${((oran * 100).toFixed(1) + " %").padStart(13)}` +
    ` ${((yeni * 100).toFixed(2) + " %").padStart(28)} ${("x" + (yeni / genel).toFixed(2)).padStart(13)}`
  );
}

// Toplulastirilmis huni iki kesimi gizleyebilir
const KESIMLER = {
  "ilk kez gelen": [6000, 4800, 2900, 2400, 900, 820],
  "kayitli kullanici": [4000, 3400, 2430, 2130, 1600, 1530],
};
console.log("\nkesim               n     adim donusumleri                          genel");
for (const [ad, v] of Object.entries(KESIMLER)) {
  const oranlar = [];
  for (let i = 1; i < v.length; i++) oranlar.push((v[i] / v[i - 1] * 100).toFixed(1) + "%");
  console.log(`${ad.padEnd(19)} ${String(v[0]).padStart(5)} ${oranlar.join("  ").padEnd(40)} ${(v[v.length - 1] / v[0] * 100).toFixed(2)} %`);
}
const toplam = HUNI.map((_, i) => Object.values(KESIMLER).reduce((a, v) => a + v[i], 0));
const toplamOran = [];
for (let i = 1; i < toplam.length; i++) toplamOran.push((toplam[i] / toplam[i - 1] * 100).toFixed(1) + "%");
console.log(`${"toplulastirilmis".padEnd(19)} ${String(toplam[0]).padStart(5)} ${toplamOran.join("  ").padEnd(40)} ${(toplam[5] / toplam[0] * 100).toFixed(2)} %`);

// Dorduncu adimda iki kesimin farki gercek mi
const [a1, u1] = wilson(KESIMLER["ilk kez gelen"][4], KESIMLER["ilk kez gelen"][3]);
const [a2, u2] = wilson(KESIMLER["kayitli kullanici"][4], KESIMLER["kayitli kullanici"][3]);
console.log(`\nodunc onayina gecis  ilk kez gelen [${(a1 * 100).toFixed(1)}, ${(u1 * 100).toFixed(1)}]  kayitli [${(a2 * 100).toFixed(1)}, ${(u2 * 100).toFixed(1)}]  araliklar ${u1 < a2 || u2 < a1 ? "ayrik" : "ortusuyor"}`);
```

```
adim                       giren  cikan  adim donusumu  terk orani  kaybedilen  kumulatif
sonuc listesi goruldu     10000   8200         82.0 %      18.0 %        1800     82.0 %   [81.2, 82.7]
kayit ayrintisi acildi     8200   5330         65.0 %      35.0 %        2870     53.3 %   [64.0, 66.0]
nusha secildi              5330   4530         85.0 %      15.0 %         800     45.3 %   [84.0, 85.9]
odunc onayi acildi         4530   2500         55.2 %      44.8 %        2030     25.0 %   [53.7, 56.6]
odunc tamamlandi           2500   2350         94.0 %       6.0 %         150     23.5 %   [93.0, 94.9]
genel donusum: 23.50 %

en yuksek terk orani: odunc onayi acildi (44.8 %)
en cok kullanici kaybi: kayit ayrintisi acildi (2870 kullanici)

adim                       simdiki oran  0.98'e cikarsa genel donusum  bagil kazanc
sonuc listesi goruldu           82.0 %                      28.09 %         x1.20
kayit ayrintisi acildi          65.0 %                      35.43 %         x1.51
nusha secildi                   85.0 %                      27.10 %         x1.15
odunc onayi acildi              55.2 %                      41.73 %         x1.78
odunc tamamlandi                94.0 %                      24.50 %         x1.04

kesim               n     adim donusumleri                          genel
ilk kez gelen        6000 80.0%  60.4%  82.8%  37.5%  91.1%        13.67 %
kayitli kullanici    4000 85.0%  71.5%  87.7%  75.1%  95.6%        38.25 %
toplulastirilmis    10000 82.0%  65.0%  85.0%  55.2%  94.0%        23.50 %

odunc onayina gecis  ilk kez gelen [35.6, 39.5]  kayitli [73.2, 76.9]  araliklar ayrik
```

## En Yüksek Terk Oranı ile En Büyük Kayıp Aynı Adım Değildir

İlk tablo iki farklı "en kötü adım" veriyor. Terk oranı en yüksek adım ödünç onayına
geçiş: yüzde 44.8. En çok kullanıcı kaybeden adım ise kayıt ayrıntısının açılması: 2870
kullanıcı.

Fark, adımların farklı büyüklükteki kitlelerle çalışmasından gelir. Kayıt ayrıntısı
adımına 8200 kullanıcı giriyor; yüzde 35'lik terk 2870 kişi ediyor. Ödünç onayı adımına
4530 kullanıcı giriyor; daha yüksek olan yüzde 44.8'lik terk 2030 kişi ediyor.

İki sayı iki farklı soruya yanıt verir. Terk oranı **adımın kendisinin ne kadar kötü
olduğunu** söyler; kaybedilen kullanıcı sayısı **o adımın toplam kayba katkısını**
söyler. Bir rapor yalnız birini yazarsa, okuyan kişi diğerini varsayar.

## Çarpımsal Huni ve İyileştirme Payı

İkinci tablo hangi adıma müdahale edileceğini belirliyor ve yanıt üçüncü bir sıralama
veriyor.

Genel dönüşüm adım oranlarının çarpımı olduğu için, bir adımın oranını $r$'den $r'$'ye
çıkarmak genel dönüşümü $r'/r$ katına çıkarır. Bu oran yalnızca o adımın **mevcut
oranına** bağlıdır; adıma kaç kullanıcının girdiğine bağlı değildir.

Tabloda her adımın oranı 0.98'e çıkarılırsa ne olacağı hesaplanmış. En büyük bağıl kazanç
ödünç onayı adımından geliyor: x1.78, yani genel dönüşüm yüzde 23.50'den 41.73'e. Kayıt
ayrıntısı adımı — en çok kullanıcı kaybeden adım — x1.51 veriyor. Tamamlanma adımı, oranı
zaten yüzde 94 olduğu için yalnızca x1.04.

Kural: **iyileştirme payı en düşük oranlı adımdadır**, en çok kullanıcı kaybeden adımda
değil. Sezgi ters yönde çalışır; en çok kişinin ayrıldığı yer en acil sorun gibi görünür.

Hesabın iki varsayımı yazılmalıdır. Birincisi, adımlar birbirinden bağımsız
sayılmıştır: bir adımın iyileştirilmesi sonraki adımların oranını değiştirmez. Gerçekte
değiştirebilir — daha çok kararsız kullanıcıyı bir sonraki adıma taşımak o adımın oranını
düşürebilir. İkincisi, 0.98 hedefi ulaşılabilirlik hesabı değil, ortak bir tavan olarak
seçilmiştir; her adım oraya çıkarılamaz. Tablo bir öncelik sıralaması verir, bir vaat
değil.

## Topluluştırılmış Huni Kesimleri Gizler

Üçüncü tablo huninin en yaygın hatasını gösteriyor. Ödünç onayına geçiş adımının
topluluştırılmış oranı yüzde 55.2. Aynı adım, ilk kez gelen kullanıcılarda yüzde 37.5,
kayıtlı kullanıcılarda yüzde 75.1.

Yüzde 55.2 hiçbir kullanıcı kesimini tarif etmiyor; iki farklı davranışın karışım
oranından doğan bir sayı. Bu adıma yapılacak müdahale ilk kez gelen kullanıcıya göre
tasarlanmalı; topluluştırılmış sayıya bakan biri sorunun büyüklüğünü yarı yarıya
küçümser.

Son satır farkın gerçek olup olmadığını sınıyor. İlk kez gelen kesimin yüzde 95 güven
aralığı [35.6, 39.5], kayıtlı kesimin [73.2, 76.9]. Aralıklar ayrık; fark örneklem
dalgalanmasıyla açıklanamaz.

Bu ayrım, davranış tasarımı konusundaki çerçeveye doğrudan bağlanır. İlk kez gelen
kullanıcı ödünç onayı ekranında üye kaydı, teslim şubesi ve süre kararlarıyla karşılaşır;
kayıtlı kullanıcının bu kararları zaten verilmiştir. Yetenek farkı bir motivasyon farkı
değildir ve motivasyon artırmaya çalışan bir müdahale bu adımda işe yaramaz.

## Huniyi Kurmanın Kuralları

**Adımlar kullanıcının görevine göre tanımlanır.** "Sayfa görüntülendi" bir adım değildir;
"nüsha seçildi" adımdır. Arayüzün iç olaylarına göre kurulan huni, kullanıcının nerede
takıldığını değil sistemin ne kaydettiğini gösterir.

**Terk oranı ile kayıp sayısı birlikte yazılır.** Biri adımın kalitesini, diğeri katkısını
verir.

**Her adım oranı güven aralığıyla verilir.** Onbinlik bir huninin son adımlarında
kullanıcı sayısı hızla azalır; son adımlardaki oranlar daha belirsizdir.

**Huni en az bir boyutta ayrıştırılır.** İlk kez gelen ile kayıtlı kullanıcı, dar ekran
ile geniş ekran, arama ile gezinmeyle gelen. Ayrıştırma yapılmadan bulunan "en kötü adım"
çoğu zaman bir karışım etkisidir.

**Huni nedeni söylemez.** Ödünç onayı adımında ilk kez gelenlerin yüzde 62.5'i çıkıyor;
niçin çıktıkları bu tabloda yok. Huni, hangi adıma bakılacağını söyler.

## Özet

- Dönüşüm hunisi görevi sıralı adımlara böler; genel dönüşüm adım oranlarının çarpımıdır.
- En yüksek terk oranı ile en çok kullanıcı kaybı farklı adımlarda olabilir: hesapta
  ödünç onayı adımı yüzde 44.8 terkle en kötü oran, kayıt ayrıntısı adımı 2870 kullanıcıyla
  en büyük kayıp.
- İyileştirme payı adımın mevcut oranına bağlıdır, kullanıcı sayısına değil; en düşük
  oranlı adımı 0.98'e çıkarmak genel dönüşümü x1.78, en çok kayıp veren adımı çıkarmak
  x1.51 katına taşıyor.
- Hesap adımları bağımsız varsayar ve 0.98'i ortak tavan alır; çıktısı bir öncelik
  sıralamasıdır, ulaşılabilir bir hedef değil.
- Topluluştırılmış huni kesimleri gizler: yüzde 55.2'lik adım oranı, yüzde 37.5 ile 75.1
  arasında iki ayrı davranışın karışımıdır ve güven aralıkları ayrıktır.
- Huni hangi adıma bakılacağını söyler, o adımda ne olduğunu söylemez.

## Sonraki Adım

Huni bir adımın kötü olduğunu gösterdiğinde sıradaki iş bir değişiklik denemektir. Ama
değişiklikten sonra ölçülen sayının farklı çıkması, değişikliğin işe yaradığı anlamına
gelmez; huni oranları haftadan haftaya kendiliğinden oynar. Sonraki ders bu ayrımı kurar:
bir değişikliği denemek için kaç kullanıcı gerekir, ölçülen fark ne zaman gerçektir,
deneyi erken durdurmak yanlış sonucu niçin şişirir ve aynı anda birkaç değişikliği sınamak
hangi düzeltmeyi gerektirir?
