Resumen

El análisis de co-votación mide con qué frecuencia cada par de legisladores vota de la misma manera en eventos de votación nominal, y construye una red ponderada a partir de esas similitudes pareadas. Esta página presenta la extensión dinámica: en lugar de una única instantánea estática, el pipeline segmenta el registro completo en ventanas temporales y rastrea cómo evolucionan la disciplina, la estructura comunitaria y la alineación de coaliciones a lo largo del tiempo.

Visualización: Disciplina Partidista

Grado de cohesión interna de cada fracción parlamentaria a través de las ventanas temporales. Valores cercanos a 1.0 indican alta disciplina.

Abrir gráfico interactivo →

Visualización: Evolución de Redes

Modularidad (fragmentación de bloques) y densidad del grafo por ventana temporal.

Abrir gráfico interactivo →

Construcción de la Matriz de Co-Votación

La matriz de co-votación es la base de todo el análisis de redes. Su construcción sigue un pipeline determinista:

  1. Carga de datos — votos, personas y organizaciones desde SQLite.
  2. Normalización de partidosnormalize_party() mapea valores mixtos de vote.group a IDs canónicos de organización usando el mapeo ORG_TO_SHORT (ej. O01MORENA, O02PT).
  3. Asignación de partido primarioget_primary_party() asigna cada legislador al partido donde emitió más votos. Empates se resuelven por la membresía con start_date más reciente.
  4. Construcción de la matrizbuild_covotacion_matrix() produce una matriz numpy NxN donde la entrada (i, j) es el conteo normalizado de acuerdos entre los legisladores i y j, en el rango de 0.0 a 1.0.
  5. Construcción del grafobuild_graph() convierte la matriz en un grafo NetworkX con:
    • Nodos: legisladores, con atributos de partido (PARTY_COLORS), género y cámara.
    • Aristas: pares de co-votación, con weight = similitud normalizada.

El grafo resultante es la entrada para detección de comunidades, centralidad y todos los módulos subsiguientes. Los colores siguen PARTY_COLORS (paleta matplotlib) y el ordenamiento de nodos respeta PARTY_ORDER.

Detección de Comunidades (Louvain)

El pipeline utiliza nx.community.louvain_communities() de NetworkX (no el paquete independiente python-louvain) para detectar comunidades de legisladores que votan de manera similar, yendo más allá de las etiquetas formales de partido para revelar bloques de votación reales.

Algoritmo

detect_communities(graph, resolution=1.0, seed=42)

Louvain realiza una optimización iterativa en dos fases:

  1. Movimiento local — cada nodo se mueve a la comunidad vecina que produce la mayor ganancia de modularidad.
  2. Agregación — las comunidades se colapsan en supernodos y el proceso se repite.

El parámetro seed=42 (LOUVAIN_SEED) garantiza reproducibilidad entre ejecuciones. El parámetro resolution (LOUVAIN_RESOLUTION, por defecto 1.0) controla la granularidad de las comunidades:

ResoluciónEfecto
< 1.0Menos comunidades, más grandes (más grueso)
1.0 (por defecto)Modularidad estándar
> 1.0Más comunidades, más pequeñas (más fino)

Salida

detect_communities() retorna un diccionario de partición: {node_id: community_id}.

analyze_communities() produce un análisis detallado por comunidad:

  • num_communities — total de comunidades detectadas
  • sizes — conteo de miembros por comunidad
  • composition — conteo y porcentaje de cada partido dentro de la comunidad
  • purity — porcentaje del partido dominante (100% = bloque puro de partido)
  • cross-party legislators — individuos cuya comunidad difiere de su partido formal
  • MORENA sub-blocks — detección de facciones internas dentro de MORENA
  • modularity — puntaje de modularidad general de la partición

:::tip Una comunidad con pureza inferior al 70% señala una coalición genuina entre partidos, no solo una etiqueta partidista. Estas comunidades mixtas suelen revelar alianzas legislativas reales. :::

Estrategias de Ventanas Temporales

El módulo de co-votación dinámica (covotacion_dinamica.py, 829 líneas) segmenta los registros de votación en ventanas temporales y analiza cada una de forma independiente. Tres estrategias están disponibles:

Ventanas Fijas

La línea temporal se divide en intervalos de igual longitud. Cada ventana contiene todos los eventos de votación dentro de su rango de fechas. Esto provee instantáneas consistentes y no superpuestas.

Ventanas Expansivas

Cada ventana subsiguiente incluye todos los datos previos más el período nuevo. Ventana 1 = período 1; Ventana 2 = períodos 1–2; Ventana N = períodos 1–N. Útil para rastrear la formación acumulativa de coaliciones.

Ventanas Deslizantes

Una ventana de ancho fijo se desliza hacia adelante en el tiempo, produciendo instantáneas superpuestas. Esto suaviza el ruido de votos individuales y resalta cambios graduales en la alineación.

Tamaño Mínimo de Ventana

Todas las estrategias imponen un umbral mínimo:

MIN_EVENTS_PER_WINDOW = 30

Las ventanas con menos de 30 eventos de votación se fusionan con la ventana precedente para garantizar validez estadística. Esto previene detección espuria de comunidades a partir de muestras diminutas.

ARI (Índice Rand Ajustado)

El Índice Rand Ajustado mide la estabilidad de las particiones comunitarias entre ventanas temporales consecutivas. Compara dos agrupamientos contando pares de elementos que son asignados al mismo o diferente clúster en ambas particiones.

Valor ARIInterpretación
1.0Acuerdo perfecto — particiones idénticas
0.0Solapamiento aleatorio — no más similar que el azar
< 0.0Desacuerdo sistemático — menos solapamiento del esperado por azar

Un ARI persistentemente alto (superior a 0.7) entre ventanas indica una estructura de coalición estable. Una caída repentina señala un evento de realineación — una votación legislativa importante, cambio de liderazgo o escisión partidista que interrumpió los patrones normales de votación.

Filtrado Bicameral y de Coaliciones

El pipeline soporta análisis separado y combinado del legislativo bicameral de México:

  • Mapeo de cámara: CAMARA_MAP mapea diputadosD y senadoS.
  • Análisis por cámara: los grafos de co-votación pueden construirse para cada cámara de forma independiente, reflejando las dinámicas políticas distintas de cada una.
  • Filtrado de coaliciones: el pipeline puede filtrar registros de votación para incluir solo eventos donde coaliciones específicas estuvieron activas, habilitando análisis focalizado del comportamiento de alianzas.

Esto es crítico porque los patrones de votación entre cámaras difieren significativamente — los senadores tienden a mostrar mayor disciplina partidista que los diputados, y las estructuras de coalición varían entre cámaras.

Soporte Multi-Legislatura

El módulo soporta análisis que abarca múltiples legislaturas usando LEGISLATURAS_ORDERED, el ordenamiento canónico de los períodos legislativos. Esto permite:

  • Seguimiento longitudinal de disciplina — cómo cambia la cohesión interna de un partido a lo largo de legislaturas sucesivas.
  • Evolución comunitaria — qué legisladores cambian de comunidad entre legislaturas, y qué implica eso sobre la realineación de coaliciones.
  • Comparación entre períodos — legisladores que sirvieron en múltiples legislaturas pueden ser rastreados mientras se mueven a través del espacio político.

El modo multi-legislatura difiere del análisis por legislatura individual en que preserva una identidad de nodo consistente entre ventanas, permitiendo comparación longitudinal directa del comportamiento de co-votación del mismo legislador a lo largo del tiempo.

Detección de Desalineación

El pipeline incluye detección automatizada de desalineación — cambios significativos en los patrones de co-votación que indican que un legislador o partido se está alejando de sus aliados tradicionales.

Mecanismo

DEALIGNMENT_THRESHOLD = -0.05

Para cada legislador, el módulo calcula el cambio en la similitud promedio de co-votación con su propio partido entre ventanas consecutivas. Si el cambio cae por debajo de DEALIGNMENT_THRESHOLD (una caída mayor a 0.05), ese legislador es marcado como desalineado.

Interpretación

La desalineación no significa necesariamente que un legislador esté desertando. Causas comunes incluyen:

  • Divisiones por tema — la línea del partido divergió de la posición del legislador en una serie de votos.
  • Realineación de coaliciones — el partido cambió su estructura de alianzas, dejando atrás a algunos miembros.
  • Deriva ideológica personal — el legislador se está alejando genuinamente del centro del partido.

El módulo también rastrea TOP_DISSIDENTS_PER_WINDOW (por defecto: 5), clasificando a los disidentes más frecuentes en cada ventana por el número de votos emitidos en contra de la mayoría del partido.

:::tip La desalineación persistente a través de múltiples ventanas es una señal temprana fuerte de cambio de partido o formación de facciones. La desalineación en una sola ventana suele ser solo ruido de una votación inusual. :::