No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

MCAR, MAR, MNAR en Python

12/21
Recursos

Aportes 10

Preguntas 2

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

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.

.

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.

diabetes_df[diabetes_df.columns[1:6]] = diabetes_df[diabetes_df.columns[1:6]].replace(0,np.nan)
diabetes_df.missing.missing_variable_plot()
  • Caso MCAR
# 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.

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.

En está clase aprendí algo nuevo, algo que ahora en adelante va a agregarle contenido a mis analisis exploratorios

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 ```js diabetes_df[diabetes_df.columns[1:6]].replace("0", np.nan) ```Eso o cambiando el tipo de datos a int, lo que prefieran
Si usan Google Colab usen este código para el MAR: `(    diabetes_df      ` `.missing` `.sort_variables_by_missingness()  .sort_values(by="BloodPressure")  .pipe(missingno.matrix))plt.show()`

genial!

12. MCAR, MAR, MNAR en Python

  • Gracias a la exploración datos se puede llegar a algunas conclusiones de que tipo de datos faltantes tengo.