.

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

Показаны сообщения с ярлыком survival analysis. Показать все сообщения
Показаны сообщения с ярлыком survival analysis. Показать все сообщения

воскресенье, 15 ноября 2020 г.

Анализ дожития / Survival analysis (в HR). Он-лайн курс

Представляю свой он-лайн курс Анализ дожития / Survival analysis

Анализ дожития / Survival analysis (в HR). Он-лайн курс

Если верить Wiki, Анализ дожития или выживаемости (англ. survival analysis) — класс статистических моделей, позволяющих оценить вероятность наступления события. Анализ дожития пошел из медицины, но наш курс построен на кейсах в HR. Анализ дожития в HR может применяться в задачах

  • Текучесть персонала - расчет среднего срока жизни сотрудника (медианы дожития), выявление факторов текучести персонала, построение моделей (и отдельно рекомендую посмотреть запись открытого вебинара Новый взгляд на текучесть персонала);
  • Карьерные треки - как быстро созревают сотрудники до карьерного перемещения, факторы карьерного роста
  • Скорость закрытия вакансий и т.д...

Не в HR дожитие применяется в сферах

  • В производстве – выход из строя деталей, оборудования
  • В продажах – удержание клиентов 
  • Скорость продаж квартир / не только квартир  
  • Возврат кредитов
  • Медицина
Видеоанонс курса


Требования к подписчикам курса

  1. Владение R / Rstudio (см. Он-лайн курс "Введение в R для HR"
  2. Знание матстатистике на уровне понимания и умения строить линейную / логистическую регрессию

Содержание 

Всего в курсе 9 видеолекций общей продолжительностью 3 часа (176 минут), 4 скрипта с кодом, 4 файла в формате csv с данными. 
  1. Почему Анализ Дожития / Выживаемости? Формат данных
  2. Функции риска и дожития
  3. Процедура Каплан-Майер (код в R)
  4. Лог-ранк тест (код в R)
  5. Регрессия пропорциональных рисков Кокса (код в R) 
  6. Сравнение Лог-ранк, регрессии Кокса, параметрических моделей
  7. Параметрические модели дожития (Accelerated failure time models) (код в R) 
  8. Что не вошло в курс, куда двигаться дальше
  9. Аппендикс. Дашборд скорость закрытия вакансий в PowerBI (код в R)

Стоимость курса

Для физлиц - 5 800 рублей основная цена
1 000 рублей, если вы закончили Он-лайн курс "Введение в R для HR"
для юрлиц обсуждается индивидуально (зависит от числа обучающихся и т.п.)


понедельник, 29 января 2018 г.

Как прохождение электронного курса влияет на выживаемость персонала



Как прохождение электронного курса влияет на выживаемость персонала


Зачем это все?


Приветствую, коллеги. В данном посте я хочу рассказать вам о том, как я решал (и еще решаю) задачу анализа выживаемости персонала в зависимости от того, пройден или нет электронный курс. Главный гость нашего набора данных - электронный вводный курс, который назначается 80% сотрудников компании.

Может возникнуть вопрос: "Зачем?". На деле в компании достаточно много дистанционных программ обучения и хочется понимать насколько они влияют на сотрудников и может ли данный вид обучения влиять на продолжительность работы сотрудников.

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

Про набор данных


Я использовал язык Python и библиотеки lifelines и patsy. На деле существует еще одна библиотека для анализа выживаемости scikit-survival, но с ней я еще не работал, хотя говорят, что она достаточно хороша.

Я пропущу описание процесса предварительной обработки данных. После всех манипуляций набор выглядел так:

<class 'pandas.core.frame.DataFrame'>
Int64Index: 10902 entries, 2 to 11162
Data columns (total 13 columns):
person_fullname      10902 non-null object
person_department    10902 non-null object
position_name        10902 non-null object
hire_date            10902 non-null datetime64[ns]
dismiss_date         10902 non-null datetime64[ns]
course_start_date    10902 non-null datetime64[ns]
course_end_date      10902 non-null datetime64[ns]
score                10902 non-null float64
status               10902 non-null object
sex                  10902 non-null category
is_dismiss           10902 non-null bool
job_exp              10902 non-null int64
time_course          10902 non-null int64
В наборе 10902 наблюдения.
Попробуем оценить функцию выживаемости с помощью lifelines


duration= data_bts.job_exp
event = data_bts.is_dismiss

from lifelines import KaplanMeierFitter
kmf = KaplanMeierFitter()
kmf.fit(duration, event)

kmf.survival_function_.plot(xticks=np.arange(0, 5500, 200), yticks=np.arange(0,1.1, 0.1),
                            figsize=(15, 10), color='blue');
plt.show()

Вот что получилось:


На графике видно, что рубеж в 175 дней преодолевает практически 80%, и 35% сотрудников преодолевает рубеж в 1,5 года. Медиана равна 466 дней.

Проверим, верно ли мы интерпретировали график:

print(kmf.median_) - 469
print(kmf.survival_function_.KM_estimate[175]) - 0.803675249511
print(kmf.survival_function_.KM_estimate[547]) - 0.350953224329

Построим функцию угрозы используя процедуру Нельсон-Аалена:

from lifelines import NelsonAalenFitter naf = NelsonAalenFitter() naf.fit(duration, event) naf.plot(xticks=np.arange(0, 5500, 200), figsize=(15, 10), c='blue') plt.show()


На графике видно, что после 400 дней риск увольнения резко возрастает.

А теперь сравним, тех кто прошел электронный курс и тех кто не прошел:

status = data_bts.status
mask = (data_bts.status == 'Пройден')

kmf.fit(duration[mask], event[mask], label='Пройден')
ax = kmf.plot(xticks=np.arange(0, 5500, 200), yticks=np.arange(0,1.1, 0.1), 
                            figsize=(15, 10), c='g');

kmf.fit(duration[~mask], event[~mask], label='Не пройден')
kmf.plot(ax=ax, c='r')
plt.show()

Что же мы видим? Продолжительность жизни в компании у тех кто не прошел электронный курс выше, чем у тех кто прошел.

Не будем верить тому, что видим и проверим это с помощью лог ранк теста:

from lifelines.statistics import logrank_test
mask = (data_bts.status == 'Пройден')

results = logrank_test(duration[mask], duration[~mask], event[mask], event[~mask], alpha=.95 )
results.print_summary()

Results
   t 0: -1
   test: logrank
   alpha: 0.95
   null distribution: chi squared
   df: 1

   __ p-value ___|__ test statistic __|____ test result ____|__ is significant __
         0.00000 |            124.084 |      Reject Null    |        True    

Судя по уровню значимости, который очень мал (для любопытных: 3.726650854557449e-29) мы можем отвергнуть нашу нулевую гипотезу. Получается, что те кто прошел электронный курс имеют больший шанс покинуть компанию, чем те кто не прошел.

Аддитивная модель Аалена


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

Построим нашу модель:

from lifelines import AalenAdditiveFitter
aaf = AalenAdditiveFitter(coef_penalizer=1.0, fit_intercept=True)

Импортируем библиотеку patsy для создания дизайн-матрицы факторов. К слову в scikit-learn аналогом этого являются dummie переменные.

import patsy
bts_factor_matrix = patsy.dmatrix('person_department + position_name + score + time_course -1', data_bts, return_type='dataframe')

Создадим новые признаки в нашей матрице

bts_factor_matrix['duration'] =  data_bts.job_exp
bts_factor_matrix['event'] = data_bts.is_dismiss

Настроим нашу модель

aaf.fit(bts_factor_matrix, 'duration', 'event')

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

from lifelines.utils import k_fold_cross_validation
score = k_fold_cross_validation(aaf, bts_factor_matrix, 'duration', 'event', k=10)
print(np.mean(score))
print(np.std(score))

Точность нашей модели равна 0,66 со стандартным отклонением 0,04. 

Вывод:


Можно сказать, что качество нашего алгоритма получилось не очень хорошим. Средняя точность по всем итерациям равна 0,66. Скорее всего необходимо сделать более качественный feature engineering и добавить в модель больше признаков. Очевидно, что в модель необходимо включать разные курсы и делить их по категориям.





среда, 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».