Share |

понедельник, 4 декабря 2017 г.

Определение факторов включения сотрудников в кадровый резерв


В этом посте решается задача по управлению карьерным планированием внешних кандидатов при трудоустройстве и действующих сотрудников компании путём прогноза их включения в состав кадрового резерва по результатам тестирования.

Имеется 145 наблюдений по сотрудникам одной производственной компании принявшим участие в формировании кадрового резерва.
Методология включения в состав резерва предполагала успешное заполнение тестов интеллекта, мотивационного опросника и профессионального кейса. По итогам 20 сотрудников вошли в резерв компании.

Гипотеза: результаты батареи методик являются основанием включения сотрудника в состав кадрового резерва компании.

Датасет содержит следующие переменные:

$ Пол                      : Factor w/ 2 levels
$ Возраст                  : int 
$ Город                    : Factor w/ 7
$ Компания                 : Factor w/ 26 levels
$ Функция                  : Factor w/ 5 levels
$ Уровень.должности        : Factor w/ 2 levels
$ Стаж                     : int 
$ Мобильность              : Factor w/ 2 levels
$ Рекомендации.руководителя: Factor w/ 2 levels
$ IQ                       : int
$ Мотивация                : int 
$ Кейс                     : num
$ Общий.результат          : Factor w/ 2 levels

В качестве инструментов были использованы:

1. Тесты интеллекта CEB SHL (суммарный балл по вербальному и числовому тесту).
2. Мотивационный опросник CEB SHL (общий уровень мотивации является результатом сложения определенных шкал с последующим преобразованием Бокса-Кокса, z-нормированием и возвращением в T-баллы).
3. Профессиональные кейсы, составленные консалтинговой компанией.

1. Подготовка данных

Поскольку метрические данные датасета измеряются в различных оценка (T-баллы для тестов, проценты для кейсов, годы для возраста и стажа) осуществлён препроцессинг данных: преобразование Бокса-Кокса, z-нормирование и импутация пропущенных значений по мотивации и кейсам:

trans = preProcess(reserv1[, c("IQ","Мотивация","Кейс","Возраст","Стаж")], method = c("BoxCox", "center", "scale", "medianImpute"))
reserv1=predict(trans, reserv1)

Для проведения анализа данные датасета разделены на обучающие и тестовые:

set.seed(1)
split = sample.split(reserv1$Общий.результат, SplitRatio = 0.7)
train1 = subset(reserv1, split==TRUE)
test1 = subset(reserv1, split==FALSE)
  
2. Анализ

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

Call:
glm(formula = Общий.результат ~ Мотивация + IQ + Кейс + Мобильность, 
    family = binomial, data = train1)
 
Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.0557  -0.5549  -0.4038  -0.2592   2.3345  
 
Coefficients:
               Estimate Std. Error z value Pr(>|z|)    
(Intercept)     -2.2928     0.4977  -4.606  4.1e-06 ***
Мотивация        0.3391     0.3315   1.023   0.3063    
IQ               0.8812     0.3533   2.494   0.0126 *  
Кейс            -0.1529     0.3780  -0.404   0.6859    
МобильностьНЕТ   0.3409     0.6523   0.523   0.6013    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

В модели только одна переменная оказывается статистически значимой – это интеллект. Полученный коэффициент свидетельствует о том, что с ростом интеллекта на 1 единицу вероятность наступления события увеличивается на 0,88.

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


Для визуализации отличия группы вошедших в резерв (1), от не вошедших (0) по уровню интеллекта (шкала преобразована в z-баллы) данные представлены в виде боксплота:



Несовершенство модели демонстрируют построенные ROC-кривая
и график точность-полнота
  


Устанавливая вероятность наступления на уровне 0,2 на тестовых данных получен следующий результат:
 
     FALSE TRUE
  0    27   10
  1     3    3

То есть из включенных в итоге в состав резерва, на тестовых данных верно определено только 50%. Точность (Precision) при таких параметрах составляет 23%.

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

Coefficients:
               Estimate Std. Error z value Pr(>|z|)   
(Intercept)    -2.32175    0.52916  -4.388 1.15e-05 ***
Мотивация       0.01942    0.36334   0.053   0.9574   
IQ              0.58641    0.31801   1.844   0.0652 . 
Кейс            0.25552    0.40166   0.636   0.5247   
МобильностьНЕТ  0.58204    0.65069   0.894   0.3711   

Осуществляя улучшение модели в неё добавлялись прочие переменные, такие как: возраст, пол, стаж, функция, рекомендация руководителя. Все перечисленные переменные оказались статистически незначимы и не привели к положительному результату.

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

Call:
glm(formula = Мобильность ~ Мотивация + Пол + Возраст + Уровень.должности, 
    family = binomial, data = reserv1)
 
Coefficients:
                            Estimate Std. Error z value Pr(>|z|)  
(Intercept)                  0.38140    0.37006   1.031   0.3027  
Мотивация                   -0.49579    0.31301  -1.584   0.1132  
ПолМ                        -1.11093    0.59826  -1.857   0.0633 .
Возраст                      0.05313    0.22454   0.237   0.8129  
Уровень.должностиСпециалист -0.11768    0.46634  -0.252   0.8008  

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

 3. Выводы:

1. На основании имеющихся данных компания не может осуществлять прогноз включения сотрудника в состав кадрового резерва, а также ответить какой фактор был решающим для формирования действующего резерва.
2. Не исключено, что многие проблемы являются следствием крайне малого числа наблюдений. Следовательно, нужно больше данных собирать. J

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

  1. Александр, из картинки не следует фраза
    "То есть из включенных в итоге в состав резерва, на тестовых данных верно определено только 50%. Точность (Precision) при таких параметрах составляет 23%."

    ОтветитьУдалить
  2. Эдуард, не пойму:
    FALSE TRUE
    0 27 10
    1 3 3

    True positive rate: 3/(3+3)=0.5
    Precision: 3/(3+10)=0.23

    Или не так?

    ОтветитьУдалить
    Ответы
    1. да, простите, я ошибся. Меня смущает диаграмма пресижн реколл - у вас с уменьшением полноты падает точность - бред какой то. Не понимаю, как такое может быть

      Удалить
    2. Полагаю, что да - 20 положительных исходов при 145 наблюдениях.

      Удалить
    3. а зачем вы тогда делаете 10 фолдов? вы берете 70 %, это 14 событий и делите их еще на 10 фолдов, это 1,4 на папку.
      И хотите что-то получить.

      Сделайте 3 и 5 фолдов и посмотрите, что получится

      Удалить
    4. Это интересно - ничего не поменялось, коэффициенты и стат. значимость такая же.

      Удалить
    5. ну тогда попробуйте еще поработать как с несбалансированной выборкой, добавляете параметр sampling в кросс валидацию

      Удалить
    6. Этот комментарий был удален администратором блога.

      Удалить
    7. ну мне вас пинать, чтобы up добавили?)

      Удалить
    8. Ого, это при up:
      Estimate Std. Error z value Pr(>|z|)
      (Intercept) -0.669609 0.277468 -2.413 0.015810 *
      Мотивация 0.003335 0.179205 0.019 0.985151
      IQ 0.664832 0.176159 3.774 0.000161 ***
      Кейс 0.438549 0.199591 2.197 0.028003 *
      МобильностьНЕТ 0.856279 0.356394 2.403 0.016278 *

      По сути то, что мы делаем, что модель так меняется? Насколько это корректный результат?

      Удалить
    9. Я перевёл описание параметра sampling, но не врублюсь.

      Удалить
    10. а вы понимаете, что мы делаем при семплинге?
      я вам это говорил на семинаре. Причем, даже на примере аварийности и тестов ЛГТ

      Удалить
    11. Эдуард, то, что вы это говорили - я не сомневаюсь, я сомневаюсь в том, что я это правильно помню:) Очевидно это касается разбивки данных при CV, используется при несбалансированности групп, как я понял

      Удалить
    12. посмотрите результаты на тесте после up sampling
      тест не семплируем, конечно же

      Удалить
    13. При этом варианте почти все коэффициенты становятся значимыми:
      Estimate Std. Error z value Pr(>|z|)
      (Intercept) -0.6676 0.2800 -2.385 0.0171 *
      Мотивация 0.2026 0.1994 1.016 0.3097
      IQ 0.7746 0.1772 4.372 1.23e-05 ***
      Кейс 0.4026 0.1959 2.055 0.0399 *
      МобильностьНЕТ 0.7528 0.3579 2.103 0.0354 *
      ---

      Но почему-то не строится ROC и PR графики, так и должно быть?

      Удалить
    14. Всё, получились графики.

      FALSE TRUE
      0 30 7
      1 2 4

      Удалить
    15. Построил ROC, самый оптимальный вариант установления вероятности события на 0,7 тогда качество модели повышается до 0,44. Всё ещё очень плохо, но считай в 2 раза лучше, чем это было изначально

      Удалить
    16. а какая РОК АУК получилась? площадь под кривой?

      и я рекомендую попробовать применить семплинг через mlr - т.е. натренировать модель через mlr заново
      в этом пакете вы можете сами задать соотношение семплинга: насколько вы up делаете

      Удалить
  3. забавно, у вас в препроцессинге переменные "Возраст","Стаж" участвуют, а в модели пропадают)))

    ОтветитьУдалить
    Ответы
    1. Я на самом деле их вначале включил, но они не дали никакого результата, поэтому в итоге убрал это дело)

      Удалить
  4. Безусловно нужно обязательно делать балансировку данных, а именно тренировочного датасета, иначе алгоритм логистической регрессии будет пренебрегать меньшим классом.
    При этом, как вам уже выше заметили, проводить кросс-валидацию с такими параметрами не имеет смысла, достаточно уменьшить количество фолдов до 5.
    Также я заметил, что вы неверно трактуете коэффициенты линейной регрессии, а именно утверждение "с ростом интеллекта на 1 единицу вероятность наступления события увеличивается на 0,88" - ошибочно.

    ОтветитьУдалить
    Ответы
    1. Этот комментарий был удален автором.

      Удалить
    2. Почему? Какая интерпретация верная? Рост логарифма шанса события?

      Удалить
    3. Нет, это не рост логарифма шанса события, а рост логарифма отношения шанса события к шансу обратного события. Т.е никакую полезную интерпретацию из них вы не получите. Это легко проверить - вы можете подставить в формулу регрессии какое-то значение интеллекта, а потом подставить интеллект + 1 и увидеть, что разница в вероятности будет совсем иной. Более того, эта разница меняется нелинейно и зависит от конкретного значения Х. Поэтому для получения удобных для интерпретации коэффициентов используется такое понятие как "предельный эффект" (marginal effect), в R существует несколько библиотек, которые позволяют их подсчитать. Можно конечно их посчитать и вручную, но в этом случае нужно следить за тем, чтобы не запутаться в частных производных.

      Удалить
    4. Спасибо! Почитал поподробнее об этом.

      Удалить
  5. — Стаж скорее всего нужно разбивать на зоны, например до 3 лет от 3 до 5 итд. Данных не много, модель не сможет обучиться.
    — Как отсеивали параметры? Включили все и поочередно отсеивали? Какой уровень выключения выбрали 0.05, 0.1 ?
    — Возраст так же укрупнить в группы и перевести в фактор. Если в кейсе баллы, можно смотреть как укрупнять.
    — Вы говорите, что возраст и функция не значимы, поэтому не добавили. При это есть в модели параметры которые на значимы. Тогда нужно все убирать.
    — Попробуйте деревья или xgboost.
    Еще, как распределены 20 прошедших сотрудников по подразделениям? У них руководители у всех разные? Департаменты?

    ОтветитьУдалить
    Ответы
    1. Всё, что было выше 0,05 исключал, но ключевые переменные оставил, в принципе можно всё до простой модели с одним регрессом IQ довести. За xgboost браться не стал, потому как ещё не до конца понимаю. Да, 20 сотрудников из разных мест.

      Удалить

Популярные сообщения

п