1. Intro

Salah satu penerapan Machine Learning juga ddapat diimplementasikan di bidang Human and Resource. Pada artikel ini saya akan menganalisis dan membuat model klasifikasi mengenai turnover karyawan. sehingga dapat membantu HRD untuk mengetahui apakah seornag tersebut akan keluar/meninggalkan pekerjaannya atau tetap stay di pekerjaannya. Employee dataset ini adalah data real yang dibagikan oleh Edward Babushkin’s seorang


2. Pre-Processing Data

2.1 Import Dataset

turnover <- read.csv("turnover.csv")
head(turnover)
##        stag event gender age        industry profession     traffic coach
## 1  7.030801     1      m  35           Banks         HR rabrecNErab    no
## 2 22.965092     1      m  33           Banks         HR       empjs    no
## 3 15.934292     1      f  35 PowerGeneration         HR rabrecNErab    no
## 4 15.934292     1      f  35 PowerGeneration         HR rabrecNErab    no
## 5  8.410678     1      m  32          Retail Commercial       youjs   yes
## 6  8.969199     1      f  42     manufacture         HR       empjs   yes
##   head_gender greywage way extraversion independ selfcontrol anxiety novator
## 1           f    white bus          6.2      4.1         5.7     7.1     8.3
## 2           m    white bus          6.2      4.1         5.7     7.1     8.3
## 3           m    white bus          6.2      6.2         2.6     4.8     8.3
## 4           m    white bus          5.4      7.6         4.9     2.5     6.7
## 5           f    white bus          3.0      4.1         8.0     7.1     3.7
## 6           m    white bus          6.2      6.2         4.1     5.6     6.7

2.2 Data Wrangling

2.2.1 Cek Struktur Data

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
glimpse(turnover)
## Rows: 1,129
## Columns: 16
## $ stag         <dbl> 7.030801, 22.965092, 15.934292, 15.934292, 8.410678, 8.96…
## $ event        <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
## $ gender       <chr> "m", "m", "f", "f", "m", "f", "f", "f", "f", "f", "f", "m…
## $ age          <dbl> 35, 33, 35, 35, 32, 42, 42, 28, 29, 30, 40, 23, 22, 24, 2…
## $ industry     <chr> "Banks", "Banks", "PowerGeneration", "PowerGeneration", "…
## $ profession   <chr> "HR", "HR", "HR", "HR", "Commercial", "HR", "HR", "HR", "…
## $ traffic      <chr> "rabrecNErab", "empjs", "rabrecNErab", "rabrecNErab", "yo…
## $ coach        <chr> "no", "no", "no", "no", "yes", "yes", "yes", "no", "no", …
## $ head_gender  <chr> "f", "m", "m", "m", "f", "m", "m", "m", "f", "m", "m", "m…
## $ greywage     <chr> "white", "white", "white", "white", "white", "white", "wh…
## $ way          <chr> "bus", "bus", "bus", "bus", "bus", "bus", "bus", "bus", "…
## $ extraversion <dbl> 6.2, 6.2, 6.2, 5.4, 3.0, 6.2, 6.2, 3.8, 8.6, 5.4, 8.6, 3.…
## $ independ     <dbl> 4.1, 4.1, 6.2, 7.6, 4.1, 6.2, 6.2, 5.5, 6.9, 5.5, 4.1, 6.…
## $ selfcontrol  <dbl> 5.7, 5.7, 2.6, 4.9, 8.0, 4.1, 4.1, 8.0, 2.6, 3.3, 1.8, 4.…
## $ anxiety      <dbl> 7.1, 7.1, 4.8, 2.5, 7.1, 5.6, 5.6, 4.0, 4.0, 7.9, 7.1, 4.…
## $ novator      <dbl> 8.3, 8.3, 8.3, 6.7, 3.7, 6.7, 6.7, 4.4, 7.5, 8.3, 6.7, 7.…

Keterangan: - Terdapat sebanyak 1129 baris/objek/karyawan

  • Terdapat sebanyak 16 kolom/variabel, diantaranya adalah:
    • stag : pengalaman karyawan (waktu)
    • event : karyawan keluar atau tidak. 0: jika tidak , dan 1: jika iya
    • gender : jenis kelamin karyawan
    • age : umur karyawan
    • industry : bidang perusahaan tempat karyawan bekerja
    • profession : pekerjaan/posisi karyawan
    • traffic : bagaimana karyawan mendatangi perusahaan
    • coach : apakah terdapat coaching/training di masa percobaan
    • head_gender : jenis kelamin atasan karyawan
    • greywage : gaji
    • way : transportasi yang digunakan ke tempat kerja
    • extraversion : Nilai Extraversion
    • independ : Nilai kemandirian
    • selfcontrol : Nilai pengendalian diri
    • anxiety : Nilai kecemasan
    • novator : Nilai novator

2.2.2 Menyesuaikan Struktur Data

turnover <- turnover %>% 
  mutate_at(vars(event, gender, industry, profession, traffic, coach, head_gender, greywage, way), as.factor)

2.2.3 Pemeriksaan Missing Value

colSums(is.na(turnover))
##         stag        event       gender          age     industry   profession 
##            0            0            0            0            0            0 
##      traffic        coach  head_gender     greywage          way extraversion 
##            0            0            0            0            0            0 
##     independ  selfcontrol      anxiety      novator 
##            0            0            0            0

Keterangan: Data tidak memiliki Missing value di setiap kolomnya sehingga tidak perlu di handle untuk cleaning data

2.4 Eksploratory Data Analysis (EDA)

2.4.1 Cek Korelasi Data Numerik

library(GGally)
## Warning: package 'GGally' was built under R version 4.2.3
## Loading required package: ggplot2
## Registered S3 method overwritten by 'GGally':
##   method from   
##   +.gg   ggplot2
ggcorr(turnover, label = T)
## Warning in ggcorr(turnover, label = T): data in column(s) 'event', 'gender',
## 'industry', 'profession', 'traffic', 'coach', 'head_gender', 'greywage', 'way'
## are not numeric and were ignored

Keterangan :

  • Dari hasil ggcorr di atas terlihat bahwa antar variabel numerik tidak memiliki korelasi yang begitu baik. tidak memiliki korelasi yang linear antar variabel.

2.4.2 Cek Persebaran Data

summary(turnover)
##       stag          event   gender       age               industry  
##  Min.   :  0.3942   0:558   f:853   Min.   :18.00   Retail     :289  
##  1st Qu.: 11.7289   1:571   m:276   1st Qu.:26.00   manufacture:145  
##  Median : 24.3450                   Median :30.00   IT         :122  
##  Mean   : 36.6275                   Mean   :31.07   Banks      :114  
##  3rd Qu.: 51.3183                   3rd Qu.:36.00   etc        : 94  
##  Max.   :179.4497                   Max.   :58.00   Consult    : 74  
##                                                     (Other)    :291  
##                profession         traffic        coach     head_gender
##  HR                 :757   youjs      :318   my head:314   f:545      
##  IT                 : 74   empjs      :248   no     :683   m:584      
##  Sales              : 66   rabrecNErab:211   yes    :132              
##  etc                : 37   friends    :118                            
##  Marketing          : 31   referal    : 95                            
##  BusinessDevelopment: 27   KA         : 67                            
##  (Other)            :137   (Other)    : 72                            
##   greywage      way       extraversion       independ       selfcontrol    
##  grey : 127   bus :681   Min.   : 1.000   Min.   : 1.000   Min.   : 1.000  
##  white:1002   car :331   1st Qu.: 4.600   1st Qu.: 4.100   1st Qu.: 4.100  
##               foot:117   Median : 5.400   Median : 5.500   Median : 5.700  
##                          Mean   : 5.592   Mean   : 5.478   Mean   : 5.597  
##                          3rd Qu.: 7.000   3rd Qu.: 6.900   3rd Qu.: 7.200  
##                          Max.   :10.000   Max.   :10.000   Max.   :10.000  
##                                                                            
##     anxiety          novator     
##  Min.   : 1.700   Min.   : 1.00  
##  1st Qu.: 4.800   1st Qu.: 4.40  
##  Median : 5.600   Median : 6.00  
##  Mean   : 5.666   Mean   : 5.88  
##  3rd Qu.: 7.100   3rd Qu.: 7.50  
##  Max.   :10.000   Max.   :10.00  
## 

Melihat banyaknya kelas dari profession dan industry

levels(turnover$profession)
##  [1] "Finan\xf1e"          "Accounting"          "BusinessDevelopment"
##  [4] "Commercial"          "Consult"             "Engineer"           
##  [7] "etc"                 "HR"                  "IT"                 
## [10] "Law"                 "manage"              "Marketing"          
## [13] "PR"                  "Sales"               "Teaching"
levels(turnover$industry)
##  [1] " HoReCa"         "Agriculture"     "Banks"           "Building"       
##  [5] "Consult"         "etc"             "IT"              "manufacture"    
##  [9] "Mining"          "Pharma"          "PowerGeneration" "RealEstate"     
## [13] "Retail"          "State"           "Telecom"         "transport"

Di sini meskipun kelas dari profession dan industry lebih dari 5 kelas. Namun, dalam analisis ini akan tetap digunakan dikarenakan ingin dikterahui juga pengaruh dari variabel tersebut. seberapa besar pengaruh seorang karyawan akan meninggalkan pekerjaannya jika diketahui profesi dan industri mereka. ada kemungkinan karyawan tersebut keluar karena profesi atau industri tempat ia bekerja. sehingga tetap dipakai dalam analisis ini agar dapat menambah informasi.

2.4.2 Persebaran Data Kategorik

plot1 <- turnover %>% 
  group_by(event, industry) %>% 
  summarise(Freq = n())
## `summarise()` has grouped output by 'event'. You can override using the
## `.groups` argument.
library(ggplot2)
ggplot(data = plot1, mapping = aes(x = reorder(industry, Freq), y = Freq)) +
  geom_col(aes(fill = event), position = "fill") +
  labs(title = "Proporsi Karyawan yang Turnover/Tidak Berdasarkan Industry") +
  theme_classic()+
  scale_fill_manual(values = c("#cdb4db","#ef476f")) +
  coord_flip()

Insight:

  • Jumlah karyawan paling banyak adalah di industry Retail
  • Jumlah karyawan yang paling banyak keluar dari pekerjaannya adalah pada industry Building, Agruculture, dan Bank
  • Hampir semua karyawan yang keluar lebih dari setengah jumlah karyawannya di semua industri kecuali industry retail, manfacture, IT, Transport, PowerGeneration, Telcom, dan RealEstate

Persebaran Data Numerik

boxplot(turnover$stag)

Keterangan: - Terdapat outlier yang pada kolom stag. artinya ada bebrapa karyawan yang memang masa kerja nya sudah lama. - Data skewed

2.4.3 Cek Class-Imbalance

plot(turnover$event)

prop.table(table(turnover$event))
## 
##         0         1 
## 0.4942427 0.5057573

Keterangan: - Proporsi variable target di setiap kelasnya suda seimbang sehingga model klasifikasi dpat mempelajari karakteristik dari kedua kelas tersebut secara merata tidak berat hanya di satu kelas saja.

3. Cross Validation / Splitting

Sebelum membangun model perlu membagi dataset menjadi datatrain dan datatest Pembagian datatrain dan datatest untuk model ini adalah 80:20

RNGkind(sample.kind = "Rounding")
## Warning in RNGkind(sample.kind = "Rounding"): non-uniform 'Rounding' sampler
## used
set.seed(100)

#melakukan subsetting untuk memilih jumlah baris
index <- sample(x = nrow(turnover) , size = nrow(turnover)*0.8)

# melakukan assign index pada data train dan test
data_train <- turnover[index,]
data_test <- turnover[-index,]

4. Build Model Logistic Regression

4.1 Logistic Regression

Pengaruh variabel taget terhdapa variabel prediktor dengan menggunakan nilai probabilitas dikarenakan variabel target adalah variabel dengan tipe data kategorik yang biner (hanya memiliki 2 kelas).

# membuat model menggunkan metode regresi logistik 
model_logistic <- glm(formula = event ~ . ,
                      data = turnover,
                      family = "binomial")

# menampilkan summary dari model regresi logistik
summary(model_logistic)
## 
## Call:
## glm(formula = event ~ ., family = "binomial", data = turnover)
## 
## Deviance Residuals: 
##      Min        1Q    Median        3Q       Max  
## -2.01395  -1.05627   0.00056   1.04307   2.10623  
## 
## Coefficients:
##                                 Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                     1.359733   1.422278   0.956 0.339060    
## stag                           -0.005270   0.002124  -2.482 0.013080 *  
## genderm                        -0.232572   0.188692  -1.233 0.217743    
## age                            -0.023254   0.010768  -2.160 0.030801 *  
## industryAgriculture            -0.190113   0.880299  -0.216 0.829016    
## industryBanks                   0.291016   0.661289   0.440 0.659883    
## industryBuilding                0.622096   0.733015   0.849 0.396059    
## industryConsult                 0.159159   0.674766   0.236 0.813531    
## industryetc                    -0.230284   0.662479  -0.348 0.728133    
## industryIT                     -1.409593   0.664147  -2.122 0.033803 *  
## industrymanufacture            -0.505507   0.648818  -0.779 0.435909    
## industryMining                 -0.143361   0.778783  -0.184 0.853948    
## industryPharma                 -0.292693   0.781669  -0.374 0.708073    
## industryPowerGeneration        -0.864231   0.716639  -1.206 0.227836    
## industryRealEstate             -1.137786   0.877329  -1.297 0.194674    
## industryRetail                 -0.599654   0.636130  -0.943 0.345855    
## industryState                  -0.459184   0.714629  -0.643 0.520517    
## industryTelecom                -0.824112   0.722043  -1.141 0.253719    
## industrytransport              -0.908012   0.711953  -1.275 0.202174    
## professionAccounting            0.216910   0.883039   0.246 0.805961    
## professionBusinessDevelopment  -0.375528   0.723739  -0.519 0.603850    
## professionCommercial           -0.030304   0.745881  -0.041 0.967592    
## professionConsult              -0.166813   0.749812  -0.222 0.823946    
## professionEngineer              0.285188   0.860859   0.331 0.740431    
## professionetc                  -0.611363   0.683120  -0.895 0.370810    
## professionHR                   -0.930732   0.588116  -1.583 0.113521    
## professionIT                   -0.946984   0.660102  -1.435 0.151401    
## professionLaw                  -0.086563   1.071632  -0.081 0.935620    
## professionmanage                0.298883   0.760576   0.393 0.694342    
## professionMarketing            -0.095108   0.722685  -0.132 0.895298    
## professionPR                    0.929152   1.272326   0.730 0.465220    
## professionSales                -0.399737   0.645856  -0.619 0.535965    
## professionTeaching             15.119394 383.808042   0.039 0.968577    
## trafficempjs                    1.303206   0.483115   2.698 0.006986 ** 
## trafficfriends                  0.416727   0.505438   0.824 0.409663    
## trafficKA                       1.121890   0.530945   2.113 0.034600 *  
## trafficrabrecNErab              1.390983   0.482588   2.882 0.003947 ** 
## trafficrecNErab                 0.840168   0.571791   1.469 0.141734    
## trafficreferal                  1.709316   0.518385   3.297 0.000976 ***
## trafficyoujs                    0.855056   0.473776   1.805 0.071111 .  
## coachno                         0.209336   0.157232   1.331 0.183063    
## coachyes                        0.451748   0.233878   1.932 0.053414 .  
## head_genderm                    0.237306   0.146512   1.620 0.105295    
## greywagewhite                  -0.113666   0.213341  -0.533 0.594177    
## waycar                          0.097141   0.153652   0.632 0.527246    
## wayfoot                        -0.666481   0.244278  -2.728 0.006365 ** 
## extraversion                   -0.048701   0.052089  -0.935 0.349807    
## independ                        0.017537   0.051950   0.338 0.735684    
## selfcontrol                    -0.017754   0.051586  -0.344 0.730728    
## anxiety                        -0.047506   0.052630  -0.903 0.366720    
## novator                         0.021838   0.043404   0.503 0.614873    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1565.0  on 1128  degrees of freedom
## Residual deviance: 1390.2  on 1078  degrees of freedom
## AIC: 1492.2
## 
## Number of Fisher Scoring iterations: 14

4.2 Feature Selection Stepwise

Menggunakan metode stepwise untuk melakukan feture selection/memilih variabel yang potensial untuk dijadikan prediktor yaitu dengan menggunakan metode stepwise regression both.

# membuat model menggunakan metode stepwise both
model_step <- step(model_logistic, direction = "both")
## Start:  AIC=1492.24
## event ~ stag + gender + age + industry + profession + traffic + 
##     coach + head_gender + greywage + way + extraversion + independ + 
##     selfcontrol + anxiety + novator
## 
##                Df Deviance    AIC
## - independ      1   1390.3 1490.3
## - selfcontrol   1   1390.4 1490.4
## - novator       1   1390.5 1490.5
## - greywage      1   1390.5 1490.5
## - anxiety       1   1391.0 1491.0
## - extraversion  1   1391.1 1491.1
## - gender        1   1391.8 1491.8
## <none>              1390.2 1492.2
## - coach         2   1394.3 1492.3
## - head_gender   1   1392.9 1492.9
## - age           1   1394.9 1494.9
## - stag          1   1396.5 1496.5
## - way           2   1399.5 1497.5
## - profession   14   1431.0 1505.0
## - traffic       7   1424.2 1512.2
## - industry     15   1445.1 1517.1
## 
## Step:  AIC=1490.35
## event ~ stag + gender + age + industry + profession + traffic + 
##     coach + head_gender + greywage + way + extraversion + selfcontrol + 
##     anxiety + novator
## 
##                Df Deviance    AIC
## - greywage      1   1390.6 1488.6
## - novator       1   1390.6 1488.6
## - selfcontrol   1   1390.7 1488.7
## - gender        1   1391.8 1489.8
## - extraversion  1   1392.0 1490.0
## - anxiety       1   1392.1 1490.1
## <none>              1390.3 1490.3
## - coach         2   1394.4 1490.4
## - head_gender   1   1392.9 1490.9
## + independ      1   1390.2 1492.2
## - age           1   1395.0 1493.0
## - stag          1   1396.6 1494.6
## - way           2   1399.6 1495.6
## - profession   14   1431.2 1503.2
## - traffic       7   1424.3 1510.3
## - industry     15   1445.4 1515.4
## 
## Step:  AIC=1488.62
## event ~ stag + gender + age + industry + profession + traffic + 
##     coach + head_gender + way + extraversion + selfcontrol + 
##     anxiety + novator
## 
##                Df Deviance    AIC
## - novator       1   1390.9 1486.9
## - selfcontrol   1   1390.9 1486.9
## - gender        1   1392.2 1488.2
## - anxiety       1   1392.3 1488.3
## - extraversion  1   1392.3 1488.3
## <none>              1390.6 1488.6
## - coach         2   1394.7 1488.7
## - head_gender   1   1393.2 1489.2
## + greywage      1   1390.3 1490.3
## + independ      1   1390.5 1490.5
## - age           1   1395.3 1491.3
## - stag          1   1397.2 1493.2
## - way           2   1400.3 1494.3
## - profession   14   1431.7 1501.7
## - traffic       7   1424.9 1508.9
## - industry     15   1446.0 1514.0
## 
## Step:  AIC=1486.87
## event ~ stag + gender + age + industry + profession + traffic + 
##     coach + head_gender + way + extraversion + selfcontrol + 
##     anxiety
## 
##                Df Deviance    AIC
## - selfcontrol   1   1391.6 1485.6
## - anxiety       1   1392.3 1486.3
## - gender        1   1392.4 1486.4
## - extraversion  1   1392.5 1486.5
## <none>              1390.9 1486.9
## - coach         2   1395.0 1487.0
## - head_gender   1   1393.5 1487.5
## + novator       1   1390.6 1488.6
## + greywage      1   1390.6 1488.6
## + independ      1   1390.8 1488.8
## - age           1   1395.4 1489.4
## - stag          1   1397.5 1491.5
## - way           2   1400.4 1492.4
## - profession   14   1431.8 1499.8
## - traffic       7   1425.1 1507.1
## - industry     15   1446.1 1512.1
## 
## Step:  AIC=1485.63
## event ~ stag + gender + age + industry + profession + traffic + 
##     coach + head_gender + way + extraversion + anxiety
## 
##                Df Deviance    AIC
## - extraversion  1   1392.5 1484.5
## - anxiety       1   1392.7 1484.7
## - gender        1   1393.4 1485.4
## <none>              1391.6 1485.6
## - coach         2   1395.8 1485.8
## - head_gender   1   1394.4 1486.4
## + selfcontrol   1   1390.9 1486.9
## + novator       1   1390.9 1486.9
## + independ      1   1391.1 1487.1
## + greywage      1   1391.4 1487.4
## - age           1   1396.0 1488.0
## - stag          1   1398.4 1490.4
## - way           2   1401.4 1491.4
## - profession   14   1432.6 1498.6
## - traffic       7   1426.3 1506.3
## - industry     15   1448.0 1512.0
## 
## Step:  AIC=1484.51
## event ~ stag + gender + age + industry + profession + traffic + 
##     coach + head_gender + way + anxiety
## 
##                Df Deviance    AIC
## - anxiety       1   1393.4 1483.4
## - gender        1   1394.1 1484.1
## <none>              1392.5 1484.5
## - coach         2   1396.5 1484.5
## - head_gender   1   1395.1 1485.1
## + independ      1   1391.6 1485.6
## + extraversion  1   1391.6 1485.6
## + greywage      1   1392.3 1486.3
## + novator       1   1392.3 1486.3
## - age           1   1396.4 1486.4
## + selfcontrol   1   1392.5 1486.5
## - stag          1   1398.8 1488.8
## - way           2   1402.1 1490.1
## - profession   14   1433.2 1497.2
## - traffic       7   1426.8 1504.8
## - industry     15   1448.9 1510.9
## 
## Step:  AIC=1483.42
## event ~ stag + gender + age + industry + profession + traffic + 
##     coach + head_gender + way
## 
##                Df Deviance    AIC
## <none>              1393.4 1483.4
## - coach         2   1397.5 1483.5
## + independ      1   1391.8 1483.8
## - gender        1   1395.9 1483.9
## - head_gender   1   1396.1 1484.1
## + anxiety       1   1392.5 1484.5
## + extraversion  1   1392.7 1484.7
## + greywage      1   1393.2 1485.2
## + novator       1   1393.4 1485.4
## - age           1   1397.4 1485.4
## + selfcontrol   1   1393.4 1485.4
## - stag          1   1399.8 1487.8
## - way           2   1403.0 1489.0
## - profession   14   1434.8 1496.8
## - traffic       7   1428.0 1504.0
## - industry     15   1450.5 1510.5
# Menampilkan summary model menggunakan metode stepwise both
summary(model_step)
## 
## Call:
## glm(formula = event ~ stag + gender + age + industry + profession + 
##     traffic + coach + head_gender + way, family = "binomial", 
##     data = turnover)
## 
## Deviance Residuals: 
##      Min        1Q    Median        3Q       Max  
## -1.98369  -1.05377   0.00055   1.05220   2.08759  
## 
## Coefficients:
##                                 Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                     0.771439   1.027095   0.751 0.452600    
## stag                           -0.005205   0.002083  -2.499 0.012469 *  
## genderm                        -0.281761   0.179179  -1.573 0.115831    
## age                            -0.020992   0.010543  -1.991 0.046474 *  
## industryAgriculture            -0.279643   0.874320  -0.320 0.749089    
## industryBanks                   0.272393   0.655547   0.416 0.677761    
## industryBuilding                0.585355   0.727074   0.805 0.420772    
## industryConsult                 0.130021   0.669749   0.194 0.846071    
## industryetc                    -0.294471   0.657280  -0.448 0.654143    
## industryIT                     -1.456617   0.659158  -2.210 0.027118 *  
## industrymanufacture            -0.563880   0.643428  -0.876 0.380830    
## industryMining                 -0.173388   0.774091  -0.224 0.822765    
## industryPharma                 -0.358565   0.775771  -0.462 0.643935    
## industryPowerGeneration        -0.934819   0.707993  -1.320 0.186708    
## industryRealEstate             -1.174009   0.868998  -1.351 0.176698    
## industryRetail                 -0.652086   0.630422  -1.034 0.300966    
## industryState                  -0.497446   0.706891  -0.704 0.481613    
## industryTelecom                -0.851596   0.714247  -1.192 0.233144    
## industrytransport              -0.939972   0.708352  -1.327 0.184514    
## professionAccounting            0.214762   0.881248   0.244 0.807462    
## professionBusinessDevelopment  -0.340387   0.721031  -0.472 0.636867    
## professionCommercial            0.036444   0.738511   0.049 0.960642    
## professionConsult              -0.088919   0.744654  -0.119 0.904951    
## professionEngineer              0.353411   0.854778   0.413 0.679275    
## professionetc                  -0.529830   0.678002  -0.781 0.434534    
## professionHR                   -0.865627   0.583610  -1.483 0.138014    
## professionIT                   -0.875344   0.653429  -1.340 0.180370    
## professionLaw                   0.064567   1.064756   0.061 0.951646    
## professionmanage                0.357298   0.758755   0.471 0.637712    
## professionMarketing             0.011007   0.716212   0.015 0.987738    
## professionPR                    0.996013   1.268236   0.785 0.432247    
## professionSales                -0.312867   0.639289  -0.489 0.624559    
## professionTeaching             15.212861 386.369826   0.039 0.968592    
## trafficempjs                    1.278627   0.477408   2.678 0.007400 ** 
## trafficfriends                  0.424821   0.500912   0.848 0.396386    
## trafficKA                       1.134995   0.525304   2.161 0.030723 *  
## trafficrabrecNErab              1.400981   0.477338   2.935 0.003336 ** 
## trafficrecNErab                 0.814619   0.564908   1.442 0.149291    
## trafficreferal                  1.724410   0.513673   3.357 0.000788 ***
## trafficyoujs                    0.842322   0.468395   1.798 0.072127 .  
## coachno                         0.209347   0.156590   1.337 0.181250    
## coachyes                        0.445406   0.232000   1.920 0.054876 .  
## head_genderm                    0.238720   0.145350   1.642 0.100511    
## waycar                          0.083017   0.152161   0.546 0.585351    
## wayfoot                        -0.682409   0.242098  -2.819 0.004821 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1565.0  on 1128  degrees of freedom
## Residual deviance: 1393.4  on 1084  degrees of freedom
## AIC: 1483.4
## 
## Number of Fisher Scoring iterations: 14

4.3 Model Comparassion

AIC adalah banyaknya nilai informasi yang terbuang. sehingga jika semakin kecil nilai AIC maka model semakin bagus.

model_logistic$aic
## [1] 1492.239
model_step$aic
## [1] 1483.424

Diantara model logistic dan dengan menggunakan model stepwise. Model stepwise memiliki nilai AIC yang lebih kecil dibandingkan dengan model logistic, sehingga model yang akan dipakai untuk interpretasi, prediksi, dan evaluasi adalah model stepwise.

6. Prediction

6.1 Prediksi Model Logistic Regression

pred_step <- predict(object = model_step , 
        newdata = data_test , 
        type = "response")
# Konvert hasil probabilitas agar menjadi nama kelas target
pred_step<- ifelse(pred_step > 0.5, 1, 0)

6.2 Prediksi Model Stepwise Logistic Regression

pred_logistic <- predict(object = model_logistic,
                         newdata = data_test ,
                         type = "response")
pred_logistic <- ifelse(pred_logistic >0.5, 1, 0)

6.3 K-Nearest Neighbor (KNN)

Mengklasifikasikan data baru dengan menggunakan kedekatan jarak antar objek. fungsi KNN tidak melakukan build model tetapi langsung meprediksi data train. sehingga tidak bisa digunakan lagi jika ada data baru, harus mulai dari awal lagi, tidak bisa langsung memanggil model untuk diprediksi karena tidak membangun model.

Workflow KNN:

1. Melakukan Splitting Data

Pada KNN perlu memisahkan variabel target dan prediktor dari data train dan data test. Dan dikarenakan konsep nya menghitung jarak sehingga model ini baik untuk variabel numerik saja. Oleh karena itu pelu memisahkan data dan menggunakan variabel numerik saja agar hasil model dapat lebih baik.

# variabel prediktor pada data train
x_train <- data_train %>% select_if(is.numeric)

# variabel target pada data train
y_train <- data_train[,"event"]

# variabel prediktor pada data test
x_test <- data_test %>% select_if(is.numeric)
  
# variabel target pada data test
y_test <- data_test[,"event"]

2. Melakukan Scaling

Dikarenakan KNN adalah mengklasifikasikan objek dengan memperhitungkan kedekatan jarak objek tersebut sehingga range antar variabel harus pada kisaran nilai range yang sama agar model dapat memperhitungkan semuanya dengan tepat dan rata sebagaimana seharusnya. Scaling hanya digunakan untuk variabel numerik saja, sehingga hanya diterapkan pada x_train dan x_test :

# melakukan scaleing untuk variabel prediktor numerik pada data train
x_train_scaled <- scale(x_train)

# melakukan scaling juga pada variabel prediktor data test
x_test_scaled <- scale(x_test,
                       center = attr(x_train_scaled, "scaled:center"),
                       scale = attr(x_train_scaled, "scaled:scale"))

3. Find Optium K

Nilai K ini adalah jumlah nilai yang digunakan untuk mengambil mau seberapa dekat objek tersebut dengan tetangganya. penentuan nilai k juga akan mempengaruhi hasil model sehingga dipilihlah k optimum agar menghasilkan model yang baik.

# memilih k oprtimum
sqrt(nrow(x_train_scaled))
## [1] 30.04996

Dikarenakan nilai tagret memiliki 2 kelas, usahakan untuk k optimum berjumlah ganjil agar tidak ada pemilihan k yang seri. jika k seri di setiap level targetnya akan mengklasifikasn secara random. sehingga k optimum yang dipilih adalah 31.

4. Prediction

library(class)
pred_knn <- knn(train = x_train_scaled,
                 test = x_test_scaled,
                 cl = y_train,
                 k = 31)

6. Model Evaluation

Setelah dilakukan pembangunan dan prediksi model maka model tersebut harus dievaluasi untuk menguji seberapa baik kah model dalam melakukan prediksi pada data baru. untuk melakukan model evaluasi bisa menggunakan matrix confusion.

6.1 Model Logistic regression

library(caret)
## Warning: package 'caret' was built under R version 4.2.3
## Loading required package: lattice
confusionMatrix(data = as.factor(pred_step),
                reference = data_test$event,
                positive = "1")
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  0  1
##          0 79 36
##          1 34 77
##                                           
##                Accuracy : 0.6903          
##                  95% CI : (0.6256, 0.7499)
##     No Information Rate : 0.5             
##     P-Value [Acc > NIR] : 5.256e-09       
##                                           
##                   Kappa : 0.3805          
##                                           
##  Mcnemar's Test P-Value : 0.9049          
##                                           
##             Sensitivity : 0.6814          
##             Specificity : 0.6991          
##          Pos Pred Value : 0.6937          
##          Neg Pred Value : 0.6870          
##              Prevalence : 0.5000          
##          Detection Rate : 0.3407          
##    Detection Prevalence : 0.4912          
##       Balanced Accuracy : 0.6903          
##                                           
##        'Positive' Class : 1               
## 

6. 2 Model Stepwise Logistic Regression

confusionMatrix(data = as.factor(pred_logistic),
                reference = data_test$event ,
                positive = "1")
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  0  1
##          0 83 41
##          1 30 72
##                                          
##                Accuracy : 0.6858         
##                  95% CI : (0.621, 0.7458)
##     No Information Rate : 0.5            
##     P-Value [Acc > NIR] : 1.174e-08      
##                                          
##                   Kappa : 0.3717         
##                                          
##  Mcnemar's Test P-Value : 0.2353         
##                                          
##             Sensitivity : 0.6372         
##             Specificity : 0.7345         
##          Pos Pred Value : 0.7059         
##          Neg Pred Value : 0.6694         
##              Prevalence : 0.5000         
##          Detection Rate : 0.3186         
##    Detection Prevalence : 0.4513         
##       Balanced Accuracy : 0.6858         
##                                          
##        'Positive' Class : 1              
## 

6.3 Model K-Nearest Neighbor

confusionMatrix(data = pred_knn,
                reference = y_test ,
                positive = "1")
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  0  1
##          0 63 48
##          1 50 65
##                                          
##                Accuracy : 0.5664         
##                  95% CI : (0.499, 0.6319)
##     No Information Rate : 0.5            
##     P-Value [Acc > NIR] : 0.02674        
##                                          
##                   Kappa : 0.1327         
##                                          
##  Mcnemar's Test P-Value : 0.91954        
##                                          
##             Sensitivity : 0.5752         
##             Specificity : 0.5575         
##          Pos Pred Value : 0.5652         
##          Neg Pred Value : 0.5676         
##              Prevalence : 0.5000         
##          Detection Rate : 0.2876         
##    Detection Prevalence : 0.5088         
##       Balanced Accuracy : 0.5664         
##                                          
##        'Positive' Class : 1              
## 

Case: Pada kasus ini, HR ingin mengetahui karyawan mana yang akan meninggalkan pekerjaan di kemudian hari agar dapat dilakukan pendekatan dengan segera. karena dalam hal ini sesorang yang akan mengundurkan diri akan mengeluarkan anggaran. perusahaan lebih fokus dalam menghasilkan prediksi yang tepat daripada mendeteksi sebanyak mungkin karyawan yang mungkin mengundurkan diri. Hal ini untuk menghindari anggaran yang tidak perlu untuk karyawan yang keliru diprediksi mengundurkan diri.

FN : karyawan yang diprediksi negatif/tidak keluar dari pekerjaan padahal sebenarnya dia keluar dri pekerjaan -> Recall FP : karyawan yang diprediksi keluar dari pekerjaan padahal sebenarnya tetap stay -> Concern -> Precision

Sehingga dalam hal ini confusion matrix melihat nilai precision nya karena perusahaan tidak ingin salah prediksi pada seseorang yang keluar padahal sebeneranya dia tetap stay itu akan mengakibatkan keluar anggaran yang banyak. sehingga memnimimalisir hal tersebut dengan melihat nilai confusion matrix pada Pos Pred Value nya. sekamin besar nilai tersebut maka semakin tepat dan mengurangi anggaran perusahaan.

7. Model Comparasion

Dari ke tiga model yang sudah dibuat di atas berikut adalah ringkasan summary yang menjadi concern pada case ini:

# membuat rigkasan kolom yang berisi akurasi dari setiap metode
akurasi <- data.frame( Model = c("Logistic", "Stepwise", "KNN"),
                       Precision = c(0.6937, 0.7059, 0.5652 ))
                      
akurasi
##      Model Precision
## 1 Logistic    0.6937
## 2 Stepwise    0.7059
## 3      KNN    0.5652
ggplot(data = akurasi, mapping = aes(x = Model, y = Precision)) +
  geom_line(group =1, lwd =1.5 , color = "darkred") +
  geom_point(aes(fill = Precision)) +
  scale_y_continuous(breaks = seq(0,1,0.2), limits = c(0,1)) +
  labs(title = "Akurasi Precision dari Ketiga Model") +
  theme_classic() 

Dalam kasus ini, model yang memiliki akurasi terbaik adalah model dengan menggunakan metode stepwise regression logistic daripada KNN. ini mungkin dikarenakan pada dataset ini memiliki banyak data kategorik yang mungkin dapat menjadi informasi penting dan sangat berpengaruh terhadap kebaikan model. sehingga regresi logistic dengan metode step memiliki akurasi yang lebih tinggi karena analisis yang disertakan juga adalah pada variabel kategorik. sedangkan KNN hanya pada variabel numerik saja tanpa variabel kategorik. stepwise regression juga telah melakukan feautre selection untuk mendapatkan variabel prediktor yang optimal. sehingga model yang didapatkan lebih baik dari model KNN.

Conclusion

Dari akurasi precision yang dihasilkan terlihat bahwa akurasi nya tidak begitu gus masih dalam rentang 50-60 persen. sehingga perlu dilakukan tuning lebih atau melakukan treatment pada data yang outlier. mengingat ketika tahap Eksploratory Data Anysis (EDA) persebaran data pada beberapa variabel prediktor terdapat outlier.