Projeto: Classificação de Sobreviventes do Titanic com Random Forest
Dados utilizados
Tipo: numérica discreta O que é: identificador único do passageiro. Para que serve: não contém informação útil para predição. Ação necessária: remover do modelo.
Tipo: categórica binária (target) O que é: 1 = sobreviveu; 0 = não sobreviveu. Para que serve: variável dependente a ser prevista. Ação necessária: checar balanceamento (a classe 0 é ligeiramente maior).
Tipo: categórica ordinal O que é: classe socioeconômica do ticket (1ª, 2ª, 3ª). Para que serve: proxy de condição financeira/social que influencia sobrevivência. Ação necessária: manter como categórica ordinal; verificar distribuição nas classes.
Tipo: categórica binária Oque é: sexo biológico do passageiro (male/female). Para que serve: uma das variáveis mais importantes na sobrevivência. Ação necessária: codificar para dummy (female → 1, male → 0).
Tipo: numérica contínua O que é: idade em anos. Para que serve: importante para separar grupos vulneráveis (crianças, adultos). Ação necessária: 177 valores ausentes → imputar (média/mediana ou por título extraído do Name).
Tipo: numérica discreta O que é: número de irmãos/cônjuges a bordo. Para que serve: indica tamanho do grupo familiar; pode influenciar sobrevivência. Ação necessária: manter; possível normalizar ou agrupar faixas.
Tipo: numérica discreta O que é: número de pais/filhos a bordo. Para que serve: outro indicador do grupo familiar. Ação necessária: manter; possível criar “FamilySize = SibSp + Parch + 1”.
Tipo: categórica (texto) O que é: número/código do ticket. Para que serve: pouco útil originalmente; pode ajudar se agrupado por prefixos. Ação necessária: normalmente remover.
Tipo: numérica contínua O que é: tarifa paga pelo ticket. Para que serve: relação com classe social; boa variável preditiva. Ação necessária: checar outliers; possível normalização logarítmica.
Tipo: categórica nominal O que é: porto de embarque (C, Q, S). Para que serve: pode refletir diferenças sociais/regionais. Ação necessária: imputar os 2 valores ausentes; criar dummies.
Código Feito
Acurácia: 0.8044692737430168 OOB Score: 0.7935393258426966 Relatório de Classificação: precision recall f1-score support 0 0.82 0.86 0.84 105 1 0.78 0.73 0.76 74 accuracy 0.80 179 macro avg 0.80 0.79 0.80 179 weighted avg 0.80 0.80 0.80 179 Importância das variáveis: Fare 0.274170 Sex_male 0.267026 Age 0.255208 Pclass 0.082134 SibSp 0.049823 Parch 0.037489 Embarked_S 0.023333 Embarked_Q 0.010816 dtype: float64
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report
import kagglehub
import pandas as pd
import os
# 1. Baixar e carregar os dados
path = kagglehub.dataset_download("yasserh/titanic-dataset")
file_path = os.path.join(path, "Titanic-Dataset.csv")
df = pd.read_csv(file_path)
# 2. Selecionar colunas relevantes
features = df[['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked', 'Survived']].copy()
# 3. Tratar valores ausentes
features['Age'].fillna(features['Age'].mean(), inplace=True)
features['Embarked'].fillna(features['Embarked'].mode()[0], inplace=True)
# 4. Converter variáveis categóricas em numéricas (One-Hot Encoding)
features = pd.get_dummies(features, columns=['Sex', 'Embarked'], drop_first=True)
# 5. Definir X (entradas) e y (alvo)
X = features.drop('Survived', axis=1)
y = features['Survived']
# 6. Dividir treino/teste
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 7. Criar modelo Random Forest
rf = RandomForestClassifier(
n_estimators=100, # número de árvores
max_depth=None, # profundidade ilimitada
max_features='sqrt', # nº de features consideradas em cada split
oob_score=True, # validação out-of-bag
random_state=42
)
# 8. Treinar modelo
rf.fit(X_train, y_train)
# 9. Avaliar modelo
y_pred = rf.predict(X_test)
print("Acurácia:", accuracy_score(y_test, y_pred))
print("OOB Score:", rf.oob_score_)
print("\nRelatório de Classificação:\n", classification_report(y_test, y_pred))
# 10. Importância das variáveis
importances = pd.Series(rf.feature_importances_, index=X.columns).sort_values(ascending=False)
print("\nImportância das variáveis:\n", importances)
1. Exploração dos Dados
Nesta etapa, foi realizada a análise inicial do conjunto de dados Titanic-Dataset (fonte: Kaggle).
O objetivo é prever se um passageiro sobreviveu ou não, com base em suas características demográficas e socioeconômicas.
Variáveis principais: - Pclass — Classe do bilhete (1ª, 2ª ou 3ª classe)
- Sex — Sexo do passageiro
- Age — Idade
- SibSp — Número de irmãos/cônjuges a bordo
- Parch — Número de pais/filhos a bordo
- Fare — Tarifa paga
- Embarked — Porto de embarque (C = Cherbourg, Q = Queenstown, S = Southampton)
- Survived — Variável alvo (0 = não sobreviveu, 1 = sobreviveu)
Estatísticas descritivas básicas: - Média de idade ≈ 29,6 anos
- Tarifa média ≈ 32,2 libras
- Proporção de sobreviventes ≈ 38,4%
O conjunto contém 891 registros, com algumas variáveis categóricas e valores ausentes em Age e Embarked.
2. Pré-processamento
Foram realizadas as seguintes etapas de preparação dos dados:
- Tratamento de valores ausentes:
Age: substituído pela média das idades.-
Embarked: substituído pelo valor mais frequente (moda). -
Codificação de variáveis categóricas:
SexeEmbarkedforam convertidas para formato numérico utilizando One-Hot Encoding.-
A primeira categoria de cada variável foi removida para evitar multicolinearidade (
drop_first=True). -
Normalização:
- Não foi necessária, pois o modelo Random Forest não é sensível à escala dos dados.
3. Divisão dos Dados
O conjunto de dados foi dividido em: - Treino: 80%
- Teste: 20%
Essa divisão permite avaliar a capacidade de generalização do modelo.
4. Treinamento do Modelo
O modelo utilizado foi o RandomForestClassifier do scikit-learn.
Foram definidos os seguintes parâmetros:
n_estimators=100→ número de árvoresmax_depth=None→ profundidade ilimitadamax_features='sqrt'→ número de variáveis consideradas em cada divisãooob_score=True→ uso de validação out-of-bagrandom_state=42→ reprodutibilidade
O modelo foi treinado com o conjunto de dados de treino (X_train, y_train).
5. Avaliação do Modelo
Após o treinamento, o modelo foi testado com o conjunto de teste (X_test).
Métricas de desempenho obtidas:
Relatório de classificação:
precision recall f1-score support
0 0.82 0.86 0.84 105
1 0.78 0.73 0.76 74
accuracy 0.80 179
macro avg 0.80 0.79 0.80 179
weighted avg 0.80 0.80 0.80 179
O modelo apresentou desempenho sólido e equilibrado, com boa generalização entre as classes.
6. Importância das Variáveis
O modelo fornece uma medida de importância de cada variável para as decisões da floresta:
| Variável | Importância |
|---|---|
| Fare | 0.274 |
| Sex_male | 0.267 |
| Age | 0.255 |
| Pclass | 0.082 |
| SibSp | 0.050 |
| Parch | 0.037 |
| Embarked_S | 0.023 |
| Embarked_Q | 0.011 |
As variáveis Fare, Sex_male e Age são as mais relevantes para prever a sobrevivência.
Isso indica que o custo do bilhete (e, indiretamente, a classe social), o sexo e a idade foram fatores determinantes.
7. Conclusão e Possíveis Melhorias
O modelo Random Forest apresentou acurácia de aproximadamente 80%, demonstrando boa capacidade de previsão.
Principais conclusões: - Passageiros com tarifas mais altas e do sexo feminino tiveram maior chance de sobreviver. - A idade também é um fator relevante: crianças e jovens apresentaram taxas de sobrevivência superiores.
Possíveis melhorias futuras: - Aplicar tuning de hiperparâmetros com GridSearchCV ou RandomizedSearchCV.
- Balancear as classes com class_weight='balanced' ou técnicas de oversampling (ex: SMOTE).
- Criar variáveis derivadas (ex: FamilySize = SibSp + Parch + 1).
- Avaliar outros algoritmos (XGBoost, Gradient Boosting, etc.).
Autor: Rafael Arkchimor Lucena
Ferramentas: Python, Scikit-Learn, Pandas, MkDocs
Base de dados: Titanic Dataset - Kaggle