Ders 24 / 24
Nicel ve Nitel Verinin Birleştirilmesi
İki kaynağın huni adımı ekseninde birleştirilmesi, sıralamalar örtüşmediğinde ortaya çıkan sorunun daraltılması, kapsamın raporlanması ve nitel oranın güven aralığıyla okunması.
İçindekiler
Önceki ders bir farkın gerçek olup olmadığını söylemeyi öğretti; farkın niçin olduğunu söylemedi. Ödünç formundaki terk oranı yüzde elli dördün üzerindeyse, kullanıcıların o ekranda ne yaptığı sayıda görünmez. Tersi de doğrudur: on iki oturumluk bir gözlem çalışmasında beş katılımcının aynı yerde takılması bir sorunun varlığını gösterir ama o sorunun kaç kişiyi etkilediğini söylemez.
Bu ders iki kaynağı aynı eksende buluşturur. Eksen, huni adımıdır: nicel kayıt her adımda kaç oturumun düştüğünü, nitel kayıt aynı adımda hangi sorunun kaç katılımcıda görüldüğünü bildirir. Buluşma noktası olmadan iki kaynak yan yana konamaz; adım eşleşmesi bu dersin ilk kuralıdır.
İki Kaydın Aynı Eksende Toplanması
Nicel taraf huni adımlarının giren ve tamamlayan sayılarından oluşur. Nitel taraf gözlem oturumlarında kodlanmış olaylardır: her kayıt bir katılımcının bir adımda yaşadığı bir sorunu bildirir. Kodlama işi Kullanıcı Araştırması Yöntemleri dersinde kurulmuştu; burada kodların hangi adıma iliştirildiği önem kazanır.
İki kaydın ortak alanı adımdır, kullanıcı değil. Gözlem oturumundaki katılımcı ile alan verisindeki oturum aynı kişi değildir ve olamaz; bu yüzden birleştirme kişi düzeyinde değil adım düzeyinde yapılır. Aşağıdaki hesap bu birleştirmeyi kurar ve iki kaynağın sıralamasını karşılaştırır.
// karma.mjs — ayni adimda nicel terk orani ile nitel gozlem kodlarinin yan yana konmasi // 1. Nicel kaynak: huni adimlari ve adima giren / adimi tamamlayan oturum sayilari. const HUNI = [ { adim: "arama-sonucu", giren: 4820, tamamlayan: 3140 }, { adim: "kayit-ayrintisi", giren: 3140, tamamlayan: 2610 }, { adim: "odunc-formu", giren: 2610, tamamlayan: 1180 }, { adim: "kimlik-dogrulama", giren: 1180, tamamlayan: 1044 }, { adim: "onay", giren: 1044, tamamlayan: 1002 }, ]; // 2. Nitel kaynak: 12 gozlem oturumunda kodlanmis olaylar. // Her kayit bir katilimcinin bir adimda yasadigi bir sorunu bildirir. const KODLAR = [ { oturum: "K01", adim: "odunc-formu", kod: "sube-secimi-anlasilmadi" }, { oturum: "K02", adim: "odunc-formu", kod: "sube-secimi-anlasilmadi" }, { oturum: "K03", adim: "odunc-formu", kod: "sube-secimi-anlasilmadi" }, { oturum: "K05", adim: "odunc-formu", kod: "sube-secimi-anlasilmadi" }, { oturum: "K07", adim: "odunc-formu", kod: "sube-secimi-anlasilmadi" }, { oturum: "K02", adim: "odunc-formu", kod: "tarih-bicimi-reddedildi" }, { oturum: "K06", adim: "odunc-formu", kod: "tarih-bicimi-reddedildi" }, { oturum: "K09", adim: "odunc-formu", kod: "tarih-bicimi-reddedildi" }, { oturum: "K04", adim: "arama-sonucu", kod: "suzgec-sonucu-bosaldi" }, { oturum: "K08", adim: "arama-sonucu", kod: "suzgec-sonucu-bosaldi" }, { oturum: "K10", adim: "arama-sonucu", kod: "siralama-beklenmedik" }, { oturum: "K11", adim: "kayit-ayrintisi", kod: "raf-kodu-anlasilmadi" }, { oturum: "K12", adim: "kimlik-dogrulama", kod: "kod-gelmedi-beklendi" }, ]; const OTURUM_SAYISI = 12; // 3. Nicel taraf: adim basina terk orani ve mutlak kayip. const nicel = HUNI.map((h) => ({ adim: h.adim, terkOrani: (h.giren - h.tamamlayan) / h.giren, kayip: h.giren - h.tamamlayan, })); console.log("adim giren tamamlayan terk orani mutlak kayip"); for (const h of HUNI) { const n = nicel.find((x) => x.adim === h.adim); console.log( h.adim.padEnd(20) + String(h.giren).padStart(7) + String(h.tamamlayan).padStart(12) + (100 * n.terkOrani).toFixed(1).padStart(12) + "%" + String(n.kayip).padStart(14) ); } // 4. Nitel taraf: adim basina kod cesitliligi ve kodun gorüldügü katilimci sayisi. const kodOzeti = new Map(); for (const k of KODLAR) { const anahtar = k.adim + "|" + k.kod; if (!kodOzeti.has(anahtar)) kodOzeti.set(anahtar, new Set()); kodOzeti.get(anahtar).add(k.oturum); } console.log("\nadim kod katilimci orani"); for (const [anahtar, oturumlar] of [...kodOzeti].sort((a, b) => b[1].size - a[1].size)) { const [adim, kod] = anahtar.split("|"); console.log( adim.padEnd(20) + kod.padEnd(28) + String(oturumlar.size).padStart(6) + (" " + (100 * oturumlar.size / OTURUM_SAYISI).toFixed(0) + "%").padStart(9) ); } // 5. Iki kaynagin siralamasi yan yana. const nicelSira = [...nicel].sort((a, b) => b.kayip - a.kayip).map((x) => x.adim); const nitelSayim = new Map(HUNI.map((h) => [h.adim, 0])); for (const k of KODLAR) nitelSayim.set(k.adim, nitelSayim.get(k.adim) + 1); const nitelSira = [...nitelSayim].sort((a, b) => b[1] - a[1]).map(([adim]) => adim); console.log("\nadim nicel sira nitel sira fark gozlem sayisi"); let uyusan = 0; for (const h of HUNI) { const n = nicelSira.indexOf(h.adim) + 1; const q = nitelSira.indexOf(h.adim) + 1; if (n === q) uyusan++; console.log( h.adim.padEnd(20) + String(n).padStart(10) + String(q).padStart(12) + String(n - q).padStart(6) + String(nitelSayim.get(h.adim)).padStart(15) ); } console.log(`ayni siraya dusen adim: ${uyusan} / ${HUNI.length}`); // 6. Kapsam: en buyuk kaybin ne kadari kodlanmis bir nedene baglanabiliyor? const enBuyuk = [...nicel].sort((a, b) => b.kayip - a.kayip)[0]; const oAdimKodlari = [...kodOzeti].filter(([a]) => a.startsWith(enBuyuk.adim + "|")); const kodlananKatilimci = new Set(KODLAR.filter((k) => k.adim === enBuyuk.adim).map((k) => k.oturum)); console.log( `\nen buyuk kayip: ${enBuyuk.adim} (${enBuyuk.kayip} oturum, %${(100 * enBuyuk.terkOrani).toFixed(1)})` ); console.log(` o adimda kodlanmis ayri neden: ${oAdimKodlari.length}`); console.log(` sorunu yasayan katilimci: ${kodlananKatilimci.size} / ${OTURUM_SAYISI}`); // 7. Iki kaynagin ayristigi adimlar: siralamalar ortusmuyorsa neden? console.log("\niki kaynagin ayristigi adimlar"); for (const h of HUNI) { const n = nicelSira.indexOf(h.adim) + 1, q = nitelSira.indexOf(h.adim) + 1; if (n === q) continue; const olcum = nicel.find((x) => x.adim === h.adim); const katilimci = new Set(KODLAR.filter((k) => k.adim === h.adim).map((k) => k.oturum)).size; console.log( ` ${h.adim.padEnd(18)} nicel ${n}. / nitel ${q}. ` + `terk %${(100 * olcum.terkOrani).toFixed(1)}, kayip ${olcum.kayip}, ` + `gozlemde ${katilimci}/${OTURUM_SAYISI} katilimci` ); } // 8. Nitel sayidan oran uretmenin siniri: 12 oturumluk kumede guven araligi. function oranAraligi(basari, n) { const z = 1.96, p = basari / n; const payda = 1 + (z * z) / n; const merkez = (p + (z * z) / (2 * n)) / payda; const yayilim = (z * Math.sqrt((p * (1 - p)) / n + (z * z) / (4 * n * n))) / payda; return [merkez - yayilim, merkez + yayilim]; } console.log("\nnitel orani nicel gibi okumanin siniri (12 oturum)"); for (const [anahtar, oturumlar] of kodOzeti) { if (oturumlar.size < 3) continue; const [alt, ust] = oranAraligi(oturumlar.size, OTURUM_SAYISI); const [adim, kod] = anahtar.split("|"); console.log( ` ${kod.padEnd(28)} ${oturumlar.size}/12 = %${(100 * oturumlar.size / OTURUM_SAYISI).toFixed(0)}` + ` %95 aralik: %${(100 * alt).toFixed(0)} - %${(100 * ust).toFixed(0)}` ); }
adim giren tamamlayan terk orani mutlak kayip arama-sonucu 4820 3140 34.9% 1680 kayit-ayrintisi 3140 2610 16.9% 530 odunc-formu 2610 1180 54.8% 1430 kimlik-dogrulama 1180 1044 11.5% 136 onay 1044 1002 4.0% 42 adim kod katilimci orani odunc-formu sube-secimi-anlasilmadi 5 42% odunc-formu tarih-bicimi-reddedildi 3 25% arama-sonucu suzgec-sonucu-bosaldi 2 17% arama-sonucu siralama-beklenmedik 1 8% kayit-ayrintisi raf-kodu-anlasilmadi 1 8% kimlik-dogrulama kod-gelmedi-beklendi 1 8% adim nicel sira nitel sira fark gozlem sayisi arama-sonucu 1 2 -1 3 kayit-ayrintisi 3 3 0 1 odunc-formu 2 1 1 8 kimlik-dogrulama 4 4 0 1 onay 5 5 0 0 ayni siraya dusen adim: 3 / 5 en buyuk kayip: arama-sonucu (1680 oturum, %34.9) o adimda kodlanmis ayri neden: 2 sorunu yasayan katilimci: 3 / 12 iki kaynagin ayristigi adimlar arama-sonucu nicel 1. / nitel 2. terk %34.9, kayip 1680, gozlemde 3/12 katilimci odunc-formu nicel 2. / nitel 1. terk %54.8, kayip 1430, gozlemde 7/12 katilimci nitel orani nicel gibi okumanin siniri (12 oturum) sube-secimi-anlasilmadi 5/12 = %42 %95 aralik: %19 - %68 tarih-bicimi-reddedildi 3/12 = %25 %95 aralik: %9 - %53
Sıralamalar Örtüşmediğinde
Çıktının üçüncü bölümü iki sıralamayı yan yana koyuyor: beş adımın üçü aynı sıraya düşüyor, ikisi yer değiştiriyor. Bu iki adım dersin asıl konusudur.
Arama sonucu ekranı mutlak kayıpta birinci: bin altı yüz seksen oturum orada düşüyor. Ama gözlemde yalnızca üç katılımcı orada bir sorun yaşadı. Ödünç formu ise mutlak kayıpta ikinci, gözlemde birinci: yedi katılımcı orada takıldı ve iki ayrı neden kodlandı.
Bu ayrışmanın iki açıklaması vardır ve ikisi de veriyle sınanabilir. Birincisi, arama sonucu ekranındaki düşüşün bir sorun olmayabileceğidir: tarama yapan bir kullanıcının sonuç listesinden çıkması beklenen bir davranıştır, huni bunu terk olarak sayar ama görev başarısızlığı değildir. İkincisi, gözlem çalışmasının o adımda görev tanımı gereği kısa kalmasıdır: katılımcıya aranacak kitap verildiyse arama zorluğu hiç oluşmaz.
Hangi açıklamanın doğru olduğuna bu tablo karar veremez. Verebildiği şey soruyu daraltmaktır: arama sonucu ekranı için görev tanımı serbest bırakılmış yeni bir gözlem turu gerekir. Nicel ve nitel verinin birleştirilmesi bir sonuç üretmez; bir sonraki çalışmanın konusunu üretir.
Kapsam: Kaybın Ne Kadarı Açıklanabiliyor
Dördüncü bölüm en büyük kaybı ve o adımda kodlanmış nedenleri sayıyor. Arama sonucunda iki ayrı neden kodlanmış ve bunlar on iki katılımcının üçünde görülmüş. Bu sayı bir kapsam göstergesidir: kaybın büyüklüğü ile onu açıklayan gözlemin gücü arasındaki mesafeyi ölçer.
Mesafe büyükse iki yanlış karar yolu açılır. Birincisi, az sayıda gözlemden çıkan nedeni bütün kayba genellemektir — üç katılımcının süzgeç sorunu, bin altı yüz seksen oturumun nedeni sayılır. İkincisi, gözlemi hiç kullanmayıp yalnız sayıya bakmaktır; o zaman da düzeltilecek şey belirsiz kalır. Doğru okuma, kapsamın kendisini raporlamaktır: “bu adımdaki kaybın açıklanabilen bölümü üç katılımcının bildirdiği iki nedenle sınırlıdır.”
Nitel Oranı Nicel Gibi Okumak
Son bölüm sık yapılan bir hatayı sayıyla gösteriyor. On iki oturumda beş katılımcının yaşadığı sorun için “kullanıcıların yüzde kırk ikisi” demek, örneklem büyüklüğünü gizler. Aynı gözlemin yüzde doksan beş güven aralığı yüzde on dokuz ile yüzde altmış sekiz arasındadır. Bu genişlikte bir aralık, bir tasarım kararını gerekçelendirebilir ama bir öncelik sırasını tek başına belirleyemez.
Kural şudur: nitel çalışma sorunun varlığını ve biçimini bildirir, yaygınlığını bildirmez. Yaygınlık sorusu alan verisiyle ya da sorunun bir ölçüte dönüştürüldüğü bir ölçümle yanıtlanır. Beş katılımcının şube seçimini anlamaması, o alanın yeniden tasarlanması için yeterli gerekçedir; “kullanıcıların yüzde kırk ikisi” cümlesi ise yazılmamalıdır.
İki Kaynak Birbirini Yalanladığında
Bir adımda terk oranı düşük ama gözlemde birden çok sorun kodlanmışsa, ya sorun görevi tamamlamayı engellemiyordur ya da alan verisi o adımı yanlış ölçüyordur. Tersi durumda — terk yüksek, gözlem yok — ya gözlem görevleri o yolu hiç kullanmıyordur ya da düşüş bir başarısızlık değildir.
Her iki durumda da izlenecek sıra aynıdır: önce ölçümün kendisi denetlenir (adım tanımı, olay kaydının tetiklendiği an, oturum tanımı), sonra görev tanımı denetlenir, en son tasarım değiştirilir. Ölçüm hatası düzeltilmeden yapılan tasarım değişikliği, sonucu yorumlanamaz hâle getirir.
Özet
- Nicel ve nitel kayıtlar kişi düzeyinde değil adım düzeyinde birleştirilir; gözlem katılımcısıyla alan verisindeki oturum aynı kişi değildir.
- İki kaynağın sıralaması örtüşmediğinde tablo bir sonuç değil bir soru üretir: beş adımın ikisi yer değiştiriyor ve her ikisinin de veriyle sınanabilir iki açıklaması var.
- Kapsam raporlanır: en büyük kaybı açıklayan gözlem on iki katılımcının üçünden geliyor; bu mesafe hem aşırı genellemeyi hem de gözlemi yok saymayı engeller.
- Nitel çalışma sorunun varlığını ve biçimini bildirir, yaygınlığını bildirmez: 5/12 gözlemin güven aralığı yüzde on dokuz ile altmış sekiz arasındadır.
- İki kaynak çeliştiğinde sıra ölçümü denetlemek, görev tanımını denetlemek ve en son tasarımı değiştirmektir.
Kurs Kapanışı
Bu kurs kullanıcıyı tasarımın girdisi hâline getirmenin zincirini kurdu. Araştırma ve Tanımlama konusu yöntemin seçimini katılımcı onayı ve veri sınırlarıyla birlikte ele aldı, profilleri gerçek veriye bağladı ve problem tanımını çözümden önce yazmayı kural yaptı. Bilgi Mimarisi ve Akış konusu yapıyı içerikten türetti, gezinme modellerini derinlik ve genişlik ödünleşimiyle hesapladı ve kullanılabilirlik testini küçük örneklemin ne söyleyebildiği sınırıyla kurdu. Davranış Tasarımı konusu kararın nasıl verildiğini modelledi ve her mekanizmayı tek bir ölçüte bağladı: kullanıcı bilseydi de aynı seçimi yapacaksa karar meşrudur, kararın gücü kullanıcının bilgisizliğinden geliyorsa karanlık kalıptır. Ölçme konusu ise bu kararların sonucunu görev başarımı, süre ve hata oranıyla raporlamayı, huniyi okumayı, deneyi doğru kurmayı ve bu dersteki gibi iki kaynağı birleştirmeyi öğretti.
Buraya kadar her karar tek tek doğrulandı. Bir sonraki soru ölçeğe aittir: aynı kararların onlarca ekranda, birden çok ekipte ve zaman içinde tutarlı kalması nasıl sağlanır? Bir sonraki kurs, Tasarım Sistemleri, bu soruyu ele alır. Tasarım dilini belirteçlere çevirir, bileşen kataloğunu belge ve sürüm disipliniyle yönetir, sistemin benimsenmesini ölçer ve yönetişimini kurar. Bu kursta verilen kararlar orada birer sözleşmeye dönüşür.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.