import pandas as pd
import openpyxl
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import missingno as msno
from sklearn.model_selection import train_test_split
#Este código carga los datops de la hoja DataTitanic del archivo de excel-
df = pd.read_excel("/work/Prueba Técnica DS.xlsx", sheet_name='DataTitanic')
# que columnas tienen los datos?
df.columns
# qué tamaño tienen los datos?
df.shape
# hay valores nulos en los datos?
df.info()
# como se distribuyen las variables numéricas
df.describe()
# como se comportan las variables categóricas
df.describe(include=['O'])
df.groupby(['Survived']).count()['PassengerId']
# target vs sex
df.groupby(['Survived','Sex']).count()['PassengerId']
grouped_sex = df.groupby(['Survived','Sex']).count()['PassengerId']
print(grouped_sex)
(grouped_sex.unstack(level=0).plot.bar())
plt.show()
Procesamiento de datos
selección de Variables
Survived
Sex
Age
Pclass
Tratamos Datos faltantes en Age train['Age'].isna() La variable "Sex" aparece como "object" y queremos "int" o "float" para el algoritmo
# Cómo se distribuyen los nulos en edad
(df[df['Age'].isna()]
.groupby(['Sex', 'Pclass'])
.count()['PassengerId']
.unstack(level=0))
# calcular mediana de Age para imputar
df['Age'].median()
# imputar valor para rellenar nulos
df['Age'] = df['Age'].fillna(28.0)
df[['Survived', 'Sex', 'Age', 'Pclass']].info()
# map para label encoding
df['Sex'] = df['Sex'].map({'female': 1, 'male': 0}).astype(int)
df[['Survived', 'Sex', 'Age', 'Pclass']].head(3)
Datos entrenar el modelo
df= df[['Survived', 'Sex', 'Age', 'Pclass']]
df
Se partirá el set de datos para obtener el conjunto de entrenamiento (75%) y el de prueba (25%). El tamaño se escogió por criterio propio.
df_features = df[['Sex', 'Age', 'Pclass']]
df_target = df["Survived"]
X_train,X_test,Y_train,Y_test =train_test_split(df_features,df_target, test_size=0.25, random_state=41)
print(Y_train.shape, X_train.shape)
se probaran dos modelos: regresión logística y árboles de decisión.
# entrenando modelo regresión logistica
from sklearn.linear_model import LogisticRegression
logreg = LogisticRegression()
logreg.fit(X_train, Y_train)
# entrenando modelo arboles de decisión
from sklearn.tree import DecisionTreeClassifier
decision_tree = DecisionTreeClassifier()
decision_tree.fit(X_train, Y_train)
Evaluación mediante matriz de confusión
from sklearn.metrics import plot_confusion_matrix
def conf_mat_acc(modelo):
disp = plot_confusion_matrix(modelo, X_test, Y_test,
cmap=plt.cm.Blues, values_format="d")
true_pred = disp.confusion_matrix[0,0]+disp.confusion_matrix[1,1]
total_data = np.sum(disp.confusion_matrix)
accuracy = true_pred/total_data
print('accuracy: ', np.round(accuracy, 2))
plt.show()
conf_mat_acc(logreg)
conf_mat_acc(decision_tree)
vemos que el árbol de decisión presenta una mejor precisión.
A continuación se aplicara el modelo a los datos del crucero IDICO.
#Este código carga los datops de la hoja DataTitanic del archivo de excel-
df_idico = pd.read_excel("/work/Prueba Técnica DS.xlsx", sheet_name='DataCruceroIDICO')
df_idico.info()
df_idico.columns
df_idico_fit = df_idico[[ 'Estrato', 'Edad', 'Género',]]
msno.bar(df_idico_fit)
para este caso se tienen 5 categorías en la variable estrato. lo que se hará es definir que los 1 y 2 pertenecen a la clase 3; los 3, a la 2 y los 5 a la 1.
def clases(x):
if x == 1 or x == 2:
y=3
elif x == 3 or x == 4:
y=2
else:
y =1
return y
df_idico_fit['Pclass'] = df_idico_fit['Estrato'].apply(clases)
df_idico_fit
df_idico_fit=df_idico_fit.rename({'Edad': 'Age', 'Género': 'Sex'}, axis=1)
df_idico_fit=df_idico_fit[['Sex', 'Age', 'Pclass']]
df_idico_fit
y_pred = decision_tree.predict(df_idico_fit)
df_idico_fit['Survived']=y_pred
df_idico_fit
df_idico_fit['Survived'].value_counts()
Porbabilidad_sobrevivir=799/1701
print(Porbabilidad_sobrevivir)