Datos Faltantes
Tipos de datos faltantes
Según Chen et al., existen tres tipos de datos faltantes:
-
Datos faltantes distribuidos completamente al azar. Los datos faltantes de una variable no están relacionados con las demás variables del conjunto de datos. Usualmente esto no afecta el análisis.
-
Datos faltantes distribuidos al azar. Los datos faltantes dependen de otra variable. Por ejemplo, quienes no responden una pregunta de ingreso tienden a tener un bajo nivel educativo. Aquí normalmente es a lugar hacer un ajuste.
-
Datos faltantes no distribuidos al azar. Los datos faltantes se correlacionan con un concepto medido. Por ejemplo, las personas pueden no responder a la pregunta sobre el ingreso porque tienen altos ingresos. En estos casos se requiere conocer profundamente la teoría relacionada con la encuesta para poder analizar.
Además proponemos la siguiente categoría:
- Datos faltantes no necesarios. Cuando no se registra el valor porque la definición de la variable o de otra variable implica que el dato mismo no tiene sentido. Por ejemplo, a un bebé no se le pregunta si ha tenido hijos.
Estrategias para identificar datos faltantes
(ésta sección sigue la teoría en VanderPlas)
Existen diferentes estrategias para indicar la presencia de datos
faltantes en las tablas o DataFrames. Ninguna de éstas estrategias
es perfecta.
máscaras (del inglés mask)
Se genera un arreglo booleano separado, o una representación en la tabla para indicar el estado nulo del valor.
Como desventajas de ésta estrategia está el que su implementación requiere más espacio para guardar el arreglo de máscara.
valores sentinel (del inglés sentinel value)
Los valores faltantes se remplazan por un valor específico, por
ejemplo se usa un valor negativo como -999, u otro valor específico
diferente a los datos presentes, o una convención global como el uso
de la clase NaN.
Como desventajas tenemos que la presencia de éstos valores puede generar errores al calcular agregados.
En Pandas
Pandas implementa la estrategia de valores sentinel, específicamente
al generar un DataFrame en pandas en la que haya datos faltantes se
usan dos tipos de dato nulo que existen previamente en Python: NaN y
None.
import pandas as pd
import numpy as np
Ejemplos:
-
None:vals1 = pd.Series([1, None, 3, 4]) -
NaNvals2 = pd.Series([1, np.nan, 3, 4])
Operaciones sobre valores nulos
-
isnull(): genera un arreglo booleano que indica cuáles valores son faltantes. Ejmplo:vals1.isnull() 0 False 1 True 2 False 3 False dtype: boolEjercicio: si tenemos el arreglo:
data = pd.Series([1, np.nan, 'hello', None])Ejecute la funciónisnulldelDataFramedata. Describa el resultado de la operación1. -
notnull(): lo opuesto aisnull(), un arreglo booleano que indica cuáles valores no son faltantes. Ejemplo: vals1.notnull()0 True 1 False 2 True 3 True dtype: boolEjercicio, haga lo propio ahora para ésta función, sobre
data -
dropna(): devuelve un nuevo arrreglo, al que se le filtran los datos faltantes. Por defecto la función remueve todas las filas en las que haya por lo menos un dato faltante.Ejemplo:
vals1.dropna() 0 1.0 2 3.0 3 4.0 dtype: float64Ejercicio: definamos un
DataFramecon datos faltantes:df = pd.DataFrame([[1,np.nan, 2], [2,3,5], [np.nan, 4,6]])Piense (no lo ejecute todavía). ¿qué valores quedarían marcados como
Truesi ejecutásemos la funciónisnull? Compruébelo.Responda. ¿Que pasaría si ejecutáse la función
dropna? específicamente, ¿cambiadf? Compruébelo.Las opciones de
dropnason:axispara indicar si se remueven filas o columnas, con valoresrows(el valor por defecto) ocolumns;howpara indicar el criterio para remover, con el valoranypara remover ejes que tengan por lo menos un valor nulo, oallpara requerir que todos los valores del eje sean nulos; ythreshpara identificar el mínimo número de valores no nulos que hacen que se mantenga la columna.Ejercicio: juegue con las opciones, pensando qué va a pasar antes de ejecutar la función.
-
fillna(): devuelve una copia del arreglo, con valores imputados para los faltantes. Ejercicio: revise con la ayuda dePythoncuáles son las openciones para ésta función.
Ejercicio 1
-
Descargue el archivo de nacimientos del año 1998 del portal del DANE
-
Cargue los datos a un DataFrame, llamado df98.
AYUDA: Si usó la página del DANE la codificación es
ISO-8859-1y el separador es el tabular,\tpd.read_csv("Nacimientos_1998.txt",encoding='ISO-8859-1',sep="\t") -
Extraiga una serie de datos para la variable de
nom_inst:serienombre = df98[‘nom_inst’]
-
¿Cómo encontraría cuántos datos faltan para la variable serienombre?
-
Usando df98, construya un dataframe que sólo tenga registros completos. Llámelo
df98filtrado. -
Con
df98filtrado, haga un histograma del código de departamento.
Ejercicio 2
Quiero construir un histograma de las edades del padre. Revisando la descripción de los datos, he encontrado que hay un código de máscara. Ahora, podría pasar que, addemás de esta máscara, haya otros tipos de datos faltantes.
-
Identifique si hay datos faltantes en la variable edad del padre.
-
Cree una nueva variable que marque los valores de la máscara
-
Filtre el conjunto de datos para tener sólo valores en los cuales existe el dato de edad del padre
Más información
https://jakevdp.github.io/PythonDataScienceHandbook/03.04-missing-values.html
Tablas Pivote
https://jakevdp.github.io/PythonDataScienceHandbook/03.09-pivot-tables.html
Bibliografía
-
Python Data Science Handbook. Jake VanderPlas.
-
Data Science for Public Policy. Chen, Rubin, Cornwall.
Footnotes
-
Se ejecuta así:
data.isnull(). El resultado es un arreglo booleano, con los índices del 0 al 4, y con los valoresTrue,False,True,False; que corresponden respectivamente a los valores del arreglo[1, np.nan, 'hello', None]. ↩