Что такое 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 churn

2. 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 для обычных метрик.