Soru
Görüşmeci“Her cihaz için ziyaretçilerin yüzde kaçı satın almış?” Takip: “Peki A/B testinde B varyantı A'ya göre ne kadar iyi?”
Önce netleştir
Kod yazmadan önce sorulacak sorular. Her biri farklı bir sorguya götürür; sormamak en sık puan kaybıdır.
- Payda ne: ziyaret eden kullanıcı mı, oturum mu, olay mı?
- Bir kullanıcı iki cihaz kullandıysa hangisine yazılır?
- Satın alma ziyaretten önce kaydedilmişse (veri hatası) sayılır mı?
- Oran yüzde mi, ondalık mı; kaç basamak?
Yaklaşım
- Payda kümesini tanımla (ziyaret eden kullanıcılar).
- Pay kümesini aynı grain düzeyinde tanımla (satın alan kullanıcılar).
- Koşullu sayımla ikisini tek geçişte hesapla.
- 100.0 ile çarparak tam sayı bölmesinden kaç.
Çözüm 1: koşullu COUNT DISTINCT
SELECT device,
COUNT(DISTINCT CASE WHEN event_type = 'visit' THEN user_id END) AS ziyaretci,
COUNT(DISTINCT CASE WHEN event_type = 'purchase' THEN user_id END) AS alici,
ROUND(100.0 * COUNT(DISTINCT CASE WHEN event_type = 'purchase' THEN user_id END)
/ COUNT(DISTINCT CASE WHEN event_type = 'visit' THEN user_id END), 2) AS donusum
FROM web_events
GROUP BY device;
Çözüm 2: kullanıcı düzeyinde bayraklar
WITH k AS (
SELECT device, user_id,
MAX(CASE WHEN event_type = 'visit' THEN 1 ELSE 0 END) AS ziyaret,
MAX(CASE WHEN event_type = 'purchase' THEN 1 ELSE 0 END) AS aldi
FROM web_events
GROUP BY device, user_id
)
SELECT device, SUM(ziyaret) AS ziyaretci, SUM(aldi) AS alici,
ROUND(100.0 * SUM(CASE WHEN ziyaret = 1 AND aldi = 1 THEN 1 ELSE 0 END) / SUM(ziyaret), 2) AS donusum
FROM k
GROUP BY device;
İkinci çözüm önce kullanıcı düzeyine iner; “ziyaret edip satın alan” gibi birleşik koşullar ve huni adımları için daha esnektir. Birinci çözüm daha kısadır ama payda ile payın aynı kişiler olduğunu garanti etmez (ziyareti olmayan bir alıcı paya girer).
Sınır durumları
| Durum | Ne olur? |
|---|---|
| Tam sayı bölmesi | 7 / 10 = 0 (SQL Server, PostgreSQL, SQLite). 100.0 * ile başla |
| Payda sıfır | NULLIF(payda, 0) ile sıfıra bölmeyi önle |
| Oranların ortalaması | Günlük oranların ortalaması, toplam dönüşüm / toplam ziyaret ile aynı değildir |
| Çift sayım | Aynı kullanıcının birden çok satın alması: COUNT(DISTINCT user_id) |
Takip soruları
- Sonuç istatistiksel olarak anlamlı mı? (iki oran z-testi)
- Dönüşümü 7 günlük pencereyle (ziyaretten sonraki 7 gün içinde) nasıl hesaplarsın?
- Mobil ile masaüstü arasındaki farkın nedeni ne olabilir? (veri değil, ürün sorusu)
Görüşmeci neye bakıyor?Paydayı netleştirmen, tam sayı bölmesini kendiliğinden önlemen ve “oranların ortalaması” tuzağını bilmen.