
METIS 4: el sesgo no está en la gráfica, está en quién falta
Lo que ha cambiado por dentro (breve)
En la entrega anterior METIS aprendió a dibujar y, sobre todo, a medir cuánto deforma cada opción de la gráfica: el factor de exageración de un eje truncado, la tendencia de una ventana recortada frente a la de la serie completa, el r² de una línea de tendencia. Cuatro números, no cuatro opiniones.
Para este paso hacían falta tres cosas más, y son pequeñas.
Un tipo de gráfica nuevo: el recuento. Cuenta cuántas filas hay de cada categoría y qué porcentaje del total es cada una. Es la gráfica más tonta del catálogo y la que más falta hacía, porque antes de comparar medias entre dos grupos hay que saber cuánta gente hay en cada grupo. Un grupo de 24 personas y otro de 84 se dibujan con barras del mismo grosor. Esa es la primera forma de engañarse con datos, y ocurre antes de que nadie toque un eje.
Un aviso nuevo: grupos_desiguales. Si la columna tiene dos categorías y una es 1,5 veces mayor que la otra o más, METIS lo dice con el número exacto. Y no dice “cuidado, muestra pequeña”, que no significa nada para un alumno de 1º de Bachillerato. Dice esto:
Antes de comparar nada entre estos dos grupos, pregúntate POR QUÉ están tan desiguales: si el desequilibrio viene de quién decidió entrar en estos datos, cualquier comparación entre los grupos puede estar midiendo esa decisión y no lo que crees que mide.
Y dos arreglos. La vista previa de las cabeceras # pasa de 400 a 1.500 caracteres, porque con 400 la conclusión de los autores del segundo conjunto de datos se cortaba justo antes de la parte importante, que es precisamente la parte que todo el mundo cita mal. Y los recuentos, porcentajes y medias por grupo ahora se escriben como texto debajo de la gráfica, no solo dentro de la imagen: antes el alumno tenía que leer números de un PNG.
Nada más. El resto del paso no es código, es el ejercicio.
Antes de empezar: qué es un sesgo de selección
En los pasos anteriores el engaño estaba en la representación. Cortabas el eje, elegías la ventana, y los mismos datos contaban otra historia. Se arreglaba mirando el eje.
Este paso es distinto y es peor. Aquí los datos están bien medidos y bien dibujados, la gráfica no deforma nada, METIS no tiene ningún aviso que darte, y la conclusión sigue siendo falsa.
Porque la trampa ocurrió antes de que existiera el archivo: en quién entró en el archivo.
Eso es un sesgo de selección. Y tiene una propiedad que conviene aprenderse de memoria:
Los datos sesgados casi nunca contienen la prueba de su propio sesgo.
Si la contuvieran sería fácil. Lo que hace peligroso a un sesgo de selección es que la columna que lo explicaría no está en el archivo, porque nadie la recogió, porque no había forma de recogerla, o porque a quien montó el archivo no se le ocurrió que hiciera falta.
Vas a verlo dos veces: primero con datos inventados a propósito, donde se puede comprobar la trampa porque tenemos el archivo bueno al lado; y después con datos reales publicados en 1973, donde el sesgo lleva cincuenta años discutiéndose.
Primera parte: la olimpiada de programación
De dónde salen estos datos
Estos dos archivos son inventados. No hay ningún alumno real de ningún centro real, y eso hay que decirlo antes de nada. Los ha generado un programa de Python que está entero al final de esta entrada, con una semilla fija, así que cualquiera puede volver a generarlos y comprobar que salen exactamente iguales.
Pero están calibrados a propósito para reproducir tres cosas que sí están medidas de verdad:
1. El rendimiento en matemáticas es prácticamente igual. Lindberg, Hyde, Petersen y Linn (2010), “New trends in gender and mathematics performance: A meta-analysis”, Psychological Bulletin 136(6):1123-1135. Doscientos cuarenta y dos estudios, alrededor de 1.300.000 participantes. El tamaño del efecto es d = 0,05, que es trivial. La conclusión de los autores, textual: “males and females perform similarly in mathematics”.
2. La confianza declarada no es igual. Else-Quest, Hyde y Linn (2010), “Cross-national patterns of gender differences in mathematics: A meta-analysis”, Psychological Bulletin 136(1):103-127. TIMSS 2003 más PISA 2003, N = 493.495 estudiantes de 14 a 16 años en 69 países. Rendimiento con d por debajo de 0,15, pero “boys reported more positive math attitudes and affect”. A rendimiento casi idéntico, actitudes distintas.
3. La participación es abrumadoramente desigual. “Igualdad en cifras. MEFD 2025”, del Ministerio de Educación, Formación Profesional y Deportes: “Aunque las mujeres son mayoría entre el alumnado universitario de Grado (56,8%), en los estudios STEAM las alumnas presentan un porcentaje menor. Destacan los ámbitos de estudio de Ingeniería, Industria y Construcción (31%) y de Informática (16,2%).”
16,2 % de alumnas en los grados de Informática. Ese es el número al que apunta todo el ejercicio.
Resumen honesto de las tres fuentes: el rendimiento es prácticamente igual, la confianza declarada no lo es, y la participación es un desastre. Los datos inventados reproducen esas tres cosas y nada más.
Los dos archivos
Son la misma prueba, el mismo día y los mismos alumnos. Lo único que cambia es quién está dentro.
| Archivo | Qué es | Filas | Columnas |
|---|---|---|---|
olimpiada_programacion.csv | Solo quien se apuntó voluntariamente | 108 | participante_id, sexo, puntuacion |
prueba_todo_el_curso.csv | Todo el curso, obligatorio | 300 | alumno_id, sexo, puntuacion, confianza_declarada, se_apunto_olimpiada |
Fíjate en las columnas antes de seguir. El archivo de la olimpiada tiene dos columnas menos. Y eso no es un descuido: es lo que pasa de verdad. El registro de una competición guarda quién participó y cómo le fue. No guarda por qué los demás no vinieron. Nadie apunta eso.
PASO A — Sube el archivo sesgado
Arranca METIS y arrastra olimpiada_programacion.csv a la página.
Lee lo que te dice el perfil: 108 filas, tres columnas, ninguna vacía, ningún valor perdido, ningún número guardado como texto. Está impecable. No hay nada que limpiar.
Pulsa Limpiar sin cambiar ninguna decisión y luego saca la ficha de metadatos. También impecable, salvo los [POR RELLENAR] de siempre, que son las cosas que solo sabe una persona.
Esto es importante que lo notes: has hecho todo bien. El archivo está limpio, tiene su ficha, METIS no se queja de nada. Y estás a punto de sacar una conclusión falsa.
PASO B — Cuenta cuánta gente hay de cada grupo
Baja al bloque “Dibujar y comparar”.
| Control | Valor |
|---|---|
| Tipo de gráfica | Recuento por grupo (barras) |
| Eje horizontal (X) | sexo |
(El eje vertical no hace falta: un recuento cuenta filas, no promedia nada. Si el desplegable se queda en gris, es normal.)
Pulsa Dibujar. Sale esto:
chico: 84 casos, 77,8 %chica: 24 casos, 22,2 %
Y debajo, el aviso grupos_desiguales:
Los dos grupos son muy desiguales: ‘chico’ tiene 84 casos (77.8 %) y ‘chica’ tiene 24 (22.2 %), 3.5 veces menos. Antes de comparar nada entre estos dos grupos, pregúntate POR QUÉ están tan desiguales…
Compara ese 22,2 % con el 16,2 % de Informática del Ministerio. No es el mismo número, pero es el mismo mundo.
PASO C — Ahora la conclusión fácil (y falsa)
| Control | Valor |
|---|---|
| Tipo de gráfica | Media por grupo (barras) |
| Eje horizontal (X) | sexo |
| Eje vertical (Y) | puntuacion |
| Eje vertical: desde dónde | Ajustado a los datos (déjalo como está) |
Pulsa Dibujar. Salen dos barras, una clarísimamente más alta que la otra. Y salta un aviso:
El eje vertical no empieza en cero: va de 63.9 a 67.78. Eso multiplica por 17.40 la pendiente que se ve…
Diecisiete veces. Ahora cambia el eje vertical a Desde cero y vuelve a dibujar: las dos barras son casi iguales, y el aviso desaparece. Esto es el paso 3 de la entrega anterior repetido en diez segundos, para que se vea que sigue funcionando.
Con el eje desde cero, los números de verdad son:
- chicas: 67,5 (24 casos)
- chicos: 64,2 (84 casos)
Es decir: en la olimpiada las chicas son muchas menos y puntúan 3,3 puntos más.
Ahora contesta a esto, por escrito, antes de seguir
Con este archivo delante, ¿puedes decir si a las chicas les gusta menos la programación?
La respuesta es no. Y ojo, no es no porque las chicas puntúen más. Es no por una razón mucho más seca:
En este archivo solo hay gente que se apuntó. No hay ni una sola fila de alguien que no se apuntó. Cero. Así que la pregunta “¿por qué hay menos chicas?” no se puede contestar con este archivo, porque la información que haría falta —qué pasó con quien no vino— no existe aquí.
Y hay una segunda cosa que hay que saber ver. Que las 24 chicas puntúen más alto no es una casualidad simpática: es lo que pasa cuando un grupo tiene que superar un filtro más duro para llegar a los datos. Se llama efecto de supervivencia. Confundirlo con “las chicas son mejores” es exactamente el mismo error que confundir lo otro con “las chicas son peores”: los dos son leer una diferencia de rendimiento donde solo hay una diferencia de puerta de entrada.
PASO D — Sube el archivo completo
Arrastra ahora prueba_todo_el_curso.csv. 300 filas, cinco columnas. Este es el curso entero, se apuntara o no. Limpia y saca la ficha igual que antes.
Primero, el recuento:
| Control | Valor |
|---|---|
| Tipo de gráfica | Recuento por grupo (barras) |
| Eje horizontal (X) | sexo |
chica: 152 casos, 50,7 %chico: 148 casos, 49,3 %- Ningún aviso. Los grupos están equilibrados.
Ya tienes el primer contraste: el curso está al 50 % y la olimpiada al 78/22. Los alumnos son los mismos. Algo pasó entre el curso y la olimpiada, y ese algo es lo que vas a buscar.
PASO E — ¿Rinden distinto? No.
| Control | Valor |
|---|---|
| Tipo de gráfica | Media por grupo (barras) |
| Eje horizontal (X) | sexo |
| Eje vertical (Y) | puntuacion |
| Eje vertical: desde dónde | Ajustado a los datos |
Dibuja. Y mira bien el aviso, porque este es de coleccionista:
El eje vertical no empieza en cero: va de 57.86 a 58.26. Eso multiplica por 146.91 la pendiente que se ve…
Ciento cuarenta y seis veces. En la pantalla vas a ver dos barras con una diferencia enorme, aplastante, evidente. Y la diferencia real es de tres décimas de punto sobre cien.
Cambia a Desde cero:
- chicas: 58,2 (152 casos)
- chicos: 57,9 (148 casos)
- Sin ningún aviso.
Dos barras idénticas. Rinden igual. Y coincide con lo que dice el metaanálisis de Lindberg de 2010 sobre 1,3 millones de personas: d = 0,05, nada.
Quédate con la lección doble de este paso: cuanto más pequeña es una diferencia de verdad, más fácil es hacerla parecer gigante con un eje truncado. El factor de exageración no es grande porque el truco sea agresivo; es grande porque la diferencia real es minúscula.
PASO F — ¿Se ven distinto? Sí, y muchísimo.
| Control | Valor |
|---|---|
| Tipo de gráfica | Media por grupo (barras) |
| Eje horizontal (X) | sexo |
| Eje vertical (Y) | confianza_declarada |
| Eje vertical: desde dónde | Desde cero |
Dibuja. Sin avisos, eje honesto, y aun así:
- chicas: 4,00 sobre 10
- chicos: 5,48 sobre 10
Punto y medio de diferencia. En la misma prueba. Que acaban de hacer igual de bien. Las tres décimas del paso anterior no se veían con el eje honesto; este punto y medio sí se ve.
Esto es lo que encontraron Else-Quest y sus colegas en medio millón de estudiantes de 69 países: rendimiento casi idéntico, actitudes distintas.
PASO G — ¿Qué abre la puerta de la olimpiada?
Ahora la parte de detective. Cambia la columna del eje horizontal:
| Control | Valor |
|---|---|
| Tipo de gráfica | Recuento por grupo (barras) |
| Eje horizontal (X) | se_apunto_olimpiada |
no: 192 casos, 64,0 %si: 108 casos, 36,0 %
Ciento ocho. El mismo número de filas que tenía el archivo de la olimpiada. Acabas de comprobar de dónde salía ese archivo: es este, filtrado.
Y ahora las dos gráficas que resuelven el caso. Las dos con el eje Desde cero:
| Control | Gráfica 1 | Gráfica 2 |
|---|---|---|
| Tipo | Media por grupo | Media por grupo |
| X | se_apunto_olimpiada | se_apunto_olimpiada |
| Y | puntuacion | confianza_declarada |
Gráfica 1 — puntuación: no 54,2 / sí 64,9. Diez puntos y medio de diferencia.
Gráfica 2 — confianza: no 3,9 / sí 6,2. Dos puntos y tercio sobre diez.
Aquí hay que ser honesto con el alumno, porque es tentador simplificar y sería mentira: las dos cosas influyen en apuntarse. Quien se apunta puntúa de verdad algo más alto, y eso es esperable: una olimpiada atrae a los que van bien. No es sospechoso.
Lo que decide cuál pesa más es comparar las dos diferencias en la misma escala, y para eso está el tamaño del efecto. Aquí el de la confianza es d = 2,0 y el de la puntuación d = 0,75. Casi tres veces más. La puerta la abre sobre todo la confianza.
La cadena completa
Ya tienes las cuatro piezas. Escríbelas en este orden, que es el del ejercicio:
- Rinden igual. (58,2 frente a 57,9, con el eje desde cero.)
- Se ven peor. (4,00 frente a 5,48 de confianza declarada, misma prueba.)
- La puerta de la olimpiada la abre la confianza, más que la nota. (d = 2,0 frente a d = 0,75.)
- Se apuntó el 15,8 % de las chicas y el 56,8 % de los chicos.
Y el resultado: el archivo de la olimpiada se llena de chicos, alguien lo abre, dibuja el recuento y concluye que la programación no es para chicas. La gráfica está bien hecha. El archivo está limpio. La conclusión es falsa.
PASO H — Y ahora la parte que hay que entender de verdad
Vuelve a mirar la lista de columnas de olimpiada_programacion.csv:
participante_id, sexo, puntuacion
La columna confianza_declarada no está. Es la columna que explica todo el ejercicio, y no está en el archivo sesgado.
No se me olvidó ponerla: la quité a propósito, porque un registro real de participantes no la trae. Y ahí está la lección del paso entero:
Con el archivo sesgado en la mano, y por bien que lo limpiaras, por bonita que fuera la ficha de metadatos y por honestos que fueran tus ejes, no había ninguna forma de llegar a la explicación correcta. Hacía falta otro archivo.
Cuando alguien te enseñe una gráfica y te diga “los datos son los datos”, la pregunta ya no es si el eje empieza en cero. La pregunta es: ¿quién no está en estos datos, y por qué?
Sobre la trampa de la semilla, que hay que contarla
La puntuación se genera sin mirar el sexo: la fórmula del programa no contiene esa variable, y puedes comprobarlo en el código del final. La diferencia de tres décimas del paso E es puro azar de muestreo.
Pero con 300 alumnos ese azar no sale exactamente cero. Probando 110 semillas distintas, el d observado en el curso completo se movió entre −0,29 y +0,26 sin cambiar una coma de la fórmula.
Se ha elegido a propósito una semilla en la que el azar sale pequeño (d = −0,023) para que el ejemplo salga limpio. Está dicho, y es una lección por sí sola: en una muestra de 300 personas, una diferencia de una décima de desviación típica puede ser exactamente nada. Quien no se lo crea solo tiene que cambiar SEMILLA en el programa y volver a generar los archivos.
Segunda parte: Berkeley, otoño de 1973
De dónde salen estos datos
Estos no los he inventado yo. Son la tabla de admisiones de posgrado de la Universidad de California en Berkeley del otoño de 1973, publicada en:
Bickel, P. J., Hammel, E. A. y O’Connell, J. W. (1975), “Sex Bias in Graduate Admissions: Data from Berkeley”, Science 187(4175):398-404.
Es el ejemplo clásico de la paradoja de Simpson y probablemente el conjunto de datos más reproducido en la enseñanza de la estadística. El archivo berkeley_1973.csv contiene los seis departamentos mayores, que en el artículo original se identifican solo con las letras A a F porque los autores no publicaron sus nombres.
En el conjunto completo de la universidad (12.763 solicitudes) las tasas fueron 44 % para los hombres y 35 % para las mujeres. En estos seis departamentos, 2.691 hombres y 1.835 mujeres.
PASO I — Lee la cabecera. En serio.
Arrastra berkeley_1973.csv. Lo primero que te va a decir METIS es que el archivo empieza con 36 líneas de comentario que arrancan con #, y te va a mostrar el principio de ellas.
Léelas. Ahí está la fuente, la explicación de las letras A-F, los totales publicados, y la conclusión textual de los autores. Esa cabecera es la mitad de los metadatos del archivo. En el paso 1 de esta secuencia ya vimos que las líneas # de un archivo científico no son basura; aquí son la parte más importante.
Las doce filas de datos son estas, y caben en la pantalla:
| Departamento | Sexo | Solicitantes | Admitidos | Rechazados | Tasa % |
|---|---|---|---|---|---|
| A | hombre | 825 | 512 | 313 | 62,06 |
| A | mujer | 108 | 89 | 19 | 82,41 |
| B | hombre | 560 | 353 | 207 | 63,04 |
| B | mujer | 25 | 17 | 8 | 68,00 |
| C | hombre | 325 | 120 | 205 | 36,92 |
| C | mujer | 593 | 202 | 391 | 34,06 |
| D | hombre | 417 | 138 | 279 | 33,09 |
| D | mujer | 375 | 131 | 244 | 34,93 |
| E | hombre | 191 | 53 | 138 | 27,75 |
| E | mujer | 393 | 94 | 299 | 23,92 |
| F | hombre | 373 | 22 | 351 | 5,90 |
| F | mujer | 341 | 24 | 317 | 7,04 |
PASO J — Primera conclusión: hay discriminación evidente
Vamos a sumar todo. METIS no suma columnas por grupo, así que hay que hacerlo en dos gráficas y una división. Se hace en un minuto y además obliga a entender qué se está calculando.
| Control | Gráfica 1 | Gráfica 2 |
|---|---|---|
| Tipo | Media por grupo | Media por grupo |
| X | sexo | sexo |
| Y | admitidos | solicitantes |
| Eje vertical | Desde cero | Desde cero |
Gráfica 1 — admitidos por departamento (media): hombre 199,67, mujer 92,83. Gráfica 2 — solicitantes por departamento (media): hombre 448,50, mujer 305,83.
Como hay seis departamentos en los dos casos, dividir las medias es lo mismo que dividir los totales. Divide:
- Hombres: 199,67 / 448,50 = 44,5 % admitidos
- Mujeres: 92,83 / 305,83 = 30,4 % admitidos
Catorce puntos de diferencia. Con 4.526 solicitudes detrás. Esto no es ruido de muestreo ni un eje truncado: es una diferencia enorme en datos reales.
Si paras aquí, la conclusión es que Berkeley discriminaba a las mujeres en las admisiones de posgrado. Es exactamente lo que se concluyó en su momento, y por eso el artículo se escribió.
PASO K — Segunda conclusión: las mujeres son admitidas MÁS
No cambies de archivo. No toques los datos. Solo cambia la columna del eje vertical:
| Control | Valor |
|---|---|
| Tipo de gráfica | Media por grupo (barras) |
| Eje horizontal (X) | sexo |
| Eje vertical (Y) | tasa_admision_pct |
| Eje vertical: desde dónde | Desde cero |
- hombre: 38,13 %
- mujer: 41,73 %
Tres puntos y medio a favor de las mujeres.
Y compruébalo departamento por departamento en la tabla de arriba, que es más convincente que cualquier gráfica:
| Departamento | Favorece a | Diferencia |
|---|---|---|
| A | mujeres | +20,35 puntos |
| B | mujeres | +4,96 |
| C | hombres | +2,86 |
| D | mujeres | +1,84 |
| E | hombres | +3,83 |
| F | mujeres | +1,14 |
Cuatro departamentos de seis admiten a mayor proporción de mujeres. Los dos que favorecen a los hombres lo hacen por menos de cuatro puntos.
Párate un segundo aquí. Las dos conclusiones son ciertas. No hay ningún truco, ningún eje deformado, ninguna ventana recortada, ningún dato inventado, y ni un solo aviso de METIS en toda la segunda parte. Los mismos 4.526 solicitantes dicen que los hombres son admitidos mucho más y que las mujeres son admitidas algo más, al mismo tiempo.
Esto es la paradoja de Simpson: al agregar los grupos, el signo se invierte.
PASO L — Dónde está la explicación
Está a la vista, en una columna que hasta ahora hemos usado solo para dividir: solicitantes.
Mira qué de difícil es entrar en cada departamento:
| Control | Valor |
|---|---|
| Tipo de gráfica | Media por grupo (barras) |
| Eje horizontal (X) | departamento |
| Eje vertical (Y) | tasa_admision_pct |
| Eje vertical: desde dónde | Desde cero |
- A: 72,2 % · B: 65,5 % · C: 35,5 % · D: 34,0 % · E: 25,8 % · F: 6,5 %
(Aquí METIS te avisará de grupos_pequenos: cada departamento tiene solo 2 filas. Tiene razón en avisar, aunque en este caso las 2 filas son “hombres” y “mujeres” y no un problema de muestreo. Un aviso automático no sabe qué mide tu tabla; eso lo sabes tú, y por eso la ficha de metadatos existe.)
Entrar en A o B era facilísimo. Entrar en F era casi imposible: 6 de cada 100.
Y ahora vuelve a la columna solicitantes de la tabla grande:
- En A, el fácil: 825 hombres y 108 mujeres.
- En B, el otro fácil: 560 hombres y 25 mujeres.
- En C: 325 hombres y 593 mujeres.
- En E: 191 hombres y 393 mujeres.
Los hombres solicitaban en masa los departamentos donde entraba casi todo el mundo. Las mujeres solicitaban en masa los departamentos donde no entraba casi nadie.
Eso es todo. La tasa global de los hombres es alta porque está dominada por A y B, donde había 1.385 hombres y 133 mujeres. No hace falta ningún comité discriminando: basta con que los dos grupos pidan cosas distintas.
PASO M — Lo que dijeron los autores, que casi nadie cuenta
Esta es la razón por la que he metido este archivo en el ejercicio, y no es la paradoja.
Berkeley se usa constantemente como remate de discusión: “¿ves? No había machismo, era la paradoja de Simpson”. El artículo dice lo contrario. Bickel, Hammel y O’Connell no dijeron que no hubiera sesgo. Dijeron que el sesgo agregado
“stems not from any pattern of discrimination on the part of admissions committees, but apparently from prior screening at earlier educational levels”
y que las mujeres eran dirigidas hacia campos de estudio “generally more crowded, less productive of completed degrees, less well funded, and frequently offer poorer professional employment prospects”.
Es decir: movieron el sesgo aguas arriba, no lo negaron. Lo sacaron de los comités de admisión y lo pusieron en la socialización y en la educación anterior, que es la que decide qué carrera pide cada uno.
Y fíjate en que eso es exactamente la primera parte de esta entrada. En la olimpiada nadie discriminó a nadie en la puerta: se apuntó quien se sintió capaz. El sesgo estaba antes, en quién se sintió capaz. Berkeley 1973 y la olimpiada inventada cuentan la misma historia con cincuenta años de diferencia.
Los dos ejercicios juntos
Escribe esto y guárdalo, porque es el resumen del paso:
| Dónde estaba el sesgo | ¿Lo avisa la gráfica? | |
|---|---|---|
| Olimpiada | En quién entra en los datos | No |
| Berkeley | En cómo se agrupan los datos | No |
En los dos casos la gráfica era honesta y METIS no tenía nada que objetar. En los dos casos la conclusión fácil era falsa. Y en los dos casos lo que hacía falta era una pregunta que no se contesta mirando la pantalla:
- ¿Quién no está en estos datos?
- ¿Qué pasa si los desagrupo?
Para quien acabe pronto
Cuatro cosas más, en orden de dificultad. Las dos primeras se hacen en METIS; las otras dos ya no, y eso también hay que saberlo.
1. El histograma de la confianza. Con prueba_todo_el_curso.csv, dibuja un histograma de confianza_declarada. ¿Se ven dos montañas o una? ¿Qué esperarías ver si la confianza dependiera solo de la nota?
2. La nube de puntos. Dispersión con X = confianza_declarada e Y = puntuacion. La correlación es r = 0,54: la confianza sí tiene que ver con la nota, y bastante. Pero la penalización por ser chica se suma encima de eso. Explica con tus palabras por qué las dos cosas pueden ser verdad a la vez.
3. Lo que METIS todavía no puede hacer. METIS no filtra filas ni cruza dos columnas de categorías. Así que la cifra clave del paso G —15,8 % de las chicas frente al 56,8 % de los chicos— no la puedes sacar con una gráfica: sale del informe que imprime el programa generador cuando lo ejecutas, o de una tabla dinámica en una hoja de cálculo. Ábrela en LibreOffice y compruébala tú mismo, que para eso están los datos.
4. El dato más incómodo del ejercicio. Coge el 20 % mejor del curso: son 60 alumnos, 28 chicas y 32 chicos (casi mitad y mitad, como cabía esperar si rinden igual). De esos, se apuntaron a la olimpiada 11 de las 28 chicas y 28 de los 32 chicos. Es decir: entre los mejores del curso, el 39,3 % de las chicas y el 87,5 % de los chicos. Esto tampoco se saca con METIS: hace falta ordenar por puntuacion en una hoja de cálculo, o cuatro líneas de pandas. Hazlo, y luego explica por qué este es el número que más duele de todos los que has calculado hoy.
Lo que hay por debajo
La gráfica de recuento y su aviso
Es la función completa, tal cual está en graficas.py. Toda la lógica del aviso son dos condiciones y una división:
def _recuento(marco, x, eje_y, opciones, avisos, datos):
"""Cuantos casos hay de cada categoria, y que proporcion del total.
Es la grafica mas simple del catalogo y la que mas falta hace: antes de
comparar medias entre grupos hay que saber CUANTA gente hay en cada
grupo. Un grupo de 5 personas y otro de 200 se dibujan con barras del
mismo grosor, y esa es la primera forma de enganarse con datos.
Ademas es la unica manera de ver un SESGO DE SELECCION desde dentro del
archivo: si un conjunto de datos que deberia estar repartido al 50 % esta
al 80/20, el problema no esta en los numeros, esta en quien falta."""
if x not in marco.columns:
raise ErrorGrafica(f"La columna '{x}' no existe en los datos.")
conteo = marco[x].astype(str).value_counts()
if len(conteo) > 25:
raise ErrorGrafica(
f"'{x}' tiene {len(conteo)} valores distintos: son demasiados para "
"un recuento legible. Esta gráfica es para columnas con pocas "
"categorías (sexo, curso, nivel...), no para identificadores."
)
total = int(conteo.sum())
figura, eje = _figura()
barras = eje.bar(conteo.index, conteo.values, color=COLOR_PRINCIPAL,
alpha=0.9, edgecolor="white", linewidth=0.8)
# El porcentaje encima de cada barra: es el dato que importa y ahorra
# tener que calcularlo a mano.
for barra, valor in zip(barras, conteo.values):
eje.annotate(f"{valor}\n({valor / total * 100:.1f} %)",
(barra.get_x() + barra.get_width() / 2, valor),
ha="center", va="bottom", fontsize=9,
xytext=(0, 3), textcoords="offset points")
eje.set_xlabel(str(x))
eje.set_ylabel("número de casos")
eje.set_title(f"Cuántos casos hay de cada {x} (total: {total})",
fontsize=12, pad=14)
eje.set_ylim(0, float(conteo.max()) * 1.18)
if len(conteo) > 6:
plt.setp(eje.get_xticklabels(), rotation=35, ha="right")
# Desequilibrio fuerte entre dos categorias: se dice con el numero.
if len(conteo) == 2:
mayor, menor = int(conteo.iloc[0]), int(conteo.iloc[1])
if menor > 0 and mayor / menor >= 1.5:
avisos.append({
"tipo": "grupos_desiguales",
"texto": (
f"Los dos grupos son muy desiguales: '{conteo.index[0]}' "
f"tiene {mayor} casos ({mayor/total*100:.1f} %) y "
f"'{conteo.index[1]}' tiene {menor} ({menor/total*100:.1f} %), "
f"**{mayor/menor:.1f} veces menos**. Antes de comparar nada "
f"entre estos dos grupos, pregúntate POR QUÉ están tan "
f"desiguales: si el desequilibrio viene de quién decidió "
f"entrar en estos datos, cualquier comparación entre los "
f"grupos puede estar midiendo esa decisión y no lo que crees "
f"que mide."
),
})
escasos = conteo[conteo < 5]
if not escasos.empty:
avisos.append({
"tipo": "grupos_pequenos",
"texto": (
"Hay categorías con menos de 5 casos: "
+ ", ".join(f"'{g}' ({int(n)})" for g, n in escasos.items())
+ ". Cualquier media o porcentaje calculado sobre tan pocos "
"casos se mueve muchísimo si cambia uno solo."
),
})
datos.update({
"n": total,
"grupos": {str(g): {"casos": int(n), "porcentaje": round(n / total * 100, 1)}
for g, n in conteo.items()},
})
return _a_png(figura)
El generador: las constantes
Aquí está toda la trampa declarada. La puntuación no depende del sexo. La confianza sí. Apuntarse depende de la confianza.
SEMILLA = 20260848
SALIDA_CURSO = "prueba_todo_el_curso.csv"
SALIDA_OLIMPIADA = "olimpiada_programacion.csv"
NUMERO_ALUMNOS = 300
PROPORCION_CHICAS = 0.507 # 152 chicas y 148 chicos
# --- Puntuacion: IDENTICA para los dos sexos. El sexo no entra aqui. ---
PUNTUACION_MEDIA = 58.0
PUNTUACION_DESVIACION = 15.0
# --- Confianza declarada (1 a 10) ---
# Depende de la puntuacion... y del sexo. Esa penalizacion es la que
# reproduce el hallazgo de Else-Quest y otros (2010): a rendimiento casi
# identico, ellos declaran mejores actitudes que ellas.
CONFIANZA_BASE = 5.4
CONFIANZA_POR_PUNTO = 0.055 # cuanto sube la confianza por punto de nota
PENALIZACION_CONFIANZA_CHICAS = -1.35
CONFIANZA_RUIDO = 1.15
# --- Apuntarse a la olimpiada: depende de la CONFIANZA, no de la nota ---
UMBRAL_APUNTARSE = 5.4
RUIDO_DECISION = 0.9
El generador: el curso completo
Los tres pasos comentados uno por uno. Lee el orden: primero la puntuación, sin mirar el sexo; después la confianza, mirándolo; y al final la decisión, que mira la confianza y no la nota.
def generar_curso():
aleatorio = random.Random(SEMILLA)
filas = []
numero_chicas = round(NUMERO_ALUMNOS * PROPORCION_CHICAS)
sexos = ["chica"] * numero_chicas + ["chico"] * (NUMERO_ALUMNOS - numero_chicas)
aleatorio.shuffle(sexos)
for indice, sexo in enumerate(sexos, start=1):
# 1. La puntuacion se genera SIN mirar el sexo.
puntuacion = aleatorio.gauss(PUNTUACION_MEDIA, PUNTUACION_DESVIACION)
puntuacion = limitar(puntuacion, 0.0, 100.0)
# 2. La confianza si depende del sexo, a igual puntuacion.
confianza = (CONFIANZA_BASE
+ CONFIANZA_POR_PUNTO * (puntuacion - PUNTUACION_MEDIA)
+ (PENALIZACION_CONFIANZA_CHICAS if sexo == "chica" else 0.0)
+ aleatorio.gauss(0, CONFIANZA_RUIDO))
confianza = limitar(confianza, 1.0, 10.0)
# 3. Apuntarse depende de la confianza, no de la nota.
decision = confianza + aleatorio.gauss(0, RUIDO_DECISION)
se_apunto = "si" if decision >= UMBRAL_APUNTARSE else "no"
filas.append({
"alumno_id": f"E{indice:04d}",
"sexo": sexo,
"puntuacion": round(puntuacion, 1),
"confianza_declarada": round(confianza, 1),
"se_apunto_olimpiada": se_apunto,
})
return filas
El generador: cómo se fabrica el archivo sesgado
Cuatro líneas y una decisión de diseño que es la clave del ejercicio.
def extraer_olimpiada(filas_curso):
"""El archivo de la olimpiada, tal como existiria en el mundo real.
Se queda SOLO con quien se apunto, y ADEMAS pierde dos columnas: la
confianza declarada y la marca de haberse apuntado. Eso no es un descuido
del ejercicio, es lo que pasa de verdad: el registro de una competicion
guarda quien participo y como le fue, no por que los demas no vinieron.
Sin esas columnas, el sesgo es indetectable desde dentro del archivo."""
return [
{"participante_id": f"O{numero:04d}",
"sexo": fila["sexo"],
"puntuacion": fila["puntuacion"]}
for numero, fila in enumerate(
(f for f in filas_curso if f["se_apunto_olimpiada"] == "si"), start=1)
]
El tamaño del efecto
Para poder comparar nuestras diferencias con el d = 0,05 del metaanálisis de Lindberg. Es la fórmula estándar con la desviación típica agrupada.
def d_de_cohen(grupo_a, grupo_b):
"""Tamano del efecto entre dos grupos, para poder compararlo con el
d = 0,05 del metaanalisis de Lindberg y otros (2010)."""
if len(grupo_a) < 2 or len(grupo_b) < 2:
return None
media_a, media_b = statistics.fmean(grupo_a), statistics.fmean(grupo_b)
var_a, var_b = statistics.variance(grupo_a), statistics.variance(grupo_b)
n_a, n_b = len(grupo_a), len(grupo_b)
agrupada = (((n_a - 1) * var_a + (n_b - 1) * var_b) / (n_a + n_b - 2)) ** 0.5
return (media_a - media_b) / agrupada if agrupada else None
Para volver a generar los dos archivos:
python generar_ejemplo_sesgo.py
La semilla es fija, así que salen siempre idénticos, e imprime un informe con todas las cifras de esta entrada para que puedas comprobarlas una por una.
Lo que METIS sigue sin hacer
- No ejecuta código generado por la IA. Ni aquí ni en ningún otro paso, y no va a cambiar.
- No filtra filas ni cruza dos columnas de categorías. Es la limitación que más se ha notado en este paso: la tasa de inscripción por sexo hay que sacarla fuera. Es el candidato más claro para la versión siguiente.
- No suma columnas por grupo, solo promedia. Por eso el paso J se hace con dos gráficas y una división.
- No sabe qué mide tu tabla. El aviso de
grupos_pequenosen Berkeley es correcto como regla general y equivocado en ese caso concreto. Un aviso automático no sustituye a saber de dónde salen tus datos: sustituye a no mirarlos.
El paso siguiente
El paso 4 y último de esta secuencia: el volumen. Qué cambia de verdad entre analizar 100 filas y 1.000, y qué no cambia nada. Medido, con el reloj en la mano y en el ordenador del aula, no en teoría.
Pero eso será otra entrada.



