Gestión de Datasheets

Por 9.99€ al mes tendrás acceso completo a todos los cursos. Sin matrícula ni permanencia.

Algunas páginas de descarga de Datasheets

Usaremos esta datasheet en la que se muestra la gente que se salvo en el hundimiento del titanic indicando sus características.

Para programar crearemos un nuevo fichero de Google colab → botón derecho sobre una carpeta de Google Drive → More → Google Collaboratory.

Luego, usaremos el siguiente código:

Importamos la libería pandas para análisis de estructuras de datos. Me permite leer un fichero con extensión csx, xls, json, etc para prepararlo para leerlo en Python.

import pandas as pd;

Las siguientes líneas específicas de Google me permiten leer un fichero de mi disco duro:

from google.colab import files
uploaded = files.upload()

df es el alias de dataframe (grupo de datasheets). El siguiente comando lee el fichero que hemos subido.

df = pd.read_csv('nombre_del_archivo.csv')

Hemos cargado los datos usando Pandas, pero también podríamos haber cargado los datos directamente de seaborn utilizando el siguiente código:

import seaborn as sns

# Cargar el dataset del Titanic desde seaborn
df = sns.load_dataset('titanic')

Para mostrar datos:

df // muestra todos los datos
df.head() // muestra los primeros registros (parámetro opcional para definir cuantos)
df.tail() // muestra los últimos registros (parámetro opcional para definir cuantos)
df.describe() // muestra algunos datos estadísticos (suma, media, máximo, mínimo, etc...) de los datos
df.info() // muestra información acerca de los datos suministrados
df['sex'] // mostramos los datos de una columna
list(df['Attendance Rate']) // devuelve un array a partir de los datos suministrados

A partir de los datos suministrados, podemos crear un nuevo dataframe que cumpla condiciones concretas.

df_age = df[df['age']>30]
df_age

Ejercicios

1. Crea un nuevo dataframe que sólo contenga los pasajeros que se han salvado.

df_alive = df[df['alive']=='yes']
df_alive

2. Crea un nuevo dataframe que sólo contenga los alumnos que han pasado que dediquen semanalmente más de 10 horas.

df_female_alive = df[(df['alive']=='yes') & (df['sex'] == 'female')]
df_female_alive

Creación del modelo predictivo

Preprocesamiento de los datos

El preprocesamiento de los datos son tareas de modificación de los mismos que se hacen para facilitar su posterior entrada en el modelo.

1. Convertir todos los datos en numéricos

Hay algunas operaciones estadísticas que serán más sencillas si los datos son numéricos. Por ejemplo, si queremos obtener el porcentaje de mujeres del titanic y los datos son 0 (hombre) y 1 (mujer), al sumar todos los valores y calcular la media tendremos directamente este cálculo.

Para ello, primero tenemos que conocer los valores únicos (etiquetas) de todas las variables categóricas (una variable categórica es una variable que no es un número).

print(f'SEX: ', df['sex'].unique())
print(f'EMBARKED: ', df['embarked'].unique())
print(f'CLASS: ', df['class'].unique())
print(f'WHO: ', df['who'].unique())
print(f'ALIVE: ', df['alive'].unique())
print(f'DECK: ', df['deck'].unique())

SEX: [‘male’ ‘female’]
EMBARKED: [‘S’ ‘C’ ‘Q’ nan]
CLASS: [‘Third’, ‘First’, ‘Second’]
WHO: [‘man’ ‘woman’ ‘child’]
ALIVE: [‘no’ ‘yes’]
DECK: [NaN, ‘C’, ‘E’, ‘G’, ‘D’, ‘A’, ‘B’, ‘F’]

Luego, mapearemos las variables categóricas en variables numéricas:

df['sex'] = df['sex'].map({'male': 0, 'female': 1})
df['embarked'] = df['embarked'].map({'C': 0, 'Q': 1, 'S': 2})
df['class'] = df['class'].map({'First': 1, 'Second': 2, 'Third': 3})
df['who'] = df['who'].map({'man': 0, 'woman': 1, 'child': 2})
df['alive'] = df['alive'].map({'yes': 1, 'no': 0})

df['deck'] = df['deck'].astype(object)
df['deck'] = df['deck'].map({'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5, 'G':6})

2. Imputación de valores (gestión de los NaN y Outliers (valores que se salen mucho de la norma o extremos)).

La cubierta en la que estaba la cabina del pasajero podía tener valores nulos. Vamos a cambiarlos por el valor -1:

df['deck'] = df['deck'].fillna(-1).astype(int)

Hay pasajeros que no tenían asignados una edad (NaN). Podemos eliminar sus filas, pero estaremos eliminando gran cantidad de datos. En luger de eliminar las filas, vamos a sustituir su edad por el valor promedio que calculamos a continuación:

df['age'].mean()

La línea de código que reemplaza los datos, quedaría así:

df['age'] = df['age'].fillna(df['age'].mean()).astype(int)

Podemos ver como quedan los datos llamando a estos comandos:

df.describe()
df

3. Creación,entrenamiento y medida de precisión del modelo

Utilizaremos el modelo de regresión logística se utiliza para hacer cálculos estadísticos en valores categóricos

Importaremos las siguientes librerías:

from sklearn.linear_model import LogisticRegression // Para solucionar modelos de regresión logística
import numpy as np // Para hacer operaciones matemáticas complejas
model_1 = LogisticRegression()

Definimos cuales serán los datos de entrada y de salida del modelo:

X = df[ ['who', 'class'] ]
y = df[ 'survived' ] 

A partir del datashet, determinamos que datos van a servir para entrenar el modelo y que datos servirán para medir su precisión. La función train_test_split me permite dividir un datasheet en subdatasheets para poder hacer estas pruebas.

En esta función:

  • X e y son los datos de entrada y salida que definimos antes.
  • test_size = 0.2 determina que el 20 por ciento de los datos serán para hacer pruebas y el 80% para entrenar al modelo.
  • random_state es la semilla de la función que permite aleatorizar los datos. Para obtener diferentes datos necesito diferentes semillas.
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test  = train_test_split(X, y, test_size = 0.2, random_state = 10)

Entrenamos el modelo:

model_1.fit(X_train, y_train)

Obtenemos las predicciones del modelo a partir de los datos de prueba:

y_pred = model_1.predict(X_test)

Creamos la matriz de confusión, que nos indica la cantidad de aciertos:

conf_matrix = confusion_matrix(y_test, y_pred)
print(conf_matrix)
Predicción
10
Realidad1TP (True positive) La predicción es 1 y la realidad es 1FN
0FPTN (True negative) La predicción es 0 y la realidad es 0

Finalmente, calculamos la precisión del modelo:

accuracy_1 = accuracy_score(y_test, y_pred)
print(f"La accuracy del modelo es { round( (accuracy_1 * 100), 2 ) } %")

4. Cálculo de probabilidades

persona = [[1, 1]]  # [who, class] [mujer, primera clase]

probabilidad_supervivencia = model_1.predict_proba(persona)

print(f"Probabilidad de sobrevivir es{probabilidad_supervivencia[0][1]}")

5. Nuevos datos

Si quisieramos evaluar la probabilidad de supervivencia de los mayores de 50…

Añadimos una nueva columna grupo_edad que será 1 para mayores de 50 y 0 pero los que tengan 50 o menos. Con esto, podemos regresar al paso 3 para volver a entrenar el modelo con la nueva información.

df['grupo_edad'] = df["age"]
df.loc[df['age'] > 50, 'grupo_edad'] = 1
df.loc[df['age'] <= 50, 'grupo_edad'] = 0

3. Calcula la probabilidad de salvarse si es mujer, hombre o niño,si viajaba en primera, si viajaba en segunda, viajaba en tercera, si tenía más.

Por 9.99€ al mes tendrás acceso completo a todos los cursos. Sin matrícula ni permanencia.