ניתוח קוהורטה
ניתוח קוהורט
קבוצות אנליזה קוהורטה אובייקטים (בדרך כלל משתמשים) על ידי אירוע התחלה יחיד ומשווה כיצד ולכמה זמן הם נשארים פעילים ובעלי ערך. גישה זו מפרידה בין השפעת הזמן במערכת (עונות, מניות) לבין השפעת עידן הקוהורטה (ימים מההתחלה).
1) הגדרות בסיסיות
קוהורט: שחקנים רבים מאוחדים על ידי האירוע ”לידה” - רישום, הפקדה ראשונה, משחק ראשון, רכישה ראשונה.
ציר זמן לוח שנה: תאריכים אמיתיים (2025-10-01,...).
ציר גיל קוהורט: ימים/שבועות מאז הלידה (D0, D1,...).
Metrics: D1/D7/D30 (מדויק ומתגלגל), WAU/MAU, Stickiness (DAU/MAU).
Monetization: ARPU/ARPU, LTV מצטבר (על D7/D30/D90).
יחידת חשבונאות: משתמש (user/master_id) - שיא בדרכון.
2) סוגי קוהורטות ומתי לבחור אותן
קוהורטות רכישה: לפי תאריך הרישום/ביקור ראשון - הערכת גיוס וערוצי עלייה למטוס.
הפעלה/Monetization-cohorts: על ידי הפקדה/רכישה ראשונה - הערכה מוקדמת של כסף ופרומו.
קוהורטות תכונה: לשימוש הראשון בקטגוריית תכונה/משחק - האפקט של שחרור.
קוהורטות התנהגות: על ידי תבנית RFM/התחלה (לדוגמה, ”ניידת לילה”).
3) גרזנים ורשתות: כיצד לצפות במטריצה
מטריצת קוהורטה: שורות - קוהורטות (לוח שנה), עמודות - גיל (D0... D90).
עונתיות: השווה בין אלכסונים (אותו יום בלוח השנה) לבין השפעות עונתיות נפרדות.
נורמליזציה: מדדים יחסיים (CR, שברים) + מצטברים (LTV), מראים את שניהם.
4) דרכון קוהורט ומדדים (תבנית)
5) פסאודו-SQL: שימור מטריצות (Den מדויק)
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;
רולינג DN (פעילות ביום 1... 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) Cohort LTV ו ־ Monetization
LTV מצטבר (DN): סכום הכנסה לכל משתמש קוהורטה על ידי Dn.
ARPU/ARPU: הכנסות לכל משתמש/לכל משלם DN.
% משלם: לשתף עם 1 תשלום Dn.
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) הישרדות/סיכון לשמירה
קפלן-מאייר: עקומת הישרדות לא-מודל (S (t - פרופורציה לא ”מרוקנת”.
מודלים מסוכנים: השפעה של מאפיינים (ערוץ, מדינה, פלטפורמה, בונוסים, תוכן) על סיכון מופרז.
תרגול: אנחנו בונים KM על ידי מקטעים, ואז מסבירים את ההבדל עם מודל הסכנה.
8) עונתיות, ט "ז ולוח שנה
TZ: לאחסן אירועים ב-UTC, לנתח ב-TZ המקומי של השוק; להיות עקבי.
לוח שנה: חגים/משכורת/התאמות/שחרורים - כמו דגלים; השוואת קוהורטות של שבועות דומים.
חלון הזזה: לקוהורטות שבועיות/חודשיות - ריבוי חגים ותקופות דיווח.
9) סגמנט וייחוס
מקטעים: ערוץ משיכה, פלטפורמה/מערכת הפעלה, גיאו, תוכן ראשון, מחיר/מגבלות, שיטת תשלום.
ייחוס קוהורט: ”מי הביא” את המשתמש - לתקן את האלגוריתם (האחרון שאינו ישיר, מונע נתונים).
משקל LTV: השווה לא רק CR, אלא גם LTV (D30/D90) על ידי ערוץ/קטע.
10) הדמיה
מפת חום של מטריצת קוהורטה (CR/LTV).
קווי מגמה D1/D7/D30 לפי לוח שנה.
תרשימי הישרדות/סיכון.
גשר ”מה שינה את LTV ל D30”: תרומת שכר, תדירות, צ 'ק ממוצע.
11) ניסויים וסיבתיות
א/ב: עלייה למטוס, הדרכות, קיר תשלום, הצעות. המטרי העיקרי הוא שימור D7/D30 ו-LTV (D30).
ניסויים קוואזי: DID/שליטה סינתטית לגלגול החוצה לשווקים.
מודלים מרוממים: למקד את הרווח החוזר בהפעלה מחדש (Qini/AUUC, uplift @ k).
12) מבצע וממשל
Versioning: ”RET _ D7 _ vN”, ”LTV _ D30 _ vN”; Changelog בעת שינוי פעילות/הגדרת מטבע.
רעננות: מוכנות יומית עד 06:00 לנעול; רישום נתונים 1 שעה.
איכות: סיקור אירועים, פרופורציה של שכפולים, פרופורציה של רובוטים/הונאה מחוץ לחבורה.
גישה: RLS/CLS, מסווה PII; יצוא - אגרגטים בלבד.
חוברות ריצה: D1 Drop (עלייה למטוס), D7 (תוכן), Event/identity droping.
13) שגיאות תכופות (אנטי דפוסים)
ערבוב ציר: השווה גילאים שונים של קוהורטות בעונות שונות ללא התאמה.
רולינג נגד מדויק: מתייחס לאותו הדבר.
ערבוב יחידות: הפעלות במכנה, משתמשים במונה.
צבירה של ”פירושו”: במקום לשמר מונה/מכנים.
התעלמות מט "ז/לוח שנה: קיזוז D1 בגבולות יום/חג.
אין בוט/הונאה/מסנן QA.
הפעלות לא מוסברות: פיצול/מיזוג חשבונות ללא גשרי זהות.
14) רשימה לפני פרסום דו "ח קוהורטה
[ אירוע לידה ], יחידה, ט "ז, חלונות פעילות מוגדרים
[ ] כלל רובוטים/הונאה/QA; זהויות מעורבות (שיא זהב)
[ ] בנוי CR (מדויק/מתגלגל) ומטריצות LTV עבור D7/D30/D90
[ ] לוח שנה/חגים נלקחו בחשבון; מקטעים על ידי ערוץ/פלטפורמה/גיאו
[ ] תוספת הישרדות/גרפיקה מסוכנת וגשר LTV
[ ] תיעדו גרסאות מטריות ואלגוריתם ייחוס
[ ] הגדרות SLOs טריים, כיסוי/שכפול/ניטור שגיאות
[ ] ספרי ריצות מוכנים לטיפות D1/D7 והפסקות אירועים
סך הכל
ניתוח קוהורט הוא שני צירים ודיסציפלינה: ”רגע לידה” קבוע, חלונות נכונים ו-TZ, שימור ומטריצות LTV, קטגמנטציה ואימות סיבתי של שינוי. גישה זו מסייעת לא רק להתבונן בעקומות, אלא גם לקבל החלטות: היכן לתקן את הערוצים, אילו ערוצים לגודל, אילו תוכן ומציעים משאירים את השחקנים ארוכים יותר ומגבירים את LTV.