Что такое survival analysis
Коротко
Survival analysis (анализ выживаемости) — методы для изучения «времени до события».
Изначально использовался в медицине — время до смерти. В бизнесе:
- Время до churn.
- Время до первой покупки.
- Время до возврата клиента.
- Время до отказа оборудования.
Чем отличается от обычной регрессии
Особенность: данные цензурированы.
Пример: вы наблюдаете 1000 пользователей 3 месяца. К концу:
- 300 ушли (событие).
- 700 ещё активны (не произошло пока).
Обычная регрессия: «700 остались навсегда» — неверно.
Survival analysis: «700 ушли бы позже, мы просто не знаем когда».
Основные концепции
Censoring (цензурирование)
Right censoring — самый частый случай. Пользователь «жив» на конец наблюдения.
- User 1: churned on day 30 (observed).
- User 2: still active on day 90 (censored).
Survival function S(t)
Вероятность «выживания» (не наступления события) до времени t.
- S(0) = 1 (начало).
- S(∞) = 0 (все ушли).
Hazard function h(t)
Мгновенная вероятность события в момент t при условии, что до t не произошло.
Median survival time
Время, когда 50% subjects уже испытали событие.
Kaplan-Meier estimator
Стандартный способ оценить survival function.
from lifelines import KaplanMeierFitter
import pandas as pd
df = pd.DataFrame({
'duration': [10, 25, 5, 90, 45, 70], # время до события / цензурирования
'event': [1, 1, 1, 0, 1, 0] # 1=событие, 0=цензура
})
kmf = KaplanMeierFitter()
kmf.fit(df['duration'], df['event'])
kmf.plot_survival_function()Результат — кривая, показывающая retention по времени.
Сравнение групп (log-rank test)
Отличается ли survival между контролем и тестом?
from lifelines.statistics import logrank_test
results = logrank_test(
df_control['duration'], df_test['duration'],
df_control['event'], df_test['event']
)
print(results.p_value)Типичный A/B для retention over time.
Больше таких примеров с разборами — в Telegram-тренажёре. Короткие сессии, прогресс по темам, объяснения после каждого ответа.
Cox proportional hazards model
Регрессия для survival — аналог линейной регрессии, но с censoring:
from lifelines import CoxPHFitter
cph = CoxPHFitter()
cph.fit(df, duration_col='days', event_col='churned', formula='age + plan + region')
cph.print_summary()Коэффициенты — hazard ratios:
- HR = 1.5 → feature увеличивает риск события в 1.5x.
- HR = 0.8 → снижает на 20%.
Применения в аналитике
1. Churn analysis
«Какие пользователи уйдут быстрее всего?»
from lifelines import CoxPHFitter
cph = CoxPHFitter()
cph.fit(df, duration_col='tenure_days', event_col='churned',
formula='plan + usage_level + support_tickets')
# Наибольший hazard ratio → main drivers of churn2. Time to first purchase
«Через сколько дней после регистрации пользователи покупают?»
Kaplan-Meier + сегментация по каналу.
3. LTV calculation
Вместо простой формулы — через survival:
LTV = integral(S(t) * revenue(t) dt)Более точно для подписочных бизнесов.
4. Recurring purchases
«Через сколько дней клиент вернётся за повторной покупкой?»
Пример
from lifelines import KaplanMeierFitter
# Загрузили данные: users с days_active и is_churned
kmf = KaplanMeierFitter()
kmf.fit(df['days_active'], df['is_churned'])
# Сравнение premium vs free
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(10, 6))
for plan in ['free', 'premium']:
mask = df['plan'] == plan
kmf.fit(df.loc[mask, 'days_active'], df.loc[mask, 'is_churned'], label=plan)
kmf.plot_survival_function(ax=ax)
plt.title('Survival curve by plan')
plt.xlabel('Days')
plt.ylabel('Survival probability')Увидите, что premium удерживается лучше.
Когда нужно
Используйте
- Подписочные бизнесы.
- Когда важно, когда событие произойдёт.
- Cohort analysis в продвинутой форме.
- Churn prediction.
НЕ используйте
- Разовые события (купил/не купил).
- Бинарная классификация.
- Когда все события уже произошли (нет censoring).
Нужно ли аналитику
На junior — нет
Overkill для большинства задач.
На middle — базово
Знать концепции, читать чужой анализ.
На senior / в retention-team
Да. Регулярно используется.
Если готовишься к собесу — бот @kariernik_bot закрывает 80% технических вопросов. SQL, Python, A/B, продуктовые метрики — всё в одном месте.
Инструменты
- lifelines (Python) — главный пакет.
- survival (R) — для R-пользователей.
- statsmodels.duration — альтернатива в Python.
Типичные ошибки
1. Игнорировать censoring
Считать «отток» просто как % ушедших — недооценка.
2. Не учитывать возраст когорт
Новые когорты меньше наблюдались → survival curve смещён.
3. Violations of assumptions
Cox model требует «proportional hazards» — не всегда выполняется.
На собеседовании
Вопросы:
- «Что такое censoring?»
- «Когда использовать survival analysis?»
- «Отличие от logistic regression?»
- «Что такое Kaplan-Meier?»
Не ждут глубины, но концепции должны знать senior-кандидаты.
Читайте также
FAQ
Survival обязательно?
Для subscription / retention-heavy компаний — да. Для e-commerce — редко.
Kaplan-Meier vs Cox?
KM — non-parametric (только curves). Cox — параметрическая (с фичами). Начинайте с KM.
Сложно ли?
Концепты сложнее, чем обычная регрессия. Но lifelines делает применение простым.
Log-rank test или t-test?
Log-rank для survival curves (учитывает censoring). T-test для обычных метрик.