Python Утримання Продуктова аналітика 2026-03-10

Когортний аналіз і утримання користувачів у Python 2026: повний гід

Утримання — найважливіша метрика для будь-якого підписного або повторного бізнесу. Ось як побудувати повний когортний аналіз із сирих транзакційних даних у Python — з кодом, який можна використати вже сьогодні.

Ісаченко Андрій
Ісаченко Андрій
Аналітик даних · Відкритий до роботи

📋 Зміст

  1. Що таке когортний аналіз і чому він важливий
  2. Розуміння матриці утримання
  3. Підготовка даних у pandas
  4. Побудова матриці утримання крок за кроком
  5. Візуалізація через теплову карту
  6. Розрахунок коефіцієнта відтоку
  7. Як інтерпретувати та презентувати результати

Що таке когортний аналіз і чому він важливий

Когорта — це група користувачів, що мають спільну характеристику у визначеному часовому вікні. Найчастіше це місяць першої покупки або реєстрації. Когортний аналіз відстежує, який відсоток кожної когорти повертається у наступні місяці.

Без когортного аналізу агрегатні метрики утримання тебе обманюють. Загальний графік «щомісячних активних користувачів» може показувати зростання, навіть коли продукт погіршується — бо залучення нових користувачів маскує зростаючий відтік із ранніх когорт. Когортний аналіз розкриває правду: чи залишаються активними користувачі, що прийшли 6 місяців тому? Чи покращується утримання між когортами з часом?

💡 Якщо утримання на 1-му місяці нижче 20% для споживчого застосунку — зростання рано чи пізно зупиниться незалежно від витрат на залучення. Когортний аналіз дозволяє виявити це завчасно.

Розуміння матриці утримання

Результат когортного аналізу — матриця утримання: таблиця, де рядки — когорти (місяць залучення), стовпці — часові періоди (місяці після залучення), а кожна клітинка показує відсоток вихідної когорти, що залишається активною в цей період. Діагональ матриці відповідає одному й тому ж календарному місяцю, спостережуваному з перспективи різних когорт.

КогортаРозмірМісяць 0Місяць 1Місяць 2Місяць 3Місяць 4Місяць 5
Січ 20251 240100%41%28%22%18%16%
Лют 2025980 100%46%31%25%20%
Бер 20251 560100%52%35%27%
Кві 20251 180100%58%38%
Тра 20251 420100%61%

Зверни увагу, як утримання на 1-му місяці зростає між когортами (41% → 61%). Це говорить про те, що зміни в продукті або онбордингу між січнем і травнем спрацювали — більше користувачів повертається після першого місяця. Саме цей інсайт сховано в сирих агрегатних метриках.

Підготовка даних у pandas

Відправна точка — таблиця транзакцій або подій з щонайменше двома колонками: user_id та event_date. Потрібно вивести для кожного користувача: місяць когорти (місяць першої покупки) та порядковий номер місяця кожної наступної покупки.

import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns # Завантаження транзакційних даних df = pd.read_csv('transactions.csv', parse_dates=['order_date']) # Нормалізація до першого дня місяця (місяць когорти) df['order_month'] = df['order_date'].dt.to_period('M') # Когорта кожного користувача = місяць ПЕРШОЇ покупки df['cohort_month'] = df.groupby('user_id')['order_month'].transform('min') # Індекс періоду: місяці після першої покупки (0, 1, 2, ...) df['period_number'] = ( df['order_month'] - df['cohort_month'] ).apply(lambda x: x.n) df.head(3)

Побудова матриці утримання крок за кроком

# Крок 1: Підрахунок унікальних активних користувачів на когорту × період cohort_data = ( df.groupby(['cohort_month', 'period_number'])['user_id'] .nunique() .reset_index() ) cohort_data.columns = ['cohort_month', 'period_number', 'n_users'] # Крок 2: Зведення у формат матриці cohort_matrix = cohort_data.pivot_table( index='cohort_month', columns='period_number', values='n_users' ) # Крок 3: Розміри когорт = колонка 0 (Місяць 0) cohort_sizes = cohort_matrix.iloc[:, 0] # Крок 4: Ділимо кожен рядок на розмір когорти → утримання у % retention_matrix = cohort_matrix.divide(cohort_sizes, axis=0) * 100 retention_matrix = retention_matrix.round(1) retention_matrix.columns = [f'Місяць {i}' for i in retention_matrix.columns] print(retention_matrix)

Візуалізація через теплову карту

Матриця утримання стає значно читабельнішою у вигляді кольорової теплової карти. Високі значення утримання відображаються темно-синім, низькі — світлим, що робить тенденції миттєво помітними для будь-якого стейкхолдера.

fig, ax = plt.subplots(figsize=(14, 7)) sns.heatmap( retention_matrix, annot=True, fmt='.1f', cmap='Blues', vmin=0, vmax=100, linewidths=0.5, linecolor='white', ax=ax, cbar_kws={'label': 'Утримання %'} ) ax.set_title('Щомісячне утримання когорт', fontsize=16, fontweight='bold', pad=15) ax.set_xlabel('Місяці після першої покупки', fontsize=12) ax.set_ylabel('Когорта (місяць першої покупки)', fontsize=12) ax.set_yticklabels(ax.get_yticklabels(), rotation=0) plt.tight_layout() plt.savefig('cohort_retention_heatmap.png', dpi=150, bbox_inches='tight') plt.show()

Розрахунок коефіцієнта відтоку

Відтік — це доповнення утримання: відсоток користувачів, що не повернулися. Щомісячний відтік когорти в період N — це просто 100 - retention_at_N. Але корисніша метрика — інкрементальний відтік: відсоток втрачених між двома послідовними періодами.

# Відтік між місяцями в межах кожної когорти churn_matrix = retention_matrix.copy() for col in range(1, len(retention_matrix.columns)): prev = retention_matrix.iloc[:, col - 1] curr = retention_matrix.iloc[:, col] churn_matrix.iloc[:, col] = ((prev - curr) / prev * 100).round(1) churn_matrix['Місяць 0'] = np.nan avg_retention = retention_matrix.mean(axis=0).round(1) print("\nСередня крива утримання:") print(avg_retention)

Як інтерпретувати та презентувати результати

Матриця утримання корисна лише тоді, коли ти вмієш перекласти цифри в бізнес-рішення. Ось фреймворк для інтерпретації:

ПаттернЩо це означаєДія
Утримання на 1-му місяці зростає між когортамиОнбординг або продуктові покращення спрацювалиПодвоїти зусилля в тому, що змінилося
1-й місяць стабільний, але 3-й падаєКористувачі починають, але втрачають звичкуПокращити повторне залучення та петлі звички
Одна когорта значно гірша за сусідніПоганий канал залучення або баг у продуктіДослідити конкретний період
Утримання стабілізується після 3-го місяця (~15%+)Є здорова база лояльних користувачівЗосередитися на розширенні цього сегменту
Утримання падає майже до 0 до 2-го місяцяПроблема з product-market fitПоговорити з тими, хто відтік, переосмислити цикл

Презентація стейкхолдерам

Коли презентуєш когортне утримання нетехнічній аудиторії, починай з бізнес-висновку, а не з методології. Замість «Утримання на 1-му місяці зросло з 41% до 61% між когортами січня–травня» скажи: «Більше половини нових клієнтів тепер повертаються за другою покупкою протягом 30 днів — це на 20 п.п. більше, ніж на початку року. Це безпосередньо скорочує термін окупності витрат на залучення клієнтів.»

🎯 Завдання аналітика — не побудувати теплову карту, а відповісти на питання: «Чи стає наш продукт кращим або гіршим у збереженні користувачів?» Когортний аналіз — найнадійніший спосіб відповісти на нього.

Готовий скрипт — скопіюй і запусти

def build_cohort_retention(df, user_col='user_id', date_col='order_date'): df = df.copy() df['order_month'] = df[date_col].dt.to_period('M') df['cohort_month'] = df.groupby(user_col)['order_month'].transform('min') df['period'] = (df['order_month'] - df['cohort_month']).apply(lambda x: x.n) matrix = df.groupby(['cohort_month','period'])[user_col].nunique().unstack() sizes = matrix.iloc[:, 0] retention = (matrix.divide(sizes, axis=0) * 100).round(1) retention.columns = [f'M{c}' for c in retention.columns] return retention, sizes # df = pd.read_csv('data.csv', parse_dates=['order_date']) # retention, sizes = build_cohort_retention(df) # sns.heatmap(retention, annot=True, fmt='.1f', cmap='Blues', vmin=0, vmax=100)
Теги: Python Утримання Когортний аналіз Pandas Продуктова аналітика Відтік