Когортная таблица удержания
Создавайте матрицу когортного удержания, показывающую долю пользователей недели 0, которые остаются активными в последующие недели, с помощью pivot_table.
«Когортная таблица удержания» — бесплатный урок Pandas & NumPy Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Pandas & NumPy Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Pandas & NumPy Academy содержит 4 уроков всего.
Что такое когортная таблица удержания
Когортная таблица удержания объединяет пользователей по неделе или месяцу, когда они впервые воспользовались продуктом, а затем отслеживает, какой процент каждой когорты остаётся активным в последующие недели. В строке 0 всегда отображается 100 %, поскольку неделя 0 определяется как неделя регистрации. Значения в последующих столбцах показывают, насколько быстро продукт теряет пользователей: чем медленнее снижение, тем выше удержание.
import pandas as pd
df = pd.read_csv('user_events.csv', parse_dates=['event_date'])
print(df.dtypes)
print(df.head())Назначение каждому пользователю недели когорты
Неделя когорты — это неделя первого события каждого пользователя. Используйте groupby('user_id')['event_date'].min(), чтобы найти дату первого события для каждого пользователя, а затем преобразуйте её в неделю ISO с помощью .dt.to_period('W'). Объедините эту метку когорты с основным DataFrame событий, чтобы каждая строка содержала информацию о неделе когорты пользователя.
cohort_week = df.groupby('user_id')['event_date'].min().dt.to_period('W').rename('cohort_week')
df = df.join(cohort_week, on='user_id')
df['event_week'] = df['event_date'].dt.to_period('W')
print(df[['user_id', 'event_date', 'cohort_week', 'event_week']].head())Вычисление номера недели с момента формирования когорты
Номер недели, также называемый номером периода или возрастом, — это разница между неделей события и неделей когорты. Вычитание периодов Pandas возвращает целочисленное смещение. Неделя 0 означает, что пользователь был активен в неделю регистрации; неделя 4 — что он вернулся через четыре недели. Этот столбец смещения становится осью столбцов матрицы удержания.
df['week_number'] = (df['event_week'] - df['cohort_week']).apply(lambda x: x.n)
print(df[['user_id', 'cohort_week', 'event_week', 'week_number']].head(10))Подсчёт активных пользователей для каждой пары «когорта — неделя»
Сгруппируйте данные одновременно по cohort_week и week_number и подсчитайте уникальных пользователей, чтобы получить исходную матрицу показателей удержания. Каждая ячейка показывает, сколько пользователей из когорты C были активны на неделе N. Диагональ из верхнего левого угла в нижний правый — неделя 0 для каждой когорты — содержит размеры когорт, которые используются как знаменатели при вычислении процентов.
retention_counts = (
df.groupby(['cohort_week', 'week_number'])['user_id']
.nunique()
.reset_index(name='active_users')
)
print(retention_counts.head(10))Преобразование данных в матрицу удержания
Используйте pivot_table(), чтобы преобразовать показатели удержания из длинного формата в широкую матрицу: строки — это недели формирования когорт, а столбцы — номера недель. Параметр aggfunc='sum' обрабатывает дублирующиеся ключи группировки. Заполните нулями ячейки, соответствующие неделям, когда пользователи этой когорты не были активны. Эта матрица является основой анализа удержания.
retention_matrix = retention_counts.pivot_table(
index='cohort_week',
columns='week_number',
values='active_users',
aggfunc='sum'
).fillna(0)
print(retention_matrix.iloc[:5, :8])Расчёт процентов удержания
Разделите каждую строку на её значение для недели 0, чтобы преобразовать количество в проценты. Столбец недели 0 содержит размер когорты и хранится в retention_matrix[0]. Используйте divide(cohort_sizes, axis=0), а затем умножьте результат на 100. Для удобства чтения округлите значения до одного знака после запятой. В результате получится стандартная тепловая карта удержания, используемая в отчётах по продуктовой аналитике.
cohort_sizes = retention_matrix[0]
retention_pct = retention_matrix.divide(cohort_sizes, axis=0) * 100
retention_pct = retention_pct.round(1)
print(retention_pct.iloc[:5, :8])Интерпретация кривой удержания
Читайте таблицу удержания по диагонали: со временем показатели каждой строки снижаются. У продукта с высоким удержанием значения могут выглядеть так: 100, 60, 50, 45, 42 — быстрое первоначальное падение сменяется стабильным плато. У продукта с низким удержанием значения будут примерно такими: 100, 30, 15, 8, 4 — постоянное снижение без плато. Уровень плато (если оно есть) называют долгосрочным уровнем удержания; это важнейший KPI удержания.
# Average retention rate per week number across all cohorts
avg_retention = retention_pct.mean(axis=0)
print('Average retention by week:')
print(avg_retention.round(1))Определение лучших и худших когорт
Сравнивайте результаты когорт по удержанию на 4-й или 8-й неделе. Когорта с самым высоким удержанием на 4-й неделе, вероятно, получила преимущества от улучшения продукта или эффективного канала привлечения; худшая когорта могла быть привлечена через канал низкого качества. Используйте .loc[:, 4].sort_values(ascending=False), чтобы упорядочить когорты по удержанию на 4-й неделе.
if 4 in retention_pct.columns:
week4 = retention_pct[4].sort_values(ascending=False)
print('Cohorts ranked by week-4 retention:')
print(week4)Визуализация удержания с помощью тепловой карты
Тепловая карта с цветовой кодировкой — стандартный способ визуализации таблиц удержания. Используйте sns.heatmap() с параметром annot=True, чтобы показать процентное значение внутри каждой ячейки, и расходящуюся цветовую шкалу (низкое удержание — красный цвет, высокое — зелёный). Задайте vmin=0 и vmax=100, чтобы цвета можно было сопоставлять на разных шкалах удержания.
import seaborn as sns
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(14, 6))
sns.heatmap(retention_pct.iloc[:, :13],
annot=True, fmt='.0f',
cmap='RdYlGn', vmin=0, vmax=100,
ax=ax, linewidths=0.5)
ax.set_title('Weekly Cohort Retention (%)')
ax.set_xlabel('Week Number')
ax.set_ylabel('Cohort Week')
plt.tight_layout()
plt.show()Построение кривой удержания
Линейный график среднего удержания по неделям яснее тепловой карты показывает общую кривую снижения показателя при представлении результатов нетехническим заинтересованным сторонам. Постройте кривую среднего удержания с затенённой областью в пределах плюс-минус одного стандартного отклонения, чтобы показать степень различий между когортами. Плато — участок, где линия выравнивается, — это естественный нижний предел удержания продукта.
avg_ret = retention_pct.mean(axis=0)
std_ret = retention_pct.std(axis=0)
fig, ax = plt.subplots(figsize=(10, 5))
ax.plot(avg_ret.index, avg_ret.values, color='steelblue', linewidth=2, marker='o')
ax.fill_between(avg_ret.index, avg_ret - std_ret, avg_ret + std_ret, alpha=0.2)
ax.set_xlabel('Week Number')
ax.set_ylabel('Retention %')
ax.set_title('Average Cohort Retention Curve')
plt.tight_layout()
plt.show()Экспорт таблицы удержания
Экспортируйте таблицу удержания в Excel, чтобы менеджеры продукта могли использовать её на еженедельных встречах. Примените to_excel() и вручную задайте условное форматирование в Excel либо используйте Styler.background_gradient() в Pandas, чтобы добавить цвета непосредственно в экспортированный файл. Таблица удержания — один из наиболее востребованных результатов продуктовой аналитики.
styled = retention_pct.style.background_gradient(cmap='RdYlGn', vmin=0, vmax=100)
styled.to_excel('retention_table.xlsx', engine='openpyxl')
print('Retention table saved to retention_table.xlsx')Быстрая проверка
Проверьте, насколько хорошо Вы усвоили понятия анализа данных из этого урока.
Итоги урока
В этом уроке Вы научились: относить пользователей к неделям когорт и вычислять смещения по неделям, преобразовывать данные в матрицу удержания и переводить количество в проценты, а также визуализировать удержание когорт с помощью тепловой карты и кривой среднего удержания. Далее мы рассмотрим визуализацию пользовательских путей с помощью воронкообразных столбчатых диаграмм и тепловых карт.
Изучай Python с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 30
- Уроки
- 120
Часто задаваемые вопросы
Урок «Когортная таблица удержания» бесплатный?
Да — полный текст урока «Когортная таблица удержания» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Pandas & NumPy Academy, подпишись на CoddyKit PRO. Курс Pandas & NumPy Academy содержит 4 уроков всего.
Чему я научусь в уроке «Когортная таблица удержания»?
Создавайте матрицу когортного удержания, показывающую долю пользователей недели 0, которые остаются активными в последующие недели, с помощью pivot_table. Ты практикуешь Pandas & NumPy Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Pandas & NumPy Academy?
Предыдущий опыт не требуется. Pandas & NumPy Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Когортная таблица удержания»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Pandas & NumPy Academy?
Да. Каждый урок Pandas & NumPy Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Формирование сессий и последовательность событий
- Анализ воронки
- Когортная таблица удержания
- Визуализация пользовательских путей