Как я построила прогнозную модель call-центра, чтобы их звонки не бесили пользователей

    Ничто так не раздражает, как заставший врасплох телефонный звонок с неизвестного номера. В наш век мессенджеров и общения перепиской зловеще мерцающий на экране смартфона незнакомый номер телефона может стать причиной как минимум небольшого волнения. Вдвойне бесит, когда звонок поступает не только внезапно (вот такие они, эти звонки), но еще и в неудобное для тебя время. Например, когда ты еще толком не успел проснуться или наоборот, уже вовсю заглядываешься на такую манящую после долгого дня постель. Какие-то деловые звонки по выходным, после девяти вечера или ночью — вообще за гранью добра и зла.



    Кстати, обо мне. Меня зовут Наташа, я работаю в Skyeng на позиции Data Scientist и вовлечена в разработку различных продуктов компании. Почему я заговорила о внезапных звонках? Общение голосом с клиентам, которые только хотят начать или по какой-то причине резко прервали обучение — часть модели работы в компании. Звонки помогают вовлечь и вернуть людей в процесс изучения языка, либо напрямую узнать, что же пошло не так. Одна из моих последних задач — анализ работы нашего колл-центра. Я помогла им подобрать оптимальное время для выхода на контакт со студентами по всей России и СНГ: потому что звонки в случайное время суток никто не любит, а бесить собственных пользователей — последнее дело.

    Настроение людей в ходе таких звонков для нас крайне важно, потому что оно напрямую влияет на конверсию. Так что давайте я расскажу подробнее о том, как Skyeng звонит студентам и какую прогнозную модель я построила для того, чтобы нашим клиентам было хорошо и комфортно, а мы вышли на показатели конверсии в 60-70%.

    Угадать удобное для конкретного человека время звонка физически невозможно, если вы конечно не экстрасенс. Хвала прогрессу, для выявления подобных закономерностей придумали статистику, в модель которой плюс-минус будет укладываться подавляющее большинство пользователей.

    В ходе анализа записей нашей CRM, в которой ведется учет деятельности колл-центра, гипотеза о деловых звонках вне рабочего времени и необходимости следовать здравому смыслу лишь подтвердились. Так выяснилось, что лучше всего звонить людям в период с понедельника по четверг, с 10 до 18 часов (внезапно!). Именно в этот временной промежуток люди охотнее всего идут на контакт и звонок продолжается более 15 секунд, то есть считается нами успешным.

    Для начала мы решили определить влияние человеческого фактора на конверсию, то есть посмотреть на успехи операторов колл-центра:

    Не надо быть сыщиком, чтобы увидеть два «якоря» на этом графике. Эти две аномалии — операторы с какой-то чрезвычайно низкой эффективностью работы. Что мы делаем с аномальными данными, природа которых кроется, вероятнее всего, в человеческом факторе? Я считаю, что мы подобные данные вовсе исключаем из модели для достижения последующей чистоты и точности результата. Что я, собственно, и сделала. Ну в самом деле, эти два оператора, точнее их результаты, настолько выбиваются из общей картины по колл-центру, что я абсолютно уверена в том, что дело не рабочем процессе, а в самих сотрудниках. Возможно, они новички, что также дает нам повод их исключить.

    А вот данные шести других операторов с конверсией ниже 0,5 в модели остаются. Я считаю, что идеальных ситуаций, как и людей, быть не может, так что эти шестеро сбалансируют наши дальнейшие расчеты на фоне остальной выборки из пятидесяти сотрудников.

    Часовые пояса, регионы и дни недели


    С часовыми поясами у нас сложилась непростая ситуация. Сейчас мы собираем достаточное количество информации, чтобы определять, откуда студент и когда ему лучше всего звонить. Но так было далеко не всегда. Именно эти пласты старой, но все еще рабочей информации и создавали ряд неудобств как для наших пользователей, так и для операторов колл-центра. Для обработки этих старых данных я написала отдельное вычисление зоны пользователя на основе других косвенных данных (по номеру телефона, региону и информации об использовании нашего приложения).

    Если начать копать в статистику CRM глубже, то можно получить еще целый пласт полезной информации для создания эффективной модели. Для начала я построила график конверсии по дням недели, чтобы подтвердить свое первоначальное предположение о том, что звонить лучше в будние дни, кроме пятницы. Собственно, мои предположения оказались верны:


    Такое разделение на Москву, Питер и прочие города было сделано именно из-за сомнений в плане определения часового пояса. За нулевой день у нас взят понедельник, соответственно шестой — воскресенье. На графике выше четко видно, насколько сильно проседает конверсия по регионам в выходные дни, что подтверждает гипотезу о проблеме с часовыми поясами, на которые ориентировались операторы колл-центра.

    Москва и Питер держатся чуть лучше. Возможно, потому что жители этих городов привыкли к более высокому темпу жизни. Но даже при всем стоицизме москвичей и обитателей города над Невой, цифры говорят, что «нечего звонить с пятницы по воскресенье».

    Нижняя граница нашего целевого показателя в 0,6 достигается только однажды — в понедельник, что удивительно, так как принято считать, что этот день самый тяжелый и какие-либо побочные вопросы по понедельникам люди решают неохотно, так как сосредоточены на возвращении в рабочий ритм после выходных. Нет, нет и еще раз нет — цифры не лгут. Дальше по неделе мы идем более-менее ровно, а спад начинается только к четвергу.

    Еще интереснее выглядит картина при разложении звонков по часам:

    Обратите внимание на сильный хвост слева для регионов. Скорее всего, эти звонки были сделаны в неприемлемое время из-за некорректно определенного часового пояса

    А теперь посмотрим на конверсию некоторых дней недели:

    Вот данные за наш день-чемпион «понедельник». В начале графика «регионы» выбиваются вперед. Примерно к полудню ситуация выравнивается. Кстати, обратите внимание на симметричное движение нашего графика на отметках 15 и 16 часов; что столицы, что регионы показывают абсолютно одинаковое движение в это время.

    Но вот уже во вторник ситуация начинает меняться:

    А в четверг регионы показывают свое нежелание отвечать на звонки:

    Помните, я говорила, что звонки в выходные дни — это зло? В целом, статистическая картина подтверждает мои слова, но есть одно «но». Короче, смотрите сами:

    В 9-10 утра по регионам конверсия просто зашкаливает! А уже в 11 утра — еле-еле отрывается от отметки в 0,4, то есть проседает вдвое. У меня нет идей, как это так работает и почему происходит, так что своими теориями можно будет поделиться в комментариях, я бы с удовольствием ознакомилась.

    Если обобщить все данные, то можно вывести следующие правила для «удачного» звонка:

    • понедельник: с 13 до 17;
    • вторник: с 12 до 18;
    • среда: с 11 до 12 и с 15 до 17;
    • четверг: с 10 до 17;
    • пятница: с 10 до 12;
    • суббота: с 16 до 18;
    • воскресенье: с 13 до 14 и с 18 до 19.

    Собственно, все укладывается в рамки здравого смысла. По будням с понедельника по четверг — звонить до пяти-шести часов вечера, а в пятницу после полудня решать какие-либо вопросы уже практически невозможно. Немного «плавает» статистика по выходным с упором на вторую половину дня, ну и плюс выбивается из общей картины ранее упоминаемый аномальный пик в 10 утра воскресенья. А так все стабильно.

    Что я со всем этим сделала и какую модель построила


    Прежде чем перейти к построению модели для колл-центра, надо было сделать несколько выводов. Первое — все зависит от времени звонка. Но тут у нас начинаются проблемы.

    Единственное, что мы можем отследить — это регион регистрации номера телефона, а уже от этой информации мы отталкиваемся при построении работы колл-центра. Но очень часто возникают ситуации, при которых мы не можем точно определить из какого региона указанный номер.

    Именно это, а не какая-то выдуманная леность регионов и приводит к тому, что общие показатели конверсии пользователей за пределами МКАД и КАД проседают относительно столиц. Что мы можем сделать в этой ситуации?

    1. Придерживаться выявленных «горячих» зон для звонков в регионы, если у нас недостаточно данных.
    2. Нам надо искать инструменты более точного определения местоположения пользователя, чтобы не тревожить его пустыми звонками.

    Второй момент особенно важен. Именно такие несовпадения и снижают общий показатель конверсии, а еще бесят клиентов.

    Но перейдем к построению модели. Вот общий список признаков, который я выделила как имеющие значение:

    • hour — час звонка (категориальный признак от 0 до 23).
    • weekday — день недели (категориальный признак от 0 до 6).
    • age — возраст ученика.
    • lifetime — время жизни ученика (в уроках) на момент звонка.
    • app_hour_{k} — суточная сезонность использования приложения. Определяется для каждого часа k как доля действий в приложении в этот час (k=0,..., 23) от общего количества действий в приложении.
    • app_weekday_{k} — недельная сезонность использования приложения. Определяется для каждого дня недели k как доля действий в приложении в этот день недели (k=0,..., 6) от общего количества действий в приложении.
    • class_hour_{k} — суточная сезонность уроков. Определяется для каждого часа k как доля уроков в этот час (k=0,..., 23) от общего количества уроков.
    • class_weekday_{k} — недельная сезонность использования приложения. Определяется для каждого дня недели k как доля уроков в этот день недели (k=0,..., 6) от общего количества уроков.
    • is_ru — 1 если страна ученика Россия и 0 если нет.
    • last_payment_amount — сумма последней оплаты.
    • days_last_lesson — количество дней с последнего урока (в случае отсутствия последнего урока заменяем числом -100).
    • days_last_payment — количество дней с последней оплаты (в случае отсутствия последней оплаты заменяем числом -100).

    Изначально признаков было около ста, но расчеты и тесты показали, что они никак не влияют на конечный результат, так что они были исключены как неинформативные (например, интенсивность уроков, пол ученика, его уровень и так далее). В качестве модели бинарной классификации использовалась библиотека градиентного бустинга на деревьях решений CatBoost.

    А вот качество моей модели (на контрольной выборке):



    Данные результаты были получены для границы разделения классов, равной 0,5 — это значение по умолчанию. Определим оптимальную границу разделения классов на основании ROC-кривых (receiver operating characteristic).

    Для этого построим зависимость таких характеристик как полнота и специфичность в зависимости от различных значений границы, разделяющей классы:



    Оптимальное значение границы будет там, где мы получаем одновременно максимально высокие значения полноты и специфичности (то есть в данном случае там, где пересекаются графики). Для полученной модели оптимальная граница получилась 0,56717.

    Качество модели с оптимальной границей выглядит следующим образом:



    В нашей ситуации нам была важнее точность модели, нежели ее полнота. Именно повышенная точность позволяет нам сократить количество false-positive прогнозов, то есть позволяет нам уменьшить количество ситуаций, когда мы ждали успешного звонка, а он оказался неудачным.

    Если резюмировать механизм работы модели:

    • для каждого часа суток и дня недели по каждому ученику рассчитывается вероятность дозвона с учетом его характеристик и его локального времени;
    • для дальнейшего сохранения выбирается время с 9 до 20 часов для каждого дня недели (время выбирается в соответствии с часовым поясом ученика);
    • перед сохранением время сдвигается на московское время, так как дозвон будет осуществляться именно в московском часовом поясе;
    • результаты сохраняются в БД.

    Так, теперь операторы колл-центра имеют спрогнозированные данные по вероятности дозвона для каждого пользователя, причем на каждый час и день недели. Если звонок не срочный, то оператор может подобрать наиболее оптимальный слот на неделе, а в крайнем случае — если звонок откладывать уже нельзя — самый удачный момент текущего рабочего дня.

    Конечно же, после внедрения моей модели надо будет выдержать паузу, а потом проделать всю эту работу заново, но уже с новыми данными. Я могу делать какие-то абстрактные выкладки бесконечно, считать вероятности и добавлять новые переменные в модель, но пока живая статистика не подтвердит мою правоту — закрывать этот вопрос рано.

    Если вам понравилось, через некоторое время вернусь уже с новыми данными, полученными после внедрения моей модели прогнозирования.
    Skyeng
    Крупнейшая онлайн-школа Европы. Удаленная работа

    Комментарии 21

      +1
      Итак у вас 13 признаков. Разница в показателях между успехом и неуспехом у вас около 10%.
      Чтоб получить значение по каждому признаку хотя бы в пределах 1%, вам надо сколько записей проанализировать? миллион? миллиард? там же N^M при M признаках, нет?
      Имхо вы слишком много параметров в модель внесли. Какая достоверность модели? Доверительные интервалы?
        +1
        Вроде немного разбираюсь в ML, но суть вопроса от меня ускользает. Речь идет о «curse of dimensionality»? Собственно, автор пишет, что изначально признаков было около 100, но в результате осталось 13, то есть это уже результат некого отбора. И признаки с точки зрения здравого смысла выглядят достаточно релевантными.
        И зачем «получать значение каждого признака в пределах 1%»? Конечно же в тренировочных данных будут «пустоты» с отсутствующими диапазонами значений признаков, но это не мешает построить модель, которая стабильно дает прогноз лучше, чем простое подбрасывание монеты. Скорее всего на ограниченном отрезке времени такие же «пустоты» будут и в данных, которые используются для прогноза, ну и никто не мешает снова обучить модель на новых данных.
          +1
          Возможно, я не до конца поняла ваш вопрос, но постараюсь всё же ответить)
          Если вас интересует соотношение объема выборки и количества признаков, то могу вам ответить, что для обучения модели у нас была выборка размерностью около 50К — по всем эмпирическим rules of thumb данное соотношение вполне подходит для того, чтобы строить даже достаточно сложные модели.
          Кроме того — признаки, которые остались в модели, были отобраны из большего множества как значимые (в основном на основании применения различных статистических критериев средних).
          Иными словами, если какой-то признак был слабо представлен в одном из классов или не давал статистического различия между классами, то, скорее всего, он не прошел этап отбора признаков.
          По поводу достоверности модели могу сказать, что все метрики, которые приведены в статье — получены по тестовой подвыборке и, кроме того, различие в метриках между обучающей и тестовой выборками было незначительное, а значит можно говорить об устойчивости прогноза.
          +3
          Откуда у вас моя фотография в момент, когда мне звонят из очередного сервиса с вопросами «А почему...? А оцените ...». И кто вам дал право использовать её для КДПВ?
          А если серьёзно, то такие звонки неимоверно вымораживают. Мыло/мессенджеры/СМС на худой конец, и я точно прочту и возможно приму ваш месседж.
          А вот звонок — ну очень возможно он будет длиться более 15 секунд и будет засчитан вами как успешный.
          Но! Это будет мой монолог, в котором я очень подробно буду рассказывать вашему оператору — почему не надо мне больше звонить.
            –7
            Мы ждали этот вопрос) Тот, который не про КДПВ.

            Конечно, время задуматься про модель определения оптимального канала коммуникации с человеком: время мы уже знаем, а всем, действительно, не угодишь, — кто-то любит голосом общаться, кто-то текстом.

            Но бывают случаи, когда иначе сложно. Вы откажете оператору. Ок. А кто-то с ним поговорит: и обратная связь поможет развивать продукт. Здесь не всегда подойдет опросник с 10 пунктами или онлайн-анкета: банально, но, когда человек пишет, он больше задумывается над формой или банально отвлекается, из-за этого иногда теряется важный смысл и нюансы. Оператор же, по сути, собирает эти нюансы. Она, причины поступков — и то, как человек их для себя формулирует — могут быть очень индивидуальны.

            Видите, здесь речь идет не об одностороннем случае коммуникации вида «привет, хочу рассказать тебе, что...», а о случае «привет, а расскажи, пожалуйста....» — т.е. это диалог.

            p.s. К сожалению, в жизни бывают и более грустные неожиданные звонки, если понимаете, о чем я. А звонки колл-центра всегда можно пережить)

              +6
              А звонки колл-центра всегда можно пережить)

              Многое можно пережить, но это не значит что это надо переживать. И по этому месту в вашем тексте лично я вижу понимание того, что ваше поведение на самом то деле не совсем социально.

              И получается что когда речь идёт о вашей прибыли, то на человека на другом конце провода вам в общем-то наплевать.

              Или я что-то неправильно понимаю?
                +4
                Субъективное мнение: компания, которая пишет так
                А звонки колл-центра всегда можно пережить)
                не может говорить о лояльности и о том, что она старается не бесить пользователей. Она может врать об этом с самого первого предложения статьи. Инженеры дожили до того, что врут подобно менеджерам в своих статьях о том, зачем и что они делают. И это уже ужасно, даже если не рассматривать методы и качество этого исследования, либо качество его описания.
                  +2
                  пережить и внести очередной номер в черный список
                +1
                На графиках с конверсиями хорошо бы еще доверительные интервалы сделать, чтобы было понятно, что это не просто случайно так вышло, а и правда есть закономерность.
                В механизм последующего выбора времени дозвона хорошо бы еще встроить немного рандома, чтобы не переобучаться потом на себя.
                  0
                  По поводу доверительных интервалов — согласна, с ними было бы намного нагляднее. Для примера я построила доверительные интервалы для одного из первых графиков, где представлена конверсия по дням недели общая и в разрезах Москва/Санкт-Петербург и регионы — получилось следующее:
                  image
                  Здесь хорошо видно, что в выходные доверительный интервал шире, так как там намного меньше изначальное количество совершенных звонков, но в целом доверительные интервалы получились не слишком широкими и видно, что общая зависимость по дням недели в них укладывается.

                  По поводу второго вопроса с рандомизацией результатов прогноза — на самом деле она уже в некотором виде есть. Модель на выходе для каждого пользователя рассчитывает слоты по часам и дням недели с вероятностями дозвона, однако, операторы не всегда выбирают наилучший слот:
                  Если звонок не срочный, то оператор может подобрать наиболее оптимальный слот на неделе, а в крайнем случае — если звонок откладывать уже нельзя — самый удачный момент текущего рабочего дня.

                    0
                    было бы намного нагляднее
                    Еще интереснее были бы технические подробности, в виде кода, например, (ну хотя бы некритичной его части, которой можно поделится). А так — задача действительно интересная. Лично я жестко пресекаю все подобные звонки. Но попытки уменьшения негатива для пользователей — гуд.
                  +1
                  Наталья, интересный опыт и рассуждения, похвально, что стараетесь быть удобными… но почему-то очень много предположений «скорее всего», «наверное» и нигде не рассматривается вариант напрямую спросить человека об удобном для него времени: безальтернативно принято суждение, что с 10-18 отправная точка, но ведь это рабочее время, клиенту может быть как раз неудобно отвечать в это время… А на практике странность еще и в том, что даже на прямую просьбу не звонить с 10 до 18 ваш колл-центр настойчиво продолжает это делать… не слишком ли вы загоняете его в рамки?
                    0
                    Спасибо за статью, она довольно интересная.
                    Как вы считаете, можно ли ваши результаты распространить на другие компании? Я правильно понимаю, что люди не знают, что им звонит именно skyeng? И получается, что любая компания с колцентром может воспользоваться вашими результатами, чтобы улучшить вероятность дозвона?
                      0
                      Да, в данном случае пользователи обычно не знают, что им звонит именно Skyeng. Поэтому если мы говорим не о построенной прогнозной модели, а об общем анализе конверсий по дням недели и часам — да, это достаточно общие результаты, не привязанные конкретно к специфике компании.
                      0
                      Скорее всего в воскресенье утром учатся дети. Им такой график удобнее, точнее мамам: пока мама занимается домашними делами, чадо под присмотром занимается полезным. А вечером у школьников уже свои дела, друзья и улица.
                        0

                        А если у пользователей будет стоять запрет на все незнакомые номера то как? Если вам это действительно важно, а не просто для галочки, то не лучше ли сначала послать смс, где вы представившись с названием вашей компании и номера телефона, можете предложить время когда вы сможете позвонить. И человек заинтересованный в вас забьет ваш номер, который будет определяемым и тогда сможет поговорить. Я понимаю это долго и не удобно, но почти всегда наверняка. Это если вам это действительно нужно.
                        Я вас точно не услышу, у меня запрет

                          +3
                          Запрет на все входящие может сильно аукнуться: что, если кому-то из семьи стало плохо, или украли телефон, а у Вас — запрет?
                          Лучше использовать какой-нибудь анти-спам, типа Kaspersky WhoCalls. Раза три-четыре на дню звонят шаромыжники, и он сам их отсекает. Чем больше пользователей пожалуются ему на номер, тем быстрее номер начнёт отсекаться у всех пользователей. Очень рекомендую.
                          0
                          стараюсь сократить подобные «разговоры» до трех секунд, понять, что это не важный звонок и сказать громко и ясно: нет, спасибо, до свидания.
                          Анти-спам из яндекс телефона неплохо отрабатывает, некоторые звонки просто не берется трубка, добавляется в бан по повторной попытке.
                            0
                            Привет, мы работаем над этим: стараемся выделить прослойку учеников, которых бесит, что им звонят. Уже сделали доработку в CRM: если была жалоба на звонки, саппорт выставляет галочку «не звонить» — по ней скрывается номер клиента и блокируется создание «телефонных» тикетов.
                            0
                            У нас самые конверсионные дни — вторник, среда. Во вторник обычно больше конверсий, но бывает и среда обгоняет. Но редко. В понедельник конверсия ближе к концу дня разгоняется, в пятницу активность утром, а к вечеру — падает. И так уже полтора года. Я удивляюсь, какие люди все-таки предсказуемые существа.
                              0
                              Привет, а «у нас» — это у кого?

                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                            Самое читаемое