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

Library and Setup

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().

# libraries
library(readr)
library(dplyr)
library(gtools)
library(gmodels)
library(ggplot2)
library(class)
library(tidyr)

Logistic Regression

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 .

titanic <- read.csv("train.csv")
head(titanic)

Cek Struktur Data

glimpse(titanic)
#> 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

head(titanic)

cek missing value

colSums(is.na(titanic))
#> PassengerId    Survived      Pclass        Name         Sex         Age 
#>           0           0           0           0           0         177 
#>       SibSp       Parch      Ticket        Fare       Cabin    Embarked 
#>           0           0           0           0           0           0
anyNA(titanic)
#> [1] TRUE

terdapat missing value sebanyak 177 pada kolom Age kita dapat mengatasinya dengan cara mengganti missing value dengan zero(0).

titanic$Age[is.na(titanic$Age)] <- 0

Data Manipulation

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

colnames(titanic)
#>  [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

head(titanic_clean)
unique(titanic$SibSp)
#> [1] 1 0 3 4 2 5 8
unique(titanic$Embarked)
#> [1] "S" "C" "Q" ""

Pre Processing Data

Sebelum melakukan pemodelan, kita perlu melihat terlebih dahulu proporsi dari target variabel yang kita miliki pada kolom survived

prop.table(table(titanic_clean$Survived))
#> 
#>         0         1 
#> 0.6161616 0.3838384
table(titanic_clean$Survived)
#> 
#>   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.

Splitting Train Test

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)
nrow(train)
#> [1] 667
nrow(test)
#> [1] 224

cek kembali proporsi kelas data train dan data tes

# re-check class imbalance
prop.table(table(train$Survived))
#> 
#>         0         1 
#> 0.6191904 0.3808096

Modelling

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.

model_titanic1 <- glm(Survived ~ ., data = train, family="binomial")

summary(model_titanic1)
#> 
#> 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

  • AIC : 609.72

Prediksi Model

Dengan menggunakan model_step1 hasil dari stepwise, kita akan coba prediksi menggunakan data test yang sudah kita miliki.

test$pred_risk <- predict(model_step1,
                          test,
                          type = "response")
head(test$pred_risk)
#> [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-coba

pada 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()

Model Evaluation

# membandingkan hasil prediksi & aktual
table(test$pred_label, test$Survived)
#>    
#>       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:

    • True Positive (TP) : diprediksi positif dan benar (prediksi positif; aktual positif) -> diprediksi hidup dan benar -> 66
    • True Negative (TN) : diprediksi negatif dan benar (prediksi negatif; aktual negatif) -> diprediksi tidak bertahan dan benar -> 113
    • False Positive (FP) : diprediksi positif namun salah (prediksi positif; aktual negatif) -> diprediksi masih hidup, aktualnya mati -> 20 -> kondisinya sudah meninggal
    • False Negative (FN) : diprediksi negatif namun salah (prediksi negatif; aktual positif) -> diprediksi tidak bertahan, aktualnya masih hidup -> 25 -> masih ada harapan dia menghilang

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

(66+113)/nrow(test)
#> [1] 0.7991071

sencitivity

66/(66+25)
#> [1] 0.7252747

diprediksi bertahan dan benar (TP)-> 79,91 diprediksi tidak bertahan, aktualnya masih hidup (FN) -> 72,5%

Model Interpretation

#Odd Ratio All Coefficients
exp(model_step1$coefficients) %>% 
  data.frame()

Interpretasi model step prediktor ini odds orang dengan pclass2 0.4536 < 1 artinya orang dengan pclass2 45,3% untuk bertahan dibanding dengan pclass3

K-NN Neighbour

Pre Processing Data

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 index

Kemudian 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).

  • Untuk data test:
    • diperlakukan sebagai data unseen
    • 📌 ketika ingin di scaling prediktornya harus menggunakan informasi mean dan sd dari data train
# scaling data prediktor
titanic_train_xs <- scale(train_x)
  
titanic_test_xs <- scale(test_x, 
                         # mengambil mean dr data train
                        center = attr(titanic_train_xs, "scaled:center"), 
                         # mengambil stdev dr data train
                        scale = attr(titanic_train_xs, "scaled:scale"))

Model Building dan Prediksi

Kita akan memilih K yang optimal untuk membangun model

# find optimum k = sqrt(total_data_yang_dipelajari)
sqrt(nrow(train_x))
#> [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

Prediksi

titanic_pred
#>   [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:

    • True Positive (TP) : diprediksi positif dan benar (prediksi positif; aktual positif) -> diprediksi hidup dan benar -> 25
    • True Negative (TN) : diprediksi negatif dan benar (prediksi negatif; aktual negatif) -> diprediksi tidak bertahan dan benar -> 101
    • False Positive (FP) : diprediksi positif namun salah (prediksi positif; aktual negatif) -> diprediksi masih hidup, aktualnya mati -> 6
    • False Negative (FN) : diprediksi negatif namun salah (prediksi negatif; aktual positif) -> diprediksi tidak bertahan, aktualnya masih hidup -> 47

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%

Kesimpulan

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