O conjunto de dados Titanic contém 891 observações com 12 variáveis descritas a seguir:

O objetivo é fazer um projeto focado no aprendizado de máquina para criar um modelo que preveja quais passageiros sobreviveram ao naufrágio do Titanic.

Para analisar a sobreviência do passageiro removeu-se algumas variáveis, como a identificação do passageiro, nome do passageiro e o número do bilhete, pois essas variáveis não influenciam na análise. Após a remoção, o novo conjunto contém 9 variáveis.

library("tidyverse")
setwd("~/Mestrado UFLA/4 Semestre/Analise e Visualizacao de Dados/Projeto/Projeto III")
dados = read.csv("train.csv")
dados = dados %>% select(-PassengerId, -Name, -Ticket)

Primeiro, analisando as características de cada variável, observou que há algumas observações ausentes nos dados, como idade e cabine. Além disso, tem-se variáveis do tipo fator, como o sexo, cabine e porto de embarque, mas também considerou-se as variáveis sobrevivência, classe, SibSp e Parch como fatores.

dados = dados %>% mutate(Survived = factor(Survived),
                         Pclass = factor(Pclass),
                         SibSp = factor(SibSp),
                         Parch = factor(Parch))
glimpse(dados)
## Observations: 891
## Variables: 9
## $ Survived <fct> 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1,...
## $ Pclass   <fct> 3, 1, 3, 1, 3, 3, 1, 3, 3, 2, 3, 1, 3, 3, 3, 2, 3, 2,...
## $ Sex      <fct> male, female, female, female, male, male, male, male,...
## $ Age      <dbl> 22, 38, 26, 35, 35, NA, 54, 2, 27, 14, 4, 58, 20, 39,...
## $ SibSp    <fct> 1, 1, 0, 1, 0, 0, 0, 3, 0, 1, 1, 0, 0, 1, 0, 0, 4, 0,...
## $ Parch    <fct> 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 0, 0, 5, 0, 0, 1, 0,...
## $ Fare     <dbl> 7.2500, 71.2833, 7.9250, 53.1000, 8.0500, 8.4583, 51....
## $ 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,...

Inicialmente, haviam 577 homens e 314 mulheres no navio, onde 216 eram da primeira classe, 184 da segunda classe e 491 da terceira. Verifica-se que houveram 342 sobreviventes entre os 891 passageiros, correspondendo a 38%. Analisando as características dos sobreviventes conforme o sexo, tem-se:

library("qwraps2"); library("knitr"); library(xtable); library("lmtest")
dados_sobreviventes = filter(dados, Survived == 1)
ggplot(data=dados_sobreviventes, aes(x=Pclass, fill=Sex)) +
  geom_bar(stat="count", position=position_dodge())+
  theme_classic()

Observa-se que o sexo feminino apresentou o maior número de sobreviventes em todas as classes. Além disso, a classe 2 apresentou o menor número de sobreviventes tanto para o sexo feminino quanto masculino.

Considerando o conjunto de dados com 891 observações, tem-se que algumas observações estão ausentes e foram removidas (removeu-se a variável Cabin, pois apresentou falta de informações). Com isso, tem-se 8 variáveis e 714 observações:

dados = dados %>% select(-Cabin) %>% na.omit() 

Considerou-se um modelo de regressão logístico com o obejetivo de analisar a sobreviência dos passageiros. Para isso, dividiu-se a amostra em 80% para treino e 20% para teste.

set.seed(14)
ind <- sample(2, nrow(dados), replace= T, prob=c(0.9, 0.1))
treino <- dados[ind==1,]
teste <- dados[ind==2,]

modelo = glm (Survived ~ Pclass+ Sex + Age + 
              SibSp+ Parch+Fare+Embarked, data = treino, family =                  binomial)
coeftest(modelo)
## 
## z test of coefficients:
## 
##                Estimate  Std. Error  z value  Pr(>|z|)    
## (Intercept)  1.8497e+01  1.6594e+03   0.0111  0.991106    
## Pclass2     -1.0836e+00  3.4750e-01  -3.1183  0.001819 ** 
## Pclass3     -2.2073e+00  3.6659e-01  -6.0212 1.731e-09 ***
## Sexmale     -2.6353e+00  2.3469e-01 -11.2289 < 2.2e-16 ***
## Age         -4.0087e-02  9.1340e-03  -4.3887 1.140e-05 ***
## SibSp1       5.0183e-03  2.5223e-01   0.0199  0.984127    
## SibSp2      -6.5911e-01  6.1543e-01  -1.0710  0.284181    
## SibSp3      -1.6904e+00  8.3196e-01  -2.0318  0.042171 *  
## SibSp4      -1.6872e+00  8.0483e-01  -2.0964  0.036047 *  
## SibSp5      -1.6096e+01  9.6178e+02  -0.0167  0.986647    
## Parch1       2.8532e-01  3.1939e-01   0.8934  0.371669    
## Parch2       1.1311e-01  4.2425e-01   0.2666  0.789763    
## Parch3       4.0981e-01  1.0515e+00   0.3897  0.696737    
## Parch4      -1.5873e+01  1.0539e+03  -0.0151  0.987983    
## Parch5      -9.9151e-01  1.1836e+00  -0.8377  0.402181    
## Fare         1.7504e-03  2.6891e-03   0.6509  0.515099    
## EmbarkedC   -1.4564e+01  1.6594e+03  -0.0088  0.992997    
## EmbarkedQ   -1.5266e+01  1.6594e+03  -0.0092  0.992660    
## EmbarkedS   -1.4815e+01  1.6594e+03  -0.0089  0.992876    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Observa-se que algumas variáveis não foram significativas e por isso procedeu-se com a função step. Então, o novo modelo é dado por: Survived ~ Pclass + Sex + Age + SibSp. Porém, considerou-se apenas as variáveis significativas a 1%, excluindo dessa forma a variável SibSp do modelo.

modelo2 = glm(Survived ~ Pclass + Sex + Age, data = treino,                family = binomial)
coeftest(modelo2)
## 
## z test of coefficients:
## 
##               Estimate Std. Error  z value  Pr(>|z|)    
## (Intercept)  3.7379614  0.4184430   8.9330 < 2.2e-16 ***
## Pclass2     -1.1919869  0.2893508  -4.1195 3.797e-05 ***
## Pclass3     -2.5376252  0.2951274  -8.5984 < 2.2e-16 ***
## Sexmale     -2.5615663  0.2185553 -11.7204 < 2.2e-16 ***
## Age         -0.0369409  0.0079646  -4.6382 3.515e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Conforme o modelo ajustado, houve um efeito significativo nas variáveis classe e idade do passageiro. Considerando um limiar de 0,5, o modelo classificou corretamente 80,85% dos passageiros que morreram e 77,27% dos passageiros que sobreviveram considerando os dados de teste.

pred.Teste = predict(modelo2, teste, type = "response")
table(teste$Survived, pred.Teste > 0.5)
##    
##     FALSE TRUE
##   0    38    5
##   1     9   17

Nota-se que o modelo apresentou uma acúracia alta (84,06%) e além disso, o valor do índice kappa foi igual a 0,6415.

library("randomForest")
library("caret")
modelo_random <- randomForest(Survived ~ Pclass+ Sex + Age + 
                            SibSp+ Parch+Fare+Embarked, data =  treino,
                            ntree = 100,  mtry = 2)
predicao <- predict(modelo_random, newdata = teste)
confusionMatrix(predicao, teste$Survived)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  0  1
##          0 41  9
##          1  2 17
##                                           
##                Accuracy : 0.8406          
##                  95% CI : (0.7326, 0.9176)
##     No Information Rate : 0.6232          
##     P-Value [Acc > NIR] : 6.893e-05       
##                                           
##                   Kappa : 0.6415          
##                                           
##  Mcnemar's Test P-Value : 0.07044         
##                                           
##             Sensitivity : 0.9535          
##             Specificity : 0.6538          
##          Pos Pred Value : 0.8200          
##          Neg Pred Value : 0.8947          
##              Prevalence : 0.6232          
##          Detection Rate : 0.5942          
##    Detection Prevalence : 0.7246          
##       Balanced Accuracy : 0.8037          
##                                           
##        'Positive' Class : 0               
##