Поступила реальная задача - мои коллеги из подбора попросили меня построить модель, предсказывающую время, необходимое для закрытия вакансии. Они перекраивают свои процессы, и одним из изменений должно стать информирование заказчика об ожидаемом сроке подбора еще на этапе подачи заявки на этот самый подбор. Хорошее желание - формирование адекватных ожиданий у руководителей. Помимо прогноза, хотим показывать историю закрытия вакансий в его городе - куда же без описательной статистики... Но возможно, некоторым людям прошлое позволит легче принять будущее) Хотя не факт...
В итоге у нас родился такой прообраз дашборда. Потребитель - линейный руководитель, подавший заявку на подбор. Предполагается, что этот отчет будет формироваться для него индивидуально, сразу после подачи заявки на поиск сотрудника. Ниже первый лист этого отчета.
Мы хотим показать в одном месте прошлое и будущее. Потому что это удобно. А еще мы хотим объяснить, как получилась наша прогнозная цифра (2-й блок дашборда). И там где это возможно, дать руководителю шанс самому "поиграться" факторами, чтобы принять свое решение. И родить кучу новых задач (видимо из блока 3).
Осталось сделать немного - построить модель, предсказывающую нужную метрику; начать собирать оценки по рекрутерам (совсем скоро в нашем кино); ну и запилить дашборд в систему отчетности для быстрого формирования (это отдельная песня).
У меня есть около 15 тыс. записей с реальным сроком закрытия - история с начала 2016 года и по текущий момент. 2015 год не стала брать сознательно - "мутное" время после очередной встряски. Оставила только вакансии массового подбора, убрала проблемные записи. В итоге выборка похудела до ~ 10 тысяч.
Модель решила построить в R: после семинара "HR - аналитика в R" стараюсь закрепить полученные знания.
Первое, что проверила - а есть ли различия в сроке закрытия в разрезе городов. А то может одним универсальным отчетом обойдемся? :-) Да, различия между городами есть - Kruskal-Wallis chi-squared = 1081.2, df = 108, p-value = 2.2e-16 - отличия статистически значимы.
Одних городов для модели мало, что еще взять? Первое, что сразу пришло в голову - это характеристики самих городов - общая численность, уровень безработицы, количество ВУЗов в городе, количество экономически активного населения. Правда тут есть нюансище - корреляции между признаками, что логично. Надо брать или сам город как фактор, или все его характеристики.
Сейчас использовала две модели - обычную линейную регрессию и дерево решений. Первая мне была интересна потому, что там легко интерпретировать результаты - увидеть какие факторы влияют и насколько сильна их взаимосвязь с целевой переменной. От второй модели я ожидала более точный прогноз, но к моему удивлению, линейная регрессия показала лучший результат.
В этом посте я покажу линейную модель, обученную на выборке с перечисленными ниже факторами. В этой модели использовала только характеристики городов.
Использовала lm из caret, разделение на обучающую и тестовую выборку 0.75/0.25. Что получилось. R-squared: 0.336, standard error: 16 дней при среднем сроке 28 дней. Далеко не идеальный результат, но для начала, да еще с учетом качества данных, пойдет. Первые выводы все равно уже можно сделать.
Ниже 20 самых значимых факторов + (Intercept). (Intercept) оказался не значим (p-value 0,707), поэтому в модели использовать его нельзя.
На первом месте бесспорный лидер -
количество вакансий в работе у рекрутера. Коэффициент 0,411, p-value практически равен нулю. Это означает, что с увеличением на единицу количества вакансий, которое рекрутер ведет одновременно, срок закрытия всех вакансий у него увеличивается в среднем на 0,4 дня. Учитывая, что обычно в работе может находиться несколько десятков вакансий, то получается весьма ощутимо. Картинка слева.
На втором месте оказался уровень позиции, что в принципе было ожидаемо. Чем выше уровень, тем больше срок закрытия. Уровень был перекодирован как метрическая переменная - 1, 2,3 и т.д. То есть, с переходом на 1 уровень выше, срок закрытия увеличивается на 1,755 дня. С p-value не поспоришь.
Третье место - одна из причин появления вакансии "конфиденциальная замена". Причины появления вакансии далее еще встретятся, но тут скажу, что если причина появления была в подобной замене, то срок закрытия увеличивается в среднем на 14 дней по сравнению с базовым уровнем. Хотя если смотреть на картинку, то срок кажется бОльшим. Но картинкам верить нельзя))) За базу в модели была принята причина "ввод новой ШЕ" (покрашена оранжевым). Все сравнения ведутся именно с ней. Никакого скрытого смысла в таком выборе не было, базовый уровень определялся исходя из названий, программа просто выбрала тот уровень, который по алфавиту был первым.
Следующее место - уровень безработицы. Тут вроде тоже противоречий не возникает. Чем выше безработица, тем легче закрыть вакансию. С увеличением безработицы в городе на 1%, скорость закрытия уменьшается на 0,7 дня.
Пятое место - следующая причина увольнения "декретная позиция". Срок закрытия такой позиции увеличивается на 2,2 дня по сравнению с базовой. Что в очередной раз подтверждает, что люди не так охотно соглашаются идти в компанию на срочные трудовые договора.
На следующих нескольких местах оказалось время подачи заявки в подбор. Картинка где-то слева. За базу принят август (первый по алфавиту, ничего более). По картинке можно сказать, что наиболее быстро закрываются позиции, открытые в период июль-сентябрь. Не знаю, что точно является причиной этого, но моя гипотеза простая - народ отдохнул в отпусках и активнее откликается на вакансии. А декабрьские вакансии закрываются медленнее, так как мало кто хочет лишаться годового бонуса, выплата которого происходит как правило весной. Но что мне странно, что значимыми в модели оказались далеко не все месяца, и тот же декабрь просто "вылетел".
На восьмом месте появилась доля отказов после проверки СБ в разрезе городов. Логично, что чем яростнее СБ, тем срок закрытия больше, вот только не очень понятно как с этим бороться))) Зависимость нелинейная. poly(Доля.отказов.СБ.город, degree=4) привело к увеличению R-squared ~ на 0.01, но тут я это не показываю.
Следующее место - численность населения в городе. Тоже ничего нового. Чем крупнее город, тем быстрее закрывается вакансия.
Был ли подбор удаленным. Если да, то срок будет больше в среднем на 1,2 дня.
И последний значимый фактор - причина появления вакансии "увольнение сотрудника". Но значим он уже с натяжкой - p-value прям на грани.
Все остальное в таблице, что выделено серой заливкой, уже не имеет значения, так как p-value у этих факторов оказался больше 0,05.
Работа над этой моделью только начинается, и по мере появления новых данных буду включать их в модель. И следующее, что я сделаю - добавлю характеристики руководителя и рекрутера (например стаж в должности, тесты и т.д. и т.п.). И очень хочется поймать взаимодействие между двумя этими персонами.
В итоге у нас родился такой прообраз дашборда. Потребитель - линейный руководитель, подавший заявку на подбор. Предполагается, что этот отчет будет формироваться для него индивидуально, сразу после подачи заявки на поиск сотрудника. Ниже первый лист этого отчета.
Мы хотим показать в одном месте прошлое и будущее. Потому что это удобно. А еще мы хотим объяснить, как получилась наша прогнозная цифра (2-й блок дашборда). И там где это возможно, дать руководителю шанс самому "поиграться" факторами, чтобы принять свое решение. И родить кучу новых задач (видимо из блока 3).
Осталось сделать немного - построить модель, предсказывающую нужную метрику; начать собирать оценки по рекрутерам (совсем скоро в нашем кино); ну и запилить дашборд в систему отчетности для быстрого формирования (это отдельная песня).
У меня есть около 15 тыс. записей с реальным сроком закрытия - история с начала 2016 года и по текущий момент. 2015 год не стала брать сознательно - "мутное" время после очередной встряски. Оставила только вакансии массового подбора, убрала проблемные записи. В итоге выборка похудела до ~ 10 тысяч.
Модель решила построить в R: после семинара "HR - аналитика в R" стараюсь закрепить полученные знания.
Первое, что проверила - а есть ли различия в сроке закрытия в разрезе городов. А то может одним универсальным отчетом обойдемся? :-) Да, различия между городами есть - Kruskal-Wallis chi-squared = 1081.2, df = 108, p-value = 2.2e-16 - отличия статистически значимы.
Одних городов для модели мало, что еще взять? Первое, что сразу пришло в голову - это характеристики самих городов - общая численность, уровень безработицы, количество ВУЗов в городе, количество экономически активного населения. Правда тут есть нюансище - корреляции между признаками, что логично. Надо брать или сам город как фактор, или все его характеристики.
Сейчас использовала две модели - обычную линейную регрессию и дерево решений. Первая мне была интересна потому, что там легко интерпретировать результаты - увидеть какие факторы влияют и насколько сильна их взаимосвязь с целевой переменной. От второй модели я ожидала более точный прогноз, но к моему удивлению, линейная регрессия показала лучший результат.
В этом посте я покажу линейную модель, обученную на выборке с перечисленными ниже факторами. В этой модели использовала только характеристики городов.
- Численность населения в городе
- Уровень безработицы
- Количество ВУЗов
- Количество экономически активного населения
- Количество вакансий в работе у рекрутера
- Подбор был удаленный (рекрутер и соискатели находятся в разных городах) или нет
- Месяц подачи заявки в подбор (почему бы и не посмотреть?)
- "Укрупненный функционал"
- Уровень позиции
- Доля отказов СЭБ за последний календарный год по каждому городу (Мои коллеги из подбора жаловались на количество отказов после проверки СЭБ, что им приходиться иногда начинать поиск заново - добавила долю отказов СЭБ в разрезе городов. Но наверное для многих компаний этот пункт не имеет критичного значения. )
- Причина появления вакансии
Использовала lm из caret, разделение на обучающую и тестовую выборку 0.75/0.25. Что получилось. R-squared: 0.336, standard error: 16 дней при среднем сроке 28 дней. Далеко не идеальный результат, но для начала, да еще с учетом качества данных, пойдет. Первые выводы все равно уже можно сделать.
Ниже 20 самых значимых факторов + (Intercept). (Intercept) оказался не значим (p-value 0,707), поэтому в модели использовать его нельзя.
Фактор
|
Уровень фактора (где есть)
|
Коэффициент в модели
|
p-value
|
Важность фактора
|
(Intercept)
|
6,251
|
0,707
|
||
Количество вакансий в работе у рекрутера
|
0,413
|
6,052E-310
|
100.00
|
|
Уровень позиции
|
1,755
|
5,183E-57
|
39.97
|
|
Причина появления вакансии
|
Конфиденциальная замена
|
14,172
|
1,320E-05
|
10.81
|
Уровень безработицы
|
-0,745
|
1,785E-04
|
9.29
|
|
Причина появления вакансии
|
Декретная позиция
|
2,233
|
0,003
|
7.34
|
Дата подачи заявки в подбор
|
Фев
|
2,945
|
0,004
|
7.05
|
Дата подачи заявки в подбор
|
Ноя
|
4,002
|
0,005
|
6.89
|
Доля отказов СЭБ в городе
|
10,803
|
0,007
|
6.66
|
|
Дата подачи заявки в подбор
|
Май
|
2,263
|
0,017
|
5.91
|
Дата подачи заявки в подбор
|
Апр
|
2,265
|
0,020
|
5.76
|
Численность населения
|
-1,67E-06
|
0,039
|
5.12
|
|
Дата подачи заявки в подбор
|
Март
|
1,973
|
0,041
|
5.07
|
Удаленный поиск
|
Да
|
1,202
|
0,048
|
4.90
|
Причина появления вакансии
|
Увольнение сотрудника
|
1,061
|
0,050
|
4.59
|
Дата подачи заявки в подбор
|
Дек
|
2,183
|
0,129
|
3.75
|
Количество ВУЗов
|
0,029
|
0,280
|
2.67
|
|
Дата подачи заявки в подбор
|
Окт
|
1,421
|
0,309
|
2.51
|
Дата подачи заявки в подбор
|
Сен
|
-1,176
|
0,316
|
2.47
|
Дата подачи заявки в подбор
|
Янв
|
0,853
|
0,438
|
1.91
|
Укрупненный функционал
|
Перевод
|
-12,763
|
0,441
|
1.90
|
На первом месте бесспорный лидер -
количество вакансий в работе у рекрутера. Коэффициент 0,411, p-value практически равен нулю. Это означает, что с увеличением на единицу количества вакансий, которое рекрутер ведет одновременно, срок закрытия всех вакансий у него увеличивается в среднем на 0,4 дня. Учитывая, что обычно в работе может находиться несколько десятков вакансий, то получается весьма ощутимо. Картинка слева.
На втором месте оказался уровень позиции, что в принципе было ожидаемо. Чем выше уровень, тем больше срок закрытия. Уровень был перекодирован как метрическая переменная - 1, 2,3 и т.д. То есть, с переходом на 1 уровень выше, срок закрытия увеличивается на 1,755 дня. С p-value не поспоришь.
Третье место - одна из причин появления вакансии "конфиденциальная замена". Причины появления вакансии далее еще встретятся, но тут скажу, что если причина появления была в подобной замене, то срок закрытия увеличивается в среднем на 14 дней по сравнению с базовым уровнем. Хотя если смотреть на картинку, то срок кажется бОльшим. Но картинкам верить нельзя))) За базу в модели была принята причина "ввод новой ШЕ" (покрашена оранжевым). Все сравнения ведутся именно с ней. Никакого скрытого смысла в таком выборе не было, базовый уровень определялся исходя из названий, программа просто выбрала тот уровень, который по алфавиту был первым.
Следующее место - уровень безработицы. Тут вроде тоже противоречий не возникает. Чем выше безработица, тем легче закрыть вакансию. С увеличением безработицы в городе на 1%, скорость закрытия уменьшается на 0,7 дня.
Пятое место - следующая причина увольнения "декретная позиция". Срок закрытия такой позиции увеличивается на 2,2 дня по сравнению с базовой. Что в очередной раз подтверждает, что люди не так охотно соглашаются идти в компанию на срочные трудовые договора.
На следующих нескольких местах оказалось время подачи заявки в подбор. Картинка где-то слева. За базу принят август (первый по алфавиту, ничего более). По картинке можно сказать, что наиболее быстро закрываются позиции, открытые в период июль-сентябрь. Не знаю, что точно является причиной этого, но моя гипотеза простая - народ отдохнул в отпусках и активнее откликается на вакансии. А декабрьские вакансии закрываются медленнее, так как мало кто хочет лишаться годового бонуса, выплата которого происходит как правило весной. Но что мне странно, что значимыми в модели оказались далеко не все месяца, и тот же декабрь просто "вылетел".
На восьмом месте появилась доля отказов после проверки СБ в разрезе городов. Логично, что чем яростнее СБ, тем срок закрытия больше, вот только не очень понятно как с этим бороться))) Зависимость нелинейная. poly(Доля.отказов.СБ.город, degree=4) привело к увеличению R-squared ~ на 0.01, но тут я это не показываю.
Следующее место - численность населения в городе. Тоже ничего нового. Чем крупнее город, тем быстрее закрывается вакансия.
Был ли подбор удаленным. Если да, то срок будет больше в среднем на 1,2 дня.
И последний значимый фактор - причина появления вакансии "увольнение сотрудника". Но значим он уже с натяжкой - p-value прям на грани.
Все остальное в таблице, что выделено серой заливкой, уже не имеет значения, так как p-value у этих факторов оказался больше 0,05.
Работа над этой моделью только начинается, и по мере появления новых данных буду включать их в модель. И следующее, что я сделаю - добавлю характеристики руководителя и рекрутера (например стаж в должности, тесты и т.д. и т.п.). И очень хочется поймать взаимодействие между двумя этими персонами.
__________________________________________________________
читайте нас в фейсбуке и телеграмме
а ты помнишь недавно был кейс про текучесть персонала? западная компания, использовали пакет H2O
ОтветитьУдалитькейс не очень, использовали классификацию, но там самое крутое было про фиче импортанс
пакет lime
я может ошибаюсь, но он вроде как дает фиче импортанс для каждой строки данных, т.е. инд фиче импортанс
это было круто добавить в то место, где у тебя коэффициенты регрессии
Ничего себе. Попробую разобраться)
Удалитьа ты пре процессинг времени закрытия делала? честно признавайся
УдалитьНе совсем поняла вопрос( У меня есть дата подачи заявки и дата ее закрытия. Я получаю срок. Что тут ещё можно и нужно подготавливать?
УдалитьЛинейная регрессия работает с нормально распределенными данными.
УдалитьПодозреваю, что у тебя время закрытия вакансий не нормально распределено
Этот комментарий был удален автором.
УдалитьЛюда, шикарная работа проделана! Прочитал с большим удовольствием. Было бы круто добавить какой-то инфы именно про самих рекрутеров. Что у них со скилами?
ОтветитьУдалитьА это следующая серия)
УдалитьЕвгений, я тоже ваших материалов жду)
УдалитьСпасибо за модель
ОтветитьУдалитьЛюда, спасибо, отличный пост. Почему берем тест именно Крускал Уоллеса — много городов?
ОтветитьУдалитьКак сделать такую визуализацию, это в R? Покажи где посмотреть?
Часовой пояс в случае если подбор удаленный может влиять на время закрытия вакансии?
Если руководитель принимает финальное решение, как можно скорость его реакции учесть в модели?
Если отказ от кандидата со стороны руководителя, как померить влияние ложных отказов( когда кандидата нужно было брать) на модель? Можно ли это померить?
Артем, Люда заболела звездной болезнью.
УдалитьХочу встречный вопрос: а какие варианты кроме Крускала Уолисса?
Нет! Дойду до компа, напишу ответы. Вопросов просто много)
УдалитьАртем, спасибо за вопросы)
Удалить1. Этот тест выбрала, потому что у меня несколько выборок и распределение там далеко от нормального.
2. Эту визуализацию делала в R с помощью уже любимого ggplot2. Помогла книга Elegant Graphics for Data Analysis Authors: Wickham, Hadley.
3. Влияние часового пояса - не знаю))) Эту гипотезу я пока не тестировала. Могу только по данным проверить, насколько удалены города между рекрутером и соискателем. Но знаю одно, мы врядли ищем сотрудника во Владивостоке, сидя в Москве. Дорого)
4. Принимает решение именно руководитель. У меня есть данные между датой последнего собеседования с руководителем и датой направления документов на финальную проверку в СБ. Теоретически в этот промежуток руководитель принимает решение. Хорошая идея попробовать использовать эту переменную в модели. Спасибо)
5. Количество рассмотренных кандидатов будет влиять на скорость закрытия вакансии, но моя задача предсказать срок в самом начале, когда я не знаю сколько людей откликнется в итоге. Для моей модели эта переменная бесполезна, так как я банально не знаю ее значение на момент прогноза. И не важно имели ли место ложные отказы
Людмила, отличное исследование, интересно почитать, жду продолжения! К слову, из-за стечения обстоятельств ищу сотрудников в Новосибирске, находясь недалеко от Москвы. Не сказала бы, что разница в часовых поясах как-то кардинально сказывается на скорости закрытия, потому что, если кандидат настроен пообщаться, то обычно находится общий знаменатель по времени.
УдалитьЭтот комментарий был удален автором.
ОтветитьУдалитьБольшое спасибо за статью!
ОтветитьУдалитьЛюдмила, подскажите, пожалуйста, Ваша модель закрыта для пользования или ее можно расшарить например на github?
Хочется попробовать проанализировать свои данные, но с моделированием пока не особо.
мои 5 %
Удалитьа вы HR, Иван?
УдалитьИван, напишу следующее - для пользования точно закрыты данные, с которыми я работаю. И это понятно) Коды я частично открою в следующей публикации, либо дам ссылки, где можно найти исходники. Но главная ссылка будет на семинар "HR аналитика в R"))) Потому как мне действительно пригодились коды Эдуарда, и особенно на первых шагах, когда я только разбиралась с R)
УдалитьУдачи в вашем анализе!
Эдуард, да я HR, на уровне любителя знакомый с R и Python с pandas, numpy. Чуть-чуть знаю статистику, эконометрику и теорвер.
УдалитьЛюдмила, то что данные закрыты я понимаю =) Мне интересна сама модель на R, чтобы подкрутить ее под свой датасет и может тоже какие-либо инсайды познать.
Спасибо, очень жду Вашу статью!
Иван, я могу вам дать доступ к блогу, вы будете делиться своими кейсами. Как Вам предложение?
УдалитьСпасибо, Эдуард! Предложение отличное, но мне пока нечем делиться. Если будет хороший кейс, то постараюсь его расписать и выложить. А пока хотелось бы "поиграть" с моделью Людмилы.
Удалить