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
##