El preprocesamiento de datos es una tarea vital. Constituye una de las técnicas de Data Mining. Consiste en transformar la data cruda (raw data) a un esquema más entendible, útil y eficiente.
¿Por qué es necesario?
Datos incompletos
Ruido como outliers y errores
Inconsistencia, diferentes códigos y nombres
En general, los datos no están preparados para ser analizados o para ser entrada o input de algoritmos.
Existe una serie de actividades que ayudan a “pulir” los datos de entrada y ¡prepararlos para que sirvan para el proceso de Data Science!
También se conoce como scrubbing (depuramiento), consiste en rellenar valores nulos, suavizamiento y remoción de datos con ruido y outliers con inconsistencias
Integración de datos con múltiples bases de datos (relacional y no relacional), cubos de datos, etc. Los datos pueden ser estructurados, semi-estructurados y no estructurados.
Consiste en la normalización y agregación de acuerdo con las necesidades
Se pueden reducir la cantidad de instancias y features (variables)
Se considera parte de Data reduction. Valores categóricos se pueden reemplazar por números con técnicas como One Hot Encoding o LabelEncoder
Por definición un outlier (valor atípico) es: una observación que se encuentra a una distancia anormal de otros valores en una muestra aleatoria de una población.
Es una observación atipica con respecto al resto de los datos.
Dos tipos de valor atípico:
Univariados: se pueden encontrar al observar una distribución de valores en un solo espacio de características.
Multivariados: se pueden encontrar en un espacio de n dimensiones (de n características).
Otra clasificación puede ser:
Outliers puntuales: datos puntuales lejos de la distribución de los datos
Outliers contextuales: pueden ser ruido en los datos (e.g símbolos de puntuación)
Outliers colectivos: pueden ser subconjuntos de novedades en los datos, como una señal que puede indicar el descubrimiento de nuevos fenómenos.
Errores de entrada de datos (errores humanos)
Errores de medición (errores del instrumento)
Errores experimentales (extracción de datos o errores de planificación / ejecución de experimentos)
Intencional (valores atípicos ficticios hechos para probar métodos de detección)
Errores de procesamiento de datos (manipulación de datos o mutaciones no deseadas del conjunto de datos)
Errores de muestreo (extracción o mezcla de datos de fuentes incorrectas o diversas)
Natural (no es un error, novedades en los datos)
La detección de valores atípicos es de gran importancia para casi cualquier disciplina cuantitativa (e.g física, economía, finanzas, aprendizaje automático, seguridad cibernética) con el fin de obtener insights sobre cualquier fenómeno.
En el aprendizaje automático y en cualquier disciplina cuantitativa, la calidad de los datos es tan o más importante que el mismo modelo de predicción o clasificación.
Gráficos para aplicar a una variáble numérica. Si existen outliers en una variable, podemos verlos de diferentes formas:
Diagrama de caja y bigotes.
Método IQR
Método Z score
Distancia media (Multivariada)
Cuando pedimos responder una encuesta o formulario, puede que alguna pregunta quede sin responder.
Cuando recolectamos datos de manera automatizada o semi-automatizada, puede ser que los datos estén mal cargados.
Puede ocurrir que se nos escape una tecla e ingresemos un número mal.
¿Qué hacemos con los datos ausentes?
Las operaciones vectorizadas ofrecen funciones que descartan los valores NaN, tales como nansum, nanprod, nanmean, etc.
Si efectivamente queremos quitar la observación completa (la fila de datos completa), podemos usar la función dropna().
Si podemos comprobar que los valores faltantes no serán extremos, podemos asignar un valor determinado al dato ausente.
No es una mala opción para eliminar datos si no tienen un patrón, siempre ver el contexto.
Imputar una variabla (agregarle un valor)
Se le está poniendo un valor a esa variable, por eso hay que ser muy cuidadosos para ver que valores elijo para imputar a las variables.
Lo ideal siempre es ir a la fuente y sino los encuenotr los elimino o los imputo.
De todas las opciones lo mejor es usar un modelo, donde se entrena y luego de entrenar al modelo se le imputa un valor, la desventaja es que se puede perder mucho tiempo. La librería para usar es ScikitLearn.
Se deben tener estrategias para poder manejarlos. En general se tienen dos metodologías
Introducir un valor constante para los nulos o una categoría llamada Desconocido en variables categóricas
Reemplazar por un valor seleccionado al azar de los otros registros
Usar la media, mediana o moda para rellenar el valor
Valor estimado usando un modelo
Ejemplo Imputación
Manejo de datos nulos: SimpleImputer. Si queremos reemplazar las columnas numéricas por media podemos hacer esto
Reemplazar los valores en cero por NaN
Luego a los NaN (valor faltante) se debe calcular la mediana e imputarle ese valor la mediana.
Método de ajustar los puntos de datos para representar el valor de una función.
Tiene varias aplicaciones en ingeniería y ciencia, que se utilizan para construir nuevos puntos de datos dentro del rango con unos puntos conocidos
Existen diversos métodos asociados (lineal, polinomial, splines)
Eliminar filas con valores perdidos
Imputar valores perdidos para variable continua
Imputar valores perdidos para variable categórica
Usar algoritmos que admiten valores perdidos
Predicción de valores perdidos
Imputación mediante la biblioteca de aprendizaje profundo - Datawig
Esta biblioteca aplica aprendizaje profundo con deep learning para encontrar la mejor imputación.
Librería Datawig:
df.columns= ['Col0','Col1','Col2','Col3','Col4','Col5','Col6','Col7','Col8']
import datawig
import pandas as pd
import datawig
df_train, df_test = datawig.utils.random_split(df)
#Inicializar el modelo SimpleImputer
imputer = datawig.SimpleImputer(
input_columns=['Col0','Col1','Col2'], # columnas que tienen la informacion con la columna a imputar
output_column= 'Col4', # columna que queremos imputar
output_path = 'imputer_model' # modelo y metricas
)
# Entrenar el modelo con data de entrenamiento y 50 epocas
imputer.fit(train_df=df_train, num_epochs=50)
# Imputar los missing values y devolver el dataframe original con la predicciones
imputed = imputer.predict(df_test)
print(imputed.head().round(2))