.

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

вторник, 5 марта 2019 г.

Как считать текучесть персонала в R/Rstudio (кейс на примере конкретной компании)



Это по сути повторение поста Как считать текучесть персонала в excel (кейс на примере конкретной компании) с той лишь разницей, что я считаю текучесть в R / Rstudio.
Я беру тот же самый файл, что ив приведенном посте.
И считаю текучесть я в соответствии с российским законодательством:
число уволенных работников за отчетный период / среднесписочная численность работников за отчетный период.
И среднесписочная считается так:
Среднесписочная численность работников "за отчетный месяц исчисляется путем суммирования численности работников списочного состава за каждый календарный день отчетного месяца, т.е. с 1 по 30 или 31 число (для февраля - по 28 или 29 число), включая праздничные (нерабочие) и выходные дни, и деления полученной суммы на число календарных дней отчетного месяца.
Численность работников списочного состава за выходной или праздничный (нерабочий) день принимается равной списочной численности работников за предшествующий рабочий день. При наличии двух или более выходных или праздничных (нерабочих) дней подряд численность работников списочного состава за каждый из этих дней принимается равной численности работников списочного состава за рабочий день, предшествовавший выходным или праздничным (нерабочим) дням." Консультант плюс

Решение

Если Вы хотите овладеть языком R, рекомендую свой он лайн курс Он-лайн курс "Введение в R для HR"
После загрузки данных, дату поступления и дату увольнения конвертируем в переменную типа Дата.
df$begin = as.Date(df$Дата.поступления, "%d.%m.%Y")
df$end = as.Date(df$дата.увольнения, "%d.%m.%Y")
df$end[is.na(df$end)] =  "2018-05-30 UTC" 
Последняя строка здесь - я заполнил пустые ячейки дат увольнения (пустые, потому что эти работники продолжают работать) датой выгрузки отчета. И формула
n  = NULL;
m = NULL;
for(i in seq(as.Date('2018-01-01'), as.Date('2018-01-31'), by = 'day')) {
  x = length(which(i == df$end))
  m = rbind(m, x)
  y = length(which(df$begin < i))-length(which(i > df$end))
  n  = rbind(n, y)
 }
print(sum(m)/mean(n))
Здесь:
seq(as.Date('2018-01-01'), as.Date('2018-01-31'), by = 'day')
это последовательность дней месяца
m - это количество уволенных в день месяца;
n - среднесписочная за день.
Потом мы делим количество уволенных за месяц на среднесписочную за месяц. У меня за январь 2018 года текучесть получилась 0.01064467. Или 1, 06 %.
В предыдущем посте за тот же период текучесть персонала по формуле в excel получилась 0.010644666 - ну т.е. мы получили одинаковые цифры.
В Rstudio мне кажется считать текучесть удобнее, поскольку не нужно по каждому месяцу рисовать портянку. Задал в seq нужные даты и посчитал за 1,2 секунды. Причем, мы ведь можем считать не только за месяц, но и за два месяца, квартал, год и т.п...
Давайте усовершенствуем
Можно зашить расчеты в формулу
turnover = function(data, date_begin, date_end) {
  n  = NULL;
  m = NULL;
  for(i in seq(as.Date(date_begin), as.Date(date_end), by = 'day')) {
    x = length(which(i == df$end))
    m = rbind(m, x)
    y = length(which(df$begin < i))-length(which(i > df$end))
    n  = rbind(n, y) }
  print(sum(m)/mean(n))
}

И мы можем получить результат, где df - наши данные, первая дата - начала периода, вторая дата - конец периода.
turnover(df, '2018-01-01', '2018-01-31')
[1] 0.01064467


Диаграмма текучести

Но мы могли бы сразу настроить построение диаграммы. Например, я хочу построить график текучести помесячно. Я  создаю новую формулу.
turn_plot = function(data, date_begin, date_end) {
  n  = NULL;
  m = NULL;
  for(i in seq(as.Date(date_begin), as.Date(date_end), by = 'day')) {
    x = length(which(i == df$end))
    m = rbind(m, x)
    y = length(which(df$begin < i))-length(which(i > df$end))
    n  = rbind(n, y) }
  
  a =format(seq(as.Date(date_begin), as.Date(date_end), by = 'day'), '%m.%Y')
  
  gh = data.frame(tapply(m/n,a, sum ))
  gh$date = row.names(gh)
  colnames(gh) = c('num', 'date')
  gh$num = as.numeric(gh$num)
  library(ggplot2)
  library(scales)
  ggplot(data=gh, aes(x=date, y=num)) + geom_bar(stat="identity", color="blue", fill="white") +
    geom_text(aes(label=scales::percent(num, accuracy = 0.001)), vjust=-0.1, size=6.5) +
    theme_grey(base_size = 30) 
  
}
И я задаю даты за 4 месяца
 
turn_plot(df, '2018-01-01', '2018-04-30') # только имейте ввиду, что дата '2018-04-31' выдаст ошибку
И мы получаем
Как считать текучесть персонала в R/Rstudio (кейс на примере конкретной компании)


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

 __________________________________________________________
 На этом все, читайте нас в фейсбуке, телеграмме и вконтакте

Комментариев нет:

Отправить комментарий