Tenggelamnya Titanic adalah salah satu bangkai kapal paling terkenal dalam sejarah. Pada tanggal 15 April 1912, selama pelayaran perdananya, RMS Titanic yang dianggap “Tidak Dapat Tenggelam” ternyata dapat tenggelam setelah bertabrakan dengan gunung es. Sayangnya, sekoci yang ada tidak cukup untuk menampung semua orang, sehingga mengakibatkan kematian 1.502 dari 2.224 penumpang dan awak.
Meskipun ada unsur keberuntungan dalam bertahan hidup, nampaknya beberapa kelompok orang lebih mungkin untuk bertahan hidup dibandingkan kelompok lainnya.
Kita akan membuat model prediktif untuk mengetahui orang-orang yang memiliki kemungkinan lebih besar untuk selamat ketika kecelakaan terjadi pada saat itu.
Algoritma yang akan saya gunakan yaitu menggunakan logistik regression dan k-nearest neighbor yang termasuk dalam supervised learning
Sebelum itu kita harus melakukan install.packages() pada package dplyr, MASS, gtools, gmodels, class, ggplot2 pada R studio. Apabila telah terinstall maka lakukan pengaktifan package menggunakan library().
Data Import
Data yang akan sy gunakan yaitu data mengenai penumpang kapal titanic berdasarkan jenis kelamin dan kelas, kita akan menggunakan data yang bersumber pada kaggle .
Cek Struktur Data
#> Rows: 891
#> Columns: 12
#> $ PassengerId <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,…
#> $ Survived <int> 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1…
#> $ Pclass <int> 3, 1, 3, 1, 3, 3, 1, 3, 3, 2, 3, 1, 3, 3, 3, 2, 3, 2, 3, 3…
#> $ Name <chr> "Braund, Mr. Owen Harris", "Cumings, Mrs. John Bradley (Fl…
#> $ Sex <chr> "male", "female", "female", "female", "male", "male", "mal…
#> $ Age <dbl> 22, 38, 26, 35, 35, NA, 54, 2, 27, 14, 4, 58, 20, 39, 14, …
#> $ SibSp <int> 1, 1, 0, 1, 0, 0, 0, 3, 0, 1, 1, 0, 0, 1, 0, 0, 4, 0, 1, 0…
#> $ Parch <int> 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 0, 0, 5, 0, 0, 1, 0, 0, 0…
#> $ Ticket <chr> "A/5 21171", "PC 17599", "STON/O2. 3101282", "113803", "37…
#> $ Fare <dbl> 7.2500, 71.2833, 7.9250, 53.1000, 8.0500, 8.4583, 51.8625,…
#> $ Cabin <chr> "", "C85", "", "C123", "", "", "E46", "", "", "", "G6", "C…
#> $ Embarked <chr> "S", "C", "S", "S", "S", "Q", "S", "S", "S", "C", "S", "S"…
Definisi Kolom
Survival : penumpang bertahan -> 1 = yes “selamat” ; 0 = no “tidak bertahan” Pclass : Tiket Kelas -> 1 = 1st ; 2 = 2nd ; 3 = 3rd Sex. : jenis Kelamin Age : umur dalam tahun Sibsp. : Hubungan saudara/pasangan di kapal titanic -> (Sibling = brother, sister, stepbrother, stepsister) ; (Spouse = husband, wife (mistresses and fiancés were ignored)
Parch : Orang tua/anak di kapal titanic Parent = mother, father Child = daughter, son, stepdaughter, stepson Some children travelled only with a nanny, therefore parch=0 for them.
Ticket : nomor tiket Fare : Tarif Penumpang Cabin : Nomor Cabin Embarked : Pelabuhan Embarkasi
berikut gambaran sedikit pada data yang digunakan
cek missing value
#> PassengerId Survived Pclass Name Sex Age
#> 0 0 0 0 0 177
#> SibSp Parch Ticket Fare Cabin Embarked
#> 0 0 0 0 0 0
#> [1] TRUE
terdapat missing value sebanyak 177 pada kolom Age kita dapat mengatasinya dengan cara mengganti missing value dengan zero(0).
Pada beberapa variabel yang digunakan terdapat ketidaksesuaian tipe data, oleh karena itu yang perlu kita lakukan adalah melakukan penyesuaian tipe data pada beberapa variabel yang ada
#> [1] "PassengerId" "Survived" "Pclass" "Name" "Sex"
#> [6] "Age" "SibSp" "Parch" "Ticket" "Fare"
#> [11] "Cabin" "Embarked"
library(dplyr)
titanic_clean <- titanic %>%
select(-Name, -Ticket) %>%
mutate(Survived = as.factor(Survived),
Pclass = as.factor(Pclass),
Sex = as.factor(Sex),
SibSp = as.factor(SibSp),
Parch = as.factor(Parch),
Cabin = as.factor(Cabin),
Embarked = as.factor(Embarked))
glimpse(titanic_clean)#> Rows: 891
#> Columns: 10
#> $ PassengerId <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,…
#> $ Survived <fct> 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1…
#> $ Pclass <fct> 3, 1, 3, 1, 3, 3, 1, 3, 3, 2, 3, 1, 3, 3, 3, 2, 3, 2, 3, 3…
#> $ Sex <fct> male, female, female, female, male, male, male, male, fema…
#> $ Age <dbl> 22, 38, 26, 35, 35, 0, 54, 2, 27, 14, 4, 58, 20, 39, 14, 5…
#> $ SibSp <fct> 1, 1, 0, 1, 0, 0, 0, 3, 0, 1, 1, 0, 0, 1, 0, 0, 4, 0, 1, 0…
#> $ Parch <fct> 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 0, 0, 5, 0, 0, 1, 0, 0, 0…
#> $ Fare <dbl> 7.2500, 71.2833, 7.9250, 53.1000, 8.0500, 8.4583, 51.8625,…
#> $ Cabin <fct> , C85, , C123, , , E46, , , , G6, C103, , , , , , , , , , …
#> $ Embarked <fct> S, C, S, S, S, Q, S, S, S, C, S, S, S, S, S, S, Q, S, S, C…
kita cek ulang data kita
#> [1] 1 0 3 4 2 5 8
#> [1] "S" "C" "Q" ""
Sebelum melakukan pemodelan, kita perlu melihat terlebih dahulu proporsi dari target variabel yang kita miliki pada kolom survived
#>
#> 0 1
#> 0.6161616 0.3838384
#>
#> 0 1
#> 549 342
jika dilihat dari proporsi data kita sudah cukup seimbang sehingga kita tidak perlu terlalu membutuhkan pre-processing tambahan untuk menyeimbangkan proporsi antar dua kelas target variabel.
Langkah selanjutnya yaitu melakukan splitting train test data. Tujuannya yaitu pada data train akan kita gunakan untuk modeling, sedangkan data test akan kita gunakan sebagai penguji model yang sudah kita buat jika dihadapkan dengan unseen data. Selain itu hal ini dapat digunakan untuk melihat kemampuan model yang kita buat dalam menghadapi unseen data.
library(rsample)
set.seed(100)
# menentukan indeks untuk train dan test
splitted <- initial_split(data = titanic_clean,
prop = 0.75,
strata = "Parch")
# mengambil indeks data train
train <- training(splitted)
# mengambil indeks data test`
test <- testing(splitted)#> [1] 667
#> [1] 224
cek kembali proporsi kelas data train dan data tes
#>
#> 0 1
#> 0.6191904 0.3808096
Melakukan pemodelan menggunakan regresi logistik. Pemodelan menggunakan fungsi glm() dalam memodelkan menggunakan regresi logistik. Variabel yang digunakan adalah beberapa variabel yang kita anggap mempengaruhi target variabel dalam hal ini survived.
#>
#> Call:
#> glm(formula = Survived ~ ., family = "binomial", data = train)
#>
#> Coefficients:
#> Estimate Std. Error z value Pr(>|z|)
#> (Intercept) 1.7366157 0.8051557 2.157 0.03102
#> PassengerId -0.0003395 0.0004927 -0.689 0.49076
#> Pclass2 0.5108689 0.6735907 0.758 0.44820
#> Pclass3 -0.7182736 0.6881742 -1.044 0.29661
#> Sexmale -2.8026627 0.2686603 -10.432 < 0.0000000000000002
#> Age -0.0192923 0.0085284 -2.262 0.02369
#> SibSp1 -0.5927754 0.3464776 -1.711 0.08711
#> SibSp2 -1.1652083 0.7314502 -1.593 0.11116
#> SibSp3 -2.7569779 0.9410236 -2.930 0.00339
#> SibSp4 -1.8811376 0.9166695 -2.052 0.04016
#> SibSp5 -20.4123625 4642.1139231 -0.004 0.99649
#> SibSp8 -21.1491292 4015.6350605 -0.005 0.99580
#> Parch1 1.1086561 0.4273424 2.594 0.00948
#> Parch2 1.3772224 0.5808082 2.371 0.01773
#> Parch3 0.4916625 1.2083440 0.407 0.68409
#> Parch4 -17.6989947 6936.3218469 -0.003 0.99796
#> Parch5 -18.7920407 5248.9680988 -0.004 0.99714
#> Parch6 -19.2130603 10754.0129840 -0.002 0.99857
#> Fare 0.0111901 0.0096221 1.163 0.24485
#> CabinA10 -18.0562232 10754.0129878 -0.002 0.99866
#> CabinA19 -18.4509118 10754.0129899 -0.002 0.99863
#> CabinA20 21.7368804 10754.0129549 0.002 0.99839
#> CabinA24 -17.9290222 10754.0129892 -0.002 0.99867
#> CabinA26 21.5352426 10754.0130033 0.002 0.99840
#> CabinA31 21.1282124 10754.0129587 0.002 0.99843
#> CabinA34 18.8107749 10754.0129747 0.002 0.99860
#> CabinA36 -17.2303420 10754.0129993 -0.002 0.99872
#> CabinA5 -17.4851207 10754.0129982 -0.002 0.99870
#> CabinB101 15.8248984 10754.0139085 0.001 0.99883
#> CabinB102 -17.9796849 10754.0129995 -0.002 0.99867
#> CabinB18 16.4927217 10754.0129642 0.002 0.99878
#> CabinB19 -17.3967141 10754.0129924 -0.002 0.99871
#> CabinB20 21.6630128 10754.0129527 0.002 0.99839
#> CabinB22 -0.5920725 2.4700472 -0.240 0.81056
#> CabinB30 -19.0295595 10754.0130033 -0.002 0.99859
#> CabinB35 17.7349650 10754.0129997 0.002 0.99868
#> CabinB37 -17.5477304 10754.0129939 -0.002 0.99870
#> CabinB39 16.5060910 10754.0129716 0.002 0.99878
#> CabinB4 18.4343206 10754.0129945 0.002 0.99863
#> CabinB42 18.4050852 10754.0129534 0.002 0.99863
#> CabinB49 20.8526796 10754.0129548 0.002 0.99845
#> CabinB5 15.9524377 7263.0646597 0.002 0.99825
#> CabinB51 B53 B55 -17.3796378 10754.0129974 -0.002 0.99871
#> CabinB57 B59 B63 B66 15.2399595 7596.7202262 0.002 0.99840
#> CabinB58 B60 -3.4287780 2.5802270 -1.329 0.18389
#> CabinB71 -17.4196247 10754.0129924 -0.002 0.99871
#> CabinB73 17.7821259 10754.0129585 0.002 0.99868
#> CabinB77 17.8893415 7594.8079430 0.002 0.99812
#> CabinB78 16.7935114 10754.0130284 0.002 0.99875
#> CabinB79 17.5849324 10754.0129636 0.002 0.99870
#> CabinB80 17.3753689 10754.0129904 0.002 0.99871
#> CabinB82 B84 -18.2306125 10754.0129933 -0.002 0.99865
#> CabinB86 -18.8757298 10754.0129898 -0.002 0.99860
#> CabinB94 -17.3954084 10754.0129973 -0.002 0.99871
#> CabinB96 B98 18.4211687 4477.0489642 0.004 0.99672
#> CabinC101 19.8785885 10754.0130183 0.002 0.99853
#> CabinC103 18.8986711 10754.0129631 0.002 0.99860
#> CabinC104 21.6900885 10754.0129923 0.002 0.99839
#> CabinC106 20.6356231 10754.0129993 0.002 0.99847
#> CabinC110 -17.8941938 10754.0129887 -0.002 0.99867
#> CabinC111 -18.0779764 10754.0129887 -0.002 0.99866
#> CabinC118 -19.1341812 10754.0129975 -0.002 0.99858
#> CabinC123 0.6252140 1.9127026 0.327 0.74376
#> CabinC124 -17.9908621 7519.5314957 -0.002 0.99809
#> CabinC125 17.3342798 10754.0130461 0.002 0.99871
#> CabinC126 22.0544013 10754.0129948 0.002 0.99836
#> CabinC128 -18.5288749 10754.0129885 -0.002 0.99863
#> CabinC148 21.1001835 10754.0129511 0.002 0.99843
#> CabinC2 -17.7353234 10754.0129915 -0.002 0.99868
#> CabinC22 C26 18.5167408 10754.0130068 0.002 0.99863
#> CabinC23 C25 C27 -0.7630926 2.6370910 -0.289 0.77230
#> CabinC32 17.1169085 10754.0130285 0.002 0.99873
#> CabinC45 16.2599682 10754.0131242 0.002 0.99879
#> CabinC46 -17.5998510 10754.0129955 -0.002 0.99869
#> CabinC49 -20.5989318 10754.0129935 -0.002 0.99847
#> CabinC50 17.1693914 10754.0129746 0.002 0.99873
#> CabinC52 20.9270348 7506.4594334 0.003 0.99778
#> CabinC62 C64 16.4614659 10754.0131244 0.002 0.99878
#> CabinC65 -0.4853112 1.9628447 -0.247 0.80472
#> CabinC68 -1.0256378 2.0235090 -0.507 0.61225
#> CabinC7 15.5570129 10754.0130221 0.001 0.99885
#> CabinC70 18.5291421 10754.0129793 0.002 0.99863
#> CabinC78 -17.6392417 10754.0130255 -0.002 0.99869
#> CabinC82 -21.5947192 10754.0130972 -0.002 0.99840
#> CabinC83 0.3882874 1.9440670 0.200 0.84169
#> CabinC85 18.3583468 10754.0129534 0.002 0.99864
#> CabinC87 -17.2718101 10754.0129935 -0.002 0.99872
#> CabinC91 -20.2364819 10754.0130414 -0.002 0.99850
#> CabinC92 20.1861870 5998.0717263 0.003 0.99731
#> CabinC93 20.2782988 6352.2027277 0.003 0.99745
#> CabinC95 -20.5591962 10754.0131200 -0.002 0.99847
#> CabinD 18.0112690 7567.0480848 0.002 0.99810
#> CabinD10 D12 19.2914692 10754.0129562 0.002 0.99857
#> CabinD15 17.6674489 10754.0129918 0.002 0.99869
#> CabinD17 18.9985098 10754.0129956 0.002 0.99859
#> CabinD19 21.9015499 10754.0129615 0.002 0.99838
#> CabinD20 18.7537764 7604.2220339 0.002 0.99803
#> CabinD26 -19.7901345 10754.0129996 -0.002 0.99853
#> CabinD28 17.1218218 10754.0129611 0.002 0.99873
#> CabinD30 -17.6372981 10754.0129928 -0.002 0.99869
#> CabinD33 20.4714377 6237.1149317 0.003 0.99738
#> CabinD35 18.1715722 10754.0129596 0.002 0.99865
#> CabinD36 17.8260669 10754.0130054 0.002 0.99868
#> CabinD37 18.8623134 10754.0129567 0.002 0.99860
#> CabinD45 20.7912855 10754.0129924 0.002 0.99846
#> CabinD46 -17.5554997 10754.0129892 -0.002 0.99870
#> CabinD47 16.8144744 10754.0129689 0.002 0.99875
#> CabinD48 -19.8017676 10754.0130190 -0.002 0.99853
#> CabinD49 20.5259518 10754.0129998 0.002 0.99848
#> CabinD56 20.8824713 10754.0129865 0.002 0.99845
#> CabinD6 -17.7671159 10754.0129896 -0.002 0.99868
#> CabinD7 19.1022771 10754.0129580 0.002 0.99858
#> CabinD9 17.8187370 10754.0129953 0.002 0.99868
#> CabinE10 22.2669439 10754.0129353 0.002 0.99835
#> CabinE101 17.7282511 7373.9986757 0.002 0.99808
#> CabinE12 21.6608550 10754.0130008 0.002 0.99839
#> CabinE121 20.7164977 10754.0129923 0.002 0.99846
#> CabinE17 21.8535208 10754.0129539 0.002 0.99838
#> CabinE24 21.5648771 7601.0861619 0.003 0.99774
#> CabinE25 21.4499401 10754.0129907 0.002 0.99841
#> CabinE31 -17.4294911 10754.0129932 -0.002 0.99871
#> CabinE34 16.6888415 10754.0129853 0.002 0.99876
#> CabinE36 17.8764288 10754.0129903 0.002 0.99867
#> CabinE40 17.2301258 10754.0129780 0.002 0.99872
#> CabinE44 -17.1771788 10754.0129933 -0.002 0.99873
#> CabinE49 17.4192594 10754.0129997 0.002 0.99871
#> CabinE50 21.2127614 10754.0129506 0.002 0.99843
#> CabinE58 -17.4112210 10754.0129914 -0.002 0.99871
#> CabinE63 -17.6236169 10754.0129886 -0.002 0.99869
#> CabinE67 -0.4818261 1.9628077 -0.245 0.80609
#> CabinE8 20.6703604 6398.5790663 0.003 0.99742
#> CabinF E69 17.8254522 10754.0129450 0.002 0.99868
#> CabinF G63 -16.5761243 10754.0129769 -0.002 0.99877
#> CabinF2 19.6968300 7604.0382328 0.003 0.99793
#> CabinF33 18.1560652 7593.2045439 0.002 0.99809
#> CabinF4 19.1112564 6435.0860388 0.003 0.99763
#> CabinG6 -0.5813953 1.3098885 -0.444 0.65715
#> CabinT -17.6703919 10754.0129885 -0.002 0.99869
#> EmbarkedQ 0.2297016 0.5054010 0.454 0.64947
#> EmbarkedS -0.2432893 0.3756804 -0.648 0.51725
#>
#> (Intercept) *
#> PassengerId
#> Pclass2
#> Pclass3
#> Sexmale ***
#> Age *
#> SibSp1 .
#> SibSp2
#> SibSp3 **
#> SibSp4 *
#> SibSp5
#> SibSp8
#> Parch1 **
#> Parch2 *
#> Parch3
#> Parch4
#> Parch5
#> Parch6
#> Fare
#> CabinA10
#> CabinA19
#> CabinA20
#> CabinA24
#> CabinA26
#> CabinA31
#> CabinA34
#> CabinA36
#> CabinA5
#> CabinB101
#> CabinB102
#> CabinB18
#> CabinB19
#> CabinB20
#> CabinB22
#> CabinB30
#> CabinB35
#> CabinB37
#> CabinB39
#> CabinB4
#> CabinB42
#> CabinB49
#> CabinB5
#> CabinB51 B53 B55
#> CabinB57 B59 B63 B66
#> CabinB58 B60
#> CabinB71
#> CabinB73
#> CabinB77
#> CabinB78
#> CabinB79
#> CabinB80
#> CabinB82 B84
#> CabinB86
#> CabinB94
#> CabinB96 B98
#> CabinC101
#> CabinC103
#> CabinC104
#> CabinC106
#> CabinC110
#> CabinC111
#> CabinC118
#> CabinC123
#> CabinC124
#> CabinC125
#> CabinC126
#> CabinC128
#> CabinC148
#> CabinC2
#> CabinC22 C26
#> CabinC23 C25 C27
#> CabinC32
#> CabinC45
#> CabinC46
#> CabinC49
#> CabinC50
#> CabinC52
#> CabinC62 C64
#> CabinC65
#> CabinC68
#> CabinC7
#> CabinC70
#> CabinC78
#> CabinC82
#> CabinC83
#> CabinC85
#> CabinC87
#> CabinC91
#> CabinC92
#> CabinC93
#> CabinC95
#> CabinD
#> CabinD10 D12
#> CabinD15
#> CabinD17
#> CabinD19
#> CabinD20
#> CabinD26
#> CabinD28
#> CabinD30
#> CabinD33
#> CabinD35
#> CabinD36
#> CabinD37
#> CabinD45
#> CabinD46
#> CabinD47
#> CabinD48
#> CabinD49
#> CabinD56
#> CabinD6
#> CabinD7
#> CabinD9
#> CabinE10
#> CabinE101
#> CabinE12
#> CabinE121
#> CabinE17
#> CabinE24
#> CabinE25
#> CabinE31
#> CabinE34
#> CabinE36
#> CabinE40
#> CabinE44
#> CabinE49
#> CabinE50
#> CabinE58
#> CabinE63
#> CabinE67
#> CabinE8
#> CabinF E69
#> CabinF G63
#> CabinF2
#> CabinF33
#> CabinF4
#> CabinG6
#> CabinT
#> EmbarkedQ
#> EmbarkedS
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> (Dispersion parameter for binomial family taken to be 1)
#>
#> Null deviance: 886.39 on 666 degrees of freedom
#> Residual deviance: 427.95 on 527 degrees of freedom
#> AIC: 707.95
#>
#> Number of Fisher Scoring iterations: 18
model_step1 <- step(object = model_titanic1,
direction = "backward",
trace = F)
summary(model_step1)#>
#> Call:
#> glm(formula = Survived ~ Pclass + Sex + Age + SibSp + Parch,
#> family = "binomial", data = train)
#>
#> Coefficients:
#> Estimate Std. Error z value Pr(>|z|)
#> (Intercept) 2.942296 0.374285 7.861 0.00000000000000381 ***
#> Pclass2 -0.758704 0.297488 -2.550 0.01076 *
#> Pclass3 -2.091391 0.285176 -7.334 0.00000000000022389 ***
#> Sexmale -2.839807 0.237089 -11.978 < 0.0000000000000002 ***
#> Age -0.019681 0.006551 -3.004 0.00266 **
#> SibSp1 0.010583 0.259625 0.041 0.96748
#> SibSp2 -0.406181 0.600033 -0.677 0.49845
#> SibSp3 -2.271395 0.767788 -2.958 0.00309 **
#> SibSp4 -1.447318 0.909799 -1.591 0.11165
#> SibSp5 -16.821943 1036.715680 -0.016 0.98705
#> SibSp8 -17.408712 885.802282 -0.020 0.98432
#> Parch1 0.635961 0.326949 1.945 0.05176 .
#> Parch2 1.207648 0.450717 2.679 0.00738 **
#> Parch3 -0.163850 1.230267 -0.133 0.89405
#> Parch4 -14.781044 1593.076737 -0.009 0.99260
#> Parch5 -15.933926 1177.332402 -0.014 0.98920
#> Parch6 -16.581263 2399.544741 -0.007 0.99449
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> (Dispersion parameter for binomial family taken to be 1)
#>
#> Null deviance: 886.39 on 666 degrees of freedom
#> Residual deviance: 566.22 on 650 degrees of freedom
#> AIC: 600.22
#>
#> Number of Fisher Scoring iterations: 15
Kita lihat summary diatas ternyata model dengan step backward / model yang optimum kita punya memiliki prediktor yang paling berpengaruh adalah + Pclass + Sex + Age + SibSp + Embarked
Dengan menggunakan model_step1 hasil dari stepwise, kita akan coba prediksi menggunakan data test yang sudah kita miliki.
#> [1] 0.58399436 0.06429937 0.27681845 0.87198649 0.20667944 0.38969707
# ifelse(kondisi, jika_benar, jika_salah)
test$pred_label <- ifelse(test$pred_risk > 0.5, 1, 0)
test[1:10, c("Age", "Survived")] #coba-cobapada kolom diatas kita dapat mengubah syntax “Age” dengan kolom yang sesuai kita inginkan, untuk mengetahui prediksi data test >0.5 artinya yes = 1 = Survived dan no = 0 = Not Survived
selanjutnya kita coba buat peluang dan hasil prediksi dibawah
test %>%
select(Survived, # label
pred_risk, # peluang
pred_label) %>% # hasil prediksi (label)
tail()#>
#> 0 1
#> 0 112 23
#> 1 24 65
library(caret)
confusionMatrix(data = as.factor(test$pred_label), # data hasil prediksi -> tipe data harus factor
reference = test$Survived, # data aktual harus sama tipe datanya
positive = "1")#> Confusion Matrix and Statistics
#>
#> Reference
#> Prediction 0 1
#> 0 112 23
#> 1 24 65
#>
#> Accuracy : 0.7902
#> 95% CI : (0.7309, 0.8416)
#> No Information Rate : 0.6071
#> P-Value [Acc > NIR] : 0.000000003846
#>
#> Kappa : 0.561
#>
#> Mcnemar's Test P-Value : 1
#>
#> Sensitivity : 0.7386
#> Specificity : 0.8235
#> Pos Pred Value : 0.7303
#> Neg Pred Value : 0.8296
#> Prevalence : 0.3929
#> Detection Rate : 0.2902
#> Detection Prevalence : 0.3973
#> Balanced Accuracy : 0.7811
#>
#> 'Positive' Class : 1
#>
positif : selamat negatifnya : meninggal
Isi dari Confusion Matrix:
Re-call/Sensitivity = dari semua data aktual yang positif, seberapa mampu proporsi model saya menebak benar. Specificity = dari semua data aktual yang negatif, seberapa mampu proporsi model saya menebak yang benar. Accuracy = seberapa mampu model saya menebak dengan benar target Y. Precision = dari semua hasil prediksi, seberapa mampu model saya dapat menebak benar kelas positif.
Berdasarkan hasil Confusion Matrix diatas, dapat kita ambil informasi bahwa kemampuan model dalam menebak target Y(survived/not survived) accuracy sebesar 79.91% dan spesicivity adalah 84.96%, Sencitivity 72.5%
Pada kasus kapal titanic lebih membahayakan untuk memiliki False Negatives (memprediksi tidak bertahan, padahal aktualnya masih hidup) daripada False Positives (memprediksi masih hidup, padahal aktualnya mati). Alasan utama untuk ini adalah bahwa kesalahan dalam memprediksi kematian pada Kapal Titanic memiliki dampak yang lebih serius daripada kesalahan dalam memprediksi orang yang masih hidup. Dalam hal ini recall sebesar pada model logistik regression 72.5%
Accuracy
#> [1] 0.7991071
sencitivity
#> [1] 0.7252747
diprediksi bertahan dan benar (TP)-> 79,91 diprediksi tidak bertahan, aktualnya masih hidup (FN) -> 72,5%
Membuat variabel dummy dari data clean kategori yang akan digunakan
dalam klasifikasi. Oleh karena nya kita akan melakukan split data yang
terdiri dari data train dan data test Data titanic_clean -
cross validation + train - train_x (prediktor numerik) - train_y
(target) + test - test_x (prediktor numerik) - test_y (target)
📍 Untuk k-NN, dipisahkan antara prediktor dan label (target variabelnya). > Hal ini dilakukan karena kita tidak perlu melakukan scaling terhadap target kita
RNGkind(sample.kind = "Rounding") # tambahan khusus u/ R 3.6 ke atas
set.seed(200) # mengunci random number yang dipilih
# index sampling
index <- sample(x = nrow(titanic_clean), size = nrow(titanic_clean)*0.8) # mau ambil 0.8 (80%) utk data train, sisanya utk data test
# splitting
titanic_clean_train <- titanic_clean[index,] # ambil yang barisnya termasuk di dalam index
titanic_clean_test <- titanic_clean[-index,] # ambil yang barisnya tidak termasuk di dalam indexKemudian diubah menjadi numerik di data train dan test prediktor
library(dplyr)
# prediktor
train_x <- titanic_clean_train %>% select_if(is.numeric)
test_x <- titanic_clean_test %>% select_if(is.numeric)
# target
train_y <- titanic_clean_train[,"Survived"]
test_y <- titanic_clean_test[,"Survived"]Data prediktor untuk knn harus numerik
Data prediktor akan discaling menggunakan z-score standarization. Data test juga harus discaling menggunakan parameter dari data train (karena menganggap data test adalah unseen data).
mean dan sd dari data trainKita akan memilih K yang optimal untuk membangun model
#> [1] 26.68333
library(class) # package untuk fungsi `knn()`
titanic_pred <- knn(train = train_x, # data train yang sudah numerik aja & di scaling
test = test_x, # data test yang sudah numerik aja & di scaling
cl = train_y, # label/kolom target dari data yang dipelajari
k = 26)
# 💡💡 output dari knn() itu adalah label dari data testnya, dimana dia belajar dari data train#> [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> [38] 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 1 0 0 1 1 0 1 0 0 1 0 1 1 0 0 0 1 1
#> [75] 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0
#> [112] 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0
#> [149] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
#> Levels: 0 1
# confusion matrix
library(caret)
confusionMatrix(data = titanic_pred, # hasil prediksi
reference = test_y, # label aktual
positive = "1")#> Confusion Matrix and Statistics
#>
#> Reference
#> Prediction 0 1
#> 0 101 47
#> 1 6 25
#>
#> Accuracy : 0.7039
#> 95% CI : (0.6312, 0.7697)
#> No Information Rate : 0.5978
#> P-Value [Acc > NIR] : 0.002078
#>
#> Kappa : 0.321
#>
#> Mcnemar's Test P-Value : 0.0000000392
#>
#> Sensitivity : 0.3472
#> Specificity : 0.9439
#> Pos Pred Value : 0.8065
#> Neg Pred Value : 0.6824
#> Prevalence : 0.4022
#> Detection Rate : 0.1397
#> Detection Prevalence : 0.1732
#> Balanced Accuracy : 0.6456
#>
#> 'Positive' Class : 1
#>
positif : selamat negatifnya : meninggal
Isi dari Confusion Matrix:
Pada saat tragedi Kapal Titanic, prioritas utama adalah untuk memastikan keselamatan dan penyelamatan penumpang. Oleh karena itu, ketika model KNN digunakan untuk memprediksi apakah seseorang akan bertahan atau tidak, mengidentifikasi dengan benar orang-orang yang bertahan (True Positives) sangat penting untuk memberikan pertolongan dan penyelamatan yang diperlukan. Memiliki False Negatives, yaitu memprediksi orang yang sebenarnya masih hidup sebagai tidak bertahan, dapat berakibat fatal karena mereka mungkin tidak mendapatkan bantuan yang mereka perlukan.
Dengan kata lain, dalam konteks ini, lebih baik memiliki kesalahan prediksi yang berupa False Positives (memperkirakan lebih banyak orang tidak bertahan daripada yang sebenarnya) daripada memiliki False Negatives (melewatkan orang-orang yang sebenarnya masih hidup dan membutuhkan bantuan).
Oleh karena itu, ketika membangun model KNN atau model lain untuk memprediksi nasib penumpang Titanic, penting untuk fokus pada meminimalkan False Negatives untuk memastikan bahwa orang-orang yang masih hidup mendapatkan perhatian dan bantuan yang tepat. Dalam hal ini sencitivity sebesar 34,72%
Pada kedua model diatas dapat disimpulkan bahwa kita akan memprediksi lebih banyak orang tidak bertahan daripada yang sebenarnya (FP) daripada False Negatives (melewatkan orang-orang yang sebenarnya masih hidup dan membutuhkan bantuan).
Sensitivity mengukur kemampuan model untuk mengidentifikasi dengan benar orang-orang yang sebenarnya bertahan (positif) dari semua orang yang sebenarnya bertahan. Dalam konteks ini, Sensitivity yang lebih tinggi berarti bahwa model memiliki kemampuan yang lebih baik untuk mengenali orang-orang yang selamat.
Specificity mengukur kemampuan model untuk mengidentifikasi dengan benar orang-orang yang sebenarnya tidak bertahan (negatif) dari semua orang yang sebenarnya tidak bertahan. Dalam konteks ini, Specificity yang lebih tinggi berarti bahwa model memiliki kemampuan yang lebih baik untuk mengenali orang-orang yang tidak bertahan.
Bisa disimpulkan model logistik regression lebih baik memprediksi daripada KNN Neightbour