Kohort analizi
Kohort analizi
Kohort analizi obyektləri (adətən istifadəçiləri) bir başlanğıc hadisəsinə görə qruplaşdırır və onların necə və nə qədər aktiv və dəyərli qaldıqlarını müqayisə edir. Bu yanaşma sistemdəki zaman təsirini (mövsümlər, promosyonlar) kohorta yaşının təsirindən (başlanğıc günlərindən) ayırır.
1) Əsas təriflər
Cohort: «doğum» hadisəsi ilə birləşən bir çox oyunçu - qeydiyyat, ilk depozit, ilk oyun, ilk alış.
Təqvim oxu (calendar time): faktiki tarixlər (2025-10-01,...).
Kohort yaşının oxu (cohort age): «doğulduqdan» sonra günlər/həftələr (D0, D1,...).
Tutma metrikası: D1/D7/D30 (Exact & Rolling), WAU/MAU, Stickiness (DAU/MAU).
Monetizasiya: ARPU/ARPPU, məcmu LTV (D7/D30/D90).
Qeydiyyat vahidi: istifadəçi (user/master_id) - pasportda qeyd edin.
2) Coquort növləri və onları seçmək üçün nə vaxt
Acquisition-cogorts: qeydiyyat/ilk səfər tarixinə görə - cəlb və onbordinq kanallarının qiymətləndirilməsi.
Activation/Monetization-cogorts: ilk depozit/alış - early-monetization və promosyon qiymətləndirilməsi.
Feature-kogorts: ilk fici/oyun kateqoriyasının istifadəsi ilə - buraxılış effekti.
Behavior-kogorts: RFM/başlanğıc nümunəsi ilə (məsələn, «gecə mobil»).
3) Oxlar və şəbəkələr: matrisə necə baxmaq olar
Kohort matrisi: sətirlər - kohortlar (təqvim), sütunlar - yaş (D0... D90).
Mövsümlük: Mövsümi effektləri ayırmaq üçün diaqonalları (eyni təqvim günü) müqayisə edin.
Normallaşma: nisbi metriklər (CR, paylar) + məcmu (LTV), hər ikisini göstərin.
4) Kohorta və metrik pasport (template)
5) Psevdo-SQL: retention 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... n gün fəaliyyət)
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) Kogort LTV və monetizasiya
Kümülatif LTV (Dn): Dn kohortdan istifadəçi başına gəlir məbləği.
ARPU/ARPPU: Dn ödəyicisinə/istifadəçiyə gəlir.
Ödəyənlərin%: Dn-ə ≥ 1 ödənişlə 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) Survival/saxlamaq üçün hazard
Kaplan-Meier: Qeyri-modelləşdirilmiş sağ qalma əyrisi (S (t)) - «axmayan» paydır.
Hazard modelləri (Sox/Logit-day): əlamətlərin (kanal, ölkə, platforma, bonuslar, məzmun) axın riskinə təsiri.
Təcrübə: KM seqmentləri qurur, sonra fərqi hazard modeli ilə izah edirik.
8) Mövsümlük, TZ və təqvim
TZ: UTC-də hadisələri saxlayın, yerli TZ bazarında təhlil edin; konsistent olun.
Təqvim: bayramlar/maaş/matçlar/buraxılışlar - bayraqlar kimi; oxşar həftələrin kohortlarını müqayisə edin.
Sürüşmə pəncərəsi: həftəlik/aylıq kohortlar üçün - bayram və hesabat dövrlərinin sayı.
9) Seqmentasiya və atributlar
Seqmentlər: cəlb kanalı, platforma/OS, geo, ilk məzmun, qiymət/limitlər, ödəniş metodu.
Kohortanın atributu: istifadəçini «kim gətirdi» - alqoritmi düzəldin (last non-direct, data-driven).
LTV çəkisi: yalnız CR deyil, həm də kanallar/seqmentlər üzrə LTV (D30/D90) müqayisə edin.
10) Vizuallaşdırma
Cohort matris istilik kartı (CR/LTV).
Trend xətləri təqvimlə D1/D7/D30.
Survival/Hazard qrafika.
Bridge «D30 üçün LTV dəyişdi»: ödəyicilərin töhfəsi, tezlik, orta çek.
11) Təcrübələr və səbəblər
A/B: onbording, tutorials, paywall, offers. Əsas metrika - D7/D30 retention və LTV (D30).
Kvaziexperiments: DiD/bazarlarda geri alınması üçün sintetik nəzarət.
Uplift modelləri: yenidən aktivləşmədə (Qini/AUUC, uplift @k) geri dönüş artımını hədəfləyin.
12) Əməliyyat və hovernans
Versiyası: 'RET _ D7 _ vN', 'LTV _ D30 _ vN'; changelog aktivlik/valyuta tərifi dəyişdikdə.
SLO təravəti: gündəlik kohortlar - 06:00 lok.; data gecikməsi ≤ 1 saat
Keyfiyyət: hadisələrin coverage, dublikatların payı, cohort xaricində bot/frod payı.
Giriş: RLS/CLS, PII maskalanması; ixrac - yalnız aqreqatlar.
Runbooks: D1 (bağlama), D7 (məzmun), hadisələrin/şəxsiyyətlərin qırılması.
13) Tez-tez səhvlər (anti-nümunələr)
Oxların qarışması: Müxtəlif mövsümlərdə müxtəlif yaşları düzəldilmədən müqayisə edin.
Rolling vs Exact: eyni kimi şərh.
Vahidlərin qarışması: məxrəcə sessiyalar, cilddə istifadəçilər.
«Orta» aqreqasiyası: alətləri/məxrəcləri toplamaq əvəzinə.
Ignor TZ/təqvim: gün/bayram sərhədləri D1 yerdəyişmə.
Heç bir filter bot/frod/QA.
Nəzərə alınmayan restartlar: şəxsiyyət körpüləri olmadan hesablar split/merge.
14) Kohorta hesabatını dərc etməzdən əvvəl yoxlama siyahısı
- Müəyyən doğum hadisəsi, vahid, TZ, fəaliyyət pəncərələri
- Xaric botlar/frod/QA; kimliyi (golden record)
- CR (Exact/Rolling) və LTV matrisləri D7/D30/D90
- Təqvim/bayramlar nəzərə alınır; kanal/platforma/geo seqmentləri
- survival/hazard-graphics və bridge LTV əlavə edilib
- Metrik versiyaları və özəlləşdirmə alqoritmi sənədləşdirilmişdir
- SLO təravəti, coverage/dublikat/səhv monitorinqi konfiqurasiya
- D1/D7 düşməsi və hadisələrin qırılması üçün runbooks hazır
Yekun
Kogort analizi iki ox və nizam-intizamdır: sabit «doğum anı», düzgün pəncərələr və TZ, saxlama matrisləri və LTV, seqmentasiya və dəyişikliklərin səbəb yoxlaması. Bu yanaşma yalnız əyriləri müşahidə etməyə deyil, həm də qərarlar qəbul etməyə kömək edir: bağlama harada düzəldilir, hansı kanallar ölçülür, hansı məzmun və offerlər oyunçuları daha uzun saxlayır və LTV artırır.