Data Analyst Telegram Bot preview
Ситуация
У PM и аналитика нет BI-доступа: проверка A/B-гипотезы ждёт дашборда, а CSV из выгрузки остаётся без статистики
Задача
Проверить гипотезу прямо в Telegram — из CSV получить корректный результат с гардрейлами, без BI и без ноутбука
Действия
Бот на aiogram, pandas, scipy и statsmodels: 12 команд, Welch t-test или χ², SRM- и power-гардрейлы, аналитика как чистые модули, pytest + ruff + mypy в CI
Результат
Из CSV — p-value, лифт и 95% CI менее чем за 30 секунд, плюс заметка по мощности и график; /export отдаёт standalone HTML
Стек
PythonaiogrampandasSciPy / statsmodelsmatplotlibSQLitepytest / ruff / mypyDocker / Fly.io
Содержание
  1. Ситуация
  2. Задача
  3. Действия
  4. Стек
  5. Команды
  6. Входные данные
  7. Инженерка
  8. Результат
  9. Ограничения
  10. Документация
  11. Частые вопросы

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.

Нужен такой же разбор на ваших данных?

Расскажите задачу — вернусь с планом: какие данные нужны, что проверяем и за какой срок. Отвечаю в течение дня.

Обсудить задачу →