import seaborn as sns# Carregar o conjunto de dados do Titanictitanic_df = sns.load_dataset('titanic')# Verificar dados faltantes em cada colunamissing_data = titanic_df.isnull().sum()print(missing_data)# Excluir a coluna 'deck', dados faltantes e criar um sex numericotitanic_df = titanic_df.drop(columns=['deck'])titanic_df = titanic_df.dropna(subset=['age'])titanic_df = titanic_df.dropna(subset=['embark_town'])titanic_df = titanic_df.dropna(subset=['embarked'])titanic_df['sex_numeric'] = titanic_df['sex'].map({'female': 0, 'male': 1})#BANCO DE DADOS FINAL QUE VAMOS TRABALHARmissing_data = titanic_df.isnull().sum()print(missing_data)
survived 0
pclass 0
sex 0
age 177
sibsp 0
parch 0
fare 0
embarked 2
class 0
who 0
adult_male 0
deck 688
embark_town 2
alive 0
alone 0
dtype: int64
survived 0
pclass 0
sex 0
age 0
sibsp 0
parch 0
fare 0
embarked 0
class 0
who 0
adult_male 0
embark_town 0
alive 0
alone 0
sex_numeric 0
dtype: int64
Divisão em treino e teste: 1. Quantas observações tem no conjunto de dados? E quantos atributos? O conjunto de dados possui quantas classes? Ele é desbalanceado?
Na primeira pesquisa, para medir o balanceamento, eu achei essa resposta:
num_observacoes = titanic_df.shape[0]num_atributos = titanic_df.shape[1]print("Número de observações:", num_observacoes)print("Número de atributos:", num_atributos)# Verificar se o conjunto de dados é desbalanceado (contagem de cada classe)contagem_classes = titanic_df['survived'].value_counts()print("Contagem de cada classe:")print(contagem_classes)# Verificar se é desbalanceadodesbalanceado = contagem_classes.min() / contagem_classes.max() <0.5print("Desbalanceado?", desbalanceado)
Número de observações: 712
Número de atributos: 15
Contagem de cada classe:
survived
0 424
1 288
Name: count, dtype: int64
Desbalanceado? False
2. Separe o conjunto de dados em treino e teste sem fixar o parâmetro random_state.
from sklearn.model_selection import train_test_split# Selecionar características e alvoX1 = titanic_df[['pclass', 'age', 'sex_numeric']]y1 = titanic_df['survived']# Dividir os dados em conjuntos de treinamento e teste SEM RANDOM STATEX1_train, X1_test, y1_train, y1_test = train_test_split(X1, y1, test_size=0.2)
3. Crie um modelo de regressão logística utilizando a biblioteca do scikit-learn.
from sklearn.linear_model import LogisticRegressionimport numpy as np# Criar e treinar o modelo de regressão logísticamodel1 = LogisticRegression()model1.fit(X1_train, y1_train)# Coeficientes do modelocoefficients1 = model1.coef_[0]intercept1 = model1.intercept_# Exibir os coeficientes e o interceptprint("Coeficientes:", coefficients1)print("Intercept:", intercept1)
# Calculando e exibindo Odds Ratiosodds_ratios1 = np.exp(coefficients1)print("Odds Ratios:", odds_ratios1)
Odds Ratios: [0.32270868 0.9697653 0.08756799]
Assim, infere-se que para cada aumento de uma unidade de classe (de 1ª para 2ª, de 2ª para 3ª), as chances de sobreviêcnia são multiplicadas por 0.27, indicando uma forte diminuição na probabilidade de sobreviência.
No que tange a idade, este valor está muito próximo de 1, sugerindo que a idade tem um impacto menor.
Considerando que o sexo foi codificado como 0 para feminino e 1 para masculino, um odds ratio de 0.085 indica que ser masculino está associado a uma diminuição drástica nas chances de sobrevivência comparado a ser feminino.
4. Calcule as métricas de acurácia, f1-score, precisão e recall.
from sklearn.metrics import classification_report# Previsões no conjunto de testey1_pred = model1.predict(X1_test)# Gerar o relatório de classificaçãoreport1 = classification_report(y1_test, y1_pred)print("Relatório de Classificação:\n", report1)