Ders 02 / 24
Kullanıcı Profilleri
Profilin uydurulmuş bir kişi değil, veriden türetilmiş bir davranış kümesi olması; katılımcıların kümelemesi, rol tabanlı gruplamanın açıklama gücünün hesaplanması ve profilin etik sınırı.
İçindekiler
Önceki ders on iki görüşmeden on kod çıkardı, ama katılımcıları hâlâ K01–K12 biçiminde
bir liste olarak bıraktı. Bu listeyle tasarım kararı verilemez: on iki ayrı kişiye ayrı
arayüz tasarlanmaz. Karar verebilmek için listenin yapısını görmek gerekir — kimler
birbirine benziyor, benzerlik hangi eksende ve bu eksen tasarımı değiştiriyor mu?
Bu sorunun yaygın yanıtı yanlıştır. Katılımcılar çoğu zaman rollerine göre gruplanır: lisans öğrencisi, lisansüstü öğrenci, akademisyen, kütüphane çalışanı, dışarıdan üye. Bu gruplama yönetilebilir görünür, çünkü roller zaten kayıtlıdır. Bu ders, aynı veri üzerinde iki gruplamayı karşılaştırır ve rolün davranışı ne kadar açıkladığını hesaplar.
Profil Nedir, Ne Değildir
Kullanıcı profili (persona), araştırma verisinden türetilmiş ve bir davranış kümesini temsil eden bir tanımdır. Üç parçası vardır:
- Amaç: kişinin arayüzü kullanma nedeni. “Kaynak taramak” ile “bilinen bir kitabı bulmak” ayrı amaçlardır ve ayrı arayüz kararları doğururlar.
- Davranış: amacın gözlenmiş biçimi. Oturum süresi, arama türü, ödünç alma sıklığı, hangi ekrandan girdiği.
- Kısıt: kişinin değiştiremediği koşullar. Zaman, ekran, dil, erişilebilirlik gereksinimi.
Profil bu üçünün dışında bir şey içerdiğinde tasarım kararı üretmeyi bırakır. Uydurulmuş bir ad, bir yaş, bir fotoğraf ve bir yaşam öyküsü profili “canlı” göstermeye çalışır ama hiçbir karar bu ayrıntılara dayandırılamaz. Katalog arayüzünde sonuç listesinin kaç satır göstereceği kararı, kullanıcının otuz iki mi kırk beş mi yaşında olduğuna değil, oturumunun dört mü yirmi iki dakika mı sürdüğüne bağlıdır.
Ölçüt şudur: profilde yazan her satırın karşılığında bir tasarım kararı gösterilebilmelidir. Karşılığı olmayan satır profilden çıkarılır.
Katılımcıları Ölçülene Göre Kümelemek
Gözlem oturumlarından dört ölçü çıkarıldı: konu taramasıyla geçen oturum oranı, ortalama oturum süresi, aylık ödünç alma sayısı ve dar ekrandan girilen oturum oranı. Bu ölçüler farklı birimlerde olduğu için önce ortak bir aralığa taşınır, sonra katılımcılar arası uzaklık hesaplanır ve birbirine yakın olanlar birleştirilir.
// profil.mjs — davranisa gore gruplama ile role gore gruplamanin karsilastirilmasi // Gozlem oturumlarindan cikan olculer (ders icin kurulmus veri). // kesif: konu taramasi ile gecen oturum orani, sure: ortalama oturum dakikasi, // odunc: aylik odunc alma sayisi, darEkran: dar ekrandan girilen oturum orani. const K = [ { ad: "K01", rol: "lisans", kesif: 0.15, sure: 4, odunc: 6, darEkran: 0.10 }, { ad: "K02", rol: "lisansustu", kesif: 0.85, sure: 22, odunc: 2, darEkran: 0.20 }, { ad: "K03", rol: "lisans", kesif: 0.45, sure: 6, odunc: 2, darEkran: 0.85 }, { ad: "K04", rol: "lisans", kesif: 0.80, sure: 19, odunc: 3, darEkran: 0.15 }, { ad: "K05", rol: "akademisyen", kesif: 0.20, sure: 5, odunc: 8, darEkran: 0.05 }, { ad: "K06", rol: "disaridan", kesif: 0.50, sure: 7, odunc: 1, darEkran: 0.90 }, { ad: "K07", rol: "calisan", kesif: 0.40, sure: 5, odunc: 3, darEkran: 0.80 }, { ad: "K08", rol: "calisan", kesif: 0.10, sure: 3, odunc: 7, darEkran: 0.15 }, { ad: "K09", rol: "akademisyen", kesif: 0.90, sure: 25, odunc: 2, darEkran: 0.10 }, { ad: "K10", rol: "lisansustu", kesif: 0.48, sure: 8, odunc: 2, darEkran: 0.88 }, { ad: "K11", rol: "disaridan", kesif: 0.78, sure: 20, odunc: 1, darEkran: 0.25 }, { ad: "K12", rol: "lisansustu", kesif: 0.18, sure: 5, odunc: 6, darEkran: 0.12 }, ]; const OLCU = ["kesif", "sure", "odunc", "darEkran"]; // Olculer farkli birimlerde; her birini 0-1 araligina tasi. const enAz = {}, enCok = {}; for (const o of OLCU) { enAz[o] = Math.min(...K.map((k) => k[o])); enCok[o] = Math.max(...K.map((k) => k[o])); } const vektor = (k) => OLCU.map((o) => (k[o] - enAz[o]) / (enCok[o] - enAz[o])); const V = K.map(vektor); const uzaklik = (a, b) => Math.hypot(...a.map((v, i) => v - b[i])); // Tam bag ile birlestirmeli kumeleme: en yakin iki kumeyi birlestir, k kumede dur. function kumele(hedef) { let kumeler = V.map((_, i) => [i]); while (kumeler.length > hedef) { let enIyi = [0, 1], enKucuk = Infinity; for (let i = 0; i < kumeler.length; i++) for (let j = i + 1; j < kumeler.length; j++) { let d = 0; for (const a of kumeler[i]) for (const b of kumeler[j]) d = Math.max(d, uzaklik(V[a], V[b])); if (d < enKucuk) { enKucuk = d; enIyi = [i, j]; } } const [i, j] = enIyi; kumeler = kumeler.filter((_, x) => x !== i && x !== j).concat([kumeler[i].concat(kumeler[j])]); } return kumeler.map((c) => c.sort((a, b) => a - b)).sort((a, b) => a[0] - b[0]); } // Grup ici kare toplami: her uyenin grup ortalamasina uzakliginin karesi const kareToplam = (gruplar) => gruplar.reduce((t, g) => { const ort = OLCU.map((_, d) => g.reduce((s, i) => s + V[i][d], 0) / g.length); return t + g.reduce((s, i) => s + uzaklik(V[i], ort) ** 2, 0); }, 0); const TUMU = kareToplam([K.map((_, i) => i)]); const rolGruplari = [...new Set(K.map((k) => k.rol))].map((r) => K.map((k, i) => [k, i]).filter(([k]) => k.rol === r).map(([, i]) => i) ); const davranisGruplari = kumele(3); console.log("davranisa gore kumeler (k = 3)"); for (const g of davranisGruplari) { const ort = OLCU.map((_, d) => g.reduce((s, i) => s + K[i][OLCU[d]], 0) / g.length); console.log( ` ${g.map((i) => K[i].ad).join(" ").padEnd(20)} n=${g.length} ` + `kesif ${ort[0].toFixed(2)} sure ${ort[1].toFixed(1)} dk odunc ${ort[2].toFixed(1)} dar ekran ${ort[3].toFixed(2)}` ); console.log(` roller: ${[...new Set(g.map((i) => K[i].rol))].sort().join(", ")}`); } console.log("\nrole gore gruplar"); for (const g of rolGruplari) { console.log(` ${K[g[0]].rol.padEnd(12)} ${g.map((i) => K[i].ad).join(" ").padEnd(16)} n=${g.length}`); } const rolK = kareToplam(rolGruplari), davK = kareToplam(davranisGruplari); console.log("\ngruplama grup sayisi grup ici kare toplami aciklanan degisim"); console.log(`role gore ${String(rolGruplari.length).padStart(11)} ${rolK.toFixed(3).padStart(21)} ${((1 - rolK / TUMU) * 100).toFixed(1)}%`); console.log(`davranisa gore ${String(davranisGruplari.length).padStart(11)} ${davK.toFixed(3).padStart(21)} ${((1 - davK / TUMU) * 100).toFixed(1)}%`); console.log(`toplam degisim (tek grup): ${TUMU.toFixed(3)}`); // Her kumenin en temsili uyesi: kume icindeki uzaklik toplami en kucuk olan console.log("\nkume temsili katilimci kume ici uzaklik toplami"); for (const g of davranisGruplari) { const puanlar = g.map((i) => [i, g.reduce((s, j) => s + uzaklik(V[i], V[j]), 0)]); puanlar.sort((a, b) => a[1] - b[1]); console.log(`${g.map((i) => K[i].ad).join("+").padEnd(20)} ${K[puanlar[0][0]].ad} ${puanlar[0][1].toFixed(3)}`); }
davranisa gore kumeler (k = 3)
K01 K05 K08 K12 n=4 kesif 0.16 sure 4.3 dk odunc 6.8 dar ekran 0.11
roller: akademisyen, calisan, lisans, lisansustu
K02 K04 K09 K11 n=4 kesif 0.83 sure 21.5 dk odunc 2.0 dar ekran 0.17
roller: akademisyen, disaridan, lisans, lisansustu
K03 K06 K07 K10 n=4 kesif 0.46 sure 6.5 dk odunc 2.0 dar ekran 0.86
roller: calisan, disaridan, lisans, lisansustu
role gore gruplar
lisans K01 K03 K04 n=3
lisansustu K02 K10 K12 n=3
akademisyen K05 K09 n=2
disaridan K06 K11 n=2
calisan K07 K08 n=2
gruplama grup sayisi grup ici kare toplami aciklanan degisim
role gore 5 4.885 22.3%
davranisa gore 3 0.261 95.8%
toplam degisim (tek grup): 6.286
kume temsili katilimci kume ici uzaklik toplami
K01+K05+K08+K12 K01 0.538
K02+K04+K09+K11 K02 0.605
K03+K06+K07+K10 K03 0.450
Rol Bir Profil Değildir
Karşılaştırmanın sonucu tek satırda okunur. Role göre gruplama beş grup üretiyor ve davranıştaki değişimin %22.3’ünü açıklıyor; davranışa göre gruplama üç grupla %95.8’ini açıklıyor. Bu karşılaştırma rolün lehinedir, çünkü daha çok grup her zaman daha küçük grup içi değişim üretme eğilimindedir. Daha az grupla daha yüksek açıklama, farkın veriden geldiğini gösterir.
Bunun nedeni kümelerin bileşiminde görünüyor: üç davranış kümesinin her birinde dört ayrı rol var. Aynı rolden iki kişi birbirine benzemiyor, farklı rollerden dört kişi benziyor. Lisans öğrencisi K01 ile akademisyen K05 aynı kümede — ikisi de bilinen bir kaydı bulup çıkmak istiyor. Lisans öğrencisi K04 ile akademisyen K09 başka bir kümede — ikisi de konu tarıyor. Rol, kütüphane kaydında yazılı olduğu için ölçülmesi ucuzdur; davranışı açıklamadığı için tasarımda karşılığı yoktur.
Üç kümenin ortalamaları profillerin çekirdeğini veriyor.
- Bilinen kaydı arayan. Konu taraması oranı 0.16, oturum 4.3 dakika, ayda 6.8 ödünç. Bu profil için sonuç listesinin ilk satırı belirleyicidir; kullanıcı listeyi taramaz, ilk eşleşmeyi doğrular ve çıkar.
- Konu tarayan. Konu taraması oranı 0.83, oturum 21.5 dakika, ayda 2.0 ödünç. Bu profil listeyi gerçekten okur, karşılaştırır ve çoğu oturumda ödünç almadan ayrılır. Onun için değerli olan işlem değil, listeye geri dönebilmektir.
- Dar ekrandan bakan. Oturumların 0.86’sı dar ekranda, süre 6.5 dakika. Bu profilin kısıtı ekrandır: aynı sonuç listesi ona daha az satır gösterir, aynı eylem şeridi ona sığmaz.
Üçüncü tablo her kümenin temsili katılımcısını veriyor: küme içindeki uzaklık toplamı en küçük olan üye. Profil metni yazılırken bu katılımcının notları kullanılır, çünkü kümenin ortasında duran gerçek bir kayıttır. Ortalama bir kişi değildir; ortalamaya en yakın kişidir.
Profilin Etik Sınırı
Profil, araştırma verisinden türetildiği için katılımcı verisinin taşıdığı bütün yükümlülükleri devralır.
Tek kişilik küme profil değildir. Bir küme tek üyeye inerse, o profil bir kişinin davranış kaydıdır; adı silinmiş olsa bile ekipteki biri onu tanır. Kural şudur: bir profil en az üç katılımcının davranışını temsil etmiyorsa profil olarak yazılmaz, gözlem olarak kalır. Yukarıdaki kümelerin üçü de dört üyelidir.
Temsili katılımcının alıntısı da kimliksizleştirilir. Profil metnine katılımcı sözü alınırken kişiyi tanımlanabilir kılan ayrıntılar çıkarılır. Önceki derste konan ölçüt burada da geçerlidir: veriden kimliğe geri gidilememelidir.
Profil, onayın kapsamı içinde kalır. Katılımcı araştırmaya katıldığında verisinin tasarım kararlarında kullanılmasına onay verdi; adının bir profil kartında görünmesine değil. Profillere uydurma ad verilmesinin tek savunulabilir gerekçesi budur, ama uydurma ad da gerçek adı çağrıştırmayacak biçimde seçilir.
Profil bir dışlama aracına dönüşmemelidir. “Bu profil bizim kullanıcımız değil” cümlesi kapsam kararı olarak yazılabilir, ama kimin ölçülmediğiyle birlikte yazılır. Üç profilin hiçbiri ekran okuyucu kullanan bir katılımcıdan türemediyse, bu bir bulgu değil örneklem eksikliğidir ve profil belgesine böyle geçer.
Özet
- Kullanıcı profili amaç, davranış ve kısıt üçlüsüdür; profildeki her satırın karşılığında bir tasarım kararı gösterilebilmelidir.
- Katılımcılar ölçülen davranışa göre kümelenir; ölçüler ortak aralığa taşınır ve uzaklık üzerinden birleştirilir.
- Örnek veride role göre gruplama beş grupla değişimin %22.3’ünü, davranışa göre gruplama üç grupla %95.8’ini açıkladı; rol ucuz ölçülür ama davranışı açıklamaz.
- Her kümenin temsili üyesi, küme içi uzaklık toplamı en küçük olan gerçek katılımcıdır; profil metni ortalama bir kişiden değil bu kayıttan yazılır.
- Bir profil en az üç katılımcıyı temsil etmiyorsa yazılmaz; profil, katılımcıyı yeniden tanımlanabilir kılmamalı ve örneklemin dışında kalanları bulgu gibi göstermemelidir.
Sonraki Adım
Üç profil elde edildi, ama profil tek başına bir yapılacak listesi değildir. “Konu tarayan” profilinin oturumu yirmi bir dakika sürüyor — bu sürede tam olarak ne yapıyor, hangi adımları sırayla izliyor ve hangi adımda ne beklemesi gerekiyor? Sonraki ders ihtiyacı eyleme çevirir: kullanıcı hikâyesinin hangi biçimde yazıldığını, içine çözümün nasıl sızdığını ve görevlerin sıklık ile başarısızlık verisine göre nasıl sıralandığını ele alır.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.