← К портфолио Sales Calls Analytics Dashboard preview
Ситуация
ИИ-обзвон — 4-шаговая воронка на 16 891 синтетическом звонке; выгрузка не говорит, где бот теряет клиента
Задача
Снять разбор звонков с ручного просмотра и показать шаг воронки с наибольшей потерей
Действия
Разметка шага по маркерам шаблонного скрипта, утечка по типам, взвешенная потеря контактов, вовлечённость по часам
Результат
Ответ за минуту: где бот теряет клиента и что чинить; на выходе — взвешенная потеря контактов и первый A/B-сценарий
Стек
PythonStreamlitpandas
Исходники Смотреть на GitHub → Обновлено: Jun 16, 2026
Содержание
  1. Ситуация
  2. Задача
  3. Действия
  4. Что показывает дашборд
  5. Методология разметки
  6. Данные
  7. Запуск
  8. Результат
  9. Ограничения
  10. Документация

Sales Calls Analytics Dashboard

Ситуация

ИИ-обзвон — это воронка: приветствие → оффер → встреча → квалификация. Прод-выгрузка хранит звонки, но не говорит, на каком шаге бот теряет клиента. Задача — превратить сырую выгрузку в ответ за минуту: где обрыв, по каким причинам, когда звонить и что чинить — скрипт, тайминг или качество самого бота.

Задача

От меня требовалось снять разбор звонков с ручного просмотра: сравнить шаги воронки между собой и показать, на каком из них теряется больше всего клиентов.

Действия

Что показывает дашборд

Блок Что отвечает
KPI + воронка общая картина и где главный обрыв
Разбор шага 1 главная утечка по типам: молчание / сброс / отказ
Куда направить усилия переходы по взвешенной потере контактов
Реакции клиентов что чинить в скрипте по вовлечённому хвосту
Когда звонить вовлечённость по часам и дням недели
Качество бота готовые дефекты: баг отрасли, зацикливание, dead air
Разбор диалогов фильтр среза + транскрипты обрывов

Методология разметки

Скрипт бота шаблонный, поэтому шаг, до которого дошёл разговор, определяется детерминированно по маркерам в репликах бота:

  • 1 — приветствие + согласие;
  • 2 — оффер;
  • 3 — встреча;
  • 4 — квалификация.

Причина обрыва на шаге 1 и тип реакции клиента — эвристики по тексту. LLM в пайплайне не используется (всё воспроизводимо), но если рядом положить llm_labels.csv с колонками phone, dt_raw, <метки>, они подмешаются автоматически — разметку реакций можно усилить через LLM.

Данные

Датасет data/calls_demo.csv — полностью синтетический: генерируется скриптом make_demo_data.py, детерминирован по фиксированному SEED и не содержит ни одного реального телефона, имени или записи разговора. Цифры воспроизводят форму типичной прод-выгрузки (воронка, дефекты, распределение по часам), чтобы дашборд рассказывал реалистичную историю на безопасных данных.

Запуск

python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/streamlit run app.py

Результат

Дашборд даёт ответ за минуту: на каком шаге бот теряет клиента и что чинить. Разметка детерминированная и воспроизводимая, без LLM в критическом пути, поэтому числа можно перепроверить. Из воронки выходит точка роста — взвешенная потеря контактов и первый A/B-сценарий.

Ограничения

Датасет синтетический, а разметка шага — по маркерам шаблонного скрипта: на живом боте с более свободными репликами эвристики придётся пересматривать. Ценность карточки — в методе разбора выгрузки на безопасных данных, а не в конкретных значениях воронки.

Документация

Аналитика

Данные: github.com/NikitaBoyarkin/sales-calls-dashboard: uv run python -c "import data_pipeline as dp; df=dp.load_and_process('data/calls_demo.csv')" (repo pipeline on data/calls_demo.csv, 11486 calls)

Воронка звонков по шагам бота

Кумулятивное число звонков, дошедших до каждого шага шаблонного скрипта бота: набор → приветствие и согласие → оффер → встреча → квалификация. Разметка по маркерам реплик бота.

Набрано: 11486 (100% от макс.) Набрано 11486 Шаг 1 · Приветствие + согласие: 8401 (73.1% от макс.) Шаг 1 · Приветствие + согласие 8401 Шаг 2 · Оффер: 373 (3.2% от макс.) Шаг 2 · Оффер 373 Шаг 3 · Встреча: 137 (1.2% от макс.) Шаг 3 · Встреча 137 Шаг 4 · Квалификация: 32 (0.3% от макс.) Шаг 4 · Квалификация 32
Выводы
  • Из 11486 звонков до оффера доходит только 373 (4,4% от диалогов) — главный обрыв на входе в разговор.
  • После согласия воронка течёт нормально: 137 из 373 (36,7%) доходят до встречи, 32 из 137 (23,4%) — до квалификации.
  • На входе теряется 3085 звонков (26,9% всех наборов) — почти каждый четвёртый даже не доходит до приветствия.

Разбор потерь на шаге 1

Как распределяются все 11486 звонков по исходу первого шага (приветствие и согласие): мгновенный сброс/автоответчик, сброс на приветствии, молчание, ответ без продвижения и прошедшие дальше.

0 2000 4000 6000 Сброс на приветствии (клиент не ответил) — Звонки: 5493 5493 Нет диалога (мгновенный сброс/автоответчик) — Звонки: 3085 3085 Молчание (user: ...) — Звонки: 1558 1558 Ответил, но сорвался на шаге 1 — Звонки: 977 977 Дошёл до оффера и дальше — Звонки: 373 373 Сброс на приветствии (клиент не ответил) Нет диалога (мгновенный сброс/автоответчик) Молчание (user: ...) Ответил, но сорвался на шаге 1 Дошёл до оффера и дальше Исход шага 1 Количество звонков
Выводы
  • 5493 из 11486 звонков (47,8%) бот завершает сам, так и не дождавшись ответа на приветствие — это главная статья потерь.
  • Ещё 3085 (26,9%) — мгновенный сброс или автоответчик без диалога; вместе с молчанием (1558) на «без ответа» приходится 88,3% всех наборов.
  • Только 977 человек (8,5%) отвечают, но бот теряет их на первом же шаге.

Звонки по часам дня

Распределение 11486 звонков по часу набора. Пик объёма приходится на 17:00, при этом почти весь трафик сконцентрирован в четверг и пятницу (99,9%).

0 1000 2000 3000 4000 Звонков в час 09 — Звонков в час: 83 10 — Звонков в час: 24 11 — Звонков в час: 1083 12 — Звонков в час: 1322 13 — Звонков в час: 1044 14 — Звонков в час: 1376 15 — Звонков в час: 751 16 — Звонков в час: 731 17 — Звонков в час: 3053 18 — Звонков в час: 1434 19 — Звонков в час: 582 20 — Звонков в час: 3 09 10 11 12 13 14 15 16 17 18 19 20 Час дня Количество звонков
Выводы
  • На 17:00 приходится 3053 звонка — 26,6% всех наборов, самый массовый час.
  • Дневной «хвост» 11:00–14:00 в сумме даёт 4449 звонков (38,7%) против 5069 (44,1%) в 17:00–18:00.
  • Трафик почти полностью упакован в два дня: 5824 звонка в четверг и 5649 в пятницу (вместе 99,9%).

Средняя длительность по шагу разговора

Средняя длительность звонка (в секундах) в зависимости от максимального шага, до которого дошёл разговор. Длительность — производная от шага: чем дальше клиент, тем дольше диалог.

0 50 100 150 0 · Без приветствия — Средняя длительность, сек: 3.3 3.3 1 · Приветствие + согласие — Средняя длительность, сек: 20.1 20.1 2 · Оффер — Средняя длительность, сек: 71.8 71.8 3 · Встреча — Средняя длительность, сек: 129.9 129.9 4 · Квалификация — Средняя длительность, сек: 141.4 141.4 0 · Без приветствия 1 · Приветствие + согласие 2 · Оффер 3 · Встреча 4 · Квалификация Максимальный достигнутый шаг Средняя длительность, сек
Выводы
  • Звонки без приветствия в среднем длятся 3,3 сек — мгновенный сброс/автоответчик (3085 звонков).
  • Переход от шага 1 к офферу удлиняет разговор в 3,6 раза: с 20,1 до 71,8 сек (236 звонков).
  • Диалоги до встречи и квалификации в среднем 129,9 и 141,4 сек — качественный разговор в ~40 раз длиннее «мгновенного сброса».

Смотрите также

Карта связей

Проекты, записи и темы, связанные с этим проектом. Наведите на узел, чтобы увидеть название; клик — открыть.