Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


Datos faltastes con Python, Apuntes de Análisis de Datos Avanzado

Ejercicio para datos faltantes

Tipo: Apuntes

2025/2026

Subido el 06/06/2026

magaly-guadalupe-reyes-alejo
magaly-guadalupe-reyes-alejo 🇲🇽

1 documento

1 / 23

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
G U ÍA DE ESTU D I O · TC5053 C I E NCIA Y A N A LÍTICA D E DA TOS
Valores faltantes:
MCAR, MAR y MNAR explicados
desde cero
Qué son, cómo se simulan en código, cómo se tratan y cómo leer los resultados — con los
números reales de tu Proyecto 02.
Magaly Reyes · Preparación para examen
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17

Vista previa parcial del texto

¡Descarga Datos faltastes con Python y más Apuntes en PDF de Análisis de Datos Avanzado solo en Docsity!

G U Í A D E E S T U D I O · T C 5 0 5 3 C I E N C I A Y A N A L Í T I C A D E D AT O S

Valores faltantes:

MCAR, MAR y MNAR explicados

desde cero

Qué son, cómo se simulan en código, cómo se tratan y cómo leer los resultados — con los números reales de tu Proyecto 02.

Magaly Reyes · Preparación para examen

L A I D E A C E N T R A L

¿Por qué importan los valores faltantes? Imagina que haces una encuesta de salarios en tu planta. Los datos que NO llegan casi nunca faltan por azar : quienes ganan poco a veces prefieren no contestar. Si calculas el salario promedio solo con las respuestas que sí tienes, tu promedio sale inflado — y ninguna fórmula te avisa. El problema real

Un dataset con huecos puede contar una historia distinta a

la realidad. La media, la mediana y las proporciones que

calculas dependen de QUÉ datos se perdieron, no solo de

cuántos.

Por eso el proyecto no trata de "rellenar huecos": trata de

entender el MECANISMO por el que se pierden los datos.

Lo que hace el proyecto

Tomamos un dataset COMPLETO (sin huecos) y nosotras

mismas le borramos datos de 3 formas distintas. Como

conocemos la "verdad" original, podemos medir

exactamente cuánto daño hace cada forma de perder datos

y cada forma de repararlos.

L O S D A T O S

clients.csv: 15,000 filas, 3 variables

El dataset es de abandono de clientes (churn) de una empresa digital. De sus 8 columnas, el proyecto usa solo estas 3 —

elegidas porque mezclan un tipo cualitativo con dos cuantitativos:

Plan Cualitativa nominal El paquete contratado: Basico (35.1%), Estandar (33.8%), Premium (21.7%), Empresarial (9.4%). Se analiza con proporciones y diagrama de barras. Se imputa con la MODA. Months Cuantitativa discreta Meses de antigüedad del cliente. Distribución casi simétrica: media 30.33, mediana 30, desv. 17.20, skewness 0.009 (≈ 0). Se imputa con la MEDIA. Income Cuantitativa continua Ingreso mensual (miles de pesos). Distribución sesgada a la derecha: media 37.36 > mediana 34.42, skewness 0.956. Hay pocos clientes con ingresos muy altos que jalan la media. Dato para el examen: si skewness ≈ 0 la media y la mediana coinciden; si skewness > 0 (cola derecha) la media > mediana.

C O N C E P T O C L A V E # 1

¿De qué depende que el dato falte? MCAR Missing Completely At Random La probabilidad de que un dato falte NO depende de nada. Puro azar. Analogía: a la base de datos le cayó café encima y borró celdas al azar. MAR Missing At Random La probabilidad depende de algo OBSERVADO (aquí: de qué columna es), pero no del valor en sí. Analogía: la pregunta de ingreso estaba al final de la encuesta y mucha gente ya no llegó a esa página. MNAR Missing Not At Random La probabilidad depende del PROPIO VALOR que se pierde. El dato falta por lo que vale. Analogía: quienes ganan menos prefieren no decir su sueldo. El hueco ES información.

Memoriza la pregunta clave: "¿De qué depende la probabilidad de que el dato falte?" Nada → MCAR. De otra cosa observable → MAR.

Del propio valor → MNAR.

M E C A N I S M O A D E T A L L E

MAR — depende de algo observable Cómo funciona

La probabilidad de faltar no es igual para todos, pero depende

de información OBSERVADA — en este proyecto, de la

columna: una columna "elegida" pierde con probabilidad p y

las demás con p/2. El valor de la celda sigue sin importar.

En el proyecto (tu corrida)

La columna elegida al azar fue Income: perdió 14.8% de sus

valores, mientras Plan (7.6%) y Months (7.1%) perdieron la

mitad. En el mapa de calor se nota que una columna está más

"rayada" que las otras.

Consecuencia estadística

Dentro de cada columna la pérdida sigue siendo aleatoria →

las métricas casi no se sesgan (media de Income: 37.355 →

37.387). El daño es desigual entre variables, pero no

sistemático respecto al valor.

Para el examen

Ojo con la confusión clásica: MAR NO significa "missing al azar

a secas". Significa que la ausencia se explica con datos que SÍ

observas. Por eso la imputación todavía es razonable aquí.

M E C A N I S M O A D E T A L L E

MNAR — el dato falta por lo que vale Cómo funciona

La probabilidad de faltar se calcula CON el propio valor de la

celda. En el proyecto: prob = (1 − valor/máximo) × 0.5 → entre

más bajo el valor, más probable que desaparezca. En Plan, una

categoría sorteada (Empresarial) pierde el doble que las

demás.

En el proyecto (tu corrida)

Months perdió 24.6% e Income 33.2% — y no cualquiera: se

borraron sobre todo los valores BAJOS. La media de Months

subió de 30.33 a 33.59 y la mediana brincó de 30 a 35. La cola

izquierda del histograma desapareció.

Consecuencia estadística

Los datos sobrevivientes ya NO representan a la población:

todo estimador queda sesgado y NINGÚN tratamiento

univariante (ni borrar filas ni imputar la media) recupera la

verdad, porque la información perdida no está en los datos

que quedan.

Para el examen

MNAR es siempre la respuesta a "¿cuál es el peor escenario?".

Frase para el examen: "en MNAR el hueco mismo contiene

información". Detectarlo requiere conocer el proceso de

negocio, no solo el dataset.

C O N C E P T O C L A V E # 3

Las 4 métricas y qué dice cada una

Media

El promedio. Sensible a valores extremos y al sesgo: si se borran los valores bajos (MNAR), la media SUBE. Es tu primer detector de daño. df[col].mean()

Mediana

El valor de en medio (50% arriba, 50% abajo). Resistente a extremos, pero NO a la pérdida sistemática: en MNAR también se desplazó (30 → 35). df[col].median()

Desv. estándar

Qué tan dispersos están los datos. Detector de imputación: si imputaste con la media, la desviación BAJA aunque la media no cambie. df[col].std()

Skewness

La asimetría. ≈0 simétrica; >0 cola a la derecha; <0 cola a la izquierda. En MNAR Months pasó de 0.009 a −0.206: se comió la cola izquierda. df[col].skew() Para Plan (cualitativa) no hay media ni skewness: se usan proporciones por categoría con value_counts(normalize=True).

La lógica del código

Vamos pieza por pieza. Si entiendes 3 ideas — la semilla, la máscara booleana y el for anidado — entiendes el 90% del notebook.

E L C Ó D I G O · P I E Z A 2

La máscara booleana: el truco clave

Una máscara es un arreglo de True/False que marca QUÉ filas tocar. Se construye comparando números aleatorios contra p:

mask = np.random.rand(len(df)) < p

# └── genera 15,000 números aleatorios entre 0 y 1

# └── compara cada uno contra p=0.15 → 15,000 True/False

df.loc[mask, col] = np.nan # solo las filas True se vuelven NaN

¿Por qué "< p" produce 15% de Trues? Porque un número aleatorio uniforme entre 0 y 1 cae debajo de 0.15 exactamente el

15% de las veces. Es la forma estándar de simular un evento con probabilidad p.

Visualízalo así rand: [0.03, 0.91, 0.12, 0.55, 0.08...] mask: [True, False, True, False, True...] → filas 1, 3 y 5 pierden su valor. Conexión con el examen Si ves "rand() < p" con p IGUAL para todo → MCAR. Si p cambia según la columna → MAR. Si p se calcula con el valor de la celda → MNAR.

E L C Ó D I G O · P I E Z A 3

mcar(): la misma moneda para toda celda

def mcar(data, p=0.15):

df_missing = data.copy()

for col in df_missing.columns:

mask = np.random.rand(len(df_missing)) < p

df_missing.loc[mask, col] = np.nan

return df_missing

Línea por línea:

1. data.copy() — trabajamos sobre una COPIA. Sin esto, destruirías el dataframe original y

los demás escenarios partirían de datos ya rotos.

2. El for recorre las 3 columnas (Plan, Months, Income).

3. Para cada columna se sortea una máscara nueva con la MISMA p = 0.15.

4. Las filas marcadas True se vuelven NaN.

La firma de MCAR Misma p para toda celda, sin mirar valores ni columnas. Resultado esperado: ~15% de NA en cada columna, repartido como ruido uniforme en el mapa de calor. Tu corrida: Plan 14.9%, Months 15.0%, Income 14.9%. ✓Coincide con la teoría.

E L C Ó D I G O · P I E Z A 5

mnar(): la probabilidad usa el valor

Columnas numéricas (Months, Income):

max_value = valores.max() for row in range(len(df_missing)): if random.random() < (1 - valor/max_value)*0.5: df_missing.iat[row, column] = np.nan

Columna categórica (Plan):

label = random.choice(valores.unique())

label pierde con p/2; las demás con p/

Desarma la fórmula (1 − valor/máx) × 0.5:

  • Si el valor es ALTO (cercano al máx): 1 − 1 = 0 → prob ≈ 0%. Casi nunca se borra.
  • Si el valor es BAJO (cercano a 0): 1 − 0 = 1 → prob ≈ 50%. Se borra la mitad de las veces. Por eso desaparece la cola izquierda del histograma y la media SUBE. La probabilidad ya no es constante: es una función del dato mismo. Eso es MNAR. La firma de MNAR El valor de la celda aparece DENTRO del cálculo de probabilidad. Nota: aquí se usa .iat[fila, col] y un for fila por fila, porque cada celda tiene SU propia probabilidad — ya no sirve una sola máscara por columna. Tu corrida: Months 24.6% NA, Income 33.2%, Plan 6.7% (Empresarial fue la categoría sorteada).

E L C Ó D I G O · P I E Z A 6

Los tratamientos: dropna() y fillna()

Casos completos — una sola línea:

df_cc = df_mcar.dropna() # elimina toda FILA que tenga al menos un NaN (en cualquier columna)

Imputación univariante — media para numéricas, moda para categóricas:

df_imp = df_mcar.copy() df_imp['Plan'] = df_imp['Plan'].fillna(df_imp['Plan'].mode()[0]) # moda: la categoría más frecuente df_imp['Months'] = df_imp['Months'].fillna(df_imp['Months'].mean()) df_imp['Income'] = df_imp['Income'].fillna(df_imp['Income'].mean())

Detalles que preguntan: mode() regresa una Serie (puede haber empates), por eso el [0] toma la primera. La media se calcula con los

datos QUE QUEDARON — si ya están sesgados (MNAR), imputas un valor sesgado miles de veces. Y dropna() bota la fila completa

aunque solo falte 1 de las 3 columnas: por eso con 15% por columna pierdes ~39% de las filas.

R E S U L T A D O S · T U C O R R I D A

MCAR y MAR: el daño es mínimo Months (real: media 30.327, σ 17.198) Media Desv. est. MCAR sin tratamiento (15.0% NA) 30.343* 17. MCAR casos completos (9,254 filas) 30.245 17. MCAR imputación con media 30.343 15.851 ↓↓ MAR sin tratamiento (7.1% NA) 30.308 17. *Nota: en tu corrida MCAR la media quedó casi idéntica a la real (diferencia de 0.016). Cómo contarlo en el examen "Bajo MCAR y MAR los estimadores se mantienen prácticamente insesgados con cualquier tratamiento; el único efecto sistemático es la caída de la desviación estándar al imputar con la media (17.20 → 15.85), porque se repite el mismo valor en miles de celdas." Y en Plan: imputar con la moda infló Basico de 0.351 a 0.449 — hasta en MCAR la moda deforma proporciones.

Mensaje: que "no pase nada" en MCAR/MAR no es un resultado aburrido — es la

confirmación de la teoría, y es la mitad de tus conclusiones.

R E S U L T A D O S · T U C O R R I D A

MNAR: aquí se rompe todo Months Media Mediana Skewness Real (completo) 30.327 30 0. MNAR sin tratamiento (24.6% NA) 33.593 ↑ 35 ↑ −0. Casos completos (7,085 filas) 33.899 ↑ 35 −0. Imputación con media 33.593 33.593* −0. *La mediana imputada se vuelve igual a la media: tantas celdas valen 33.593 que el valor de en medio ES ese. La cadena lógica

  1. Se borran los valores BAJOS →
  2. los que quedan son altos →
  3. media y mediana SUBEN →
  4. el histograma pierde la cola izquierda → skewness se vuelve negativa →
  5. dropna conserva el sesgo (borra justo a los clientes nuevos/de bajo ingreso) →
  6. fillna imputa una media YA sesgada y además colapsa σ (Income: 16.71 → 14.25).

Income es aún más dramático: 33.2% de NA, media de 37.355 → 39.165. Y en Plan, la

categoría Empresarial perdió el doble que las demás.