Parlamentos
Indicadores calculados sobre una cámara enteraPara cada par de miembros que votó en las mismas votaciones, la concordancia es la proporción de votaciones comunes en las que emitieron el mismo voto (sí, no, abstención o ausente), donde ausente concuerda con ausente. Un miembro necesita al menos 20 votaciones contabilizadas y un par al menos 20 votaciones comunes para aparecer. El mapa de calor de partidos promedia estas concordancias por pares sobre cada par de partidos no ordenado (con una semiamplitud de confianza al 95 % de 1,96·σ/√n). El diagrama de dispersión reduce la matriz de concordancia a dos dimensiones mediante escalamiento multidimensional clásico: las distancias d = 1 − concordancia se centran doblemente en B, se desplazan a B + σI (cota de Gershgorin) para hacerla semidefinida positiva, y los dos vectores propios más positivos dan las coordenadas. La disposición se inicializa de forma determinista y por eso nunca tiembla entre recargas.
Cómo se calculaagreement(a,b) = |{ ballots where vote_a = vote_b }| / |shared(a,b)|
distance d = 1 − agreement
B = −½ · J · (D∘D) · J (double-centred squared distances)
B' = B + σ·I, σ = maxᵢ Σⱼ |Bᵢⱼ| (Gershgorin PSD shift)
coords = 2 most-positive eigenvectors of B'
Dónde aparece- /parliaments/:id/alignment
Para cada votación, la línea de un grupo parlamentario es la posición (sí, no o abstención) que una estricta pluralidad de sus votantes adoptó; los empates, y los grupos con menos de 4 votantes en esa votación, no se contabilizan. Un miembro disiente cada vez que su voto difiere de la línea de su grupo; su tasa de disidencia es disidencias ÷ votaciones contabilizadas (los miembros con menos de 10 votaciones contabilizadas se descartan). Se usa el grupo en el momento del voto, con repliegue al partido actual del miembro donde no existe una instantánea (p. ej. Liechtenstein). La cohesión de un grupo es el índice de acuerdo medio (Hix–Noury–Roland) sobre sus votaciones: 1 cuando un grupo vota en bloque, 0 cuando se divide por igual en tres.
Cómo se calculagroup line = strict plurality of {yes, no, abstain} (≥ 4 voters, no tie)
dissent_rate(m) = dissents(m) / scored_ballots(m) (m needs ≥ 10 ballots)
cohesion (AI) = [ max(Y,N,A) − ½·((Y+N+A) − max(Y,N,A)) ] / (Y+N+A)
Los miembros y las organizaciones que declaran en el registro de intereses forman un grafo bipartito; solo se conservan las organizaciones vinculadas a al menos 2 miembros, de modo que la imagen muestra conexiones compartidas en lugar de mandatos aislados. Cada vínculo declarado se clasifica como remunerado, no remunerado o desconocido (primero el código armonizado, luego un repliegue textual en alemán / francés / italiano), y remunerado prevalece sobre no remunerado que prevalece sobre desconocido cuando un miembro tiene varios vínculos con una misma organización. La red se dispone con una simulación de fuerzas Fruchterman-Reingold determinista: longitud de arista ideal k = √(área/n), repulsión k²/distancia, atracción distancia²/k, en 300 iteraciones con enfriamiento. No se usa ninguna aleatoriedad, por lo que el grafo permanece estable entre recargas.
Cómo se calculagraph = members ↔ organisations declared by ≥ 2 members
k = √(area / n) (ideal edge length)
repulsion = k² / distance, attraction = distance² / k
layout = 300 Fruchterman–Reingold iterations, cooling ×0.985
Los discursos de cada miembro activo en una ventana temporal común se tokenizan y se filtran de palabras vacías por idioma, y luego se reducen a un documento de conteos de palabras por miembro. Wordfish (Slapin & Proksch 2008) ajusta un modelo de Poisson E[y] = exp(α + ψ + β·θ) mediante regresiones de Poisson alternas y sitúa a cada orador en una única escala latente θ solo a partir de la elección de palabras: α es la locuacidad, ψ la frecuencia de una palabra y β cuán nítidamente una palabra discrimina. El ajuste está endurecido (acotado, con medio paso, regularizado con ridge) e inicializado de forma determinista. η² (la proporción de la varianza de θ explicada por el partido) se muestra al lado, y el eje usa un dominio robusto del percentil 2 al 98 para que un puñado de oradores parcos y de alta varianza no fije la escala.
Cómo se calculaE[y_ij] = exp( α_i + ψ_j + β_j · θ_i ) (Wordfish, Poisson)
θ_i = speaker position α_i = talkativeness
ψ_j = word frequency β_j = word discrimination
η² = SS_between(party) / SS_total (θ variance explained by party)
Dónde aparece- /parliaments/:id/discussion
- /experiments/wordfish
Personas
Indicadores para un solo miembroCada transcripción de discurso de un miembro se limpia de HTML, se pone en minúsculas y se divide en los caracteres no alfabéticos en tokens de más de un carácter (se conservan los acentos, se descartan cifras y puntuación). Cada token se filtra contra la lista de palabras vacías del idioma propio del discurso, de modo que los discursos alemanes y franceses de un miembro bilingüe se limpian con la lista correcta. El resultado son las palabras más frecuentes del miembro (las 120 primeras con un conteo de al menos 2, en una ventana de fechas opcional), dibujadas como un treemap cuadrificado dimensionado según el conteo.
Cómo se calculatokens = lowercase(strip_html(text)) split on [^\p{L}]+, length > 1
keep = tokens NOT IN stopwords[ speech language ]
result = top 120 words with count ≥ 2 → squarified treemap
Es la mitad por pares de la afinidad de voto, vista desde un miembro: sobre las votaciones en que ambos votaron, la concordancia con cada otro miembro es coincidencias ÷ votaciones comunes (ausente concuerda con ausente). Los pares que comparten menos de 10 votaciones se ocultan como ruido, y la lista puede reencuadrarse a un rango de fechas. A diferencia del diagrama de dispersión del parlamento, no se aplica ninguna reducción de dimensionalidad. Es una lista ordenada de vecinos.
Cómo se calculaagreement(subject, other) = matches / shared_ballots (absent = absent)
keep pairs with shared_ballots ≥ 10 → ranked neighbour list
Cada entrada del registro de intereses se ordena en remunerada, no remunerada o desconocida: prevalece primero el código de remuneración armonizado (no remunerado y honorario cuentan ambos como no remunerado), de lo contrario un repliegue por palabras clave en alemán / francés / italiano lee la descripción en texto libre. Las entradas se agrupan por nombre de organización normalizado para agregar los mandatos de un miembro por organización. Esta misma regla alimenta el reparto remunerado / no remunerado de la red de lobby.
Cómo se calculaclass = paid if harmonised code = paid
unpaid if code ∈ {unpaid, honorary} else de/fr/it text match
else unknown (paid ≻ unpaid ≻ unknown, per organisation)