Streamlit-приложение: KPI-борд продуктовой аналитики

Статический снимок живого multipage-приложения streamlit-app: детерминированный синтетический датасет (seed 42, 8 000 пользователей, январь 2024 — июнь 2025). Панель KPI, которые приложение считает само; рост MRR с переключателем метрики; структура навигации по пяти страницам.

Что это за приложение: пять страниц под общей боковой панелью

app.py → st.navigation
Product Analytics 🏠 Overview 🪣 Funnel 🔁 Retention 💰 Revenue 🎯 Segments 8 000 пользователей · 2024-01 — 2025-06
pages/overview.py — страница, открытая по умолчанию
5 KPI: пользователи, платящие, MRR, активные за 30 дней, stickiness DAU-тренд (площадной график Plotly) новые регистрации по месяцам · конверсия в оплату по каналам страницы Funnel / Retention / Revenue / Segments читают тот же набор данных
Датасет генерируется один раз и кэшируется через @st.cache_data, поэтому все пять страниц внутри сессии видят одни и те же числа.

KPI-панель приложения, страница Overview при значениях по умолчанию

все каналы · весь период

Это ровно те пять показателей, которые считает pages/overview.py: len(users), subs.user_id.nunique(), сумма MRR активных подписок, active_users(events, end−30д, end) и их отношение. Нижние два (активные за 30 дней и stickiness) зависят от правой границы диапазона дат; при полном диапазоне это конец периода — 2025-06-30. Total users, Paid users и MRR от фильтра дат не зависят: приложение режет по датам только поток событий, а не таблицу подписок.

Рост MRR по месяцам — главный аналитический вид страницы Revenue

выбранная метрика ось Y пересчитывается под выбранную серию

Воронка AARRR — вид страницы Funnel

Уникальные пользователи на каждом шаге (funnel_counts), а не последовательная воронка. Шаги app_open и signup совпадают по построению датасета — оба пишутся на дату регистрации, поэтому 100 % на втором шаге это определение, а не конверсия. Настоящий отвал начинается с activate.

Что интерактивно в реальном приложении, а что — на этом борде

снимок, а не копия рантайма
В живом Streamlit-приложении
  • боковая панель: мультивыбор канала и диапазон дат; каждое изменение перезапускает страницу и пересчитывает все графики и KPI
  • пять страниц через st.navigation — переключение меняет весь экран
  • графики Plotly: зум, ховер-подсказки, скрытие серий по клику на легенде
  • @st.cache_data держит датасет между перезапусками в одной сессии
На этой странице
  • снимок: числа соответствуют значениям приложения по умолчанию, а не текущему состоянию сессии
  • переключатель метрики MRR действительно пересчитывает график и его KPI — но только они
  • фильтров канала и диапазона дат здесь нет; структура навигации нарисована, а не работает
  • ховеры Plotly заменены подписями на осях и точкой со значением на конце линии

Источник чисел — тот же датасет, что и в data.py: метрики получены перезапуском собственных функций репозитория. Репозиторий приватный, поэтому борд не ссылается на него и не воспроизводит ничего, кроме агрегатов.