Data Analyst Telegram Bot
▶ Схема: A/B-тест из CSV — самодостаточный HTML, открывается в браузере — без установки и сборки
Ситуация
У PM и аналитиков часто нет BI-доступа: проверка A/B-гипотезы ждёт дашборда, а CSV из выгрузки остаётся без статистики. Гипотеза сформулирована, данные выгружены — но p-value, лифт и проверка SRM всё ещё требуют ноутбука, окружения и человека, который помнит формулу.
Задача
От меня требовалось довести проверку гипотезы до Telegram: из CSV получить корректный результат с гардрейлами — без BI, без ноутбука и без ручной статистики.
Действия
Стек
aiogram 3 + pandas, scipy, statsmodels. UI следует локали Telegram (EN/RU), вывод аналитики — английский.
Команды
| Команда |
Что делает |
/start, /help |
Список команд |
/describe |
Shape, dtypes, доля пропусков, describe числовых, топ категориальных, диапазон дат |
/funnel |
Пошаговая и общая конверсия (предупреждает о немонотонных шагах) + график |
/abtest |
Welch t-test (числовая) или χ² (бинарная), p-value, лифт, 95% CI, SRM- и power-гардрейлы + график |
/cohort |
Недельный retention по неделе первой активности + heatmap |
/rfm |
RFM-сегментация (recency/frequency/monetary) по пользователю + график |
/trend |
Тренд ряда (день/неделя/месяц) + график |
/correlate |
Топ парных корреляций Пирсона + heatmap |
/history |
Последние 10 анализов |
/export |
Последний анализ как standalone HTML-отчёт с графиком |
/cancel |
Сброс ожидания файла |
Входные данные
| Команда |
Колонки |
/funnel |
step,users — шаги сверху вниз |
/abtest |
group,metric — метрика числовая или бинарная 0/1 |
/cohort |
user_id,date — строка на активность; date также принимается как dt, day, ts, timestamp, created, updated, дата |
/trend |
date,metric — строка на наблюдение |
/rfm |
user_id,date,amount — строка на транзакцию |
/correlate |
любой CSV с двумя и более числовыми колонками |
/describe |
любой CSV |
Примеры датасетов лежат в data/samples/.
Инженерка
Аналитика вынесена в src/analytics/ как чистые протестированные модули; CI гоняет pytest, ruff и mypy. Аплоады ограничены до парсинга — 10 MB / 100k строк (free tier: 5 MB, 10 анализов в день). История — SQLite, последние 10 анализов.
Результат
Из CSV — p-value, лифт и 95% CI менее чем за 30 секунд, плюс заметка по мощности и график. /export отдаёт последний анализ standalone HTML-отчётом, который можно приложить к обсуждению гипотезы.
Ограничения
Бот считает, но не проектирует эксперимент: независимость наблюдений, novelty и множественные сравнения остаются на аналитике. Данные приходят только в CSV — подключения к хранилищу нет. Free tier ограничен 5 MB и 10 анализами в день. Репозиторий приватный — публичного кода нет, карточка не ведёт на пустой репозиторий.
Документация
- Репозиторий приватный — доступ по запросу. Публичного кода нет; карточка не ведёт на пустой/stub-репозиторий.
Частые вопросы
Какие команды есть у бота?
12 команд: /start, /help, /describe, /funnel, /abtest, /cohort, /rfm, /trend, /correlate, /history, /export, /cancel.
Что нужно прислать для /abtest?
CSV с колонками group и metric; metric числовой или бинарный 0/1.
Что бот считает кроме p-value?
Welch t-test для числовой метрики или χ² для бинарной, затем лифт, 95% CI, SRM- и power-гардрейлы и график.
Где хранятся данные?
Только локально: история последних 10 анализов в SQLite. Токен читается из переменной окружения BOT_TOKEN, .env в gitignore.
Как задеплоить?
Long polling — нужен постоянно живой процесс: Fly.io worker из Dockerfile или локальный docker run. CI гоняет pytest + ruff + mypy.