Es importante saber que tipo de mecanismo es el que esta ocasionando que nuestros datos falten, en este ejemplo de wikipedia
Se trata el ejemplo de un cuestionario sobre depresión, y basicamente se sabía que si la falta de datos era:
.
MAR: An example is that males are less likely to fill in a depression survey but this has nothing to do with their level of depression, after accounting for maleness.
Básicamente si eran hombres era mas probable que faltara ese valor (indicador de depresión).
Aquí la localización del valor faltante dependia de la variable male/female
.
MNAR: This would occur if men failed to fill in a depression survey because of their level of depression.
Y en este otro caso faltaban esos valores debido a la misma variable o indicador de "depresión", las personas estaban tan deprimidas que por esta misma razón no podian ir y tomar la encuesta.
Y la conclusión fue:
The more data is missing (MNAR), the more biased are the estimations. We underestimate the intensity of depression in the population.
Si no se toman en cuenta los datos faltantes MNAR, entonces se pueden caer en sesgos.
Y como dice el proverbio:
.
Garbage in, garbage out.
.
Excelente aporte, gracias
Que buen aporte!
MCAR, MAR, MNAR en Python
Tenemos un conjunto de datos llamado diabetes_df en el que aparentemente no hay datos faltantes (nan). Lo podemos verificar como sigue:
diabetes_df
diabetes_df.missing_variable_plot()
Por otro lado, sabemos que si existen datos faltantes pero estan escrito en otro formato, en este caso por cero. Ahora lo que se hace es remplazar tales valores por nan para que sean detectados como valores faltantes.
# ordena las columnas desde la que mas tiene valores faltantes a la que menos tiene( diabetes_df
.missing.sort_variables_by_missingness().pipe(missingno.matrix)# muestra los datos en una matriz de sombra)
Para las variables bmi y glucose hay tan pocos valores faltantes que se pueden considerar valores faltantes al azar
Caso MAR
( diabetes_df
.missing.sort_variables_by_missingness().sort_values(by='blood_pressure')# ordena los valores segun una columna.pipe(missingno.matrix))
Los valores faltantes de la variable blood_presure pueden estar relacionado a algunos valores de la insulina o de la skin_thickness por lo que son de tipo MAR
Caso MNAR
( diabetes_df
.missing.sort_variables_by_missingness().sort_values(by='insulin')# ordena los valores segun una columna.pipe(missingno.matrix))
Hay un rango de valores de insulina en la que estan la mayoria de los valores faltantes de las demas variables de lo que podemos concluir que es de tipo MNAR
Soy médico y creo que es importante precisar un dato importante respecto a la clase.
Que en una base de datos haya números enteros, muchas veces altos, acompañados de números 0 abruptos no siempre significa que tengamos datos faltantes.
En el caso de la variable “insulina”, es perfectamente plausible que el valor sea 0 sin que este sea faltante. Simple y sencillamente por el hecho de que ¡Los pacientes diabéticos no siempre toman insulina!
Para el manejo de la diabetes usamos múltiples medicamentos, algunos son pastillas (como metformina), otros inyectables y varios por otros medios corno la Incluso algunos pacientes, aunque les recetemos insulina, a veces no se la ponen. En todos esos casos, al llenar el apartado de "Insulina", podríamos poner 0 y puede ser un valor real y bien medido.
Entonces, en esta base de datos podrían estar pasando dos cosas:
1. Que los pacientes que no usan insulina pueden ser de dos tipos principales. O están lo suficientemente sanos como para poder darles otros tratamientos “menos fuertes” contra la diabetes y que sea suficiente con eso (como pastillas). O son pacientes que, aunque les recetemos la insulina, no se la ponen porque no hacen caso a indicaciones médicas. En ambos casos, estamos ante un grupo de pacientes de diabetes que no acuden tan frecuentemente al hospital y al que puede ser más difícil darles seguimiento (o porque no necesitan ir tan frecuentemente o porque no van, aunque se les cite). En esos casos, no me sorprendería que hubiera más valores faltantes de otros tipos.
2. Que los pacientes no acudieron a la cita para las mediciones o no supieron contestar las preguntas, y aunque tomen insulina, no se pudo registrar. En ese caso, sí serían valores faltantes
Desgraciadamente, el no haber registrado dentro de la metodología los “No respondió” o “No acudió” como NaN implica un sesgo a esta base de datos impresionante, porque se mezclan estos dos grandes grupos que menciono. Entonces no podemos saber cuáles de esos son realmente faltantes y cuáles son diabéticos sencillamente que no requieren de insulina.
Por supuesto, en otros casos, como la presión arterial, es claro que un valor de 0 es imposible, porque una persona no puede no tener sangre corriendo por su cuerpo (el hecho de que la sangre se mueva genera presión en las arterias). Entonces estoy perfectamente de acuerdo con tratar esos valores directamente como nulos. Solo quería dejar esa acotación.
aquí hay un video conde explican el conceptos
video de youtube de datos faltantes
Buen video, gracias.
Recuerden que no todas las bases de datos que tengan ceros significa que son datos nulos, eso depende del contexto que de la base de datos.
Me gustaria dejar mi anecdota, yo en la U fui auxiliar investigativo, y me correspondia realizar un analisis de datos de pm2.5 y pm10 en las estaciones del valle de aburra Antioquia, que pasaba , hay se codificaban los valores nulos como numeros negativo, sin embargo existian algunas mediciones que daban cero en la concentracion de ese contaminante, yo en mi logica dije, que probabilidades hay de que la cencentracion de pm10 y pm 2.5 sea cero en uno de los puntos con mayor cencentracion de contaminacion atmosferica colombia, entonces yo lo tome como un dato Nan, que paso la jefa de investigacion me llamo la atencion, ya que esos datos si son reale, solo que esas concentraciones fueron tomadas en la madrugada a horas donde el flujo vehicular es practicamente nulo, en resumen, el remplazar los datos que uno considera nulo solo es una buena practica si uno conoce el contexto de la base de datos.
Qué tal Nixon. Entonces, tu jefa, por su experiencia en el campo, supo que esos missing values que ponías en realidad estaban mal y que era correcto el valor 0? ¿O hubo algo que le pareció extraño e hizo un análisis propio? Cada vez que avanzo en esto de los datos, veo que me falta mucho más por saber.
Gracias por el aporte desde su experiencia.
En está clase aprendí algo nuevo, algo que ahora en adelante va a agregarle contenido a mis analisis exploratorios
siempre a practicar
Si a Ustedes también les dio el error que no les cambiaba los datos 0 a Nan al hacer replace, lo resolví cambiando el código a
diabetes_df[diabetes_df.columns[1:6]].replace("0", np.nan)```Eso o cambiando el tipo de datos a int, lo que prefieran
Hola. ¿Seria correcto decir que: si tenemos pocos valores perdidos es un MCAR, si temos mas seria MAR y si hay aun mas seria MNAR?
En este caso, la lógica que sigue para determinarlos como MCAR no es solamente que sean pocos, sino que al observar la matriz que se imprimió, con respecto a los datos faltantes de glucosa y bmi, los valores faltantes aparentemente no siguen un patrón. Si, por ejemplo, sucediera el caso hipotético de que cada valor faltante (aunque sean pocos y en el caso de la glucosa y bmi) presentarán una separación de la misma distancia, entonces ya podrías determinar que es un MAR ya que cada determinado "algo" se está presentando esta situación.
Cabe recalcar que lo que mencione es un simple ejemplo y las situaciones con respecto a los datos suele ser muy diversa. Te recomienda jugar con los datos así como lo hace el instructor @JesúsVélez y ya con la practica iras afinando este tema.
Muy buen aporte
Estudiando detalladamente los valores únicos de cada variable se observa la presencia del valor 0 en muchas de estas donde este valor no tiene sentido. Es decir, en parámetros como glucose, blood_preasure, skin_tickness, insuline y bmi no puede existir un valor de cero(0) debido a la naturaleza de los mismos, por lo que su presencia indica que este valor fue usado para indicar valor faltante. En el caso de la variable pregnancies y outcome la presencia del valor 0 es totalmente valida.
Si están usando el repo de Github de la diabetes, ya que el original no sirve tengan en cuenta que los nombres de las columnas están diferente. Por lo que si les bota un Key Error, probablemente es porque el nombre de la columna esta mal.
Si usan Google Colab usen este código para el MAR:
( diabetes_df
Gracias a la exploración datos se puede llegar a algunas conclusiones de que tipo de datos faltantes tengo.
MCAR (Missing Completely at Random), MAR (Missing at Random), y MNAR (Missing Not at Random) son tres tipos de mecanismos de datos faltantes que afectan cómo se pueden manejar y analizar los datos faltantes. Aquí te explico cada uno y cómo puedes identificarlos o tratarlos en Python.
### Tipos de Datos Faltantes
1. **MCAR (Missing Completely at Random)**
- **Descripción**: Los datos faltantes son completamente aleatorios y no están relacionados con ninguna variable observada o no observada. Esto significa que la falta de datos no sigue ningún patrón y es independiente de los valores de las otras variables.
- **Ejemplo**: Una encuesta donde algunas personas olvidaron responder a una pregunta por azar.
2. **MAR (Missing at Random)**
- **Descripción**: Los datos faltantes están relacionados con otras variables observadas en el conjunto de datos, pero no con los valores faltantes mismos. Por ejemplo, una pregunta en una encuesta puede ser respondida menos frecuentemente por personas con ciertos perfiles, pero si sabemos el perfil de las personas, podemos hacer inferencias sobre los valores faltantes.
- **Ejemplo**: Las personas con ingresos más bajos son menos propensas a reportar sus ingresos, pero el ingreso de una persona en particular no influye en la probabilidad de que ese dato esté ausente.
3. **MNAR (Missing Not at Random)**
- **Descripción**: Los datos faltantes están relacionados con el valor que falta. En otras palabras, el mecanismo de falta de datos está relacionado con el valor faltante en sí. Esto puede hacer que el análisis y la imputación sean más complejos.
- **Ejemplo**: Las personas que tienen ingresos muy altos podrían ser menos propensas a reportar su ingreso porque no quieren compartir información sobre sus altos ingresos.
### Cómo Manejar y Detectar Estos Tipos en Python
#### 1. **Identificación y Diagnóstico**
Para identificar el tipo de datos faltantes, es necesario realizar un análisis más detallado. A continuación, te muestro algunas técnicas y herramientas que puedes usar:
- **Visualización**: Utiliza gráficos para identificar patrones en los datos faltantes.
- **Análisis Estadístico**: Analiza la relación entre los datos faltantes y otras variables.
**Ejemplo en Python usando missingno y seaborn:**
import pandas as pd
import numpy as np
import missingno as msno
import seaborn as sns
import matplotlib.pyplot as plt
\# Crear un DataFrame con datos faltantes
data ={'A': \[1,2, np.nan,4, np.nan],  'B': \[5, np.nan, 7, np.nan, 10],  'C': \[1, 2, 3, 4, 5]}df = pd.DataFrame(data)
\# Visualización de datos faltantes
msno.matrix(df)plt.show()
\# Análisis de correlación entre datos faltantes
sns.heatmap(df.isnull().corr(), annot=True)plt.show()
#### 2. **Tratamiento**
El tratamiento de los datos faltantes depende del mecanismo y del tipo de datos faltantes. Algunas técnicas comunes incluyen:
- **Imputación**: Rellenar los valores faltantes con valores medios, medianos, moda, o usar técnicas avanzadas como la imputación múltiple.
- **Eliminación**: Eliminar las filas o columnas con datos faltantes si la proporción es pequeña.
- **Modelado**: Usar modelos que pueden manejar datos faltantes, como modelos de imputación basada en modelos (e.g., KNN, regresión).
**Ejemplo de imputación con la media:**
from sklearn.impute import SimpleImputer
\# Imputar con la media
imputer = SimpleImputer(strategy='mean')df\_imputed = pd.DataFrame(imputer.fit\_transform(df), columns=df.columns)print(df\_imputed)
**Ejemplo de eliminación de filas con datos faltantes:**
\# Eliminar filas con datos faltantes
df\_dropped = df.dropna()print(df\_dropped)
**Ejemplo de imputación múltiple usando IterativeImputer:**
from sklearn.experimental import enable\_iterative\_imputer
from sklearn.impute import IterativeImputer
\# Imputación múltiple
imputer = IterativeImputer()df\_imputed = pd.DataFrame(imputer.fit\_transform(df), columns=df.columns)print(df\_imputed)
### Resumen
- **MCAR**: Los datos faltantes son aleatorios y no dependen de otras variables. Se puede manejar con métodos estándar de imputación.
- **MAR**: Los datos faltantes dependen de otras variables observadas. La imputación puede ser más complicada y podría necesitar técnicas basadas en modelos.
- **MNAR**: Los datos faltantes están relacionados con el valor faltante mismo. El manejo puede ser más complejo y podría necesitar técnicas avanzadas o ajustes específicos del contexto.
La identificación precisa del tipo de datos faltantes es crucial para seleccionar el método de manejo adecuado y asegurar que los resultados del análisis sean válidos. ¿Necesitas más información o ejemplos sobre alguno de estos métodos?