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.
aprende f谩cilmente inteligencia artificial - newsletter

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

13 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.

  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.