Introdução

A análise de sobrevivência do Titanic é um projeto clássico no universo da Ciência de Dados. Proposto pelo Keagle em 2012, esse projeto tem um objetivo simples: Através de algumas ferramentas de Machine Learning, ajustar um modelo que prevê quais passageiros sobreviveram ao náufrago do Titanic. Em 10 de abril de 1912, o Titanic desembarcava em sua viagem inaugural, de Southampton, ao sul do Reino Unido, para um dos maiores desastres marítimos da história. No dia 15 de Abril do mesmo ano, o navio afundou após colidir com um iceberg no Oceano Atlântico. O número insuficiente de botes salva-vidas, uma série de negligências cometidas, e outros fatores, culminaram na morte de 1502 dos 2224 passageiros e tripulantes. Usando alguns dados dos passageiros, como: Nome; Idade; Sexo; Classe socioeconômica, e etc… Construiremos um modelo preditivo que respoda a seguinte pergunta: Que tipo de pessoa tem maior probabilidade de sobreviver ao náufrago do Titanic?

Análise e Discussão

A plataforma Keagle disponibilizou um banco de dados dividido em duas partes chamadas train e test. A primeira parte, train, possui 891 observações e 12 variáveis, sendo elas:

Survived (Sobreviveu): 0 = Não, 1 = Sim

Pclass (Classe): Classe de ingresso 1 = 1º, 2 = 2º, 3 = 3º

Sex (Sexo): Sexo do passageiro

Age (Idade): Idade em anos

Sibsp: Quantidade de irmãos / cônjuges a bordo do Titanic

Parch: Quantidade de pais / crianças a bordo do Titanic

Ticket (Bilhete): Número do bilhete de embarque

Fare (Tarifa): Tarifa paga pelo Passageiro

Cabin (Cabine): Número de cabine

Embarked (Embarque): Porto de Embarque (C = Cherbourg, Q=Queenstown, S = Southampton)

A Segunda parte, test, possui 418 observações e as mesmas variáveis, com exceção da coluna “Survived”. Os dados dessa coluna serão estimados ao final do relatório como resultado do modelo construído.

Falar sobre informações sem entender como esse banco de dados se comporta pode ser um pouco confuso e até contraintuitivo, portanto, a análise gráfica irá guiar esse processo investigativo. Vamos olhar para esses dados sob a ótica de alguns gráficos, e assim, extrair informações que possam ser relevantes para a construção do modelo proposto.

No grafico abaixo, vamos analisar as variáveis “Sex”, “Pclass”, e “Survived” no momento do embarque e o perfil dos sobreviventes.

É notada uma grande diferença na dinâmica dos sexos. No primeiro momento, a embarcação é majoritariamente masculina, e no perfil dos sobreviventes, isso se inverte. O que faz sentido, se pensarmos na ordem de prioridade de salvamento em acidentes: Mulheres, crianças e idosos podem ter sido colocados em lugar de prioridade. É notável também uma diminuição expressiva entre os passageiros da terceira classe, expresso pela cor azul.

Pensando em ordem de prioridade, é interessante darmos atenção à variável idade, e ver o que ela tem a nos dizer nesse cenário.

É preciso dedicar um pouco de atenção ao analisar esse gráfico. Visualmente, ele parece não apresentar mudanças significativas como o gráfico anterior, mas, se olharmos com atenção, podemos observar que o eixo vertical, “contagem”, possui grandezas diferentes entre o momento do embarque e o perfil dos sobreviventes, logo, a contagem de passageiros é muito menor no segundo momento. Como a grande massa de passageiros e tripulantes se concentra entre 20 e 40 anos, é intuitivo dizer que, proporcionalmente, os adultos dessa idade foram os maiores afetados. Buscando uma relação com o gráfico anterior, podemos interpreta-los dizendo que, as maiores vítimas foram homens entre 20 e 40 anos. Dadas as maiores discrepâncias de cada gráfico. Outro ponto interessante de se observar, é que as extremidades sofreram menores alterações, reforçando a suposição que mulheres, crianças e idosos podem ter tido prioridade na ordem de salvamento. Aqui, cabe uma curiosidade importante: O passageiro mais velho do Titanic sobrevieu ao náufrago. O Mr. Algernon Henry Wilson, era um senhor de 80 anos que viajava de primeira classe. Essa informação pode ser observada no grafico acima, no histograma das idades. O passageiro mais novo também sobreviveu. Thomas Alexander era um bebê de 5 mêses, que viajava de terceira classe com apenas um parente à bordo.

Vamos agora olhar as estatísticas descritivas básicas de cada variável:

##  PassengerId        Survived Pclass      Name               Sex     
##  Length:891         0:549    1:216   Length:891         female:314  
##  Class :character   1:342    2:184   Class :character   male  :577  
##  Mode  :character            3:491   Mode  :character               
##                                                                     
##                                                                     
##                                                                     
##                                                                     
##       Age            SibSp           Parch           Ticket         
##  Min.   : 0.42   Min.   :0.000   Min.   :0.0000   Length:891        
##  1st Qu.:20.12   1st Qu.:0.000   1st Qu.:0.0000   Class :character  
##  Median :28.00   Median :0.000   Median :0.0000   Mode  :character  
##  Mean   :29.70   Mean   :0.523   Mean   :0.3816                     
##  3rd Qu.:38.00   3rd Qu.:1.000   3rd Qu.:0.0000                     
##  Max.   :80.00   Max.   :8.000   Max.   :6.0000                     
##  NA's   :177                                                        
##       Fare           Cabin             Embarked        
##  Min.   :  0.00   Length:891         Length:891        
##  1st Qu.:  7.91   Class :character   Class :character  
##  Median : 14.45   Mode  :character   Mode  :character  
##  Mean   : 32.20                                        
##  3rd Qu.: 31.00                                        
##  Max.   :512.33                                        
## 

Esse quadro descritivo nos dá uma informação resumida sobre como os nossos dados estão distribuídos. Lembrando que, os dados analisados até aqui, dizem respeito apenas ao conjunto de dados “train”, e não à tripulação completa. Dito isso, podemos observar, por exemplo, que sobreviveram 342 pessoas das 891 observadas. É possivel ver que o maior número de pessoas pertencia a terceira classe de embarcação, somando 491 pessoas. 314 pessoas, entre passageiros e tripulantes, eram do sexo feminino. A idade média da tripulação era de 29 anos. E assim, olhando detalhadamente, coluna por coluna, conseguimos extrair informações, que talvez, não tenham sido apresentadas de maneira clara nos gráficos.

Uma observação interessante acontece na coluna Age. A idade apresenta uma observação diferente das demais, a contagem de 177 NA’s. Esse dado indica que, das 891 observações, 177 não foram computadas na coluna idade. Essa informação pode ter se perdido por diversos fatores, e como resultado, nos entrega uma informação deficiente que pode influenciar negativamente o resultado do nosso modelo. Os valores ausentes, representam 8% do volume total do nosso conjunto de dados, por ser um valor relativamente baixo, é plausível que criemos estimativas para preencher os dados faltantes.

Através do método Arvores de Classificação e Regressão, nosso modelo conseguiu preencher todos os valores ausentes. Matematicamente, foi feita uma operação linear com essas matrizes e os valores foram imputados levando em consideração a influencia de todas as variáveis envolvidas. O algorítmo usado nessa implementação pode ser consultado no meu perfil do Github. Sempre visando preservar os dados originais, criei um novo banco de dados chamado “train_completo”. Removi também algumas colunas que não eram interessantes no nosso processo analítico, restando apenas “PassengerId”; “Survived”; “Pclass”; “Sex”; “Age”; “SibSp”; “Parch” e “Fare”.

Vamos analisar graficamente a qualidade da nossa imputação:

Podemos observar uma diferença na densidade das idades de 20 a 40 anos, o que representa o comportamento do conjunto de dados imputado. Como as curvas são parecidas, podemos concluir que a imputação apresenta um resultado plausível.

Vamos agora implementar de fato um modelo que nos retorne probabilidades de sobrevivência. Para ilustrar esse cenário, usaremos uma uma árvore de decisões.

A interpretação da árvore de probabilidades é bem intuitiva. No topo, vemos que 38% das pessoas sobreviveram, e representam o total da base (100%). O primeiro nó que separa os sobreviventes é a variável Sex. A esquerda, na alternativa “yes”, podemos ver que apenas 19% dos homens sobreviveram, e eles representam 65% dos passageiros. A interpretação pode continuar dessa forma recurssivamente. A árvore apresenta apenas os sobreviventes. O valor central de cada quadro mostra a sobrevivência desse indivíduo em porcentagem, o valor logo abaixo, representa a porcentagem que esse indivíduo representa em relação ao total de passageiros. Por, exemplo, se analisarmos o primeiro quadro, da direita para a esquerda, veremos uma mulher, da terceira classe, que 95% das pessoas com esse perfil sobreviveu, e representa 19% do total da base.

Vamos aos resultados do nosso modelo ajustado:

## Analysis of Deviance Table
## 
## Model: binomial, link: logit
## 
## Response: Survived
## 
## Terms added sequentially (first to last)
## 
## 
##        Df Deviance Resid. Df Resid. Dev  Pr(>Chi)    
## NULL                     890    1186.66              
## Pclass  2  103.547       888    1083.11 < 2.2e-16 ***
## Sex     1  256.220       887     826.89 < 2.2e-16 ***
## Age     1   24.907       886     801.98 6.017e-07 ***
## SibSp   1   20.204       885     781.78 6.960e-06 ***
## Parch   1    0.485       884     781.29    0.4861    
## Fare    1    1.122       883     780.17    0.2896    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Esse quadro apresenta de maneira analítica os resultados do nosso modelo em uma análise de variância (ANOVA). Na coluna “Pr(>Chi)” podemos analisar a influência de cada variável no nosso modelo, quanto maior for a quantidade de asteriscos (***), com maior segurança poderemos afirmar que aquela variável exerceu influência sobre o modelo ajustado.

As variáveis explicativas Parch e Fare, possuem um p-valor muito alto, o que indica baixa influência no resultado do nosso modelo, porém, quando ajustei um modelo sem a presença das duas, o modelo apresentou um aumento na variância, o que é negativo para o nosso modelo. Para um modelo bem ajustado, buscamos uma variância com o menor valor possível. A variância representa o quão distante cada valor do conjunto está da média, logo, buscamos uma variância mínima. Na tabela, a menor variância pode ser observada ao final da coluna “Resid. Dev”.

Para testar o nosso modelo no banco de dados “test”, é necessário repetir o procedimento de imputação de dados, visto que o conjunto de dados a ser testado também possui dados ausentes.

Procedimentos feitos, vamos analisar o reultado final do nosso modelo:

## # A tibble: 6 x 9
##   PassengerId Pclass Sex      Age SibSp Parch  Fare SurviveId Survive
##   <chr>       <fct>  <fct>  <dbl> <dbl> <dbl> <dbl>     <dbl>   <dbl>
## 1 892         3      male    34.5     0     0  7.83    0.0768       0
## 2 893         3      female  47       1     0  7       0.327        0
## 3 894         2      male    62       0     0  9.69    0.0729       0
## 4 895         3      male    27       0     0  8.66    0.105        0
## 5 896         3      female  22       1     1 12.3     0.583        1
## 6 897         3      male    14       0     0  9.22    0.177        0

Apliquei uma função que nos retorna as primeiras 6 linhas da nossa tabela. A coluna “SurviveId” é a coluna cujo qual foi aplicado o nosso modelo, ela contem resultados de 0 a 1 e que representam as probabilidades de sobrevivência de cada passageiro. O Keagle, exige que os dados, na sua submissão, sejam fornecidos em formato binário (0 ou 1).Baseado nisso, construí uma nova coluna chamada “Survive”, essa por sua vez, possui apenas dois valores, 0 e 1. Para aqueles indivíduos que possuem probabilidade de sobreviência maior que 0.5 (50%) a coluna Survive retorna 1, e para aqueles que possuem probabilidade de sobrevivência menor que 0.5, a coluna Survive retorna 0.

Conclusão

O resultado desse modelo foi submetido à plataforma keagle e, a partir dele, conseguimos prever corretamente 75% dos resultados. É um bom resultado, porém, o mesmo se torna menos relevante se observarmos que uma quantidade significativa de participantes conseguiram prever 100% dos resultados. O modelo pode ser refinado e trabalhado para aumento da sua acurácia. Contudo, é um bom projeto para iniciar nesse imenso e poderoso mundo da Ciência de Dados.