.

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

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

Анализ дожития: как предсказывать увольнения сотрудников и что на это влияет



Данная статья подготовлена для учебных целей. Любые совпадения с реальными бизнесами или компаниями являются случайными.

Рекомендую курсы


Задача
Наша задача состоит в следующем. Проанализировать данные по уволенным сотрудникам и выявить факторы, которые влияют на уход. А также визуализировать полученный результат и сделать выводы.

О подходе
Мы будем использовать такой инструмент, как анализ дожития или анализ выживаемости (survival analysis).

Анализ выживаемости – это в широком смысле построение статистических моделей, в которых эффект y (отклик) является функцией независимых переменных (х; t), где х – это уровень воздействия и/или факторы, которые влияют на время «жизни» изучаемых объектов t.

А если говорить более конкретно о методе, то это мы будем использовать регрессию Кокса.

Данный метод позволяет ответить на вопрос: с какой вероятностью и как долго сотрудник проработает до наступления определенного события (например, увольнение или назначение). А также найти драйверы, которые увеличивают или уменьшают время до наступления определенного события.

Для тех, кто дочитает всю статью до конца, будет несколько инсайтов от меня относительно данного инструмента.

Данные
Мы будем анализировать данные компании об увольнениях и назначениях сотрудников за последние несколько лет. Загрузить датасет в R, а также посмотреть его содержание, можно так:

q1 <- read.table("staff.csv", header = TRUE, sep = ";", na.strings = c("",NA), stringsAsFactors=FALSE)
str(q1)
head(q1)


Мы видим, что у нас есть 303 наблюдения. Также мы видим формат данных всех наших переменных.

В датасете у нас есть следующие данные:
  • Номер – порядковый номер наблюдения
  • Пол – пол сотрудника
  • Учился – бинарная переменная, которая говорит нам о том, проходил ли какое-либо обучение сотрудник компании (1), или нет (0)
  • Дата приема, Дата увольнения и Дата назначения

Подготовка данных
Для проведения анализа дожития по нашим увольнениям, первое, что нам нужно сделать, так это добавить новую переменную event, которая будет отвечать на вопрос: наступило ли событие (т.е. увольнение или нет).
event = 1 – сотрудник уволился,
event = 0 – сотрудник не уволился.

Давайте это и сделаем.

q1$event = 1
q1$event[is.na(q1$Дата.увольнения)] = 0

Чтобы посмотреть результат работы предыдущих строк кода, давайте посмотрим на таблицу:


table(q1$event)

Данная таблица показывает, сколько у нас сотрудников уволились (т.е. событие наступило = 49), и сколько сотрудников продолжают работать (т.е. событие не наступило = 254).

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

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

В переменной stag у нас получилось кол-во месяцев работы в компании начиная с даты приема и заканчивая датой увольнения или датой формирования датасета.

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

Мы завершили подготовку наших данных для анализа дожития.

А именно, у нас есть переменные:
stag – это количество месяцев до наступления события,
event – событие наступило или нет (1 – наступило, 0 – нет).

Анализ дожития
Для своего анализа мы будем использовать регрессионную модель – это модель пропорциональных рисков Кокса (Cox proportional hazards model). Построить такую модель в R можно одно строчкой кода:

Первая строка кода строит саму модель регрессии Кокса. Вторая – выводит результат на экран. Здесь важно отметить, что в данной модели у нас еще нет никакого фактора, который мы бы изучали. Запись «~1» в формуле означает, что мы строим модель без факторов. Такая модель позволит посмотреть на общую картину увольнений по компании.

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

library(survminer)
ggsurvplot(survfit(w1), palette = "#2E9FDF",ggtheme = theme_minimal(),
           title = "График дожития (анализ увольнений)",
           xlab = "Кол-во месяцев до увольнения")

Что нам показывает данный график?

По оси Y у нас вероятность дожития (т.е. наступления события, которое мы изучаем).

По оси X у нас стаж в месяцах наших сотрудников.

Толстая синяя линия показывает средний срок «жизни» в компании. А закрашенная голубая область 95%-ый доверительный интервал.

Трактуется данная кривая следующим образом. Вероятность, что сотрудник проработает в компании 60 месяцев (5 лет) – смотрим на ось Х, составляет чуть больше 0,5 – смотрим на ось Y.

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

quantile(survfit(w1))

Средний срок «жизни» в компании равняется почти 65 месяцев (выделено красной пунктирной линией в полученной таблице).

Анализ факторов
Мы уже посмотрели общую картину в компании по увольнениям. Теперь давайте посмотрим, как обучение влияет и влияет ли на текучесть персонала.
Для этого у нас в датасете есть переменная «Учился».

Это бинарная переменная: 1 – если сотрудник проходил какие-либо программы обучения в компании и 0 – если сотрудник не проходил никакого обучения.

Давайте посмотрим на распределение данной переменной.

Теперь давайте построим модель Кокса и выведем результат:

w1 = coxph(Surv(stag, event) ~ as.factor(Учился) , data = q1)
summary(w1)

Из этого итога мы можем увидеть, что наш фактор «Учился» оказался значимым (р=0.00351) – выделено красной пунктирной линией.

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

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

Давайте визуализируем полученный результат. Это можно сделать при помощи следующего кода.

e = survfit(w1, newdata=data.frame(Учился = c(1, 0)))
ggsurvplot(e, legend.labs=c("Учился","Не учился"),
           ggtheme = theme_bw(), palette = c("#E7B800", "#2E9FDF"),
           title = "График дожития (анализ увольнений)",
           xlab = "Кол-во месяцев до увольнения")

Данный график нам еще раз показывает, что те сотрудники, которые обучаются в компании, работают дольше – желтая верхняя линия. Например, вероятность, что сотрудник, который обучался, проработает 48 месяцев (4 года) составляет почти 80%. А сотрудник, который не обучался, проработает 4 года с вероятностью чуть ниже 50%.

Или можем по-другому посмотреть на этот график. Например, сотрудник, который не учился, проработает в компании с вероятностью 60% чуть больше 3-х лет. А сотрудник, который проходил обучение с вероятностью 60% проработает уже почти 5-ть лет.

А теперь давайте посмотрим на фактор пола.


Как видно из итога, фактор пола получился незначимым для увольнений (р=0,179).

Давайте визуализируем полученный результат:


Мы видим, что наши две линии (Ж и М) находятся довольно близко друг к другу и их рисунок практически идентичный.

А теперь давайте посмотрим на два фактора вместе. Для этого в нашу формулу добавим и фактор Пола, и фактор Обучения в компании (Учился).

Первое, мы видим что теперь оба фактора оказались значимыми (р=0,001 и р=0,0395).

Второе, если человек учился, то это понижает риск увольнения. Об этом говорит знак минус возле коэффициента фактора Учился. И наоборот, отсутствие знака минус возле коэффициента фактора Пол (м) говорит о том, что, будучи мужчиной, риск увольнения сотрудника в данной компании увеличивается.

Давайте добавим все четыре возможных комбинации наших факторов и изобразим результаты на графике.

У нас могу быть следующие комбинации:
·        Ж, проходила обучение
·        М, проходил обучение
·        Ж, не проходила обучение
·        М, не проходил обучение

e <- survfit(w1, newdata=data.frame(Пол = c("ж", "м", "ж", "м"), Учился = c(1, 1,0,0)))
ggsurvplot(e, conf.int = F, legend.labs=c("Ж - Обучалась", "М - Обучался","Ж - Не обучалась ", "М - Не обучался"),
           break.x.by= 12, break.y.by= 0.2,xlim= c(0,108),
           ggtheme = theme_bw(),
           title = "График дожития (анализ увольнений)",
           xlab = "Кол-во месяцев до увольнения")

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

Для продвинутых
В процессе работы с моделью рисков Кокса наткнулся на еще один аналогичный метод. Он называется Модели ускоренного времени AFT (Accelerated failure-time models).

Метод АFT является альтернативой модели Кокса. Модели AFT разработаны, исходя из некоторого предположения о теоретическом распределении времени жизни. Данное предположение заключается в том, что изменение объясняющих переменных сопряжено с изменением масштаба времени наблюдаемого состояния объекта: т.е. ускорением или замедлением наступления момента изучаемого события.

В R параметрические AFT-модели могут быть построены очень легко при помощи функции survreg(). Давайте мы построим несколько аналогичных моделей с изучением наших двух факторов (Пол и Учился) с использованием различных видов распределений: exponential, weibull, lognormal, logistic и gaussian. А затем сравним все эти модели с нашей моделью Кокса и выберем лучшую.
Все это можно сделать при помощи следующего кода:

В результате мы получим следующую таблицу:

В этой таблице мы видим рассчитанные по каждой модели логарифм правдоподобия и AIC-критерий. Наилучшей модели будет соответствовать максимальная оценка правдоподобия или минимальный AIC-критерий.

Модель Кокса имеет самый минимальный AIC-критерий из всех шести протестированных моделей.

Выводы
Анализ выживаемости или анализ дожития (survival analysis) очень интересный и полезный инструмент. Данный метод позволяет выявлять факторы, которые влияют на текучесть сотрудников компании.

Построить модель регрессии Кокса и потом ее понятно визуализировать крайне просто в R. И что немаловажно, такие расчеты и такие итоги вашего исследования внутри компании очень легко объяснить бизнесу и «продать» их внутри.

И еще обещанные вначале статьи мои инсайты.
Работая с данным инструментом (survival analysis) я понял, что:
  1. Начать его применять может практически любая компания и любой HR уже завтра из-за его простоты и понятности. Что необходимо, так это немного усидчивости и данные по вашим сотрудникам.
  2. Данный инструмент позволит ВАМ уже СЕГОДНЯ найти те факторы, которые влияют на текучесть ВАШИХ сотрудников в ВАШЕЙ компании. Т.е. не читать исследования каких-то других специалистов из каких-то других компаний и потом примерять их выводы к вашей компании и к вашим сотрудникам. А найти именно ВАШИ драйверы, которые влияют именно на ВАШУ текучесть.


Р.S.: Ну и еще один вывод по итогам данного исследования – обучайте ваших сотрудников и тогда они проработают у вас дольше! J

Р.S.1.: Делаю для себя задел на будущее для следующей статьи. Провести анализ дожития, например, назначений. Т.е. будем искать факторы, которые драйвят наши назначения.

Используемые источники при подготовке статьи: В.К. Шитиков «Экотоксикология и статистическое моделирование эффекта с использованием R».

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

  1. Евгений, гамлетовский вопрос: а может быть не работают дольше, потому что учатся, а, наоборот, учатся, потому что работают дольше?

    ОтветитьУдалить
  2. Да, вопрос на засыпку: курица и яйцо)
    Может стоит посмотреть на коротком промежутке. Например, до года.

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

      Удалить
    2. Даты можно достать. А что?

      Удалить
    3. я сейчас не вспомню, где, но со временем достану код аналогичной задачи: в Америке смотрели рецидивы совершения преступления выпущенными на свободу преступниками.
      И там был фактор: нашел работу или нет
      Соответственно, этот код можно применить под вашу задачу.
      На словах я вам не смогу объяснить, там потребуется перевод данных из wide формат в long формат

      Удалить
    4. и еще посмотрите фишку в регрессии Кокса - strata - вы пишете as.factor(Учился)+ strata(Пол)
      и машинка вам ответит на вопрос, как фактор обучения сказывается отдельно по М и Ж

      Удалить
  3. А вероятность прохождения обучения у всех исследуемых одинакова? Есть ведь вариант, когда не обучение влияет на срок дожития, а на дожитие и обучение влияет третий фактор. например самомотивация. У кого она есть - те учатся и долго работают, у кого ее нет - не учатся и часто меняют места работы. Поэтому надо в исследование вводить факторы, влияющие на прохождение обучения - например причину обучения.

    ОтветитьУдалить
  4. Добрый день.
    Картинки не отображаются. Есть возможность обновить ссылки?

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