Product Analytics Dashboard (Streamlit)
Ситуация
Аналитическое портфолио должно показывать весь AARRR-цикл на одном согласованном датасете, а не одну метрику изолированно. Этот дашборд — self-contained приложение: данные генерируются детерминированно, метрики воспроизводимы между запусками, а тот же UI позже стал слоем презентации для full-stack Supabase-проекта.
Задача
От меня требовалось собрать метрики так, чтобы они читались как один связный сюжет, а не как набор отдельных графиков.
Действия
Данные: синтетический SaaS-датасет, 8 000 пользователей, Jan 2024 – Jun 2025. Генерируется in-memory с детерминированным seed = 42 и кэшируется через @st.cache_data — датасет идентичен между запусками и разделяем между страницами в сессии.
Страницы
| Page | Что показывает |
|---|---|
| Overview | KPI (users, paid, MRR, active 30d, stickiness), DAU trend, monthly signups, conversion by channel |
| Funnel | app_open → signup → activate → start_trial → subscribe с пошаговым drop-off |
| Retention | Cohort retention heatmap (месяц signup × месяцев с момента signup) |
| Revenue | MRR growth, MRR by plan, ARPU, logo churn |
| Segments | Распределения + конверсия + ARPU по сегменту / каналу / стране / устройству |
Запуск
uv sync
uv run streamlit run app.py
Результат
Все AARRR-вопросы читаются на одной согласованной базе. Детерминированный seed означает, что Funnel, Retention, Revenue и Segments говорят об одних и тех же пользователях, а числа можно проверить. Позже этот же UI стал слоем презентации для full-stack Supabase-проекта — сменился только слой данных.
Ограничения
Данные синтетические и сгенерированы in-memory: числа воспроизводимы, но не описывают реальный продукт. Ценность дашборда — в полноте цикла и согласованности метрик между страницами, а не в конкретных значениях.