Description

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.

Cakupan Materi:

Materi yang akan dibahas, yaitu:
1. Data Extraction
2. Data Description
3. Data Exploration
4. Data Preparation
5. Modeling
6. Evaluation
7. Recommendation

1. Data Extraction

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.

2. Data Description

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

3. Data Eksploration

3.1. Multivariate Analysis

A. Correlative Coeficient

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

3.2. Diagram Plot Univariate Analysis, Bivariate Analysis dan Multivariate Analysis

Sebelum dilakukan plot, langkah pertama adalah merubah tipe data variabel agar hasil plotting lebih terlihat jelas

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"))

A. Univariate Analysis (Analisis 1 Variabel)

Melakukan install.packages

#install.packages("ggplot2")
library(ggplot2)

A. Attrition

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.

B. Gender

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.

C. Marital Status

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.

D. Environment Satisfaction

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.

E. Job Satisfaction

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.

F. Num Companies Worked

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.

B. Bivariate Analysis (Analisis 2 Variabel)

A. Karyawan yang mengalami attrition berdasarkan gender

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.

B. Karyawan yang mengalami attrition berdasarkan marital status

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.

C. Karyawan yang mengalami attrition berdasarkan department

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.

D. Karyawan yang mengalami attrition berdasarkan environment satisfaction

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.

E. Karyawan yang mengalami attrition berdasarkan job satisfaction

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.

F. Karyawan yang mengalami attrition berdasarkan num companies worked

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.

B. Multivariate Analysis (Analisis 3 Variabel)

A. Karyawan yang mengalami attrition berdasarkan usia dan lama bekerja di perusahaan

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.

B. Karyawan yang mengalami attrition berdasarkan gaji dan lama bekerja di perusahaan

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.

4. Data Preparation

A. Melakukan One Hot Encoding (OHE)

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

B. Melakukan Remove Outlier

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,]

C. Membagi Data Testing dan Data Train

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, ]

5. Modeling

A. Logistic Regression

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

Evaluation (testing)

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.

B. Classification Tree

Install packages

#install.packages("party")
library(party)

Membuat model

fit.ctree <- ctree(formula = Attrition ~ .,
                   controls = ctree_control(minsplit = 1, mincriterion = 0.5, minbucket = 1),
                   data = train_df)

Plot Ctree

plot(fit.ctree)

Hasil Prediksi

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.

C. Random Forest

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.

D. Support Vector Machine

#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.

6. Evaluation

Performance Comparison

# 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)
}

Hasil Performance Comparison

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

7. Recomendation

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.