Predecir la supervivencia del Titanic utilizando Python

En el proyecto de hoy vamos a realizar el primer ejercicio que por lo general se hace cuando se esta comenzando en Machine Learning y es el de predecir la supervivencia del Titanic.

Los datos lo vamos a obtener de la página de Kaggle, para ello se deben suscribir para poder tener acceso a los mismos.

Nuestro programa lo vamos a dividir de la siguiente forma:

  • Exportar las librerías de Python que vamos a utilizar a lo largo del programa
  • Importar los datos que vamos a utilizar dentro de nuestro análisis
  • Preprocesamiento de los datos para dejarlos de manera
  • Aplicación de los algoritmos de Machine Learning
  • Realización de las predicciones correspondientes.

Lo primero que debemos hacer importar las librerías, estas las colocamos al inicio de nuestro programa.

#Se importan la librerias a utilizar
import numpy as np
import pandas as pd

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier

Lo siguiente que vamos hacer serán importar los datos desde la página de Kaggle, guardarlos en nuestra PC y a su vez guardar dichos datos en variables Pandas para poderlos manipular a lo largo del programa.

#Se importa los datos a utilizar de la web
url_test = 'https://storage.googleapis.com/kaggle-competitions-data/kaggle/3136/test.csv'
url_train = 'https://storage.googleapis.com/kaggle-competitions-data/kaggle/3136/train.csv'

df_test = pd.read_csv(url_test)
df_train = pd.read_csv(url_train)

#Se guardan los datos en un archivo para siempre tenerlos disponibles
dir_test = '/Users/ligdigonzalez/Documents/ML/Proyectos/Titanic/titanic_test.csv'
dir_train = '/Users/ligdigonzalez/Documents/ML/Proyectos/Titanic/titanic_train.csv'

df_test.to_csv(dir_test)
df_train.to_csv(dir_train)

#Importar los datos de los archivos .csv almacenados
df_test = pd.read_csv(dir_test)
df_train = pd.read_csv(dir_train)

Posteriormente vamos a entender la data que vamos a estar manejando, para ello verificamos la cantidad de datos con la que contamos, el tipo de datos, la cantidad de datos faltantes que tiene el dataset y por último las estadísticas del mismo.

#Verifico la cantidad de datos que hay en los dataset
print('Cantidad de datos:')
print(df_train.shape)
print(df_test.shape)

#Verifico el tipo de datos contenida en ambos dataset
print('Tipos de datos:')
print(df_train.info())
print(df_test.info())

#Verifico los datos faltantes de los dataset
print('Datos faltantes:')
print(pd.isnull(df_train).sum())
print(pd.isnull(df_test).sum())

#Verifico las estadísticas del dataset
print('Estadísticas del dataset:')
print(df_train.describe())
print(df_test.describe())

Ya que analizamos los datos y sabemos qué tenemos exactamente y qué debemos corregir, procedemos a realizar el preprocesamiento de datos.

#Cambio los datos de sexos en números
df_train['Sex'].replace(['female','male'],[0,1],inplace=True)
df_test['Sex'].replace(['female','male'],[0,1],inplace=True)

#Cambio los datos de embarque en números
df_train['Embarked'].replace(['Q','S', 'C'],[0,1,2],inplace=True)
df_test['Embarked'].replace(['Q','S', 'C'],[0,1,2],inplace=True)

#Reemplazo los datos faltantes en la edad por la media de esta columna
print(df_train["Age"].mean())
print(df_test["Age"].mean())
promedio = 30
df_train['Age'] = df_train['Age'].replace(np.nan, promedio)
df_test['Age'] = df_test['Age'].replace(np.nan, promedio)

#Creo varios grupos de acuerdo a bandas de las edades
#Bandas: 0-8, 9-15, 16-18, 19-25, 26-40, 41-60, 61-100
bins = [0, 8, 15, 18, 25, 40, 60, 100]
names = ['1', '2', '3', '4', '5', '6', '7']
df_train['Age'] = pd.cut(df_train['Age'], bins, labels = names)
df_test['Age'] = pd.cut(df_test['Age'], bins, labels = names)

#Se elimina la columna de "Cabin" ya que tiene muchos datos perdidos
df_train.drop(['Cabin'], axis = 1, inplace=True)
df_test.drop(['Cabin'], axis = 1, inplace=True)

#Elimino las columnas que considero que no son necesarias para el analisis
df_train = df_train.drop(['PassengerId','Name','Ticket'], axis=1)
df_test = df_test.drop(['Name','Ticket'], axis=1)

#Se elimina las filas con los datos perdidos
df_train.dropna(axis=0, how='any', inplace=True)
df_test.dropna(axis=0, how='any', inplace=True)

#Verifico los datos
print(pd.isnull(df_train).sum())
print(pd.isnull(df_test).sum())

print(df_train.shape)
print(df_test.shape)

print(df_test.head())
print(df_train.head())

Y ahora si empezamos a implementar los algoritmos de Machine Learning, para este proyecto vamos a implementar algoritmos de regresión logística, vectores de soporte y vecinos más cercanos.

#Separo la columna con la información de los sobrevivientes
X = np.array(df_train.drop(['Survived'], 1))
y = np.array(df_train['Survived'])

#Separo los datos de "train" en entrenamiento y prueba para probar los algoritmos
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

##Regresión logística
logreg = LogisticRegression()
logreg.fit(X_train, y_train)
Y_pred = logreg.predict(X_test)
print('Precisión Regresión Logística:')
print(logreg.score(X_train, y_train))

##Support Vector Machines
svc = SVC()
svc.fit(X_train, y_train)
Y_pred = svc.predict(X_test)
print('Precisión Soporte de Vectores:')
print(svc.score(X_train, y_train))

##K neighbors
knn = KNeighborsClassifier(n_neighbors = 3)
knn.fit(X_train, y_train)
Y_pred = knn.predict(X_test)
print('Precisión Vecinos más Cercanos:')
print(knn.score(X_train, y_train))

Ya teniendo nuestros modelos procedemos a realizar la predicción respectiva utilizando la data de prueba.

ids = df_test['PassengerId']

##Regresión logística
prediccion_logreg = logreg.predict(df_test.drop('PassengerId', axis=1))
out_logreg = pd.DataFrame({ 'PassengerId' : ids, 'Survived': prediccion_logreg })
print('Predicción Regresión Logística:')
print(out_logreg.head())

##Support Vector Machines
prediccion_svc = svc.predict(df_test.drop('PassengerId', axis=1))
out_svc = pd.DataFrame({ 'PassengerId' : ids, 'Survived': prediccion_svc })
print('Predicción Soporte de Vectores:')
print(out_svc.head())

##K neighbors
prediccion_knn = knn.predict(df_test.drop('PassengerId', axis=1))
out_knn = pd.DataFrame({ 'PassengerId' : ids, 'Survived': prediccion_knn })
print('Predicción Vecinos más Cercanos:')
print(out_knn.head())

Fíjate que las predicciones del primer y último algoritmo son muy parecidas, así también lo fue los resultados de precisión, mientras que el segundo algoritmo que tuvo una precisión mucho mayor la predicción es un poco diferente por lo que esta sería más confiable que la de los otros.

A continuación esta el código completo:

"""
Predecir la supervivencia del Titanic

@author: ligdigonzalez
"""

##########LIBRERÍAS A UTILIZAR##########

#Se importan la librerias a utilizar
import numpy as np
import pandas as pd

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier

##########IMPORTANDO LA DATA##########

#Se importa los datos a utilizar de la web
url_test = 'https://storage.googleapis.com/kaggle-competitions-data/kaggle/3136/test.csv'
url_train = 'https://storage.googleapis.com/kaggle-competitions-data/kaggle/3136/train.csv'

df_test = pd.read_csv(url_test)
df_train = pd.read_csv(url_train)

#Se guardan los datos en un archivo para siempre tenerlos disponibles
dir_test = '/Users/ligdigonzalez/Documents/ML/Proyectos/Titanic/titanic_test.csv'
dir_train = '/Users/ligdigonzalez/Documents/ML/Proyectos/Titanic/titanic_train.csv'

df_test.to_csv(dir_test)
df_train.to_csv(dir_train)

#Importar los datos de los archivos .csv almacenados
df_test = pd.read_csv(dir_test)
df_train = pd.read_csv(dir_train)

print(df_test.head())
print(df_train.head())

##########ENTENDIMIENTO DE LA DATA##########

#Verifico la cantidad de datos que hay en los dataset
print('Cantidad de datos:')
print(df_train.shape)
print(df_test.shape)

#Verifico el tipo de datos contenida en ambos dataset
print('Tipos de datos:')
print(df_train.info())
print(df_test.info())

#Verifico los datos faltantes de los dataset
print('Datos faltantes:')
print(pd.isnull(df_train).sum())
print(pd.isnull(df_test).sum())

#Verifico las estadísticas del dataset
print('Estadísticas del dataset:')
print(df_train.describe())
print(df_test.describe())

##########PREPROCESAMIENTO DE LA DATA##########

#Cambio los datos de sexos en números
df_train['Sex'].replace(['female','male'],[0,1],inplace=True)
df_test['Sex'].replace(['female','male'],[0,1],inplace=True)

#Cambio los datos de embarque en números
df_train['Embarked'].replace(['Q','S', 'C'],[0,1,2],inplace=True)
df_test['Embarked'].replace(['Q','S', 'C'],[0,1,2],inplace=True)

#Reemplazo los datos faltantes en la edad por la media de esta columna
print(df_train["Age"].mean())
print(df_test["Age"].mean())
promedio = 30
df_train['Age'] = df_train['Age'].replace(np.nan, promedio)
df_test['Age'] = df_test['Age'].replace(np.nan, promedio)

#Creo varios grupos de acuerdo a bandas de las edades
#Bandas: 0-8, 9-15, 16-18, 19-25, 26-40, 41-60, 61-100
bins = [0, 8, 15, 18, 25, 40, 60, 100]
names = ['1', '2', '3', '4', '5', '6', '7']
df_train['Age'] = pd.cut(df_train['Age'], bins, labels = names)
df_test['Age'] = pd.cut(df_test['Age'], bins, labels = names)

#Se elimina la columna de "Cabin" ya que tiene muchos datos perdidos
df_train.drop(['Cabin'], axis = 1, inplace=True)
df_test.drop(['Cabin'], axis = 1, inplace=True)

#Elimino las columnas que considero que no son necesarias para el analisis
df_train = df_train.drop(['PassengerId','Name','Ticket'], axis=1)
df_test = df_test.drop(['Name','Ticket'], axis=1)

#Se elimina las filas con los datos perdidos
df_train.dropna(axis=0, how='any', inplace=True)
df_test.dropna(axis=0, how='any', inplace=True)

#Verifico los datos
print(pd.isnull(df_train).sum())
print(pd.isnull(df_test).sum())

print(df_train.shape)
print(df_test.shape)

print(df_test.head())
print(df_train.head())


##########APLICACIÓN DE ALGORITMOS DE MACHINE LEARNING##########

#Separo la columna con la información de los sobrevivientes
X = np.array(df_train.drop(['Survived'], 1))
y = np.array(df_train['Survived'])

#Separo los datos de "train" en entrenamiento y prueba para probar los algoritmos
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

##Regresión logística
logreg = LogisticRegression()
logreg.fit(X_train, y_train)
Y_pred = logreg.predict(X_test)
print('Precisión Regresión Logística:')
print(logreg.score(X_train, y_train))

##Support Vector Machines
svc = SVC()
svc.fit(X_train, y_train)
Y_pred = svc.predict(X_test)
print('Precisión Soporte de Vectores:')
print(svc.score(X_train, y_train))

##K neighbors
knn = KNeighborsClassifier(n_neighbors = 3)
knn.fit(X_train, y_train)
Y_pred = knn.predict(X_test)
print('Precisión Vecinos más Cercanos:')
print(knn.score(X_train, y_train))


##########PREDICCIÓN UTILIZANDO LOS MODELOS##########

ids = df_test['PassengerId']

###Regresión logística
prediccion_logreg = logreg.predict(df_test.drop('PassengerId', axis=1))
out_logreg = pd.DataFrame({ 'PassengerId' : ids, 'Survived': prediccion_logreg })
print('Predicción Regresión Logística:')
print(out_logreg.head())

##Support Vector Machines
prediccion_svc = svc.predict(df_test.drop('PassengerId', axis=1))
out_svc = pd.DataFrame({ 'PassengerId' : ids, 'Survived': prediccion_svc })
print('Predicción Soporte de Vectores:')
print(out_svc.head())

##K neighbors
prediccion_knn = knn.predict(df_test.drop('PassengerId', axis=1))
out_knn = pd.DataFrame({ 'PassengerId' : ids, 'Survived': prediccion_knn })
print('Predicción Vecinos más Cercanos:')
print(out_knn.head())

6 thoughts on “Predecir la supervivencia del Titanic utilizando Python”

  1. Buena tarde Ligdi, muy buenas tus explicaciones . Excelente que compartas tus conocimientos.
    En el codigo me saca un error en la linea para #Separo la columna con la información de los sobrevivientes. al parecer no encuentra la columna Survived.

    Gracias por la atencion,,,,

  2. Hola Carlos,
    Verifica los datos con los que estas trabajando porque probablemente seleccionaste el dataset test.csv para entrenar el modelo, este dataset no cuenta con la columna «Survived», a diferencia del dataset train.csv.
    Si sigues con el inconveniente me comentas.
    Saludos,
    Ligdi

  3. Hola Ligdieli, te comparto un error que me sale al ejecutar las siguientes lineas:

    #Se elmina la columna «Cabina» ya que tiene muchos datos perdidos
    df_train.drop([‘Cabin’], axis = 1, inplace=True)
    df_test.drop([‘Cabin’], axis = 1, inplace=True)

    #Elimino las columnas que considero que no son necesarias para el analisis
    df_train = df_train.drop([‘PassengerId’,’Name’,’Ticket’], axis=1)
    df_test = df_test.drop([‘Name’,’Ticket’], axis=1)

    #Se elimina las filas con los datos perdidos
    df_train.dropna(axis=0, how=’any’, inplace=True)
    df_test.dropna(axis=0, how=’any’, inplace=True)

    El error es el siguientes :

    ValueError: No axis named 1 for object type

    Muchas gracias por tu trabajo 😉

  4. Hola Leandro,
    Con el error que me estas escribiendo no obtengo mucha información del problema, te doy dos opciones, pasame más información del error, y por otra parte, compara el programa que estas escribiendo con el mio, porque es muy probable que tengas algo distinto.
    Te explico, en el programa utilizo axis es igual a 1 o 0, axis lo que indica es que si se implementa la instrucción sobre la fila (axis = 0) o sobre las columnas (axis = 1).
    Saludos.

  5. Hola, ¡tienes razón!. Este creo que fue el primer post que publique y no lo hice, al contrario de las siguientes publicaciones. De todas formas en el video se puede observar los resultados de cada código. Saludos.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *