Задача

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

В отчете также проводится симуляция, которая поможет оценить потенциальный эффект от предложенных мер.

Анализ

Данные и логика анализа

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

В данном отчете мы предлагаем проанализировать только часть сотрудников, а именно тех, кто работает в компании хотя бы 3 года. Предлагаем исходить из предположения о том, что компания должна быть особенно озабочена в ситуациях, когда её покидают сотрудники, проработавшие в ней достаточное количество времени.Поэтому предлагаем поделить всех сотрудников на тех, кто проработал в компании как минимум 3 года (их около 800) и тех, кто проработал менее трёх лет (их около 200). Мы бы хотели проанализировать первых, так как вторые, отработавшие меньше, могут менять место работы потому что проработали в компании слишком мало времени и ещё не развили в себе “идентичность с ней”, предположительно пока что менее к ней лояльны, не совсем освоились и т.д. А если сотрудник проработал в компании минимум 3 года, освоился в ней, но по какой-то причине всё таки решил уйти - это уже повод для беспокойства.

В работе tenure будет означать количество лет, которое сотрудник проработал в компании. Long tenure - сотрудник проработал 3 года и более, short tenure - менее трёх лет. Для переменной Attrition (покинул ли сотрудник компанию) значение 1 означает, что покинул, а значение 0 - не покинул.

yeem = dbGetQuery(con, "
SELECT Attrition,YearsAtCompany 
FROM 
    portfolio")

yeem = yeem %>% filter(YearsAtCompany > 0) %>% mutate(Tenure = case_when(YearsAtCompany >= 3 ~ "Long", T ~ 'Short'))

ggplotly(ggplot(yeem, aes(x = Tenure, fill = as.factor(Attrition))) + geom_bar() + labs(y = "", title = "Распределение количества сотрудников по количеству проработанных \nв компании лет", subtitle = "Три и более лет (Long tenure) и менее трёх лет (Short tenure)") + scale_fill_discrete(labels = c("Нет", "Да"), name = "Покинул ли сотрудник \nкомпанию?"))

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

На графике ниже видно, что сотрудники, проработавшие в компании менее трёх лет, почти в 3 раза чаще покидают компанию.Это может частично подтверждать нашу гипотезу

ggplotly(ggplot(yeem) + geom_bar(aes(x = Tenure, fill = as.factor(Attrition)), position = "fill") + labs(y = "",title = "Распределение склонности сотрудника покинуть компанию \nот количества проработанных лет", subtitle = "Три и более лет (Long tenure) и менее трёх лет (Short tenure)") + scale_fill_discrete(labels = c("Нет", "Да"), name = "Покинул ли сотрудник \nкомпанию?"))

Хотя график даёт нам достаточно явные основания для вывода, проверим их ещё статистически.

ch = chisq.test(as.factor(yeem$Attrition), yeem$Tenure)
ch
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  as.factor(yeem$Attrition) and yeem$Tenure
## X-squared = 31.622, df = 1, p-value = 1.873e-08
ch$stdres
##                          yeem$Tenure
## as.factor(yeem$Attrition)      Long     Short
##                         0  5.726823 -5.726823
##                         1 -5.726823  5.726823

Критерий хи-квадрат и стандартизированные остатки показывают, что сотрудники, проработавшие в компании менее трёх лет, действительно намного более склонны покидать компанию.

Чтобы проверить нашу гипотезу о “сотрудниках-кочевниках” с другой стороны, также предлагаем посмотреть на то, как связаны вероятность покинуть компанию с тем, в скольких компаниях в принципе работал сотрудник. Мы предполагаем, что работа в большом количестве компаний может быть свидетельством склонности сотрудника “кочевать” (хотя в этом анализе мы не берем в рассчет возраст сотрудника, который тоже может сильно влиять на количество компаний, в которых он работал).

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

numc = dbGetQuery(con, "
SELECT port.Attrition, prof.NumCompaniesWorked 
FROM 
    portfolio as port
JOIN 
    profile as prof ON port.EmployeeNumber = prof.EmployeeNumber")

ggplotly(ggplot(numc, aes(x = as.factor(Attrition), y = NumCompaniesWorked)) + geom_boxplot() + labs(title = "Взаимосвязь вероятности того, что сотрудник покинет компанию \nс количеством компаний, в которых он работал", subtitle = "Три и более лет (Long tenure) и менее трёх лет (Short tenure)", x = "Покинул ли сотрудник компанию", y = "Количество компаний, в которых работал сот-к") +scale_x_discrete(labels = c("Нет", "Да")))

Проведенный ниже статистический анализ показывает, что взаимосвязи между количеством компаний, в которых работал сотрудник и его вероятностью покинуть компанию нет (p-value = 0,12). Однако видно, что покинувшие компанию сотрудники в среднем за свою жизнь работают в чуть большем числе компаний (2,9 компаний за жизнь), чем те, кто нашу компанию не покинул (2,7 компаний за жизнь)

describeBy(numc$NumCompaniesWorked, as.factor(numc$Attrition), mat = TRUE) %>% 
  select(Attrition = group1, N = n, Mean = mean, SD = sd, Median = median, Min = min, Max = max, 
         Skew = skew, Kurtosis = kurtosis, st.error = se) %>% 
  kable(align = c("lrrrrrrrrr"), digits = 2, row.names = FALSE, caption = "Взаимосвязь покидания компании и количества компаний, в которых работал сотрудник")
Взаимосвязь покидания компании и количества компаний, в которых работал сотрудник
Attrition N Mean SD Median Min Max Skew Kurtosis st.error
0 879 2.66 2.49 2 0 9 1.04 0.11 0.08
1 179 2.92 2.70 1 0 9 0.86 -0.59 0.20
yes = numc %>% filter(Attrition == 1)
no = numc %>% filter(Attrition == 0)

t.test(yes$NumCompaniesWorked, no$NumCompaniesWorked, alternative = "greater")
## 
##  Welch Two Sample t-test
## 
## data:  yes$NumCompaniesWorked and no$NumCompaniesWorked
## t = 1.1523, df = 243.26, p-value = 0.1252
## alternative hypothesis: true difference in means is greater than 0
## 95 percent confidence interval:
##  -0.1090249        Inf
## sample estimates:
## mean of x mean of y 
##  2.916201  2.664391

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

Проведенный ниже анализ подтверждает нашу гипотезу, чем дольше сотрудник работает в компании, тем менее он склонен её покидать.

Так как нормальность распределения переменной “YearsAtCompany” вызывает сомнения, был проведён и параметрический, и непараметрический тест.

numy = dbGetQuery(con, "
SELECT Attrition, YearsAtCompany
FROM 
    portfolio")

ggplotly(ggplot(numy, aes(x = as.factor(Attrition), y = YearsAtCompany)) + geom_boxplot() + labs(title = "Взаимосвязь вероятности того, что сотрудник покинет компанию \nи количества лет сотрудника в компаниии", subtitle = "Три и более лет (Long tenure) и менее трёх лет (Short tenure)", x = "Покинул ли сотрудник компанию", y = "Количество лет в компании") +scale_x_discrete(labels = c("Нет", "Да")))
describeBy(numy$YearsAtCompany, as.factor(numc$Attrition), mat = TRUE) %>% 
  select(Attrition = group1, N = n, Mean = mean, SD = sd, Median = median, Min = min, Max = max, 
         Skew = skew, Kurtosis = kurtosis, st.error = se) %>% 
  kable(align = c("lrrrrrrrrr"), digits = 2, row.names = FALSE, caption = "Взаимосвязь покидания компании и количества лет, отработанных сотрудником")
Взаимосвязь покидания компании и количества лет, отработанных сотрудником
Attrition N Mean SD Median Min Max Skew Kurtosis st.error
0 879 6.96 6.13 5 0 40 1.69 3.45 0.21
1 179 7.58 6.88 6 0 37 2.00 4.65 0.51
yes = numy %>% filter(Attrition == 1)
no = numy %>% filter(Attrition == 0)

t.test(yes$YearsAtCompany, no$YearsAtCompany, alternative = "less")
## 
##  Welch Two Sample t-test
## 
## data:  yes$YearsAtCompany and no$YearsAtCompany
## t = -4.5559, df = 262.9, p-value = 3.996e-06
## alternative hypothesis: true difference in means is less than 0
## 95 percent confidence interval:
##      -Inf -1.43935
## sample estimates:
## mean of x mean of y 
##  5.189944  7.447099
wilcox.test(numy$YearsAtCompany ~ as.factor(numy$Attrition))
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  numy$YearsAtCompany by as.factor(numy$Attrition)
## W = 101571, p-value = 6.989e-10
## alternative hypothesis: true location shift is not equal to 0

Таким образом, после проведения эксплораторного анализа, мы можем заметить, что сотрудники, проработавшие в компании долгое время, менее склонны её покидать. Поэтому если “сотрудник-старожил” решает покинуть компанию, это должно вызывать особенные опасения.

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

Важно отметить, что решение покинуть компанию - комплексное, и зависит от огромного количества факторов. Из имеющихся у нас данных, мы предлагаем сконцентрироваться при анализе только на части факторов, чтобы сделать модель более осмысленной и парсимонной. Мы не планируем использовать в модели любые субъективные факторы (например, worklifebalance, jobsatisfaction, jobinvolvement и тд), а предпочтём опираться на объективно измеряемые факторы, такие как размер зарплаты, наличие переработок, расстояние до работы и т.д. Это решение обусловлено тем, что любые субъективные факторы могут иметь большую погрешность при измерении, на них может влиять большое количество “третих переменных” и т.д.

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

Таким образом, при построении модели мы предлагаем использовать следующие переменные:

  • Attrition - остался сотрудник в компании или нет (1- ушел, 0 - остался, это предсказываемая переменная)

  • MonthlyIncome - размер зарплаты

  • OverTime - наличие переработок (где 1 - у сотрудника есть переработки, 0 - отсутствие переработок)

  • PercentSalaryHike - процент повышения зарплаты

  • TrainingTimesLastYear - участие в программах повышения квалификации (число программ за последний год)

  • YearsSinceLastPromotion - сколько лет прошло с последнего повышения

  • YearsInCurrentRole - стаж работы в текущей должности

  • YearsWithCurrManager - сколько лет работает с текущим руководителем

  • DistanceFromHome - расстояние от дома до работы в милях

  • YearsAtCompany - стаж работы в компании (будет использоваться как контрольная переменная, так как показала свою значимость в эксплораторном анализе)

  • TotalWorkingYears - общий стаж работы в течение жизни (тоже контрольная переменная, так как возрастные сотрудники могут уходить на пенсию, что может быть порой заложено в высокие показатели Attrition)

  • NumCompaniesWorked - в скольких компаниях работал сотрудник (тоже контрольная переменная)

data = dbGetQuery(con, "
SELECT
    port.Attrition,
    port.MonthlyIncome,
    port.OverTime,
    port.PercentSalaryHike,
    port.TrainingTimesLastYear,
    port.YearsAtCompany,
    port.YearsSinceLastPromotion,
    port.YearsInCurrentRole,
    port.YearsWithCurrManager,
    prof.TotalWorkingYears,
    prof.DistanceFromHome,
    prof.NumCompaniesWorked
FROM 
    portfolio as port
JOIN 
    profile as prof ON port.EmployeeNumber = prof.EmployeeNumber
WHERE 
    port.YearsAtCompany >= 3")
dbDisconnect(con)

Модель

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

Данные по всем сотрудникам, проработавшим в компании хотя бы 3 года, случайным образом распределены на тренировочную (80% наблюдений) и тестовую (20% наблюдений) выборки.

Ниже представлены результаты нашего моделирования на тренировочной выборке. Значимыми переменными оказались наличие переработок, количество лет с повышения и количество компаний, в которых работал сотрудник. Наличие переработок и долгое отсутствие повышения у сотрудника увеличивают вероятность покидания им компании. Однако важно отметить, что наша модель объясняет всего лишь 14% вариации в принятии решения покинуть компанию (R square = 0,136).

data$OverTime = as.factor(data$OverTime)
data$Attrition = as.factor(data$Attrition)

set.seed(10)
ind = initial_split(data, prop = 0.8)
train = training(ind)
test = testing(ind)
model = logistic_reg()
logreg = model %>% fit(Attrition~., data = train)
predlog = predict(logreg, test)

tab_model(logreg)
  Dependent variable
Predictors Odds Ratios CI p
(Intercept) 0.21 0.06 – 0.82 0.025
MonthlyIncome 1.00 1.00 – 1.00 0.465
OverTime [Yes] 4.71 2.89 – 7.69 <0.001
PercentSalaryHike 0.98 0.91 – 1.05 0.477
TrainingTimesLastYear 0.92 0.75 – 1.13 0.416
YearsAtCompany 1.07 0.98 – 1.17 0.118
YearsSinceLastPromotion 1.13 1.03 – 1.24 0.007
YearsInCurrentRole 0.93 0.84 – 1.03 0.159
YearsWithCurrManager 0.95 0.87 – 1.05 0.349
TotalWorkingYears 0.91 0.85 – 0.99 0.019
DistanceFromHome 1.02 1.00 – 1.05 0.104
NumCompaniesWorked 1.14 1.03 – 1.26 0.011
Observations 648
R2 Tjur 0.120

Ниже представлен график значимости переменных для нашей модели:

vip(logreg)

Наша модель имеет очень низкую точность на тестовой выборке. Значение True Negatives самое значимое для нас, так как нам важно понимать именно какие сотрудники покинут компанию, при этом из всех действительно покинувших компанию, модель предсказала только одного сотрудника.

table(predlog$.pred_class, test$Attrition)
##    
##       0   1
##   0 143  17
##   1   2   1

Значение специфичности (spec) самое важное для нас, так как нам важно понимать, какое количество сотрудников реально покинувших компанию модель предсказывает верно. При этом, даже если сотрудник не покинул компанию, но модель предсказывает обратное (False Negatives), это совершенно не страшно - если какие-то характеристики сотрудника говорят о том, что он вероятно покинет компанию, но он её не покидает - это просто вклад каких-то других факторов, которые наша модель не берёт во внимание. Поэтому далее будет концентрироваться именно на специфичности модели, которая сейчас очень низкая (около 6%).

test %>% 
  mutate(pred = predlog$.pred_class) %>% 
  conf_mat(estimate = pred, truth = Attrition) %>% 
  summary()
## # A tibble: 13 × 3
##    .metric              .estimator .estimate
##    <chr>                <chr>          <dbl>
##  1 accuracy             binary        0.883 
##  2 kap                  binary        0.0658
##  3 sens                 binary        0.986 
##  4 spec                 binary        0.0556
##  5 ppv                  binary        0.894 
##  6 npv                  binary        0.333 
##  7 mcc                  binary        0.0974
##  8 j_index              binary        0.0418
##  9 bal_accuracy         binary        0.521 
## 10 detection_prevalence binary        0.982 
## 11 precision            binary        0.894 
## 12 recall               binary        0.986 
## 13 f_meas               binary        0.938

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

Чтобы решить проблему несбалансированности выборок, воспользуемся моделью SMOTE (во время анализа она оказалась наиболее эффективной с точки повышения специфичности модели).

После балансировки выборок, к отмеченным ранее стат. значимым факторам (количество переработок и время с повышения) также можно добавить участие в программах повышения квалификации, количество времени с текущим менэджером и общее количество отработанных лет. Долгая работа с одним и тем же руководителем свидетельствует об удовлетворенности им и снижает вероятность покинуть компанию, чем дольше сотрудник работает в принципе (но скорее просто чем старше он становится), тем с меньшей вероятностью он покидает компанию, участие в большем количестве программ повышения квалификации также снижает вероятность покидания компании. Теперь наша модель объясняет около 25% дисперсии в решении покинуть компанию.

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

train1 = train
train1$OverTime = as.numeric(train1$OverTime) - 1
test1 = test

set.seed(10)
data_smote = recipe(Attrition ~ ., data = train1) %>%
  step_smote(Attrition, over_ratio = 0.9) %>% 
  prep(training = train1, retain = TRUE) %>% 
  bake(new_data = NULL)

model = logistic_reg()
logreg1 = model %>% fit(Attrition~., data = data_smote)
test1$OverTime = as.numeric(test1$OverTime) - 1
predlog1 = predict(logreg1, test1)

tab_model(logreg1)
  Dependent variable
Predictors Odds Ratios CI p
(Intercept) 1.05 0.46 – 2.37 0.916
MonthlyIncome 1.00 1.00 – 1.00 0.243
OverTime 5.66 4.18 – 7.66 <0.001
PercentSalaryHike 0.99 0.95 – 1.03 0.558
TrainingTimesLastYear 0.86 0.75 – 0.97 0.015
YearsAtCompany 1.08 1.03 – 1.13 0.002
YearsSinceLastPromotion 1.15 1.08 – 1.21 <0.001
YearsInCurrentRole 0.92 0.87 – 0.98 0.015
YearsWithCurrManager 0.95 0.89 – 1.01 0.086
TotalWorkingYears 0.92 0.88 – 0.95 <0.001
DistanceFromHome 1.03 1.01 – 1.05 0.002
NumCompaniesWorked 1.13 1.06 – 1.20 <0.001
Observations 1065
R2 Tjur 0.204

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

vip(logreg1)

Матрица ошибок показывает, что теперь наша модель намного лучше определяет количество True Negatives.

table(predlog1$.pred_class, test1$Attrition)
##    
##       0   1
##   0 108   7
##   1  37  11

Однако специфичность модели до сих пор далека от идеала и составляет 61%.

test1 %>% 
  mutate(pred = predlog1$.pred_class) %>% 
  conf_mat(estimate = pred, truth = Attrition) %>% 
  summary()
## # A tibble: 13 × 3
##    .metric              .estimator .estimate
##    <chr>                <chr>          <dbl>
##  1 accuracy             binary         0.730
##  2 kap                  binary         0.206
##  3 sens                 binary         0.745
##  4 spec                 binary         0.611
##  5 ppv                  binary         0.939
##  6 npv                  binary         0.229
##  7 mcc                  binary         0.245
##  8 j_index              binary         0.356
##  9 bal_accuracy         binary         0.678
## 10 detection_prevalence binary         0.706
## 11 precision            binary         0.939
## 12 recall               binary         0.745
## 13 f_meas               binary         0.831

Симуляция

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

Количество лет с последнего повышения

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

ggplotly(ggplot(test1, aes(x = YearsSinceLastPromotion, fill = Attrition)) + geom_density(alpha = 0.5) + labs(title = "Распределение количества лет с повышения в разрезе \nрешения уйти из компании", x = "Кол-во лет с повышения", y = "Плотность распределения", fill = "Покинул ли сотрудник \nкомпанию"))

Мы предлагаем ввести в компании правило: сотрудник, которого не повышали 6 лет и более должен обязательно быть повышен. Такое правило может быть встречено по-разному, так как предполагает сложные структурные изменения в компании, и не всегда такое правило можно считать обоснованным.

Однако после симуляции видно, что на тестовой выборке такое правило приведёт к уменьшению количества покинувших компанию сотрудника (на наших данных на 7 сотрудников).

test1new = test1 

test1new = test1new %>% mutate(YearsSinceLastPromotion = case_when(YearsSinceLastPromotion > 5 ~ 0, T ~ YearsSinceLastPromotion)) 

predTest = predict(logreg1, test1new)$.pred_class
predInitial = predict(logreg1, test1)$.pred_class
ggplotly(ggplot(data.frame(predTest)) + geom_bar(aes(x = predTest), alpha = 0.5, fill = "blue") +
  geom_bar(data = test, aes(x = predInitial), alpha = 0.5) + labs(title = "Распределение предполагаемого эффекта", x = "Покинул ли сотрудник компанию", y = "Количество сотрудников", subtitle = "При введении обязательного повышения"))

Переработки

Более важным фактором, влияющим на уход сотрудника являются переработки.

ggplotly(ggplot(test1, aes(x = as.factor(Attrition), fill = as.factor(OverTime))) + geom_bar(position = "fill", alpha = 0.5)  + labs(title = "Относительное распределение ухода сотрудника из компании \nи наличия переработок", x = "Покинул ли сотрудник компанию", y = "", fill = "Наличие переработок"))

Переработки некоторых сотрудников могут быть важной частью эффективности и продуктивности компании, но часто ведут к тому, что сотрудники увольняются. Наше предсказание показывает, что если компании получится предотвратить переработки в хотя бы 30% случаев, то намного меньшее количество “сотрудников-старожилов” будут покидать компанию (в нашем случае на 11 человек из 48)

test1new = test1

set.seed(10)
test1new$OverTime[test1new$OverTime == 1] = 
  sample(c(1, 0), 
         size = length(test1new$OverTime[test1new$OverTime == 1]),
         replace = T,
         prob = c(0.7, 0.3)) 

predTest = predict(logreg1, test1new)$.pred_class
predInitial = predict(logreg1, test1)$.pred_class
ggplotly(ggplot(data.frame(predTest)) + geom_bar(aes(x = predTest), alpha = 0.5, fill = "blue") +
  geom_bar(data = test, aes(x = predInitial), alpha = 0.5) + labs(title = "Распределение предполагаемого эффекта", x = "Покинул ли сотрудник компанию", y = "Количество сотрудников", subtitle = "При снижении количества переработок"))

Оба фактора

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

test1new = test1

test1new = test1new %>% mutate(YearsSinceLastPromotion = case_when(YearsSinceLastPromotion > 5 ~ 0, T ~ YearsSinceLastPromotion)) 

set.seed(10)
test1new$OverTime[test1new$OverTime == 1] = 
  sample(c(1, 0), 
         size = length(test1new$OverTime[test1new$OverTime == 1]),
         replace = T,
         prob = c(0.7, 0.3)) 

predTest = predict(logreg1, test1new)$.pred_class
predInitial = predict(logreg1, test1)$.pred_class
ggplotly(ggplot(data.frame(predTest)) + geom_bar(aes(x = predTest), alpha = 0.5, fill = "blue") +
  geom_bar(data = test, aes(x = predInitial), alpha = 0.5) + labs(title = "Распределение предполагаемого эффекта", x = "Покинул ли сотрудник компанию", y = "Количество сотрудников", subtitle = "При снижении количества переработок и введении обязательных повышений"))
testSample = test1$Attrition
table(testSample)
## testSample
##   0   1 
## 145  18
table(predTest)
## predTest
##   0   1 
## 132  31

Дэшборд

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

Общие выводы

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

Построенная модель объясняет только 25% вариации в решении сотрудника покинуть компанию, а её специфичность составляет 61%, что не очень много. Чтобы улучшить модель необходимо, если возможно, собрать больше данных, особенно среди сотрудников, покинувших компанию (так как выборки оказались несбалансированными).

Самыми значимыми факторами, влияющими на вероятность ухода сотрудником из компании оказались наличие переработок и количество лет с последнего повышения. Были предложены меры, которые позволят уменьшить отток из компании “сотрудников-старожилов”:

  • введение обязательного повышения сотрудника как минимум раз в 5 лет

  • снижение количества перерабатывающий сотрудников на 30%

Предложенные меры потенциально должны снизить отток “сотрудников-старожилов” на 35%.