.

Сделать репост в соц сети!

среда, 5 июля 2017 г.

Домашнее задание: Какие факторы влияют на вероятность проработать больше года в компании.



Привет, HRM. Я не математик или програмист. Посетил семинар Эдуарда Бабушкина по HR-аналитике. Это мое домашнее задание. 

Дата сет

Датасет предоставлен Эдуардом после семинара. 5000 ответов на вопросы анкеты. Кстати, если хотите узнать свою оценку на рынке труда в денежном эквиваленте можно пройти тест в блоге Эдуарда https://edwvb.blogspot.ru/…/01/skolko-ya-stoyu-na-rynke.html
Просто работаю с датасетом для себя отметил как можно моделировать анкету для построения модели в будущем. Теперь понимаю — ошибкой будет создать опросник или анкету в компании, без понимания на какие аналитические вопросы она отвечает. Конечно, для опытных аналитиков это очевидно, для меня открытие.

Какую задачу взял в домашнее задание?

Поставил себе задачу найти факторы, которые влияют на вероятность сотрудника проработать больше года в компании. Задача классификации. До семинара ничего сложнее регресии для красивой линии на графике я не считал. Сразу практика и в построении модели классификации и интрепретации ROCR кривой, оптимизация модели на точность.

Думаю это останется моим блоком для аналитики и в будущем. При условии, что подбор и обучение нового сотрудника стоит дороже, чем удержание уже принятого и прошедшего обучение и испытательный срок. Сейчас я провожу реструктурицазию подразделения где ошибка сотрудника в коммуникации стоит от 4 до 10 млн рублей в обороте для компании. Эту ошибку я закладыаю в стоимость обучения и прохождения адаптационного срока. 

Как решал задачу?

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

Препроцессинг:

— Большую часть времени обрабатывал данные и приводил их к нужному формату.
— Важно в компании сразу настраивать корректную гигиену данных
— Столкнулся с проблемами о которых говорил Эдуард на семинаре.
Взял переменные как отличие по заработной плате между обещанной и рельаной, белая или серая заработная плата?  Превратил их в факторные переменные, заодно заменил NA если их было не более 5% от общего числа самым популярным ответом. Если пропущенных значений было больше 5%, то я просто удалял их из датасета. 

Что взял за Y или выходная переменная

В итоговом варианте, взял за Y стаж сотрудника до увольнения. Опять же, помог код , он был предоставлен на семинаре. 
— Поставил дату увольнения end переменная
— Дата устройства как begin.
— Далее вычислил разницу и получил стаж.
Затем пришлось очистить данные от ошибок. Например стаж у части был минусовой. Так же убрал данные где стаж превышал 200 месяцев.

В итоговом датасете:

Тех кто уволился до 12 месяцев событие 0 = 1359 наблюдений
Тех кто уволился после 12 месяцев событие 1 = 737 наблюдений

Какие параметры включил в модель?

Некоторы парметры, например переработки личные и руководителя я прерватил в новую переменную в виде комбинации двух параметров. 
Пол = gender
Наличие наставник = mentor
Время до работы = worktrip
Белая или серя зап = salary_
Публичная критика = crit
Тип офиса workspace
Наличие интранета = intranet
Доступ к социальным сетям = social
График работы = schedule
Перерабатывал ли сотрудник и его руководитель? = overmatch
Наличие обратной связи = os
Обучение и курсы квалификации = growth
Поддержка инициативы = initiative
Наличие детей в комбинации с кредитами = kids_loan
Возраст руководителя = bossage 
Перерабатывал ли руководитель ? = bossover
Вид квартиры = flat
Премия = bonus

Результаты работы алгоритмов:

GLM без кроссвалидации 

АUC = 0.68

GLM с кроссвалидацией. 

Тот же результат что и с кроссвалидацией. 

Random forest

АUC = 0.71, при числе факторов 16

Общая точность 65% при границе отсечения 0.4

Точность полнота

Важность факторов: 

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


XGboost

АUC = 0.69. Тренировка модели заняла вместе с подгонкой 4 дня. Random Forest 6 часов. В итоге часть параметров по прежнему на границах значений которые я выставил в настройки. Духу сражаться дальше с настройками не хватило. Скорее всего нужно было выкидывать из модели лишний параметры и упрощать модель.

Итоговые параметры:



Сетка настроек:


Точность полнота:


Важность факторов: 


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

— Отсутвие интранета
— Оупен спейс офис
— Обратная связь не реже одного раза в неделю.
Скорее всего параметр нужно было удалять. Вот соотношение с уволились до 12 месяцев и после.

— Rec4 = Все достижения отмечены руководителем
— Rec 2 = Изредка получал обратную связь
— Руководитель перерабатывал меньше чем сотрудник.

Что в итоге?

— Бонусы влияют на верояность сотрудника проработать дольше года.
— Модель нельзя использовать для прогноза т.к. низкая точность на текущий момент.
— Серая заработная плата и переработки сотрудника,когда руководитель не перерабатывает увеличивают риск сотрудника покинуть компанию.


Чем полезно для бизнеса?

— Проверять навыки руководителей. Могут ли они структурировать работу так, что бы сотрудники работали в комфортном режиме.
— Если нет, способен ли руководитель вместе с сотрудниками компенсировать объем работ и своими часами тоже
— Важным параметром оказался интранет и сотрудники с наличием интранета работила дольше 12 месяцев чаще чем без интранета. Здесь скорее влияние внутренних комуникаций в компании и чувства споричастности к группе. Хотя это мои догадки.

Чему научился?

— Подбирать алгоритм
— Строить модель и тестировать ее
— Работать с современными алгоритмами машинного обучения
— Понимаю как внедрить тот же процесс у себя в компании и у клиента
— По сути нужно было делать дожитие и смотреть какие факторы увеличивают риск уволиться. Но это уже был бы третий разворот модели. Мне пока не под силу физически:) 

Чему предстоит научиться?

— Применять модели в бизнес решениях
— Понять как вывести важность параметров отностельно одного из откликов Y параметра

Что предстоит сделать?

— Построить модель для прогноща срока работы сотрудника на живом примере
— Построить регрессионный анализ для предсказания способности продавца продавать на заданный уровень
— Попробовать научить модель оценивать письменные переписки сотрудников с клиентами.
Друзья, это мой текущий уровень понимание. Буду благодарен за обратную связь и критику. Сейчас важно понимать куда дальше настравивать обучение?


17 комментариев:

  1. Здравствуйте, Артем!

    Я бы предложил для начала сделать разбиение датасета на тренировочную и тестовую выборку (в пропорции 70 на 30 к примеру) и сделать балансировку данных на тренировочном сете (есть много разных способов, многие из них хорошо описаны в интернете - искать по ключевой фразе imbalanced data). Потому что точность, указанная в glm модели равна точности при утверждении, что никто из сотрудников не уволится: в этом случае будет 1359 правильных ответов, то есть точность составит - 1359/(737+1359)=65% и далее опять попробовать построить указанные вами модели и проверить уже точность на тестовых данных. Уровень отсечения я бы сразу так не выбирал, потому что здесь необходимо проделать анализ confusionmatrix и сопутствующих метрик для подходящего выбора p.

    ОтветитьУдалить
    Ответы
    1. Разбивка сделана 70 на 30 при тренировке модели. Про Imbalanced data спасибо. Похоже это вариант который нужно будет попробовать. То есть, уровень отсечения необходимо брать в зависимости от p value по confusion matrix, а не по максимально доступной точности при определенном уровне отсечения?

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

      Удалить
    3. Точность редко является тем параметром по которому стоит подбирать параметр отсечения. Тут необходим анализ таких метрик как специфичность, чувствительность и т.д и понимание в каком бизнесе будет данная модель использоваться. Часто полезным бывает метрика F1. В пакете caret (при работе с R) есть отличная функция confusionMatrix - в которой многие метрики и так уже показаны. Ее можно сохранить в переменную и обращаться к нужной метрике напрямую, что очень облегчает написание функции, чтобы найти при каком уровне отсечения p выбранная метрика принимает свое максимальное значение.
      Насчет балансировки данных - есть также немало пакетов в R, которые вам могут уже помочь. Желательно выбрать несколько методов балансировки, провести их и по каждому сету построить модель - от выбранного метода балансировки может значительно измениться точность модель. Какой когда метод использовать - трудно сказать, зависит от разных ситуаций, поэтому здесь лучше либо написать функцию заранее, которая будет автоматически делать балансировку и выбирать лучшую по метрике к примеру AUC, либо для одноразового использования написать все ручками.
      Также для сокращения времени построения и тюнинга модели с caret можно использовать параллельное вычисление (работает не со всеми моделями), если у вас многоядерный процессор, что позволит сократить время на ее тренировку, т.к. на данный момент R работает только с одним ядром - гуглить "caret parallel".
      И по моему мнению в данном случае от glm модели можно полностью отказаться, она довольно плохо показывает себя при большом наличии факторных данных.

      Удалить
    4. я вам сделаю подсказку, но все таки рекомендую отдельно почитать про несбалансированность классов
      в xgboost есть параметр scale_pos_weight, который как раз отвечает за коррекцию балансировки

      к сожалению, в базовом пакете, то, что я вам давал, не заложен этот параметр, поэтому рекомендую перейти к новой форме тренировки модели на основе xgboost в R
      по ссылке хороший пример

      https://www.analyticsvidhya.com/blog/2016/03/complete-guide-parameter-tuning-xgboost-with-codes-python/

      Удалить
  2. а текучесть брали добровольную?
    отсекали тех, кого ушли?

    ОтветитьУдалить
    Ответы
    1. Не отсекал. Брал и тех кого уволили, и тех кто уволился.

      Удалить
    2. ха, рекомендую отсечь и взять в анализ только тех, кто сам ушел

      Удалить
    3. Попробую пересчитать на втором этапе.

      Удалить
  3. Логика простая: те, кто сами ушли, они сами принимали решение об уходе, те, кого ушли, не сами, поэтому драйверы будут, скорее всего, разные.
    смешивая вместе, вы убиваете влияние этих факторов

    ОтветитьУдалить
  4. у меня еще комментарий - вопрос: а что вы делали с теми, кто работает в компании менее года и не уволился?

    ОтветитьУдалить
    Ответы
    1. Отсек все строки, где не было даты увольнения.

      Удалить
    2. Не совсем верно!!!
      Вы прогнозируете проработает год или нет.
      И в этой логике вы должны оставить тех, кто работает, но проработал больше года
      Согласны?!

      Удалить
    3. С этим тоже согласен. Нужно отсекать тех, кто отработал меньше года. Стаж расчитываем от даты заполнения анкеты респондентом, верно?

      Удалить
    4. ну конечно: я же давал код, как заполнить пустые значения
      тут задача - посчитать стаж, для тех, кто работает, т.е. от даты заполнения анкеты отнять дату трудоустройства

      Удалить
    5. Верно, просто я отсеял вообще всех, кто не уволился. Что не правильно. Только это создаст еще больший дисбаланс выборки. Это ужа задача балансировки.

      Удалить
  5. Артем, у меня еще один комментарий) вы читаете еще?

    ОтветитьУдалить