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
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
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
stag : pengalaman karyawan (waktu)event : karyawan keluar atau tidak. 0: jika tidak , dan 1: jika iyagender : jenis kelamin karyawanage : umur karyawanindustry : bidang perusahaan tempat karyawan bekerjaprofession : pekerjaan/posisi karyawantraffic : bagaimana karyawan mendatangi perusahaancoach : apakah terdapat coaching/training di masa percobaanhead_gender : jenis kelamin atasan karyawangreywage : gajiway : transportasi yang digunakan ke tempat kerjaextraversion : Nilai Extraversionindepend : Nilai kemandirianselfcontrol : Nilai pengendalian dirianxiety : Nilai kecemasannovator : Nilai novatorturnover <- turnover %>%
mutate_at(vars(event, gender, industry, profession, traffic, coach, head_gender, greywage, way), as.factor)
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
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 :
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.
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:
boxplot(turnover$stag)
Keterangan: - Terdapat outlier yang pada kolom stag. artinya ada bebrapa karyawan yang memang masa kerja nya sudah lama. - Data skewed
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.
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,]
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
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
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.
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)
pred_logistic <- predict(object = model_logistic,
newdata = data_test ,
type = "response")
pred_logistic <- ifelse(pred_logistic >0.5, 1, 0)
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.
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)
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.
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
##
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
##
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.
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.
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.