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())

16 comentarios en “Predecir la supervivencia del Titanic utilizando Python”

  1. Leonardo Campos

    Buenos dias Ligdi,

    De primero muchas gracias por tu blog, realmente es de mucha ayuda para las personas que nos queremos iniciar como científico de datos desde cero (casi -2).

    Te consulto algo, estoy tratando de hacer las llamadas a los archivos de Internet (url) y cuando activo el programa me da error
    «File «C:\Users\Campos\Anaconda3\lib\urllib\request.py», line 649, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)

    HTTPError: Forbidden»

    No se como solucionarlo, quedando de tu parte si me puedes ayudar.

    Leonardo Campos

    1. Hola Leonardo, el link que debes utilizar lo debes generar tu mismo con tu cuenta de Kaggle, no puede utilizar el que esta acá ya que te dará ese error. Saludos.

  2. Hola Ligdi, muy bueno el tutorial.
    Tengo una duda, no se porque la columna «Embarqued» en el set «train» queda finalmente del tipo float64 mientras que en el set «test» queda como int64. He visto el video y a ti también te sucede lo mismo. Entiendo que ambas deberían ser int64.

    Saludos,
    Claudio.

  3. Hola, salvando el origen de los datos (CSV) con una lectura local, todo va muy bien hasta la predicción de la regresión logística ( logreg.predict(df_test.drop(‘PassengerId’, axis=1)) ) donde da un error «TypeError: can’t multiply sequence by non-int of type ‘float'»
    así como algunas advertencias a futuro.
    scikit-learn Version: 1.2.0
    pandas 1.4.1
    numpy 1.23.5

    1. Hola David, creo que el problema se te presenta porque tienes datos que no se encuentran numéricos, revisa que todos los datos que le introduces al algoritmo sean numéricos para que puedas realizar una predicción. Saludos.

    2. Desués de ids = df_test[‘PassengerId’]

      agrega:
      df_test[‘Age’] = df_test[‘Age’].astype(float)

      y es todo

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

  4. Excelente y valiosa ayuda!!! Muchas gracias. Me gustaria que incluyas un ejemplo de serie temporal pero con un contador de horas acumuladas de operación (no fechas).

Deja un comentario

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