Beeline Campaign
Агент и сайт для планирования тарифных кампаний Beeline.
О проекте
Команда: Exodus
Кейс HackAlem.ai: Телеком — Beeline
Стадия: Рабочий MVP
Задача кейса: Агент, который решает, каким абонентам какой тариф предложить (чистый прирост ARPU)
Суть
Агент и сайт для планирования тарифных кампаний Beeline. Агент выбирает сегменты абонентов, целевой тариф и канал, проводит пилоты и формирует до 10 кампаний с максимальным чистым приростом ARPU за вычетом стоимости контактов.
Как устроено
Аудитория делится на ячейки «текущий тариф × ARPU-сегмент». По истории change_tariff.csv оцениваются переходы: среднее изменение ARPU, частота, число наблюдений. До 16 лучших ячеек отправляются на пилоты через SMS или Push на ≤15% бюджета. Результат пилота обновляет оценку перехода: исторический приор весит 60 условных наблюдений, пилот — по размеру выборки, с поправкой на множитель канала. Затем ячейки объединяются в кампании до 5 000 абонентов и жадно отбираются до 10 кампаний с учётом лимитов бюджета (100 000) и контактов (15 000).
Ключевые решения
- segmentation tariff×ARPU
- historical transition uplift estimation
- pilot allocation
- weighted prior-posterior update
- channel cost/multiplier modelling
- greedy campaign selection under budget constraints
Особенности
Приор, взвешенный как 60 наблюдений, байесоподобно обновляется результатами пилотов с нормировкой на множитель канала, что снижает влияние малых пилотов. Отдельно учтено повторное засчитывание абонентов, уже охваченных пилотом.
Стек
Python · pandas · NumPy · http.server · HTML · CSS · JavaScript
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-453de0e3-exodus.
README
README.mdHackathon team repository for Exodus
Beeline Campaign
О ПРОДУКТЕ
Сайт и агент предназначены для кейса HackAlem «Beeline Tariff Marketing Campaigns». Продукт помогает планировать тарифные маркетинговые кампании: выбирает сегмент абонентов, целевой тариф и канал коммуникации, проверяет гипотезы пилотами и показывает план с расходами и охватом.
Все данные, тарифы, суммы и эффекты кейса синтетические и приведены только для учебной задачи. Исторические данные описывают другую выборку, поэтому их нельзя считать результатами целевых абонентов или соединять с целевой аудиторией по ID.
КАК РАБОТАЕТ РЕШЕНИЕ
Агент группирует целевую аудиторию по текущему тарифу и ARPU-сегменту. По истории из data/change_tariff.csv он оценивает переходы на другие тарифы: учитывает среднее изменение ARPU, частоту перехода и число наблюдений. История служит предварительной оценкой для выбора гипотез, а не истинным эффектом на целевой аудитории. Если файл истории недоступен, агент возвращает пустой план. Агент ранжирует гипотезы по ожидаемому чистому результату и выбирает до 16 разных ячеек «текущий тариф × ARPU-сегмент» для пилотов. Пилот проводится через SMS, если для перехода ожидается положительный результат в этом канале; иначе используется Push. Для ячейки от 500 абонентов запрашивается выборка 160 человек, для меньшей — 100. Фактический размер ограничивается доступной аудиторией, контактами, бюджетом и лимитом пилотов. На пилоты агент выделяет не более 15% доступного на момент запуска бюджета. После пилота он делит наблюдаемый эффект на множитель проверенного канала и обновляет оценку того же перехода для доступных каналов. Историческая оценка имеет вес 60 условных наблюдений; результат пилота учитывается с весом, равным фактическому размеру его выборки. Это снижает влияние малого пилота, но агент не вычисляет отдельный доверительный интервал. Агент оценивает ожидаемый результат каждого подходящего перехода с учётом стоимости канала. При составлении плана он приблизительно учитывает абонентов, уже охваченных пилотом, чтобы не засчитывать их эффект повторно. В финальный отбор попадают варианты с положительным ожидаемым приростом за вычетом стоимости контактов; среди них могут быть переходы, которые не прошли отдельный пилот. Совместимые ячейки с одинаковыми ARPU-сегментом, целевым тарифом и каналом объединяются в кампании до 5 000 абонентов. Агент выбирает до 10 кампаний по ожидаемому чистому результату с учётом оставшихся бюджета и контактов. Одна ячейка «текущий тариф × ARPU-сегмент» не используется в двух итоговых кампаниях. ОГРАНИЧЕНИЯ КЕЙСА
• Не более 10 итоговых кампаний. • Не более 5 000 абонентов в одной кампании. • Не более 15 000 контактов суммарно, включая пилоты. • Бюджет — 100 000 у.е. на все контакты, включая пилоты. • Не более 20 пилотов; каждый проводится на 10–200 абонентах. • Абонент учитывается один раз — по лучшей кампании.
Стоимость и множители каналов: • Push — бесплатно, ×0,50. • SMS — 4 у.е. за контакт, ×0,65. • Digital ads — 22 у.е. за контакт, ×0,85. • Звонок — 160 у.е. за контакт, ×1,20.
Чистый результат кейса — прирост ARPU по уникальным абонентам за вычетом стоимости коммуникаций.
ТЕХНОЛОГИИ
• Python — агент, демонстрационный API и локальный веб-сервер. • pandas — чтение и обработка таблиц CSV, сегментация аудитории. • NumPy — численные расчёты и симуляция пилотных наблюдений в демо-среде. • Стандартная библиотека Python (http.server, json, pathlib) — HTTP-сервер и API без отдельного веб-фреймворка. • HTML, CSS и JavaScript без дополнительных frontend-фреймворков — пользовательский интерфейс сайта. • Формат данных — CSV.
ТРЕБОВАНИЯ
• Python 3.10 или новее. • Пакеты numpy и pandas. • Современный браузер.
ЗАПУСК САЙТА С АГЕНТОМ
Откройте сайт в Гитхабе КАК ПРОВЕРИТЬ РЕШЕНИЕ
Локальная проверка файлов:
Из корневой папки проекта выполните проверку синтаксиса: python -m py_compile backend\agent.py backend\server.py Запустите сайт по инструкции выше. Убедитесь, что в браузере открывается панель, отображаются рекомендации и результаты пилотов. В отдельном окне PowerShell проверьте API: (Invoke-RestMethod http://127.0.0.1:8001/api/recommendations).summary Проверьте, что план не превышает лимиты бюджета, числа контактов, размера одной кампании и количества кампаний. Официальная проверка по ТЗ:
Распакуйте архив участника HackAlem в отдельную папку. В ней должны быть local_eval.py, make_submission.py, environment.py и папка data. Поместите проверяемый agent.py в корневую папку распакованного пакета, заменив шаблонный файл. Сохраните предусмотренную архивом структуру data, включая data/change_tariff.csv. Установите зависимости, необходимые пакету участника. Из корневой папки распакованного пакета выполните: python local_eval.py python local_eval.py --runs 10 python make_submission.py Проверьте вывод local_eval.py: агент должен завершить запуск без ошибок, провести пилоты, вернуть от 1 до 10 корректных кампаний и не превысить лимиты. Убедитесь, что make_submission.py создал submission.csv. Используйте файл, сформированный официальным скриптом. Локальный сайт использует демонстрационную среду с упрощённой симуляцией эффекта пилотов. Она нужна для показа сценария работы сайта и не заменяет официальный оценщик. Успешное открытие сайта или ответа API не означает, что официальный local_eval.py пройден. Официальные команды оценки нужно запускать в распакованном пакете участника; сам веб-сайт submission.csv не создаёт.
Для запуска сайта локально нужен установленный Python 3.10 или новее.
- Распакуйте архив сайта. В папке должны находиться index.html и папка backend с файлами server.py, agent.py и данными в data.
- Откройте эту папку в Проводнике, в адресной строке введите powershell и нажмите Enter.
- Установите библиотеки — для этого потребуется интернет: python -m pip install numpy pandas
- Запустите сервер: $env:HOST = "127.0.0.1" python backend/server.py
- Откройте в браузере http://127.0.0.1:8001/. Агент запускается автоматически при загрузке рекомендаций. Кнопка «Пересчитать рекомендации» повторяет расчёт. Оставляйте окно PowerShell открытым, пока пользуетесь сайтом. Для остановки нажмите Ctrl+C. При последующих запусках повторять установку библиотек не требуется. Если порт 8001 занят, запустите сайт на другом порту: $env:PORT = "8010" python backend/server.py Тогда адрес сайта будет http://127.0.0.1:8010/.
СТРУКТУРА ПРОЕКТА
beeline-campaign-copilot/ README.txt index.html backend/ agent.py server.py data/ customer_profile_optimized.csv dict_tariff.csv segment_baseline.csv change_tariff.csv
ФАЙЛЫ ДАННЫХ
• customer_profile_optimized.csv — подготовленные признаки целевой аудитории. • dict_tariff.csv — коды и параметры тарифов. • segment_baseline.csv — агрегированные данные по сегментам. • change_tariff.csv — история смен тарифов из отдельной выборки.
Пропуски в исходных данных не следует автоматически заменять нулями: отсутствие значения не всегда означает нулевое потребление. Не используйте ID_NUMBER как признак модели и не объединяйте целевую аудиторию с исторической выборкой так, будто это одни и те же абоненты.
Авторы коммитов
История коммитов
- 2026-09-23 17:49readmepareidoliacat
- 2026-09-23 17:49Enhance README with project details and instructionspareidoliacat
- 2026-09-23 17:38Delete website/backend/data/t.txtpareidoliacat
- 2026-09-23 17:38Delete website/t.txtpareidoliacat
- 2026-09-23 17:38Add files via uploadpareidoliacat
- 2026-09-23 17:38Create t.txtpareidoliacat
- 2026-09-23 17:37Delete website/backend/s.txtpareidoliacat
- 2026-09-23 17:37Add files via uploadpareidoliacat
Все коммиты (53)
- 2026-09-23 17:37Create s.txtpareidoliacat
- 2026-09-23 17:37Delete requirements.txtpareidoliacat
- 2026-09-23 17:36Delete .gitignorepareidoliacat
- 2026-09-23 17:36Delete index.htmlpareidoliacat
- 2026-09-23 17:36Delete website/backendpareidoliacat
- 2026-09-23 17:35Create backendpareidoliacat
- 2026-09-23 17:35Add files via uploadpareidoliacat
- 2026-09-23 17:35Add new file t.txt with initial contentpareidoliacat
- 2026-09-23 17:34Update README.mdpareidoliacat
- 2026-09-23 17:33Delete local_eval.cpython-312.pycAzamat Tagay
- 2026-09-23 17:33Delete environment.cpython-312.pycAzamat Tagay
- 2026-09-23 17:33Delete agent.cpython-312.pycAzamat Tagay
- 2026-09-23 17:33Delete make_submission.cpython-312.pycAzamat Tagay
- 2026-09-23 17:31Add files via uploadpareidoliacat
- 2026-09-23 17:26Delete data/tasd.txtAzamat Tagay
- 2026-09-23 17:26Add files via uploadAzamat Tagay
- 2026-09-23 17:26Create tasd.txtAzamat Tagay
- 2026-09-23 17:24Add files via uploadAzamat Tagay
- 2026-09-23 17:23Add files via uploadAldiyar
- 2026-09-23 17:21Delete PARTICIPANT_GUIDE.pdfAzamat Tagay
- 2026-09-23 17:21Delete PARTICIPANT_GUIDE.mdAzamat Tagay
- 2026-09-23 17:21Delete tariff_dictionary.csvAzamat Tagay
- 2026-09-23 17:21Delete submission.csvAzamat Tagay
- 2026-09-23 17:21Delete scoring_core.pyAzamat Tagay
- 2026-09-23 17:21Delete mock_environment.pyAzamat Tagay
- 2026-09-23 17:21Delete make_submission.pyAzamat Tagay
- 2026-09-23 17:20Delete local_eval.pyAzamat Tagay
- 2026-09-23 17:20Delete feature_dictionary.csvAzamat Tagay
- 2026-09-23 17:20Delete environment.pyAzamat Tagay
- 2026-09-23 17:20Delete customer_profile.csvAzamat Tagay
- 2026-09-23 17:20Delete agent_template.pyAzamat Tagay
- 2026-09-23 17:20Delete agent.pyAzamat Tagay
- 2026-09-23 17:14Add files via uploadAldiyar
- 2026-09-23 17:13Delete submission.csvAldiyar
- 2026-09-23 17:13agent.pyAldiyar
- 2026-09-23 17:10Add Beeline Campaign section to READMEpareidoliacat
- 2026-09-23 17:10Enhance README with campaign details and setup guidepareidoliacat
- 2026-09-23 16:10Update README.mdAzamat Tagay
- 2026-09-23 16:07Update README.mdAzamat Tagay
- 2026-09-23 16:04Update agent.pyAzamat Tagay
- 2026-09-23 15:29Update README.mdAzamat Tagay
- 2026-09-23 15:28agent(updated2).pyAzamat Tagay
- 2026-09-23 15:03Update README.mdAzamat Tagay
- 2026-09-23 14:59agent(updated).pyAzamat Tagay
- 2026-09-23 14:43Add files via uploadAzamat Tagay
Структура репозитория (20 файлов)
README.md agent.py data/arpu_monthly.csv data/change_tariff.csv data/dict_tariff.csv data/traffic.csv make_submission.py mock_environment.py scoring_core.py submission.csv tariff_dictionary.csv website/.gitignore website/backend/agent.py website/backend/data/change_tariff.csv website/backend/data/customer_profile_optimized.csv website/backend/data/dict_tariff.csv website/backend/data/segment_baseline.csv website/backend/server.py website/index.html website/requirements.txt
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.