UTS Survival Analysis
~ Employee Turnover Survival Analysis ~
| Kontak | : \(\downarrow\) | : \(\downarrow\) |
| Nama | Sherly Taurin Siridion | Jocelyn Irene Gani |
| NIM | 20194920011 | 20194920002 |
| sherlytaurinsiri@gmail.com | jirene113@gmail.com | |
| https://www.instagram.com/sherlytaurin/ | https://www.instagram.com/irenegani/ | |
| RPubs | https://rpubs.com/sherlytaurin/ | https://rpubs.com/irenegani/ |
1 Pendahuluan
Employee Turn-over atau diketahui sebagai Employee Churn adalah masalah yang cukup berisiko bagi perusahaan, dikarenakan biaya untuk mengganti karyawan seringkali bisa sangat besar. Berdasarkan studi di Center for American Progress, ditemukan bahwa perusahaan biasanya membayar 1/5 dari gaji karyawan untuk menggantikan karyawan itu, dan biayakan dapat meningkat jika eksekutif atau karyawan dengan bayaran tertinggi harus diganti. Dengan kata lain, biaya mengganti karyawan untuk sebagian besar pemberi kerja tetap signifikan. Hal ini disebabkan banyaknya waktu yang dihabiskan untuk wawancara dan mencari pengganti, bonus, dan hilangnya produktivitas selama beberapa bulan dimana karyawan baru harus membiasakan diri dengan pekerjaannya.
Mengetahui hal itu, perlu tindakan untuk meningkatkan retensi karyawan serta merencanakan perekrutan karyawan baru telebih dahulu. Salah satunya dapat dengan menggunakan Survival Analysis. Project ini biasanya disebut dengan HR Analytics atau People Analytics.
Variabel-variabel yang terdapat pada data ini adalah: Attrition, BusinessTravel, Department, Education, EducationField, EnvironmentSatisfaction, Gender, JobInvolvement, JobLevel, JobRole, JobSatisfaction, MaritalStatus, OverTime, PerformanceRating, RelationshipSatisfaction, WorkLifeBalance, Age, DistanceFromHome, MonthlyIncome, NumCompaniesWorked, PercentSalaryHike, TotalWorkingYears, TrainingTimesLastYear, YearsAtCompany, YearsInCurrentRole, YearsSinceLastPromotion, YearsWithCurrManager. Dengan beberapa variabel kategorikal yang dituliskan dalam bentuk numerik, yaitu:
Education 1 ‘Below College’ 2 ‘College’ 3 ‘Bachelor’ 4 ‘Master’ 5 ‘Doctor’
EnvironmentSatisfaction 1 ‘Low’ 2 ‘Medium’ 3 ‘High’ 4 ‘Very High’
JobInvolvement 1 ‘Low’ 2 ‘Medium’ 3 ‘High’ 4 ‘Very High’
JobSatisfaction 1 ‘Low’ 2 ‘Medium’ 3 ‘High’ 4 ‘Very High’
PerformanceRating 1 ‘Low’ 2 ‘Good’ 3 ‘Excellent’ 4 ‘Outstanding’
RelationshipSatisfaction 1 ‘Low’ 2 ‘Medium’ 3 ‘High’ 4 ‘Very High’
WorkLifeBalance 1 ‘Bad’ 2 ‘Good’ 3 ‘Better’ 4 ‘Best’
Dapat kita ketahui, ada berbagai faktor yang menyebabkan terjadinya employee turnover. Salah satunya adalah Overtime. Pada projek ini, ada 2 hal yang akan dicari, yaitu: * Apakah Overtime memengaruhi secara signifikan terjadinya employee turnover? * Berapa peluang karyawan yang overtime dan tidak overtime dapat bertahan hingga 10 tahun kedepan?
2 Import Data
Data yang digunakan adalah data dari IBM HR Analytics Employee Attrition & Performance yang diambil dari Kaggle yang berisikan data 1470 karyawan dengan berbagai informasi didalamnya dengan total 35 kolom dengan 237 karyawan turnover dan 1233 yang masih bertahan.
data <- read_xlsx("data/DataHR.xlsx")
datatable(data)str(data)## tibble [1,470 x 35] (S3: tbl_df/tbl/data.frame)
## $ Age : num [1:1470] 41 49 37 33 27 32 59 30 38 36 ...
## $ Attrition : chr [1:1470] "Yes" "No" "Yes" "No" ...
## $ BusinessTravel : chr [1:1470] "Travel_Rarely" "Travel_Frequently" "Travel_Rarely" "Travel_Frequently" ...
## $ DailyRate : num [1:1470] 1102 279 1373 1392 591 ...
## $ Department : chr [1:1470] "Sales" "Research & Development" "Research & Development" "Research & Development" ...
## $ DistanceFromHome : num [1:1470] 1 8 2 3 2 2 3 24 23 27 ...
## $ Education : num [1:1470] 2 1 2 4 1 2 3 1 3 3 ...
## $ EducationField : chr [1:1470] "Life Sciences" "Life Sciences" "Other" "Life Sciences" ...
## $ EmployeeCount : num [1:1470] 1 1 1 1 1 1 1 1 1 1 ...
## $ EmployeeNumber : num [1:1470] 1 2 4 5 7 8 10 11 12 13 ...
## $ EnvironmentSatisfaction : num [1:1470] 2 3 4 4 1 4 3 4 4 3 ...
## $ Gender : chr [1:1470] "Female" "Male" "Male" "Female" ...
## $ HourlyRate : num [1:1470] 94 61 92 56 40 79 81 67 44 94 ...
## $ JobInvolvement : num [1:1470] 3 2 2 3 3 3 4 3 2 3 ...
## $ JobLevel : num [1:1470] 2 2 1 1 1 1 1 1 3 2 ...
## $ JobRole : chr [1:1470] "Sales Executive" "Research Scientist" "Laboratory Technician" "Research Scientist" ...
## $ JobSatisfaction : num [1:1470] 4 2 3 3 2 4 1 3 3 3 ...
## $ MaritalStatus : chr [1:1470] "Single" "Married" "Single" "Married" ...
## $ MonthlyIncome : num [1:1470] 5993 5130 2090 2909 3468 ...
## $ MonthlyRate : num [1:1470] 19479 24907 2396 23159 16632 ...
## $ NumCompaniesWorked : num [1:1470] 8 1 6 1 9 0 4 1 0 6 ...
## $ Over18 : chr [1:1470] "Y" "Y" "Y" "Y" ...
## $ OverTime : chr [1:1470] "Yes" "No" "Yes" "Yes" ...
## $ PercentSalaryHike : num [1:1470] 11 23 15 11 12 13 20 22 21 13 ...
## $ PerformanceRating : num [1:1470] 3 4 3 3 3 3 4 4 4 3 ...
## $ RelationshipSatisfaction: num [1:1470] 1 4 2 3 4 3 1 2 2 2 ...
## $ StandardHours : num [1:1470] 80 80 80 80 80 80 80 80 80 80 ...
## $ StockOptionLevel : num [1:1470] 0 1 0 0 1 0 3 1 0 2 ...
## $ TotalWorkingYears : num [1:1470] 8 10 7 8 6 8 12 1 10 17 ...
## $ TrainingTimesLastYear : num [1:1470] 0 3 3 3 3 2 3 2 2 3 ...
## $ WorkLifeBalance : num [1:1470] 1 3 3 3 3 2 2 3 3 2 ...
## $ YearsAtCompany : num [1:1470] 6 10 0 8 2 7 1 1 9 7 ...
## $ YearsInCurrentRole : num [1:1470] 4 7 0 7 2 7 0 0 7 7 ...
## $ YearsSinceLastPromotion : num [1:1470] 0 1 0 3 2 3 0 0 1 7 ...
## $ YearsWithCurrManager : num [1:1470] 5 7 0 0 2 6 0 0 8 7 ...
Yes <- count(subset(data, Attrition == "Yes"))
No <- count(subset(data, Attrition == "No"))
attr <- data.frame(Yes, No)
names(attr) <- c('yes', 'no')
attr3 Exploratory Data Analysis
Sebagai permulaan, akan dilakukan eksplorasi data untuk membersihkan data dan melihat visualisasi setiap variable yang ada sehingga hasil prediksi dapat lebih baik.
3.1 Data Cleaning
Sebelum dilakukan pembersihan, tipe data Character akan diubah terlebih dahulu menjadi Character.
data <- data %>%
mutate_if(is.character, as.factor) %>%
select(Attrition, everything())3.1.1 Mengatasi Data Hilang
data.frame(colSums(is.na(data)))Dari hasil di atas, dapat dilihat tidak ada data yang hilang. Maka selanjutkan akan melakukan pengecekan data duplikat.
3.1.2 Mengatasi Data Duplikat
check.duplicate <- data.frame(
row_of_data = data %>% nrow (),
row_of_unique.data = data %>% distinct() %>% nrow())
check.duplicateDapat dilihat jumlah row of data dan row of unique data sama-sama 1470. Oleh karena itu, dapat dibilang tidak ada data yang duplikat.
3.1.3 Menghapus Kolom yang Tidak digunakan
Dalam hal ini ada beberapa kolom yang tidak digunakan seperti employeecount, standardhour, dan over18. Untuk mengurasi jumlah kolom, maka dapat dihapus.
data <- data[, c(-9, -22, -27)]3.1.4 Mengatasi Outlier
Outlier dapat mengganggu hasil dari penelitian, oleh karena itu harus diatasi.
outlier <- boxplot.stats(data$YearsWithCurrManager)$out
out_idx <- which(data$YearsWithCurrManager %in% c(outlier))
data <- data[-out_idx,]
datatable(data)Pada variabel YearsWithCurrManager terdapat 14 data yang outlier, oleh karena itu untuk membantu penelitian maka dihapuskan. Sehingga data akhir menjadi 1456 dengan 32 kolom.
3.2 Visualisasi Data Kategorik
# Attrition berdasarkan Income Level
plot1 <- ggplot(data, aes(x = MonthlyIncome, fill = Attrition)) +
geom_density(alpha = 0.6) +
labs(x = "Monthly Income", y = "") +
ggtitle("Attrition by income level") +
theme_classic()#Attrition berdasarkan Department
# let's see what percentage of people are leaving from their departments
dept <- data %>%
group_by(Department, Attrition) %>%
summarise(n = n())
# creating groups and summing by group
dept$totals <- ifelse(dept$Department == "Human Resources",
sum(data$Department == "Human Resources"),
ifelse(dept$Department == "Research & Development",
sum(data$Department == "Research & Development"),
ifelse(dept$Department == "Sales",
sum(data$Department == "Sales"), data$Department)))
# using dplyr's mutate() function to create the variable 'attr_perc'
dept <- dept %>%
mutate(attr_perc = n / totals * 100)
plot2 <- dept %>%
filter(Attrition == "Yes") %>%
ggplot(aes(x = reorder(Department, attr_perc), y = attr_perc, fill = Department)) +
geom_bar(stat = "identity", alpha = 0.9) +
labs(x="", y="% of employees")+
ggtitle("Attrition % by Department") +
theme_classic()# Attrition by Amount of Business Travel
# do people who travel more for business leave at higher rates?
trav_attr <- data %>%
group_by(BusinessTravel, Attrition) %>%
summarise(n = n())
# creating traveler groups
trav_attr$totals <- ifelse(trav_attr$BusinessTravel == "Non-Travel",
sum(data$BusinessTravel == "Non-Travel"),
ifelse(trav_attr$BusinessTravel == "Travel_Frequently",
sum(data$BusinessTravel == "Travel_Frequently"),
ifelse(trav_attr$BusinessTravel == "Travel_Rarely",
sum(data$BusinessTravel == "Travel_Rarely"), trav_attr$BusinessTravel)))
trav_attr <- trav_attr %>%
mutate(attr_perc = n / totals * 100)
plot3 <- trav_attr %>%
filter(Attrition == "Yes") %>%
ggplot(aes(x = reorder(BusinessTravel, attr_perc), y = attr_perc, fill = BusinessTravel)) +
geom_bar(stat = "identity", alpha = 0.9) +
labs(x="", y="% of employees") +
ggtitle("Attrition % by Amount of Business Travel") +
theme_classic()# attrition by education level
edu_attr <- data %>%
group_by(Education, Attrition) %>%
summarise(n = n())
edu_tots <- data %>%
group_by(Education) %>%
summarise(num = n())
edu_attr <- left_join(edu_attr, edu_tots, by = "Education")
edu_attr <- edu_attr %>% mutate(attr_perc = n / num * 100)
plot4 <- edu_attr %>%
filter(Attrition == "Yes") %>%
ggplot(aes(x = reorder(Education, attr_perc), y = attr_perc, fill = Education)) +
geom_bar(stat = "identity", alpha = 0.9) +
labs(x="Education Level", y="% of employees") +
ggtitle("Attrition % by Education Level") +
theme_classic()# Attrition by MaritalStatus
mar_attr <- data %>%
group_by(MaritalStatus, Attrition) %>%
summarise(n = n())
mar_tots <- data %>%
group_by(MaritalStatus) %>%
summarise(nums = n())
mar_attr <- left_join(mar_attr, mar_tots, by = "MaritalStatus")
mar_attr <- mar_attr %>%
mutate(attr_perc = n / nums * 100)
plot5 <- mar_attr %>%
filter(Attrition == "Yes") %>%
ggplot(aes(x = reorder(MaritalStatus, attr_perc), y = attr_perc, fill = MaritalStatus)) +
geom_bar(stat = "identity", alpha = 0.9) +
labs(x="", y="% of employees") +
ggtitle("Attrition % by Marital Status") +
theme_classic()# attrition by gender and marital status
gend_attr <- data %>%
group_by(Gender, MaritalStatus, Attrition) %>%
summarise(n = n())
gend_tots <- data %>%
group_by(Gender, MaritalStatus) %>%
summarise(nums = n())
gend_attr <- left_join(gend_attr, gend_tots)
gend_attr <- gend_attr %>%
mutate(attr_perc = n / nums * 100)
gend_attr$type <- paste(gend_attr$MaritalStatus, gend_attr$Gender, sep = " ")
plot6 <- gend_attr %>%
filter(Attrition == "Yes") %>%
ggplot(aes(x = reorder(type, attr_perc), y = attr_perc, fill = Gender)) +
geom_bar(stat = "identity", alpha = 0.9) +
labs(x="", y="% of employees") +
ggtitle("Attrition % by Gender and Marital Status") +
theme_classic() +
coord_flip()# attrition by JobInvolvement
jobinv <- data %>%
group_by(JobInvolvement, Attrition) %>%
summarise(n = n())
jobtots <- data %>%
group_by(JobInvolvement) %>%
summarise(nums = n())
jobinv <- left_join(jobinv, jobtots, by = "JobInvolvement")
jobinv <- jobinv %>%
mutate(attr_perc = n / nums * 100)
plot7 <- jobinv %>%
filter(Attrition == "Yes") %>%
ggplot(aes(x = JobInvolvement, y = attr_perc, fill = JobInvolvement)) +
geom_bar(stat = "identity", alpha = 0.9) +
labs(x="Job Involvement Level", y="% of employee attrition") +
ggtitle("Attrition % by Job Involvement") +
theme_classic()# attrition by overtime
ovt <- data %>%
group_by(OverTime, Attrition) %>%
summarise(n = n())
ovttots <- data %>%
group_by(OverTime) %>%
summarise(nums = n())
ovt <- left_join(ovt, ovttots, by = "OverTime")
ovt <- ovt %>%
mutate(attr_perc = n / nums * 100)
plot8 <- ovt %>%
filter(Attrition == "Yes") %>%
ggplot(aes(x = OverTime, y = attr_perc, fill = OverTime)) +
geom_bar(stat = "identity", alpha = 0.9) +
labs(x="Overtime", y="% of employee attrition") +
ggtitle("Attrition % by Overtime (Y/N)") +
theme_classic()ggarrange(plot1, plot2, plot3, plot4, plot5, plot6, plot7, plot8, ncol = 2, nrow = 2) Hasil diatas menunjukkan bahwa Income memengaruhi terjadinya turnover (Attrition) dimana semakin besar income bulanannya, semakin rendah kemungkinan terjadinya turnover. Sedangkan untuk Department. Business Travel, Education Level, Gender, dan Marital status tidak menunjukkan pengaruh yang jelas terhadap terjadinya turnover.
Pada Job Involvement, terlihat semakin rendah involvement levelnya, semakin tinggi terjadinya turnover, sedangkan semakin tinggi involvement levelnya, semakin rendah tingkat terjadinya turnover itu sendiri. Perbedaan yang sangat jelas terjadi pada Attrition yang disebabkan oleh Overtime atau lembur. Hasil menunjukkan dari 237 karyawan yang turnover, tingkat yang keluar karena Overtime jauh lebih tinggi dibandingkan yang tidak. Hal ini menunjukkan Overtime memengaruhi terjadinya Employee Turnover. Hal ini akan dibahas secara lebih rincinya di bagian survival analysis.
3.3 Visualisasi Data Numerik
# attrition by years worked for company
yrcomp <- data %>%
group_by(YearsAtCompany) %>%
filter(Attrition == "Yes") %>%
summarise(n = n())
yrcomp$Attrition <- "Left"
yrno <- data %>%
group_by(YearsAtCompany) %>%
filter(Attrition == "No") %>%
summarise(n = n())
yrno$Attrition <- "Stayed"
yearscomp <- rbind(yrcomp, yrno)
plot9 <- ggplot(yearscomp, aes(x = YearsAtCompany, y = n, fill = Attrition)) +
geom_bar(position = "stack", stat = "identity", alpha = 0.9) +
xlab("Years With Company") +
ylab("# of employees") +
ggtitle("Attrition by years worked for company") +
theme_classic()# attrition by number of years in current role
yrscomp <- data %>%
group_by(YearsInCurrentRole) %>%
filter(Attrition == "Yes") %>%
summarise(n = n())
yrscomp$Attrition <- "Left"
yrsno <- data %>%
group_by(YearsInCurrentRole) %>%
filter(Attrition == "No") %>%
summarise(n = n())
yrsno$Attrition <- "Stayed"
jyearscomp <- rbind(yrscomp, yrsno)
plot10 <- ggplot(jyearscomp, aes(x = YearsInCurrentRole, y = n, fill = Attrition)) +
geom_bar(position = "stack", stat = "identity", alpha = 0.9) +
xlab("Years In Current Role") +
ylab("# of employees") +
ggtitle("Attrition by years in current role") +
theme_classic()# attrition by number of years with current manager
mancomp <- data %>%
group_by(YearsWithCurrManager) %>%
filter(Attrition == "Yes") %>%
summarise(n = n())
mancomp$Attrition <- "Left"
manno <- data %>%
group_by(YearsWithCurrManager) %>%
filter(Attrition == "No") %>%
summarise(n = n())
manno$Attrition <- "Stayed"
managercomp <- rbind(mancomp, manno)
plot11 <- ggplot(managercomp, aes(x = YearsWithCurrManager, y = n, fill = Attrition)) +
geom_bar(position = "stack", stat = "identity", alpha = 0.9) +
xlab("Years With Current Manager") +
ylab("# of employees") +
ggtitle("Attrition by years with current manager") +
theme_classic()ggarrange(plot9, plot10, plot11, ncol = 2, nrow= 2)Hasil diatas menunjukkan bahwa Years in Current Role dan Years with Currrent Manager memengaruhi terjadinya attrition. Pada years in current role, dapat dilihat bahwa semakin lama orang itu berkutat di bidangnya atau rolenya, maka kemungkinan terjadinya turnover lebih kecil. Mungkin dikarenakan bila di tahun-tahun awal employee merasa tidak cocok dengan rolenya sehingga mengundurkan diri. Jika yang sdah bertahan lama, orang tersebut sudah nyaman dan merasa itu adalah role yang tepat untuknya.
Pada attrition with current manager di beberapa waktu tertentu tingkat turnovernya lebih tinggi dibandingkan dengan yang bertahan. Tetapi semakin lama orang bersama manager yang sekarang, semakin rendah kemungkinan turnovernya.
4 Analisis Survival
Karena salah satu variabel yang paling menunjukkan terjadinya employee turnover adalah Overtime, karena itu kami akan mencari peluang bertahannya karyawan 10 tahun kedepan berdasarkan overtimenya atau kerja lembur. Dengan itu, variabel yang akan digunakan adalah Attrition dengan Yes = 1 dan No = 0, Overtime dengan Yes = 1 dan No = 0 , serta waktunya menggunakan YearsAtCompany.
data$event <- with(data,ifelse(Attrition=="Yes", 1, 0)) # mengubah attrition jadi binary 1/0
data$overtimework <- with(data, ifelse(OverTime == "Yes", 1, 0)) # mengubah overtime jadi binary 1/0
time<-data$YearsAtCompany # menentukan time
event<-data$event # menentukan event
group<-data$overtimework # menentukan group untuk pembanding
survival<-Surv(time,event) # membuat objek survival4.1 Compute Survival Curves
Pada tahap pertama akan dihitung dan divisualisasikan Kurva Survivalnya untuk melihat survival data dari waktu kewaktu.
4.1.1 Model survival berdasarkan waktu dan kejadiannya
model <- survfit(Surv(time,event) ~ 1)
sum <- surv_summary(model)
sumplot(model, xlab="Time elapsed", ylab="% surviving",main="Survival Plot")Pada hasil di atas dapat dilihat bahwa peluang survivenya semakin turun dan berakhir pada tahun ke-40 dimana penurunan paling sering terjadi di tahun pertama hingga tahun ke-10.
4.1.2 Model survival time dan event berdasarkan kelompok overtime
Pada bagian ini akan dilihat model survivalnya jika dikelompoknya pada yang kerja lembur (overtime) dan yang tidak lembur.
model_comp <- survfit(Surv(time, event) ~ group, data=data)
plot(model_comp, xlab="Time elapsed", ylab="% surviving",main="Survival Plot", legend=T, col=c('blue','red'))
legend('bottomleft', c("Overtime=No", "Overtime=Yes"), col=c('blue','red'), lty = 1, bty="n")Pada Hasil diatas dapat dilihat untuk Group 0 (Tidak overtime) karyawan ada yang bertahan hingga 40 tahun. Sedangkan untuk Group 1 (Overtime) karyawan paling lama bertahan hingga 31 tahun. Pada grafik juga dapat dilihat peluang bertahannya karyawan yang overtime lebih rendah dibandingkan dengan yang tidak overtime.
4.2 Kaplan-Meier Life Table
sm1 <- surv_summary(model_comp, data=data)
datatable(sm1,
caption = htmltools::tags$caption(
style = 'caption-side: bottom; text-align: center,',
htmltools::em('Summary of Survival Curves.')))Pada tabel dapat dilihat peluang survive untuk setiap tahunnya beserta batas atas dan bawahnya. Dari sini dapat dilihat peluang karyawan bertahan 10 tahun kedepan adalah 0.8814 atau 88.14% untuk karyawan yang tidak overtime dan 0.5883 atau 58.83% untuk karyawan yang overtime. Hal ini menunjukkan peluang untuk bertahan 10 tahun kedepan untuk karyawan yang tidak overtime lebih besar.
4.3 The Median Survival
summary(model_comp)$table## records n.max n.start events rmean se(rmean) median 0.95LCL 0.95UCL
## group=0 1042 1042 1042 110 30.52316 1.351791 33 32 NA
## group=1 414 414 414 127 22.58698 1.396738 24 16 NA
Pada hasil ini dapat dilihat ketika peluangnya 50% (nilai median) untuk group 0 atau tidak lembur peluangnya akan dibawah 50% ketika sudah kerja selama 33 tahun, sedangkan untuk group 1 atau yang lembur, peluangnya akan dibawah 50% jika telah bekerja hinga 24 tahun.
4.4 Visualize Survival Curves
Visualisasi untuk data tersebut beserta batas atas dan bawahnya adalah sebagai berikut.
ggsurvplot(model_comp,
data = data,
pval = TRUE,
conf.int = TRUE,
xlab = "Time in Years",
ggtheme = theme_bw(),
risk.table = "abs_pct",
risk.table.y.text.col = TRUE,
risk.table.y.text = FALSE,
ncensor.plot = TRUE,
surv.median.line = "hv",
legend.labs = c("Overtime", "No Overtime"),
palette = c("#2E9FDF", "#9B59B6"))Dari visualisasi ini dapat dilihat bahwa kebanyakan turnover terjadi di tahun pertama hingga tahun ke-10. dimana jumlah karyawan yang tersisa di tahun ke-10 adalah 257 untuk yang tidak lembur dan 85 untuk yang lembur. Hingga pada tahun ke-40 hanya ada 1 karyawan yang tidak lembur yang masih bertahan di perusahaan.
4.5 Comparing Survival Curves
Untuk mengetahui apakah Overtime memengaruhi survival karyawan, dapat dilihat dari hasil comparenya.
surv_diff <- survdiff(Surv(time, event) ~ group, data=data)
surv_diff## Call:
## survdiff(formula = Surv(time, event) ~ group, data = data)
##
## N Observed Expected (O-E)^2/E (O-E)^2/V
## group=0 1042 110 170.5 21.5 78.9
## group=1 414 127 66.5 55.1 78.9
##
## Chisq= 78.9 on 1 degrees of freedom, p= <2e-16
Dari hasil tersebut dapat dibilang bahwa Overtime memengaruhi terjadinya employee turnover karena berdasarkan test tersebut dapat dilihat overtime memengaruhi secara signigikan dengan p value lebih kecil dari 0.05. Dari Observed dan Expected juga dapat dilihat untuk group 1 yang lembur, angka observe melebihi ekspektasi yang berarti angka turnovernya tinggi.
5 Kesimpulan Akhir
data.frame(subset(sm1, time == 10))Data awal terdapat 1470 data dan ketika di lakukan pembersihan tersisa 1456 data. Dari data tersebut, dibuat visualisasi dan didapatkan ada beberapa variabel yang memengaruhi terjadinya Employe Turnover, yaitu: Overtime, MonthlyIncome, BusinessTravel, JobInvolvement, TotalWorkingYears, YearsAtCompany, dan YearsWithCurrManager. Karena pada penelitian ini berfokus pada OverTime, maka data yang digunakan adalah YearsAtCompany sebagai time, Attrition sebagai event, dan Overtime sebagai Group untuk pembanding.
Dari hasil penelitian, didapatkan bahwa Overtime memengaruhi secara signifikan terjadinya Employee Turnover. Peluang bertahannya karyawan 10 tahun kedepan untuk employee yang mengalami Overtime adalah 58.83% dan yang tidak mengalami overtime adalah 88.14%. Jika dilihat secara keseluruhan tanpa memperhitungkan overtime, peluang bertahan employee untuk 10 tahun kedepan adalah 77.3%. Dengan itu, mungkin lebih baik agar jam kerja karyawan diperhatikan agar dapat menurunkan kemungkinan turnover sehingga dapat mengurangi kerugian perusahaan juga.