İçeriğe geç
academia.sh

Ders 22 / 24

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.

İçindekiler

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

// 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ı rr’den rr'’ye çıkarmak genel dönüşümü r/rr'/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?

İ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