Ir al contenido
σestadistica.ar

Script

Multivariado

Componentes principales, conglomerados jerárquicos y correspondencias, con las tres preguntas que estos métodos no contestan solos: si tipificar cambia todo, si el enlace cambia los grupos, y si los grupos existen.

Descargar

Proyecto en R y Python · ZIP · 147 KB

En R alcanza con lo que ya trae; en Python hace falta SciPy.

El PCA sin tipificar es un ranking de unidades de medida

Sin tipificar, cada variable pesa según el cuadrado de su unidad. En el ejemplo hay una población en personas, cinco porcentajes y unos años de escolaridad, que es la mezcla de todos los días:

VersiónExplica el primeroPegado aCorrelaciónHasta el 90 %
Sin tipificar100,0 %poblacion1,0001
Tipificada52,3 %hacinamiento0,9045

El de arriba no resume nada: es la población con otro nombre, con correlación 1,000. Y como «explica el 100 % de la varianza», que suena bárbaro, nadie lo mira dos veces. El de abajo necesita 5 componentes para llegar al 90 %, que es la respuesta honesta: estas 8 variables no se dejan resumir en dos.

El enlace cambia los grupos

«Agrupamiento jerárquico» no es un método, son cuatro. Sobre la misma matriz de distancias y pidiendo los mismos cuatro grupos:

EnlaceGruposEl mayorSiluetaAcuerdo con Ward
simple4210,2660,209
completo4130,2920,369
promedio4210,2660,209
ward4140,2641,000

La última columna es el índice de Rand ajustado, que vale uno cuando las dos particiones son la misma. Entre Ward y el simple da 0,209: no son los mismos grupos ni parecido. No hay un enlace correcto; hay uno elegido, y hay que decir cuál.

El simple deja 21 de las 24 jurisdicciones en un solo grupo y el resto casi sueltas. No está roto: encadena, que es lo que su fórmula dice.

Agrupar siempre devuelve grupos

Pedirle cuatro conglomerados a una nube sin ninguna estructura devuelve cuatro conglomerados prolijos, con su dendrograma y todo. Para saber si los grupos dicen algo hay que compararlos contra el caso en que no dicen nada.

El proyecto arma 23 versiones nulas de la tabla: corre cada columna una cantidad distinta de posiciones, con lo cual cada variable conserva exactamente sus valores, su media y su desvío, y lo único que se pierde es con qué fila iba cada uno. Después vuelve a agrupar y mira la silueta.

datos de verdad   0,264
desordenados      de 0,089 a 0,228, mediana 0,137
cuántos ganan     0 de 23

Ninguno lo alcanza, así que hay estructura. Eso no dice que los grupos sean los correctos ni que sean cuatro: dice que no son un invento del método. Y el margen es chico —0,264 contra 0,228—, que es exactamente la clase de cosa que un dendrograma solo nunca deja ver.

Para armar los nulos no hace falta ningún generador de números aleatorios, y por eso los dos idiomas arman exactamente los mismos.

El signo de un componente es arbitrario

eigen de R y numpy.linalg.eigh usan los dos LAPACK y aun así no devuelven lo mismo: eligen distinto el signo de cada autovector. Un componente con el signo cambiado es el mismo componente —las cargas cambian todas de signo a la vez— y es la causa número uno de que dos personas digan que «el PCA les dio distinto».

Este proyecto calcula los autovalores a mano, por el método de Jacobi, y fija el signo con una regla escrita: el elemento de mayor valor absoluto de cada vector queda positivo. Son cuarenta líneas de rotaciones de dos por dos que se leen de arriba abajo.

Esa pieza no usa ninguna suma compensada, y de hecho todo el núcleo numérico del proyecto tampoco: no por precisión —con veinticuatro filas cualquier método alcanza y sobra— sino porque math.fsum de Python y sum de R no dan el mismo último bit. Con sumas comunes en el mismo orden, las dos versiones salen idénticas bit a bit, que es más fuerte que coincidir al redondear.

Las correspondencias

Es el PCA de una tabla de contingencia. En vez de varianza hay inercia, que es exactamente el χ² dividido por el total de casos, y cada eje se lleva una parte de ella. En el ejemplo el primer eje ordena los cinco tramos educativos de menos a más, y los dos primeros se llevan el 95,8 %.

El χ² da 1.478.333 y eso no dice nada. El χ² crece con el total de casos, y acá hay 26,7 millones de personas: con esa cantidad, cualquier desvío rechaza. Lo que mide la fuerza de la asociación es la inercia, que es 0,0553 —una V de Cramér de 0,118—. La asociación existe y es débil; el mapa muestra su forma, no su tamaño.

Dos cosas más que evitan leer mal un mapa. El aporte dice cuánto de un eje lo construyó un solo punto: acá el primero lo arma la Ciudad de Buenos Aires casi sola, con el 79,8 %. La calidad dice cuánto de un punto se ve en los ejes graficados: hay siete que están dibujados y de los que se ve menos de la mitad, o sea que están lejos en una dirección que nadie está mirando.

Los datos son reales

No hay nada simulado. Son 8 indicadores de las 24 jurisdicciones argentinas —población, NBI, hacinamiento, saneamiento, escolaridad, tamaño del hogar, población mayor y desocupación— y la tabla de nivel educativo de las 26,7 millones de personas de 25 y más, todo del Censo 2022. La ficha datos/FUENTES.md dice de qué variable salió cada columna.

Qué deja

ArchivoQué trae
componentes.csvAutovalor, proporción y acumulado de cada componente
cargas.csvLa correlación de cada variable con cada componente, y cuánto queda representada
puntajes.csvCada unidad proyectada sobre los componentes
sin-estandarizar.csvLas dos versiones al lado: la tipificada y la que no
conglomerados.csvEl grupo de cada unidad con los cuatro enlaces, y su silueta
fusiones.csvEl árbol completo: qué se fusionó con qué y a qué altura
silueta.csvPor enlace: tamaños, silueta y acuerdo con el elegido
nulo.csvLa silueta de cada una de las versiones desordenadas
correspondencias.csvLos ejes con su inercia
puntos.csvFilas y columnas con su masa, su aporte a cada eje y su calidad
avisos.csvCada cosa que hay que mirar antes de publicar un número
resumen.csvLas veinticinco cifras del informe, en dos columnas
multivariado.mdEl informe redactado

Lo que no hace

No hace k-medias. El jerárquico no depende de una inicialización al azar, que es lo que hace que dos corridas de k-medias den distinto. Con datos más grandes k-medias es la opción, y merece su propio proyecto.

No rota los componentes —ni varimax ni nada—. La rotación es de análisis factorial, que no es lo mismo que PCA aunque los programas los pongan juntos. Y no hace análisis factorial ni estima comunalidades.

No elige la cantidad de componentes ni de grupos. Deja el gráfico de sedimentación en una tabla, el criterio del autovalor promedio y la silueta; la decisión es de quien escribe.

No imputa faltantes. Una celda que no sea un número lo detiene, con el nombre de la fila y de la columna: rellenarla con la media sería inventar una unidad que no existe.

No dibuja. Deja las coordenadas en un CSV, que es lo que cualquier graficador necesita.

Cómo está verificado

La descomposición escrita a mano se compara contra LAPACK —numpy.linalg.eigh— salvo por el signo, que es justamente lo que ninguno de los dos determina, y contra el otro idioma sin redondear nada: los 72 números que salen de la matriz de correlaciones son idénticos bit a bit en R y en Python. El resto se recalcula con numpy y con scipy —el árbol contra scipy.cluster.hierarchy, la inercia contra la descomposición en valores singulares—. Encima van las identidades que no pueden fallar: los autovalores suman la traza, cada autovector tiene norma uno y son ortogonales entre sí, la varianza de cada puntaje es su autovalor y los puntajes no correlacionan entre ellos, los aportes de cada eje suman uno, las coordenadas ponderadas por la masa dan cero, la inercia total por el total de casos es el χ², y el índice de Rand de una partición contra sí misma vale uno. Corre además tres variantes con otro enlace, otra cantidad de grupos y todos los ejes posibles. Son 2.508 comprobaciones, los veintitrés sabotajes se detectan —trece de ellos rotos en R y en Python al mismo tiempo, para que lo único que pueda verlos sea el recálculo— y R y Python escriben los trece archivos idénticos byte a byte en las cuatro configuraciones.