Pada kesempatan kali ini, Saya akan mencoba melakukan prediksi terhadap karyawan yang akan meninggalkan perusahaan dan tidak meninggalkan perusahaan berdasarkan kategori dari beberapa variabel penunjangnya. Algoritma yang akan saya gunakan yaitu menggunakan model Classification yang terdiri dari Logistik Regression, Classification Tree, Random Forest dan Super Vector Machine yang termasuk dalam supervised learning.
Dataset yang akan digunakan untuk melakukan penelitian ini diambil dari https://www.kaggle.com/rohitsahoo/employee?select=train.csv.
Materi yang akan dibahas, yaitu:
1. Data Extraction
2. Data Description
3. Data Exploration
4. Data Preparation
5. Modeling
6. Evaluation
7. Recommendation
Proses mengimport data dalam format file csv dapat dilakukan menggunakan fungsi read.csv() dan menyebutkan nama file beserta folder tempat menyimpannya.
employee_df <- read.csv(file = "data/employee3.csv")
Dengan perintah di atas, pada workspace-R kita memiliki data frame dengan nama employee. Selanjutnya kita akan bekerja dengan dataframe ini.
Sebelum lebih jauh bekerja dengan data, kita perlu mengetahui informasi dasar dari data yang kita miliki. Informasi dasar tersebut meliputi ukuran/banyaknya data dan nama-nama kolom atau variabel yang ada di dalamnya.
Fungsi dim() dapat digunakan untuk menampilkan berapa banyak baris dan kolom pada dataframe kita, dan fungsi colnames() dapat digunakan untuk menampilkan nama-nama kolom pada data.
dim(employee_df)
## [1] 1058 35
Tampak bahwa ada sebanyak 1058 baris pada data dengan kolom sebanyak 35 buah. Berikut ini adalah nama-nama kolom yang ada pada Data Employee Attrition.
colnames(employee_df)
## [1] "Age" "Attrition"
## [3] "BusinessTravel" "DailyRate"
## [5] "Department" "DistanceFromHome"
## [7] "Education" "EducationField"
## [9] "EmployeeCount" "EmployeeNumber"
## [11] "EnvironmentSatisfaction" "Gender"
## [13] "HourlyRate" "JobInvolvement"
## [15] "JobLevel" "JobRole"
## [17] "JobSatisfaction" "MaritalStatus"
## [19] "MonthlyIncome" "MonthlyRate"
## [21] "NumCompaniesWorked" "Over18"
## [23] "OverTime" "PercentSalaryHike"
## [25] "PerformanceRating" "RelationshipSatisfaction"
## [27] "StandardHours" "StockOptionLevel"
## [29] "TotalWorkingYears" "TrainingTimesLastYear"
## [31] "WorkLifeBalance" "YearsAtCompany"
## [33] "YearsInCurrentRole" "YearsSinceLastPromotion"
## [35] "YearsWithCurrManager"
Untuk melihat tipe data, dapat menggunakan fungsi str
str(employee_df)
## 'data.frame': 1058 obs. of 35 variables:
## $ Age : int 41 49 37 33 27 32 59 30 38 36 ...
## $ Attrition : int 1 0 1 0 0 0 0 0 0 0 ...
## $ BusinessTravel : chr "Travel_Rarely" "Travel_Frequently" "Travel_Rarely" "Travel_Frequently" ...
## $ DailyRate : int 1102 279 1373 1392 591 1005 1324 1358 216 1299 ...
## $ Department : chr "Sales" "Research & Development" "Research & Development" "Research & Development" ...
## $ DistanceFromHome : int 1 8 2 3 2 2 3 24 23 27 ...
## $ Education : int 2 1 2 4 1 2 3 1 3 3 ...
## $ EducationField : chr "Life Sciences" "Life Sciences" "Other" "Life Sciences" ...
## $ EmployeeCount : int 1 1 1 1 1 1 1 1 1 1 ...
## $ EmployeeNumber : int 1 2 4 5 7 8 10 11 12 13 ...
## $ EnvironmentSatisfaction : int 2 3 4 4 1 4 3 4 4 3 ...
## $ Gender : chr "Female" "Male" "Male" "Female" ...
## $ HourlyRate : int 94 61 92 56 40 79 81 67 44 94 ...
## $ JobInvolvement : int 3 2 2 3 3 3 4 3 2 3 ...
## $ JobLevel : int 2 2 1 1 1 1 1 1 3 2 ...
## $ JobRole : chr "Sales Executive" "Research Scientist" "Laboratory Technician" "Research Scientist" ...
## $ JobSatisfaction : int 4 2 3 3 2 4 1 3 3 3 ...
## $ MaritalStatus : chr "Single" "Married" "Single" "Married" ...
## $ MonthlyIncome : int 5993 5130 2090 2909 3468 3068 2670 2693 9526 5237 ...
## $ MonthlyRate : int 19479 24907 2396 23159 16632 11864 9964 13335 8787 16577 ...
## $ NumCompaniesWorked : int 8 1 6 1 9 0 4 0 0 6 ...
## $ Over18 : chr "Y" "Y" "Y" "Y" ...
## $ OverTime : chr "Yes" "No" "Yes" "Yes" ...
## $ PercentSalaryHike : int 11 23 15 11 12 13 20 22 21 13 ...
## $ PerformanceRating : int 3 4 3 3 3 3 4 4 4 3 ...
## $ RelationshipSatisfaction: int 1 4 2 3 4 3 1 2 2 2 ...
## $ StandardHours : int 80 80 80 80 80 80 80 80 80 80 ...
## $ StockOptionLevel : int 0 1 0 0 1 0 3 1 0 2 ...
## $ TotalWorkingYears : int 8 10 7 8 6 8 12 1 10 17 ...
## $ TrainingTimesLastYear : int 0 3 3 3 3 2 3 2 2 3 ...
## $ WorkLifeBalance : int 1 3 3 3 3 2 2 3 3 2 ...
## $ YearsAtCompany : int 6 10 0 8 2 7 1 1 9 7 ...
## $ YearsInCurrentRole : int 4 7 0 7 2 7 0 0 7 7 ...
## $ YearsSinceLastPromotion : int 0 1 0 3 2 3 0 0 1 7 ...
## $ YearsWithCurrManager : int 5 7 0 0 2 6 0 0 8 7 ...
Ada baiknya kita mengetahui berapa banyak karyawan yang statusnya tergolong No Attrition (Tidak mengalami atrisi) dan Yes Attrition (Mengalami atrisi), karena variabel ini merupakan variabel yang akan kita gunakan dalam pemodelan sebagai variabel target.
Fungsi table() merupakan fungsi yang dapat menghasilkan frekuensi dari setiap kategori, sedangkan prop.table() dapat menghasilkan proporsi atau persentase-nya.
table(employee_df$Attrition)
##
## 0 1
## 879 179
Cek Prosentase Variabel Target
prop.table(table(employee_df$Attrition))
##
## 0 1
## 0.8308129 0.1691871
Berdasarkan hasil di atas diperoleh bahwa karyawan yang mengalami attrition ada sebanyak 178 karyawan atau sebanyak 17% dari keseluruhan yang ada.
Cek Missing Value (Apakah ada kolom yang kosong)
colSums(is.na(employee_df))
## Age Attrition BusinessTravel
## 0 0 0
## DailyRate Department DistanceFromHome
## 0 0 0
## Education EducationField EmployeeCount
## 0 0 0
## EmployeeNumber EnvironmentSatisfaction Gender
## 0 0 0
## HourlyRate JobInvolvement JobLevel
## 0 0 0
## JobRole JobSatisfaction MaritalStatus
## 0 0 0
## MonthlyIncome MonthlyRate NumCompaniesWorked
## 0 0 0
## Over18 OverTime PercentSalaryHike
## 0 0 0
## PerformanceRating RelationshipSatisfaction StandardHours
## 0 0 0
## StockOptionLevel TotalWorkingYears TrainingTimesLastYear
## 0 0 0
## WorkLifeBalance YearsAtCompany YearsInCurrentRole
## 0 0 0
## YearsSinceLastPromotion YearsWithCurrManager
## 0 0
Hapus Variabel yang tidak dibutuhkan
employee_df$EmployeeCount <- NULL
employee_df$EmployeeNumber <- NULL
employee_df$StandardHours <- NULL
employee_df$Over18 <- NULL
employee_df$OverTime <- NULL
employee_num <- employee_df[, c("Age","Attrition","Education","JobLevel","PercentSalaryHike",
"MonthlyIncome","PerformanceRating","TotalWorkingYears")]
cor(employee_num)
## Age Attrition Education JobLevel
## Age 1.00000000 -0.172067255 0.18072285 0.50648393
## Attrition -0.17206725 1.000000000 -0.03263074 -0.16920128
## Education 0.18072285 -0.032630740 1.00000000 0.09492171
## JobLevel 0.50648393 -0.169201277 0.09492171 1.00000000
## PercentSalaryHike -0.02485555 0.004907250 -0.02671213 -0.07018046
## MonthlyIncome 0.49739211 -0.163599695 0.09253269 0.95396393
## PerformanceRating -0.03342552 0.007754974 -0.04300827 -0.06153236
## TotalWorkingYears 0.69042789 -0.177136556 0.13121292 0.78692544
## PercentSalaryHike MonthlyIncome PerformanceRating
## Age -0.02485555 0.49739211 -0.033425523
## Attrition 0.00490725 -0.16359969 0.007754974
## Education -0.02671213 0.09253269 -0.043008270
## JobLevel -0.07018046 0.95396393 -0.061532363
## PercentSalaryHike 1.00000000 -0.06025745 0.769793092
## MonthlyIncome -0.06025745 1.00000000 -0.058225173
## PerformanceRating 0.76979309 -0.05822517 1.000000000
## TotalWorkingYears -0.05325025 0.77817684 -0.027490995
## TotalWorkingYears
## Age 0.69042789
## Attrition -0.17713656
## Education 0.13121292
## JobLevel 0.78692544
## PercentSalaryHike -0.05325025
## MonthlyIncome 0.77817684
## PerformanceRating -0.02749099
## TotalWorkingYears 1.00000000
Dari plot correlation ini, diperoleh bahwa tidak ada feature yg secara langsung memiliki nilai correlation cukup tinggi thdp attrition. Namun terdapat beberapa hal yg saya highlight disini Persentase job level memiliki korelasi yg cukup tinggi (0.95 dri skala 1) dengan monthly income. Sehingga nilai keduanya ini bergantung satu sama lain. Jadi saya akan memilih satu saja yaitu monthly income. Dan saya akan menghapus variable job level. Karena dari monthly income sudah bisa menjelaskan bahwa gaji ditentukan sesuai dengan job level masing2 karyawan.
employee_df$JobLevel <- NULL
Merubah tipe data variabel Attrition dari integer ke factor
employee_df$Attrition<- factor(employee_df$Attrition, levels = c(0,1),
labels = c("No","Yes"))
Merubah tipe data variabel Business Travel dari char ke factor
employee_df$BusinessTravel= as.factor(employee_df$BusinessTravel)
Merubah tipe data variabel Department dari char ke factor
employee_df$Department = as.factor(employee_df$Department)
Merubah tipe data variabel Education Field dari char ke factor
employee_df$EducationField = as.factor(employee_df$EducationField)
Merubah tipe data variabel Gender dari char ke factor
employee_df$Gender = as.factor(employee_df$Gender)
Merubah tipe data variabel Job Role dari char ke factor
employee_df$JobRole = as.factor(employee_df$JobRole)
Merubah tipe data variabel Marital Status dari char ke factor
employee_df$MaritalStatus = as.factor(employee_df$MaritalStatus)
Merubah tipe data variabel Num Companies Worked dari integer ke factor
employee_df$NumCompaniesWorked = as.factor(employee_df$NumCompaniesWorked)
Merubah tipe data variabel Environment Satisfaction dari integer ke factor
employee_df$EnvironmentSatisfaction <- factor(employee_df$EnvironmentSatisfaction , levels = c(1,2,3,4),
labels = c("Low","Medium","High","Very High"))
Merubah tipe data variabel Job Satisfaction dari integer ke factor
employee_df$JobSatisfaction <- factor(employee_df$JobSatisfaction , levels = c(1,2,3,4),
labels = c("Low","Medium","High","Very High"))
Melakukan install.packages
#install.packages("ggplot2")
library(ggplot2)
ggplot(employee_df,aes(Attrition,fill=Attrition))+
geom_bar()+ labs(title = "Total Numbers Of Attrition")
Dari diagram ini, menjelaskan bahwa di perusahaan ini mengalami Attrition cukup tinggi yaitu sebanyak 16.9% atau 17%. Dari sebanyak 1058 pegawai yang bekerja diperusahaan, 179 pegawainya meninggalkan perusahaan. Angka 179 pegawai ini perlu kita liat apa yang menyebabkan mereka bisa meninggalkan perusahaan.
ggplot(employee_df,aes(Gender,fill=Gender))+
geom_bar()+ labs(title = "Gender")
Ternyata di perusahaan ini banyak pegawai laki-laki yang bekerja diperusahaan dari pada pegawai perempuan. Lebih dari 50% populasinya adalah pria. Yaitu 620 pegawai laki-laki dan 438 pegawai perempuan.
ggplot(employee_df,aes(MaritalStatus,fill=MaritalStatus))+
geom_bar()+ labs(title = "Marital Status")
Status pernikahan banyak yang sudah menikah. Ada 464 yg married, 352 yg single, dan divorced 242 pegawai.
ggplot(employee_df,aes(EnvironmentSatisfaction,fill=EnvironmentSatisfaction))+
geom_bar()+ labs(title = "Environment Satisfaction")
Kepuasan lingkungan kerja banyak yang high. Tinggi. Dan ada juga yang rendah. Sebanyak 209 pegawai dari 1058 pegawai yang merasa lingkungan kerjanya tidak sehat.
ggplot(employee_df,aes(JobSatisfaction,fill=JobSatisfaction))+
geom_bar()+ labs(title = "Job Satisfaction")
Kepuasan terhadap pekerjaan banyak yang very high. Sangat Tinggi. Tapi ada juga yang rendah. Sebanyak 205 pegawai dari 1058 pegawai yang merasa tidak puas dengan pekerjaannya. Ini juga perlu diteliti alasan kenapa banyak pegawai yang merasa tidak puas dengan pekerjaannya. Apa karna beban kerjanya yg terlalu tinggi, atau alasan lain.
ggplot(employee_df,aes(NumCompaniesWorked,fill=NumCompaniesWorked))+
geom_bar()+ labs(title = "Num Companies Worked")
Jumlah pengalaman pegawai yang bekerja di perusahaan lain, banyak yang 0 kali. Ada 356 pegawai yang mempunyai pengalaman kerja hanya 0 kali. Artinya pegawai ini belum pernah bekerja di perusahaan lain.
ggplot(data = employee_df, aes(x = Attrition, fill = Gender)) +
geom_bar(position = "dodge") + labs(title = "Attrition By Gender")
Dari diagram ini ternyata yang mengalami attrition paling banyak adalah laki-laki. Nah ini kita perlu cari tau alasan kenapa laki-laki lebih banyak yg meninggalkan perusahaan daripada wanita.
ggplot(data = employee_df, aes(x = Attrition, fill = MaritalStatus)) +
geom_bar(position = "dodge") + labs(title = "Marital Status")
Dari diagram ini, yang meninggalkan perusahaan paling banyak adalah yang berstatus single. Brarti kemungkinan 17% attrition disebabkan karna PHK atau pengunduran diri. Bukan karna pensiun.
ggplot(data = employee_df, aes(x = Attrition, fill = Department)) +
geom_bar(position = "dodge") + labs(title = "Attrition By Department")
Dari diagram ini yang paling banyak meninggalkan perusahaan itu adalah dari department research&development.
ggplot(data = employee_df, aes(x = Attrition, fill = EnvironmentSatisfaction)) +
geom_bar(position = "dodge") + labs(title = "Attrition By Environment Satisfaction")
Dari diagram ini telah membuktikan bahwa banyak pegawai yang merasa tidak puas dengan lingkungan kerjanya. Jadi sebagai pihak manajemen perusahaan mesti selalu memeriksa apakah suasana kantornya harmonis atau tidak, apakah pegawainya dapat mengembangkan kepercayaan satu sama lain Atau tidak.
ggplot(data = employee_df, aes(x = Attrition, fill = JobSatisfaction)) +
geom_bar(position = "dodge") + labs(title = "Attrition By Job Satisfaction")
Dari diagram ini menjelaskan bahwa ada beberapa pegawai yang merasa puas dengan pekerjaanya, ada juga yg tidak puas dengan pekerjaannya. Ini juga cukup banyak yang tidak puas dengan pekerjaannya dan perlu kita galih apa yang membuat mereka tidak puas dengan pekerjaannya.
ggplot(data = employee_df, aes(x = Attrition, fill = NumCompaniesWorked)) +
geom_bar(position = "dodge") + labs(title = "Attrition By Num Companies Worked")
Dari diagram ini menjelaskan bahwa banyak yang mempunyai pengalaman kerja di perusahaan lain hanya 0 kali. Artinya banyak yg akan memulai karir. Mungkin alasan nya karna mereka ingin memperluas jaringan aja atau ingin mencoba pengalaman baru.
ggplot(data = employee_df, aes(x = Age, y = TotalWorkingYears, color = Gender)) +
geom_point() +
facet_grid(MaritalStatus ~ Attrition) +
labs(title = "Attrition By Marital Status")
Dari plot ini menjelaskan bahwa pegawai perusahaan paling banyak berada di rentang usia 30-40 tahun. Dan jumlah karyawan yang paling banyak meninggalkan perusahaan adalah karyawan di kelompok rentang usia dibawah 30 tahun dan rentang usia 30-40 tahun. Dan berstatus single yang paling tinggi disbanding status lainnya. Dan rata-rata paling banyak bekerja di perusahaan selama 0-10 tahun.
ggplot(data = employee_df, aes(x = TotalWorkingYears, y = MonthlyIncome, color = Gender)) +
geom_point() +
facet_grid(MaritalStatus ~ Attrition) +
labs(title = "Attrition By Marital Status")
Dari plot ini menjelaskan bahwa banyak pegawai yang meninggalkan perusahaan ini rata-rata memiliki gaji dibawah 5 juta, dan telah bekerja selama 0-10 tahun. Dan kebanyakan status nya adalah single. Disini juga ada yang sudah bekerja selama 20 tahun tidak kunjung naik gaji. Mungkin ini juga bisa jadi suatu alasan mengapa pegawai meninggalkan perusahaan.
Jadi kesimpulannya adalah Attrition yang paling banyak terjadi pada karyawan kategori usia muda (di bawah 40 tahun), berstatus single atau belum menikah, dan belum pernah memiliki pengalaman bekerja di perusahaan lain sebelumnya. Oleh karena itu, kelompok karyawan yang masuk kategori ini mungkin sebaiknya diberi perlakuan khusus seperti pembatasan rekrutmen.
OHE Untuk BusinessTravel, Department, Education, EducationField, EnvironmentSatisfaction, Gender dan MaritalStatus
library(ggplot2)
library(caret)
dmy <- dummyVars(" ~ BusinessTravel + Department + Education + EducationField + EnvironmentSatisfaction +
Gender + MaritalStatus ", data = employee_df)
employee_ohe <- data.frame(predict(dmy, newdata = employee_df))
employee_df<- cbind(employee_df, employee_ohe)
Remove OHE
employee_df$BusinessTravel<- NULL
employee_df$Department<- NULL
employee_df$Education <- NULL
employee_df$EducationField <- NULL
employee_df$EnvironmentSatisfaction <- NULL
employee_df$Gender<- NULL
employee_df$MaritalStatus <- NULL
get outlier values
out_stag <- boxplot.stats(employee_df$YearsWithCurrManager)$out
out_stag
## [1] 17 15 15 15 15 17 16 17 15 17 17 17
get row index of outlier values
out_idx <- which(employee_df$YearsWithCurrManager %in% c(out_stag))
out_idx
## [1] 29 124 154 188 232 387 562 617 636 687 876 927
remove rows with outliers
employee_df <- employee_df[-out_idx,]
Data Testing = 30% : Data Training = 70%
set.seed(2021)
m <- nrow(employee_df)
train_idx <- sample(m, 0.7 * m)
train_df <- employee_df[train_idx, ]
test_df <- employee_df[-train_idx, ]
fit.logit <- glm(formula = Attrition ~ .,
family = binomial(link="logit"),
data = train_df)
summary(fit.logit)
##
## Call:
## glm(formula = Attrition ~ ., family = binomial(link = "logit"),
## data = train_df)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -2.06855 -0.52717 -0.29783 -0.06909 3.13435
##
## Coefficients: (6 not defined because of singularities)
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.596e+00 2.219e+00 1.170 0.242111
## Age -2.536e-02 1.854e-02 -1.368 0.171215
## DailyRate -3.761e-04 3.094e-04 -1.215 0.224213
## DistanceFromHome 3.963e-02 1.468e-02 2.700 0.006940 **
## HourlyRate -1.234e-03 6.192e-03 -0.199 0.841996
## JobInvolvement -4.234e-01 1.722e-01 -2.459 0.013951 *
## JobRoleHuman Resources 1.797e+01 2.223e+03 0.008 0.993551
## JobRoleLaboratory Technician 2.086e+00 7.215e-01 2.891 0.003835 **
## JobRoleManager 2.110e-01 1.109e+00 0.190 0.849023
## JobRoleManufacturing Director 5.403e-01 8.353e-01 0.647 0.517745
## JobRoleResearch Director -1.577e+01 8.865e+02 -0.018 0.985806
## JobRoleResearch Scientist 1.701e+00 7.263e-01 2.342 0.019201 *
## JobRoleSales Executive 1.613e+00 1.429e+00 1.129 0.259049
## JobRoleSales Representative 3.634e+00 1.510e+00 2.407 0.016082 *
## JobSatisfactionMedium -9.521e-01 4.011e-01 -2.374 0.017605 *
## JobSatisfactionHigh -4.635e-01 3.390e-01 -1.367 0.171573
## JobSatisfactionVery High -1.161e+00 3.491e-01 -3.327 0.000879 ***
## MonthlyIncome 8.279e-05 8.384e-05 0.988 0.323390
## MonthlyRate 1.974e-05 1.769e-05 1.116 0.264401
## NumCompaniesWorked1 -1.512e-02 3.791e-01 -0.040 0.968185
## NumCompaniesWorked2 2.654e-01 5.437e-01 0.488 0.625455
## NumCompaniesWorked3 -3.082e-01 5.694e-01 -0.541 0.588388
## NumCompaniesWorked4 3.223e-01 5.178e-01 0.622 0.533618
## NumCompaniesWorked5 1.451e+00 5.525e-01 2.626 0.008635 **
## NumCompaniesWorked6 1.085e+00 5.910e-01 1.835 0.066448 .
## NumCompaniesWorked7 1.251e+00 5.547e-01 2.255 0.024102 *
## NumCompaniesWorked8 9.755e-01 7.078e-01 1.378 0.168115
## NumCompaniesWorked9 1.255e+00 6.894e-01 1.821 0.068602 .
## PercentSalaryHike 1.324e-03 5.299e-02 0.025 0.980066
## PerformanceRating 1.505e-01 5.181e-01 0.291 0.771433
## RelationshipSatisfaction -2.880e-01 1.096e-01 -2.629 0.008563 **
## StockOptionLevel 5.499e-02 2.186e-01 0.252 0.801387
## TotalWorkingYears -3.275e-02 3.993e-02 -0.820 0.412079
## TrainingTimesLastYear -2.900e-01 9.596e-02 -3.022 0.002508 **
## WorkLifeBalance -5.740e-01 1.775e-01 -3.233 0.001224 **
## YearsAtCompany 2.117e-02 5.268e-02 0.402 0.687756
## YearsInCurrentRole -1.330e-01 6.627e-02 -2.007 0.044736 *
## YearsSinceLastPromotion 2.017e-01 5.907e-02 3.415 0.000638 ***
## YearsWithCurrManager -9.795e-02 6.848e-02 -1.430 0.152633
## BusinessTravel.Non.Travel -6.149e-01 4.692e-01 -1.310 0.190038
## BusinessTravel.Travel_Frequently 5.040e-01 2.926e-01 1.722 0.084981 .
## BusinessTravel.Travel_Rarely NA NA NA NA
## Department.Human.Resources -1.488e+01 2.223e+03 -0.007 0.994658
## Department.Research...Development 3.833e-01 1.292e+00 0.297 0.766785
## Department.Sales NA NA NA NA
## Education 5.885e-02 1.229e-01 0.479 0.631931
## EducationField.Human.Resources -2.543e+00 1.519e+00 -1.674 0.094060 .
## EducationField.Life.Sciences -1.335e+00 4.342e-01 -3.075 0.002106 **
## EducationField.Marketing -5.566e-01 5.514e-01 -1.009 0.312735
## EducationField.Medical -1.140e+00 4.433e-01 -2.573 0.010092 *
## EducationField.Other -8.150e-01 6.661e-01 -1.224 0.221114
## EducationField.Technical.Degree NA NA NA NA
## EnvironmentSatisfaction.Low 1.179e+00 3.483e-01 3.384 0.000715 ***
## EnvironmentSatisfaction.Medium 4.565e-01 3.520e-01 1.297 0.194667
## EnvironmentSatisfaction.High -7.204e-02 3.314e-01 -0.217 0.827882
## EnvironmentSatisfaction.Very.High NA NA NA NA
## Gender.Female -2.651e-01 2.541e-01 -1.043 0.296853
## Gender.Male NA NA NA NA
## MaritalStatus.Divorced -1.531e+00 4.939e-01 -3.100 0.001938 **
## MaritalStatus.Married -1.026e+00 3.518e-01 -2.916 0.003545 **
## MaritalStatus.Single NA NA NA NA
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 675.47 on 731 degrees of freedom
## Residual deviance: 470.11 on 677 degrees of freedom
## AIC: 580.11
##
## Number of Fisher Scoring iterations: 17
pred <- predict(fit.logit, test_df)
pred
## 2 3 5 6 9
## -3.780872993 -0.051991766 -0.526140342 -1.949643796 -1.568917091
## 11 14 15 21 25
## -2.955440727 -2.761182449 0.880091802 -4.273730277 -0.592328595
## 26 31 33 36 39
## -5.544536244 -2.561799655 -1.009358567 -4.510349829 -1.542024931
## 40 41 43 46 59
## -3.013040304 -3.245814377 2.124539550 -16.842357177 -4.519387873
## 63 65 66 72 75
## -15.843772099 -3.243193483 -4.168316190 -4.797393668 -3.040450863
## 79 84 87 89 92
## -17.012117143 -4.395444269 -0.327206910 -4.003402485 -1.338814936
## 97 100 101 103 105
## -0.474818863 -3.051246006 -3.361542749 -0.990461745 -5.684648495
## 111 112 123 132 133
## -0.483568178 0.010367111 -0.933116596 -2.132166860 -1.189754362
## 137 142 143 147 156
## -1.360173354 -0.409323825 -0.817682793 -2.142809353 -3.933280411
## 160 164 166 171 172
## 0.100205658 -4.561692862 -4.268599622 -1.351017339 2.409679710
## 179 186 192 194 197
## -1.403504958 -5.407767438 -2.849788304 -6.181077793 -0.516823072
## 205 210 212 214 221
## -1.195649385 -3.902719911 -3.330084164 -19.074301878 -3.666778730
## 223 224 225 229 233
## -20.155968173 -3.937865891 -4.509233225 -2.961846971 -0.257153494
## 236 239 241 243 244
## -4.845061494 -2.260841502 -1.973965847 -1.328948783 -1.215529606
## 249 253 254 255 260
## -1.290134154 -1.666773150 -1.778174952 -3.263737991 -0.444816824
## 270 271 273 276 282
## -4.366653315 -3.660491833 -3.621491650 -19.861381912 -3.416152244
## 286 288 289 292 293
## -4.323639533 -3.289064922 -1.790409852 0.334882331 -1.237959494
## 294 295 297 301 302
## -0.222848280 -1.900445926 -0.471066385 -4.447841778 1.408256245
## 303 309 313 319 320
## -3.330975807 -5.310505300 -2.210553700 -1.760926127 -2.125045373
## 323 329 331 335 336
## -0.830045114 -2.200416668 -3.427141494 -1.382176646 -1.793908600
## 337 339 342 343 348
## -1.562400642 -3.317293564 -21.580626388 -3.694539781 0.606340176
## 352 353 357 358 360
## -4.434117962 -1.126413892 -3.290234258 2.083347019 -2.324476422
## 363 364 373 375 377
## 0.694126329 1.019062041 -2.745008488 -2.740885324 -5.196772042
## 382 386 388 389 392
## 0.294652143 0.352462774 -3.595366416 -3.189121230 -0.763494241
## 395 400 405 411 415
## -4.025336328 -1.349176603 -2.437805734 -2.675385483 0.808184278
## 416 418 420 424 429
## 0.509139321 -7.414121769 -3.204655884 -2.928142082 -3.570947323
## 440 443 447 449 453
## -1.068899488 -1.052953860 -3.514545429 -1.759546543 -4.656307796
## 461 465 472 474 480
## -0.009804046 -3.171928432 -5.144574546 -22.089668239 -1.768512056
## 483 486 492 493 494
## -0.941305315 -2.369245561 -2.803220994 -1.154565855 0.534072469
## 496 499 502 503 511
## -1.132119093 -1.375488677 -2.045592964 -1.740518546 -1.006843577
## 513 514 518 520 522
## -0.284017746 -1.947246494 -3.989690970 -4.303778684 -5.045338617
## 523 526 531 536 540
## -2.339393292 1.103009766 -5.570257016 -17.851639515 0.217826084
## 546 550 552 558 559
## -0.455933181 -3.098246566 -1.904051322 -5.510213871 -1.019246956
## 560 565 566 567 570
## 0.817928972 2.272280686 -0.872239763 -1.668617854 -1.554132390
## 573 574 578 579 583
## -2.163046963 1.681289128 -1.888948294 -1.353906932 -6.164762042
## 584 591 593 594 596
## -0.919861495 -21.119034065 -4.821979946 -4.602299375 -18.095046498
## 598 601 603 604 610
## -4.871255721 -4.934930367 -1.114488161 -1.847141056 -17.448029387
## 611 622 627 631 638
## -20.355769811 -5.137973784 -1.432207067 -0.743345665 -3.876966116
## 640 647 649 652 653
## -1.743941602 -0.610950421 0.001388283 -2.636977459 -2.438337845
## 655 656 663 686 692
## -2.532040044 -5.999214735 0.344660925 -1.884349122 -2.096842622
## 694 702 712 715 719
## -4.707057078 -3.567012263 -0.379198117 -19.865781067 -3.466390660
## 721 727 729 736 737
## -0.497110852 -3.598278640 -3.435971141 -1.682569441 -3.271126891
## 739 740 744 746 750
## -3.615773778 -3.215703627 -3.960088695 -5.031717309 -3.798929017
## 755 758 763 765 767
## -0.397914199 -3.570486429 0.939858267 -1.530454230 -18.249934951
## 769 771 781 783 786
## 0.199119558 -18.752795102 -0.594282904 -1.338290480 -1.587135967
## 787 796 802 803 804
## -1.483750632 -3.805961233 -2.593714206 -3.755962758 -3.824721296
## 806 808 810 817 820
## -4.895178262 -2.775880189 -5.240225768 -1.031586774 -0.692793640
## 825 826 830 832 833
## 0.876143553 -3.279505015 0.716162244 -1.532665314 -3.118048132
## 836 840 842 843 847
## 1.647237375 -1.246402557 0.053772335 -3.373003301 -4.085894336
## 848 849 853 859 860
## -2.853248265 -1.374900781 -4.493776732 -6.371111249 -1.085079525
## 861 862 869 872 873
## -2.932308207 -1.218559388 -0.670708958 -1.060128964 -1.668607941
## 877 879 883 885 889
## 0.341263100 -1.488148745 -1.596873595 -0.745974959 -3.712383002
## 891 893 897 900 902
## -2.662902569 -0.878881837 -2.929305395 -2.486399060 0.018164555
## 903 904 908 909 910
## -2.423011235 -4.810924706 -4.344743947 -4.511279048 -1.247465971
## 921 923 924 926 928
## -3.021024456 -3.760329869 -3.832336379 -2.973164975 -4.718469254
## 934 938 943 948 950
## 0.904227130 -1.390210605 -3.270819915 -0.401118774 -2.950486409
## 958 960 963 965 967
## -1.563496883 -3.036357236 -21.956380599 -2.662278299 -2.466833917
## 969 974 977 978 980
## -1.331070005 -2.612224747 -2.352879745 -0.605576868 0.905136550
## 984 989 999 1001 1003
## -5.392339790 -2.730433930 -1.070195079 -0.230729623 -1.630257659
## 1004 1005 1006 1008 1011
## 0.188096862 -2.044729122 1.209784712 -1.537385411 -23.605576692
## 1015 1016 1017 1022 1023
## -18.426876961 -0.562484368 -0.996221564 1.854721217 -0.075050386
## 1025 1034 1038 1039 1042
## -20.384954189 -3.803097112 -2.933604917 -2.052370962 -2.075933251
## 1045 1046 1047 1052
## -0.900988754 -4.188664531 -1.797547641 0.126890284
prob <- predict(fit.logit, test_df, type = "response")
prob
## 2 3 5 6 9 11
## 2.229440e-02 4.870050e-01 3.714175e-01 1.245922e-01 1.723708e-01 4.948000e-02
## 14 15 21 25 26 31
## 5.945821e-02 7.068412e-01 1.373835e-02 3.561007e-01 3.893537e-03 7.163776e-02
## 33 36 39 40 41 43
## 2.671054e-01 1.087505e-02 1.762411e-01 4.684022e-02 3.747758e-02 8.932655e-01
## 46 59 63 65 66 72
## 4.846823e-08 1.077825e-02 1.315640e-07 3.757224e-02 1.524237e-02 8.183699e-03
## 75 79 84 87 89 92
## 4.563153e-02 4.090076e-08 1.218314e-02 4.189204e-01 1.792621e-02 2.077050e-01
## 97 100 101 103 105 111
## 3.834763e-01 4.516371e-02 3.351921e-02 2.708209e-01 3.386222e-03 3.814099e-01
## 112 123 132 133 137 142
## 5.025918e-01 2.822929e-01 1.060095e-01 2.333029e-01 2.042121e-01 3.990743e-01
## 143 147 156 160 164 166
## 3.062558e-01 1.050051e-01 1.920335e-02 5.250305e-01 1.033641e-02 1.380805e-02
## 171 172 179 186 192 194
## 2.057041e-01 9.175625e-01 1.972605e-01 4.461639e-03 5.469226e-02 2.063929e-03
## 197 205 210 212 214 221
## 3.735954e-01 2.322501e-01 1.978748e-02 3.455342e-02 5.201588e-09 2.492170e-02
## 223 224 225 229 233 236
## 1.763495e-09 1.911717e-02 1.088706e-02 4.917957e-02 4.360636e-01 7.805725e-03
## 239 241 243 244 249 253
## 9.441839e-02 1.219636e-01 2.093333e-01 2.287241e-01 2.158301e-01 1.588549e-01
## 254 255 260 270 271 273
## 1.445286e-01 3.683636e-02 3.905938e-01 1.253454e-02 2.507494e-02 2.604621e-02
## 276 282 286 288 289 292
## 2.367617e-09 3.179446e-02 1.307826e-02 3.594824e-02 1.430225e-01 5.829468e-01
## 293 294 295 297 301 302
## 2.247914e-01 4.445174e-01 1.300580e-01 3.843639e-01 1.156840e-02 8.034908e-01
## 303 309 313 319 320 323
## 3.452369e-02 4.915152e-03 9.880676e-02 1.466744e-01 1.066863e-01 3.036355e-01
## 329 331 335 336 337 339
## 9.971308e-02 3.145791e-02 2.006596e-01 1.425942e-01 1.733024e-01 3.498266e-02
## 342 343 348 352 353 357
## 4.242805e-10 2.425592e-02 6.471055e-01 1.172639e-02 2.448235e-01 3.590774e-02
## 358 360 363 364 373 375
## 8.892740e-01 8.911602e-02 6.668842e-01 7.347899e-01 6.036917e-02 6.060348e-02
## 377 382 386 388 389 392
## 5.503939e-03 5.731347e-01 5.872147e-01 2.671722e-02 3.957717e-02 3.178881e-01
## 395 400 405 411 415 416
## 1.754412e-02 2.060050e-01 8.033488e-02 6.444152e-02 6.917225e-01 6.246047e-01
## 418 420 424 429 440 443
## 6.023184e-04 3.899089e-02 5.077980e-02 2.735959e-02 2.556124e-01 2.586583e-01
## 447 449 453 461 465 472
## 2.890119e-02 1.468471e-01 9.412051e-03 4.975490e-01 4.023588e-02 5.797152e-03
## 474 480 483 486 492 493
## 2.550228e-10 1.457275e-01 2.806368e-01 8.554814e-02 5.715037e-02 2.396561e-01
## 494 496 499 502 503 511
## 6.304324e-01 2.437702e-01 2.017345e-01 1.144984e-01 1.492471e-01 2.675980e-01
## 513 514 518 520 522 523
## 4.294690e-01 1.248539e-01 1.816920e-02 1.333710e-02 6.398081e-03 8.791255e-02
## 526 531 536 540 546 550
## 7.508236e-01 3.795044e-03 1.766572e-08 5.542422e-01 3.879510e-01 4.317964e-02
## 552 558 559 560 565 566
## 1.296506e-01 4.028944e-03 2.651741e-01 6.937965e-01 9.065552e-01 2.947885e-01
## 567 570 573 574 578 579
## 1.586085e-01 1.744902e-01 1.031183e-01 8.430752e-01 1.313644e-01 2.052324e-01
## 583 584 591 593 594 596
## 2.097808e-03 2.849861e-01 6.731627e-10 7.986533e-03 9.929172e-03 1.384909e-08
## 598 601 603 604 610 611
## 7.605450e-03 7.139621e-03 2.470351e-01 1.362089e-01 2.644948e-08 1.444114e-09
## 622 627 631 638 640 647
## 5.835320e-03 1.927550e-01 3.222730e-01 2.029323e-02 1.488130e-01 3.518424e-01
## 649 652 653 655 656 663
## 5.003471e-01 6.679620e-02 8.029557e-02 7.364236e-02 2.474561e-03 5.853223e-01
## 686 692 694 702 712 715
## 1.318901e-01 1.094041e-01 8.950482e-03 2.746450e-02 4.063203e-01 2.357224e-09
## 719 721 727 729 736 737
## 3.028380e-02 3.782199e-01 2.664160e-02 3.119000e-02 1.567555e-01 3.657510e-02
## 739 740 744 746 750 755
## 2.619165e-02 3.857903e-02 1.870488e-02 6.485258e-03 2.190420e-02 4.018136e-01
## 758 763 765 767 769 771
## 2.737186e-02 7.190710e-01 1.779272e-01 1.186189e-08 5.496161e-01 7.174053e-09
## 781 783 786 787 796 802
## 3.556528e-01 2.077913e-01 1.697872e-01 1.848616e-01 2.175405e-02 6.954406e-02
## 803 804 806 808 810 817
## 2.284389e-02 2.135838e-02 7.427002e-03 5.864157e-02 5.271128e-03 2.627766e-01
## 820 825 826 830 832 833
## 3.334119e-01 7.060224e-01 3.628102e-02 6.717614e-01 1.776041e-01 4.236890e-02
## 836 840 842 843 847 848
## 8.385173e-01 2.233235e-01 5.134398e-01 3.314991e-02 1.653026e-02 5.451365e-02
## 849 853 859 860 861 862
## 2.018292e-01 1.105477e-02 1.707338e-03 2.525460e-01 5.057937e-02 2.281901e-01
## 869 872 873 877 879 883
## 3.383381e-01 2.572848e-01 1.586099e-01 5.844973e-01 1.841998e-01 1.684190e-01
## 885 889 891 893 897 900
## 3.216990e-01 2.383718e-02 6.519821e-02 2.934095e-01 5.072376e-02 7.681717e-02
## 902 903 904 908 909 910
## 5.045410e-01 8.143472e-02 8.074599e-03 1.280864e-02 1.086506e-02 2.231391e-01
## 921 923 924 926 928 934
## 4.648505e-02 2.274661e-02 2.119979e-02 4.865302e-02 8.849817e-03 7.118174e-01
## 938 943 948 950 958 960
## 1.993741e-01 3.658592e-02 4.010436e-01 4.971353e-02 1.731454e-01 4.581014e-02
## 963 965 967 969 974 977
## 2.913836e-10 6.523626e-02 7.821620e-02 2.089824e-01 6.835579e-02 8.683715e-02
## 978 980 984 989 999 1001
## 3.530688e-01 7.120039e-01 4.530691e-03 6.120123e-02 2.553660e-01 4.425721e-01
## 1003 1004 1005 1006 1008 1011
## 1.637951e-01 5.468861e-01 1.145861e-01 7.702609e-01 1.769157e-01 5.600519e-11
## 1015 1016 1017 1022 1023 1025
## 9.938229e-09 3.629728e-01 2.696850e-01 8.646805e-01 4.812462e-01 1.402578e-09
## 1034 1038 1039 1042 1045 1046
## 2.181508e-02 5.051713e-02 1.138130e-01 1.114581e-01 2.888474e-01 1.493994e-02
## 1047 1052
## 1.421499e-01 5.316801e-01
logit.pred <- factor(prob > 0.5,
levels = c(FALSE, TRUE),
labels = c("No", "Yes"))
logit.perf <- table(test_df$Attrition, logit.pred,
dnn = c("Actual","Predicted"))
logit.perf
## Predicted
## Actual No Yes
## No 240 22
## Yes 37 15
True Negatif
Ada 240 pegawai yang diprediksi tidak akan meninggalkan perusahaan, dan ternyata memang benar dia tidak akan meninggalkan perusahaan.
True Positif
Ada 15 pegawai yang diprediksi akan meninggalkan perusahaan, dan ternyata memang benar dia akan meninggalkan perusahaan.
False Positif
Ada 22 pegawai yang diprediksi akan meninggalkan perusahaan, dan ternyata prediksinya salah. Ternyata 22 pegawainya itu tidak meninggalkan perusahaan.
False Negatif
Ada 37 pegawai yang diprediksi tidak akan meninggalkan perusahaan, dan ternyata prediksinya salah. Ternyata 37 pegawai itu benar-benar meninggalkan perusahaan.
#install.packages("party")
library(party)
fit.ctree <- ctree(formula = Attrition ~ .,
controls = ctree_control(minsplit = 1, mincriterion = 0.5, minbucket = 1),
data = train_df)
plot(fit.ctree)
ctree.pred <- predict(fit.ctree, test_df)
ctree.pred
## [1] No Yes No No No No No No No No No Yes No No No No No No
## [19] No No No No No No No No No No No No No No No Yes No No
## [37] No No No No No No No No No No No No No Yes No No No No
## [55] No No No No No No No No No No No No No No No No No No
## [73] No No No No No No No No No No No No No No No Yes No Yes
## [91] No No No No No No No No No No No No No No Yes No No No
## [109] No No No Yes No No No No No No No No No No No No No No
## [127] No No No No No No No No No No No No No No No No No No
## [145] No No No No No No No No No No No No No No No No No No
## [163] No No No No No No No Yes No No No No No No No No No No
## [181] No No No No No No No No No No No No No No Yes No No No
## [199] Yes No No No No No No No No No No No No No No No No No
## [217] No No No No No No No No No No No No No No No No No No
## [235] No Yes No Yes No No No No No No No No No No No No No No
## [253] No No No No No No No No No Yes No No Yes No No No No No
## [271] No No No No No No No No No No No No No No No No No No
## [289] No No No No No No No No No No No No No No No No No No
## [307] No No No No No No No No
## Levels: No Yes
ctree.perf <- table(test_df$Attrition, ctree.pred,
dnn = c("Actual","Predicted"))
ctree.perf
## Predicted
## Actual No Yes
## No 254 8
## Yes 45 7
True Negatif
Ada 254 pegawai yang diprediksi tidak akan meninggalkan perusahaan, dan ternyata memang benar dia tidak akan meninggalkan perusahaan.
True Positif
Ada 7 pegawai yang diprediksi akan meninggalkan perusahaan, dan ternyata memang benar dia akan meninggalkan perusahaan.
False Positif
Ada 8 pegawai yang diprediksi akan meninggalkan perusahaan, dan ternyata prediksinya salah. Ternyata 8 pegawainya itu tidak meninggalkan perusahaan.
False Negatif
Ada 45 pegawai yang diprediksi tidak akan meninggalkan perusahaan, dan ternyata prediksinya salah. Ternyata 45 pegawai itu benar-benar meninggalkan perusahaan.
library(randomForest)
fit.forest <- randomForest(formula = Attrition ~ .,
data = train_df,
na.action = na.roughfix)
forest.pred <- predict(fit.forest, test_df)
forest.pred
## 2 3 5 6 9 11 14 15 21 25 26 31 33 36 39 40
## No No No No No No No No No No No No No No No No
## 41 43 46 59 63 65 66 72 75 79 84 87 89 92 97 100
## No Yes No No No No No No No No No No No No No No
## 101 103 105 111 112 123 132 133 137 142 143 147 156 160 164 166
## No No No No No No No No No No No No No No No No
## 171 172 179 186 192 194 197 205 210 212 214 221 223 224 225 229
## No Yes No No No No No No No No No No No No No No
## 233 236 239 241 243 244 249 253 254 255 260 270 271 273 276 282
## No No No No No No No No No No No No No No No No
## 286 288 289 292 293 294 295 297 301 302 303 309 313 319 320 323
## No No No No No No No Yes No Yes No No No No No No
## 329 331 335 336 337 339 342 343 348 352 353 357 358 360 363 364
## No No No No No No No No No No No No Yes No No No
## 373 375 377 382 386 388 389 392 395 400 405 411 415 416 418 420
## No No No No No No No No No No No No No No No No
## 424 429 440 443 447 449 453 461 465 472 474 480 483 486 492 493
## No No No No No No No No No No No No No No No No
## 494 496 499 502 503 511 513 514 518 520 522 523 526 531 536 540
## No No No No No No No No No No No No No No No No
## 546 550 552 558 559 560 565 566 567 570 573 574 578 579 583 584
## No No No No No No No No No No No No No No No No
## 591 593 594 596 598 601 603 604 610 611 622 627 631 638 640 647
## No No No No No No No No No No No No No No No No
## 649 652 653 655 656 663 686 692 694 702 712 715 719 721 727 729
## No No No No No Yes No No No No No No No No No No
## 736 737 739 740 744 746 750 755 758 763 765 767 769 771 781 783
## No No No No No No No No No No No No No No No No
## 786 787 796 802 803 804 806 808 810 817 820 825 826 830 832 833
## No No No No No No No No No No No No No No No No
## 836 840 842 843 847 848 849 853 859 860 861 862 869 872 873 877
## No No No No No No No No No No No No No No No No
## 879 883 885 889 891 893 897 900 902 903 904 908 909 910 921 923
## No No No No No Yes No No No No No No No No No No
## 924 926 928 934 938 943 948 950 958 960 963 965 967 969 974 977
## No No No No No No No No No No No No No No No No
## 978 980 984 989 999 1001 1003 1004 1005 1006 1008 1011 1015 1016 1017 1022
## No No No No No No No No No No No No No No No No
## 1023 1025 1034 1038 1039 1042 1045 1046 1047 1052
## No No No No No No No No No No
## Levels: No Yes
forest.perf <- table(test_df$Attrition, forest.pred,
dnn = c("Actual","Predicted"))
forest.perf
## Predicted
## Actual No Yes
## No 261 1
## Yes 46 6
True Negatif
Ada 261 pegawai yang diprediksi tidak akan meninggalkan perusahaan, dan ternyata memang benar dia tidak akan meninggalkan perusahaan.
True Positif
Ada 6 pegawai yang diprediksi akan meninggalkan perusahaan, dan ternyata memang benar dia akan meninggalkan perusahaan.
False Positif
Ada 1 pegawai yang diprediksi akan meninggalkan perusahaan, dan ternyata prediksinya salah. Ternyata 1 pegawainya itu tidak meninggalkan perusahaan.
False Negatif
Ada 46 pegawai yang diprediksi tidak akan meninggalkan perusahaan, dan ternyata prediksinya salah. Ternyata 46 pegawai itu benar-benar meninggalkan perusahaan.
#install.packages("e1071")
library(e1071)
fit.svm <- svm(formula = Attrition ~ .,
data = train_df)
svm.pred <- predict(fit.svm, na.omit(test_df))
svm.pred
## 2 3 5 6 9 11 14 15 21 25 26 31 33 36 39 40
## No No No No No No No No No No No No No No No No
## 41 43 46 59 63 65 66 72 75 79 84 87 89 92 97 100
## No No No No No No No No No No No No No No No No
## 101 103 105 111 112 123 132 133 137 142 143 147 156 160 164 166
## No No No No No No No No No No No No No No No No
## 171 172 179 186 192 194 197 205 210 212 214 221 223 224 225 229
## No Yes No No No No No No No No No No No No No No
## 233 236 239 241 243 244 249 253 254 255 260 270 271 273 276 282
## No No No No No No No No No No No No No No No No
## 286 288 289 292 293 294 295 297 301 302 303 309 313 319 320 323
## No No No No No No No No No No No No No No No No
## 329 331 335 336 337 339 342 343 348 352 353 357 358 360 363 364
## No No No No No No No No No No No No Yes No No No
## 373 375 377 382 386 388 389 392 395 400 405 411 415 416 418 420
## No No No No No No No No No No No No No No No No
## 424 429 440 443 447 449 453 461 465 472 474 480 483 486 492 493
## No No No No No No No No No No No No No No No No
## 494 496 499 502 503 511 513 514 518 520 522 523 526 531 536 540
## No No No No No No No No No No No No No No No No
## 546 550 552 558 559 560 565 566 567 570 573 574 578 579 583 584
## No No No No No No No No No No No No No No No No
## 591 593 594 596 598 601 603 604 610 611 622 627 631 638 640 647
## No No No No No No No No No No No No No No No No
## 649 652 653 655 656 663 686 692 694 702 712 715 719 721 727 729
## No No No No No No No No No No No No No No No No
## 736 737 739 740 744 746 750 755 758 763 765 767 769 771 781 783
## No No No No No No No No No No No No No No No No
## 786 787 796 802 803 804 806 808 810 817 820 825 826 830 832 833
## No No No No No No No No No No No No No No No No
## 836 840 842 843 847 848 849 853 859 860 861 862 869 872 873 877
## No No No No No No No No No No No No No No No No
## 879 883 885 889 891 893 897 900 902 903 904 908 909 910 921 923
## No No No No No No No No No No No No No No No No
## 924 926 928 934 938 943 948 950 958 960 963 965 967 969 974 977
## No No No No No No No No No No No No No No No No
## 978 980 984 989 999 1001 1003 1004 1005 1006 1008 1011 1015 1016 1017 1022
## No No No No No No No No No No No No No No No No
## 1023 1025 1034 1038 1039 1042 1045 1046 1047 1052
## No No No No No No No No No No
## Levels: No Yes
svm.perf <- table(na.omit(test_df)$Attrition, svm.pred,
dnn = c("Actual","Predicted"))
svm.perf
## Predicted
## Actual No Yes
## No 262 0
## Yes 50 2
True Negatif
Ada 262 pegawai yang diprediksi tidak akan meninggalkan perusahaan, dan ternyata memang benar dia tidak akan meninggalkan perusahaan.
True Positif
Ada 2 pegawai yang diprediksi akan meninggalkan perusahaan, dan ternyata memang benar dia akan meninggalkan perusahaan.
False Positif
Ada 0 pegawai yang diprediksi akan meninggalkan perusahaan, dan ternyata prediksinya salah. Ternyata 0 pegawainya itu tidak meninggalkan perusahaan.
False Negatif
Ada 50 pegawai yang diprediksi tidak akan meninggalkan perusahaan, dan ternyata prediksinya salah. Ternyata 50 pegawai itu benar-benar meninggalkan perusahaan.
# Performance Comparison
performance <- function(table){
tn <- table[1,1]
tp <- table[2,2]
fn <- table[1,2]
fp <- table[2,1]
accuracy <- (tn + tp) / (tn + tp + fn + fp)
precision <- tp / (tp + fp)
recall <- tp / (tp + fn)
f1score <- 2 * precision * recall / (precision + recall)
result <- paste("Accuracy = ", round(accuracy, 3),
"\nPrecision = ", round(precision, 3),
"\nRecall = ", round(recall, 3),
"\nF1 Score = ", round(f1score, 3), "\n")
cat(result)
}
performance(logit.perf)
## Accuracy = 0.812
## Precision = 0.288
## Recall = 0.405
## F1 Score = 0.337
performance(ctree.perf)
## Accuracy = 0.831
## Precision = 0.135
## Recall = 0.467
## F1 Score = 0.209
performance(forest.perf)
## Accuracy = 0.85
## Precision = 0.115
## Recall = 0.857
## F1 Score = 0.203
performance(svm.perf)
## Accuracy = 0.841
## Precision = 0.038
## Recall = 1
## F1 Score = 0.074
Setelah selesai melakukan beberapa algoritma, yang menghasilkan tingkat akurasi paling tinggi adalah model Random Forest sebesar 0.85 atau 85%.
Bisa dibuktikan melalui perhitungan confusion matrix, dengan hasil sebagai berikut:
- Accuracy untuk model logistic regression = 255 pegawai
- Accuracy untuk model classification tree = 261 pegawai - Accuracy untuk model random forest = 267 pegawai - Accuracy untuk model support vector machine = 264 pegawai
Jadi paling banyak adalah model random forest, sebanyak pegawai yang benar diprediksi tidak akan meninggalkan perusahaan.
Dan yang menghasilkan tingkat precision paling tinggi adalah model Support Vector Machine sebesar 100%.
Bisa dibuktikan melalui perhitungan confusion matrix, dengan hasil sebagai berikut:
- Precision untuk model logistic regression = 15 pegawai
- Precision untuk model classification tree = 7 pegawai
- Precision untuk model random forest = 6 pegawai
- Precision untuk model support vector machine = 2 pegawai
Jadi paling sedikit yang meninggalkan perusahaan adalah model support vector machine, yaitu sebanyak 2 pegawai yang benar di prediksi akan meninggalkan perusahaan.
Sehingga dapat disimpulkan: 1.) Projek ini dilakukan selama 2 minggu
2.) Untuk variabel utama yang digunakan dalam projek ini adalah attrition, age, monthlyincome, gender, maritalstatus, numcompaniesworked. 3.) Untuk model, mungkin bisa di deploy lagi dalam meningkatkan nilai akurasinya.
4.) Menurut saya, Model yang paling menguntungkan dalam segi bisnis adalah model Support Vector Machine. Karena precissionnya menunjukan yang paling sedikit meninggalkan perusahaan sebanyak 2 pegawai. Dan juga hasil presentase paling tinggi diantara model lainnya adalah precision sebesar 100%.
5.) Sehingga dengan demikian kalau kita sudah mentreatment itu dengan lebih baik maka kita tidak akan kehilangan talenta-talenta baru diperusahaan. Dan akhirnya kita juga gak perlu kluar biaya atau effort untuk merekrut org-orang baru lagi. 6.) Projek ini dapat dimanfaatkan oleh seorang HR dalam mengefisiensi waktu dari kinerja nya untuk mengelola karyawannya.
7.) Projek ini dapat dimanfaarkan oleh seorang Manager dalam memprediksi probabilitas attrition tiap karyawan, sehingga manajer bisa melihat dan mendalami alasan personal satu persatu karyawan dengan melihat nilai attrition probability yang tinggi.
8.) Projek ini juga dapat membantu manager dalam menentukan kebijakan dalam usahanya untuk menurunkan nilai attrition yang tinggi di perusahaan.