Kohort analizi
Kohort analizi
Kohort analizi nesneleri (genellikle kullanıcıları) tek bir başlangıç olayına göre gruplandırır ve nasıl ve ne kadar süre aktif ve değerli kaldıklarını karşılaştırır. Bu yaklaşım, sistemdeki zamanın etkisini (mevsimler, stoklar) kohortun yaşının etkisinden (başlangıçtan itibaren günler) ayırır.
1) Temel tanımlar
Kohort: "Doğum" etkinliği ile birleşmiş birçok oyuncu - kayıt, ilk para yatırma, ilk oyun, ilk satın alma.
Takvim zaman ekseni: gerçek tarihler (2025-10-01,...).
Kohort yaş ekseni: Doğumdan itibaren günler/haftalar (D0, D1,...).
Tutma metrikleri: D1/D7/D30 (Exact ve Rolling), WAU/MAU, Yapışkanlık (DAU/MAU).
Para kazanma: ARPU/ARPPU, kümülatif LTV (D7/D30/D90'da).
Muhasebe birimi: kullanıcı (user/master_id) - pasaportta kayıt.
2) Kohort türleri ve ne zaman seçileceği
Edinme kohortları: kayıt tarihine/ilk ziyarete göre - işe alım ve işe alım kanallarının değerlendirilmesi.
Aktivasyon/Para Kazanma-kohortlar: ilk para yatırma/satın alma ile - erken para kazanma değerlendirmesi ve promosyonu.
Özellik kohortları: özellik/oyun kategorisinin ilk kullanımı için - sürümlerin etkisi.
Davranış kohortları: RFM/başlangıç modeline göre (örneğin, "gece mobil").
3) Eksenler ve ızgaralar: matrisin nasıl izleneceği
Kohort matrisi: satırlar - kohortlar (takvim), sütunlar - yaş (D0... D90).
Mevsimsellik: Mevsimsel etkileri ayırmak için köşegenleri (aynı takvim günü) karşılaştırın.
Normalleştirme: göreceli metrikler (CR, kesirler) + kümülatif (LTV), her ikisini de gösterir.
4) Kohort pasaportu ve metrikleri (şablon)
5) Pseudo-SQL: tutma matrisi (Exact Dn)
sql
WITH regs AS (
SELECT user_id, DATE_TRUNC('day', MIN(ts)) AS cohort_day
FROM event_register
GROUP BY 1
),
act AS (
SELECT user_id, DATE_TRUNC('day', ts) AS act_day
FROM event_activity
),
ages AS (
SELECT r. user_id, r. cohort_day, a. act_day,
(a. act_day - r. cohort_day) AS age_days
FROM regs r
JOIN act a ON a. user_id = r. user_id
),
exact AS (
SELECT cohort_day,
age_days,
COUNT(DISTINCT user_id) AS users_active
FROM ages
GROUP BY 1,2
),
coh_size AS (
SELECT cohort_day, COUNT(DISTINCT user_id) AS cohort_size
FROM regs GROUP BY 1
)
SELECT e. cohort_day,
e. age_days,
e. users_active::decimal / NULLIF(c. cohort_size,0) AS exact_retention
FROM exact e
JOIN coh_size c USING (cohort_day)
WHERE age_days IN (1,7,30,90)
ORDER BY cohort_day, age_days;
Rolling Dn (1. günde aktivite... n)
sql
WITH days AS (... as above...),
roll AS (
SELECT cohort_day,
CASE WHEN age_days BETWEEN 1 AND 7 THEN 7
WHEN age_days BETWEEN 1 AND 30 THEN 30 END AS bucket,
COUNT(DISTINCT user_id) AS any_active
FROM days
WHERE age_days BETWEEN 1 AND 30
GROUP BY 1,2
)
SELECT r. cohort_day, r. bucket AS Dn,
r. any_active::decimal / s. cohort_size AS rolling_retention
FROM roll r
JOIN (SELECT cohort_day, COUNT(DISTINCT user_id) cohort_size FROM regs GROUP BY 1) s USING (cohort_day)
ORDER BY cohort_day, Dn;
6) Kohort LTV ve para kazanma
Kümülatif LTV (Dn): Dn tarafından kohort kullanıcı başına gelir toplamı.
ARPU/ARPPU: Kullanıcı başına/Dn ödeme yapan kişi başına gelir.
% paying: Dn'ye ≥1 ödeme ile pay.
sql
WITH reg AS (
SELECT user_id, DATE_TRUNC('day', MIN(ts)) AS cohort_day
FROM event_register GROUP BY 1
),
pay AS (
SELECT user_id, amount, DATE_TRUNC('day', ts) AS pay_day
FROM fact_payments
),
ltv AS (
SELECT r. cohort_day,
(pay_day - r. cohort_day) AS age_days,
SUM(amount) AS rev
FROM reg r JOIN pay p USING (user_id)
WHERE pay_day >= r. cohort_day
GROUP BY 1,2
),
cum AS (
SELECT cohort_day, age_days,
SUM(rev) OVER (PARTITION BY cohort_day ORDER BY age_days ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS rev_cum
FROM ltv
)
SELECT c. cohort_day, c. age_days,
c. rev_cum::decimal / NULLIF(sz. cohort_size,0) AS ltv_per_user
FROM cum c
JOIN (SELECT cohort_day, COUNT(DISTINCT user_id) cohort_size FROM reg GROUP BY 1) sz USING (cohort_day)
WHERE age_days IN (7,30,90)
ORDER BY cohort_day, age_days;
7) Hayatta kalma/tutma tehlikesi
Kaplan-Meier: Model olmayan sağkalım eğrisi (S (t)) - "boşaltılmamış" oran.
Tehlike modelleri: karakteristiklerin (kanal, ülke, platform, bonuslar, içerik) çıkış riski üzerindeki etkisi.
Uygulama: KM'yi segmentlere göre oluşturuyoruz, ardından tehlike modeli ile farkı açıklıyoruz.
8) Mevsimsellik, TZ ve takvim
TZ: olayları UTC'de saklayın, pazarın yerel TZ'sinde analiz edin; Tutarlı ol.
Takvim: tatiller/maaş/maçlar/bültenler - bayraklar gibi; Benzer haftaların kohortlarını karşılaştırın.
Sürgülü pencere: haftalık/aylık kohortlar için - tatillerin ve raporlama dönemlerinin çokluğu.
9) Segmentasyon ve ilişkilendirme
Segmentler: cazibe kanalı, platform/OS, coğrafi, ilk içerik, fiyat/limitler, ödeme yöntemi.
Kohort ilişkilendirme: Kullanıcıyı'kim getirdi "- algoritmayı düzeltin (son doğrudan olmayan, veri odaklı).
LTV ağırlığı: sadece CR'yi değil, aynı zamanda LTV'yi (D30/D90) kanal/segment ile karşılaştırın.
10) Görselleştirme
Kohort matrisinin ısı haritası (CR/LTV).
Trend çizgileri takvime göre D1/D7/D30.
Hayatta Kalma/Tehlike çizelgeleri.
Köprü "LTV'yi D30'a ne değiştirdi": ödeyen katkısı, sıklık, ortalama kontrol.
11) Deneyler ve nedensellik
A/B: onboarding, öğreticiler, paywall, teklifler. Ana metrik D7/D30 tutma ve LTV'dir (D30).
Yarı-deneyler: Piyasalara yayılmak için DiD/sentetik kontrol.
Yükseltme modelleri: yeniden aktivasyonda geri dönüş kazancını hedefleyin (Qini/AUUC, uplift @ k).
12) Operasyon ve yönetişim
Sürüm oluşturma: 'RET _ D7 _ vN', 'LTV _ D30 _ vN'; Aktivite/para birimi tanımını değiştirirken changelog.
SLO tazeliği: günlük kohortlar - 06:00 kilidine kadar hazırlık.; Veri kaydı ≤ 1 saat.
Kalite: Olayların kapsamı, kopyaların oranı, kohortlar dışındaki botların/sahtekarlığın oranı.
Erişim: RLS/CLS, PII maskeleme; dışa aktarma - yalnızca kümeler.
Runbooks: D1 damla (onboarding), D7 (içerik), olay/kimlik hurdaya.
13) Sık hatalar (anti-desenler)
Eksen karıştırma: Farklı mevsimlerde farklı kohort yaşlarını ayarlamadan karşılaştırın.
Rolling vs Exact: Aynı şey olarak kabul edilir.
Karıştırma birimleri: paydadaki oturumlar, paydaki kullanıcılar.
"Means'ın toplanması: numerators/paydaları toplamak yerine.
TZ/takvimi göz ardı etme: Gün/tatil sınırlarında D1 ofset.
Bot/dolandırıcılık/QA filtresi yok.
Hesaplanmamış yeniden başlatmalar: kimlik köprüleri olmadan hesapları bölün/birleştirin.
14) Kohort raporunun yayınlanmasından önce kontrol listesi
- Doğum olayı, birim, TZ, etkinlik pencereleri tanımlanmış
- Hariç tutulan botlar/dolandırıcılık/QA; Kimlikler karışık (altın plak)
- D7/D30/D90 için üretilmiş CR (Exact/Rolling) ve LTV matrisleri
- Takvim/tatiller dikkate alınır; Kanala/platforma/geoya göre segmentler
- Hayatta kalma/tehlike grafikleri ve köprü LTV eklendi
- Belgelenmiş metrik sürümler ve ilişkilendirme algoritması
- Taze SLO'lar yapılandırılmış, kapsama/yinelenen/hata izleme
- D1/D7 damlaları ve etkinlik molaları için hazır runbook'lar
Toplam
Kohort analizleri iki eksen ve disiplindir: sabit "doğum anı", doğru pencereler ve TZ, tutma ve LTV matrisleri, segmentasyon ve değişimin nedensel doğrulaması. Bu yaklaşım sadece eğrileri gözlemlemekle kalmaz, aynı zamanda karar vermeye yardımcı olur: onboarding'in nerede düzeltileceği, hangi kanalların ölçeklendirileceği, hangi içeriğin ve tekliflerin oyuncuları daha uzun süre tutacağı ve LTV'yi artıracağı.