После полученных замечаний к посту Определение факторов включения сотрудников в кадровый резерв от Эдуарда Бабушкина и коллег аналитиков пост был переработан.
За что всем огромное спасибо! Это лучший способ научиться.
1.
Подготовка
данных
Переменная возраст была включена по
причине синтаксиса R (не пропустил с одной переменной IQ).
В этом посте решается задача по
управлению карьерным планированием внешних кандидатов при трудоустройстве и
действующих сотрудников компании путём прогноза их включения в состав кадрового
резерва по результатам тестирования.
Имеется 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.
3. Профессиональные кейсы,
составленные консалтинговой компанией.
Поскольку метрические данные
датасета измеряются в различных оценках необходимо осуществить их препроцессинг. В первоначальном посте не было выявлено никакого влияния других метрических переменных на зависимую кроме IQ, поэтому препроцессингу была подвергнута только данная переменная. Важно отметить, что уровень мотивации и результаты кейсов не оказались статистически значимыми для итоговой модели.
trans
= preProcess(reserv1[, c("Возраст","IQ")], method
= c("BoxCox", "center", "scale", "medianImpute"))
reserv1=predict(trans, reserv1)
Для проведения анализа данные
датасета разделены на обучающие и тестовые в соотношении 70/30%:
set.seed(1)
split
= sample.split(reserv1$Общий.результат, SplitRatio = 0.7)
train1
= subset(reserv1, split==TRUE)
test1
= subset(reserv1, split==FALSE)
2. Анализ
По сути, включение или не
включение сотрудника в состав кадрового резерва – это задача классификации и
соответственно решается она через построение логистической регрессии.
Аналитиками был отмечен
несбалансированный характер данных, так как при ограниченном количестве наблюдений
(145) только 20 исходов являлись положительными, в связи с чем произведена
балансировка данных и установлены параметры кросс-валидации (3 папки по 5
повторов):
fitControl1 = trainControl(method = "repeatedcv", number = 3, repeats = 5,sampling = "up")
После поэтапного отключения
статистически незначимых переменных, в качестве независимых переменных остаётся IQ и мобильность, тогда итоговая модель принимает вид:
logreg <- train(Общий.результат~IQ+Мобильность, data=train1, method="glm",metric='Accuracy',trControl = fitControl1, family="binomial")
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -0.6682 0.2770 -2.412 0.0159 *
IQ 0.7959 0.1838 4.330 1.49e-05 ***
МобильностьНЕТ 0.8069 0.3453 2.337 0.0194 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Важно, что мобильность в теоретическом
конструкте кадрового резерва являлась важным условием участия, но построенная модель
говорит о том, что отношение шансов включения в резерв против невключения
равняется exp(0.8069) = 2,24 в случае неготовности сотрудника к переезду.
При этом важным фактором всё
равно является только IQ:
Далее приводится анализ качества модели:
1. ROC-кривая
Площадь под кривой =
0.83.
2. График Точность-полнота
Исходя из ROC-кривой и графика P-R установлена вероятность
наступления события на уровне 0,5. На тестовых данных получен следующий результат:
FALSE TRUE
0 26 11
1 0 6
Точность (Precision) модели при таких параметрах составляет 35%.
В первом посте проверялась гипотеза по классификации мобильности, но поскольку она была не доказана, то анализ был исключён.
Далее данные проверяются на новых (условных) сотрудниках.
В связи с тем, что модель была подвергнута препроцессингу тоже самое осуществляется в отношении новых данных:
> newCandidate = data.frame(Возраст=32, IQ=100, Мобильность="НЕТ")
> newdudeTrans = predict(trans, newCandidate)
> predict(logreg, type="prob", newdata=newdudeTrans)
0 1
1 0.3823303 0.6176697
Новый сотрудник вероятно войдёт в
кадровый резерв компании, а вот у его мобильного коллеги,
при прочих равных условиях, как это ни парадоксально, скорее всего меньше шансов попасть в резерв:
> newCandidate = data.frame(Возраст=32, IQ=100, Мобильность="ДА")
> newdudeTrans = predict(trans, newCandidate)
> predict(logreg, type="prob", newdata=newdudeTrans)
0 1
1 0.581091 0.418909
3. Выводы:
1. Построенная модель оказалась статистически значимой, но при этом с крайне низкой точностью. Кроме того, перестройка модели приводит к тому, что переменная мобильность может становиться незначимой. Вероятно, что данные проблемы являются следствием ограниченного набора данных.
2. При этом инсайт касается противоречия полученных данных с теоретическим конструктом, то есть изначально положительный фактор мобильности, который должен был увеличивать вероятность включения в резерв, в конечном итоге снижает её.
все таки очень странно, что стаж не вошел в модель
ОтветитьУдалитьОн ухудшал модель
УдалитьАлександр, а какие-нибудь параметры оценки результатов деятельности? Возраст? - изначально не брали?
ОтветитьУдалитьа могли бы вместе быть на семинаре с Александром:)
Удалить