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 DataFrame
s. 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 # cargamos la librería
Ejemplos:
-
None
:vals1 = np.array([1, None, 3, 4])
-
NaN
vals2 = np.array([1, np.nan, 3, 4])
Operaciones sobre valores nulos
-
isnull()
: genera un arreglo booleano que indica cuáles valores son faltantes. Ejercicio: si tenemos el arreglo:data = pd.Series([1, np.nan, 'hello', None])
Ejecute la funciónisnull
delDataFrame
data
. Describa el resultado de la operación1. -
notnull()
: lo opuesto aisnull()
, un arreglo booleano que indica cuáles valores no son faltantes. Ejercicio, haga lo propio ahora para ésta función. -
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.Ejercicio: definamos un
DataFrame
con 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
True
si 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
dropna
son:axis
para indicar si se remueven filas o columnas, con valoresrows
(el valor por defecto) ocolumns
;how
para indicar el criterio para remover, con el valorany
para remover ejes que tengan por lo menos un valor nulo, oall
para requerir que todos los valores del eje sean nulos; ythresh
para 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 dePython
cuáles son las openciones para ésta función.
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]
. ↩