Saltar para o conteúdo principal

Metodologia

o parlhub não se limita a listar registos: calcula a afinidade de voto, a lealdade de grupo, as redes de lobbying, mapas de palavras e mais a partir dos dados abertos. Esta página expõe com precisão como se obtém cada valor e liga cada indicador ao código-fonte que o produz.

Parlamentos

Indicadores calculados sobre uma câmara inteira

Afinidade de voto

Para cada par de membros que votou nas mesmas votações, a concordância é a proporção de votações comuns em que emitiram o mesmo voto (sim, não, abstenção ou ausente), sendo que ausente corresponde a ausente. Um membro precisa de pelo menos 20 votações contabilizadas e um par de pelo menos 20 votações comuns para aparecer. O mapa de calor dos partidos faz a média destas concordâncias por pares sobre cada par de partidos não ordenado (com uma semi-amplitude de confiança a 95 % de 1,96·σ/√n). O gráfico de dispersão reduz a matriz de concordância a duas dimensões por escalonamento multidimensional clássico: as distâncias d = 1 − concordância são duplamente centradas em B, deslocadas para B + σI (limite de Gershgorin) para a tornar semidefinida positiva, e os dois vetores próprios mais positivos dão as coordenadas. A disposição é inicializada de forma determinista e por isso nunca oscila entre recarregamentos.

Como é calculado
agreement(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'

Lealdade de grupo & coesão

Para cada votação, a linha de um grupo parlamentar é a posição (sim, não ou abstenção) que uma estrita pluralidade dos seus votantes adotou; os empates, e os grupos com menos de 4 votantes nessa votação, não são contabilizados. Um membro dissente sempre que o seu voto difere da linha do seu grupo; a sua taxa de dissidência é dissidências ÷ votações contabilizadas (os membros com menos de 10 votações contabilizadas são descartados). Usa-se o grupo no momento do voto, recuando para o partido atual do membro onde não existe um instantâneo (p. ex. Liechtenstein). A coesão de um grupo é o índice de concordância médio (Hix–Noury–Roland) sobre as suas votações: 1 quando um grupo vota em bloco, 0 quando se divide igualmente em três.

Como é calculado
group 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)

Rede de lobbying

Os membros e as organizações que declaram no registo de interesses formam um grafo bipartido; conservam-se apenas as organizações ligadas a pelo menos 2 membros, de modo que a imagem mostra ligações partilhadas em vez de mandatos isolados. Cada ligação declarada é classificada como remunerada, não remunerada ou desconhecida (primeiro o código harmonizado, depois um recuo textual alemão / francês / italiano), e remunerada prevalece sobre não remunerada que prevalece sobre desconhecida quando um membro tem várias ligações a uma mesma organização. A rede é disposta por uma simulação de forças Fruchterman-Reingold determinista: comprimento de aresta ideal k = √(área/n), repulsão k²/distância, atração distância²/k, ao longo de 300 iterações com arrefecimento. Não se usa qualquer aleatoriedade, pelo que o grafo permanece estável entre recarregamentos.

Como é calculado
graph     = 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

Posicionamento de debates (Wordfish)

Os discursos de cada membro ativo numa janela temporal comum são tokenizados e filtrados de palavras vazias por língua, e depois reduzidos a um documento de contagens de palavras por membro. O Wordfish (Slapin & Proksch 2008) ajusta um modelo de Poisson E[y] = exp(α + ψ + β·θ) por regressões de Poisson alternadas e coloca cada orador numa única escala latente θ apenas a partir da escolha de palavras: α é a loquacidade, ψ a frequência de uma palavra e β quão nitidamente uma palavra discrimina. O ajuste é robustecido (limitado, com meio-passo, regularizado por ridge) e inicializado de forma determinista. η² (a proporção da variância de θ explicada pelo partido) é mostrada ao lado, e o eixo usa um domínio robusto do percentil 2 ao 98 para que um punhado de oradores pouco prolixos e de alta variância não fixe a escala.

Como é calculado
E[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)

Pessoas

Indicadores para um único membro

Vocabulário (frequência de palavras)

Cada transcrição de discurso de um membro é limpa de HTML, passada a minúsculas e dividida nos caracteres não alfabéticos em tokens com mais de um caractere (acentos mantidos, dígitos e pontuação descartados). Cada token é filtrado contra a lista de palavras vazias da língua própria do discurso, de modo que os discursos alemães e franceses de um membro bilingue sejam limpos com a lista certa. O resultado são as palavras mais frequentes do membro (as 120 primeiras com uma contagem de pelo menos 2, numa janela de datas opcional), desenhadas como um treemap quadrificado dimensionado pela contagem.

Como é calculado
tokens = 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

Vizinhos de voto

É a metade por pares da afinidade de voto, vista a partir de um membro: sobre as votações em que ambos votaram, a concordância com cada outro membro é correspondências ÷ votações comuns (ausente corresponde a ausente). Os pares que partilham menos de 10 votações são ocultados como ruído, e a lista pode ser reenquadrada num intervalo de datas. Ao contrário do gráfico de dispersão do parlamento, não se aplica qualquer redução de dimensionalidade. É uma lista ordenada de vizinhos.

Como é calculado
agreement(subject, other) = matches / shared_ballots   (absent = absent)
keep pairs with shared_ballots ≥ 10   →   ranked neighbour list
Onde aparece
  • /people/:id/alignment

Classificação de interesses

Cada entrada do registo de interesses é ordenada em remunerada, não remunerada ou desconhecida: vale primeiro o código de remuneração harmonizado (não remunerado e honorário contam ambos como não remunerado), caso contrário um recuo por palavras-chave alemão / francês / italiano lê a descrição em texto livre. As entradas são agrupadas por nome de organização normalizado para agregar os mandatos de um membro por organização. Esta mesma regra alimenta a repartição remunerado / não remunerado da rede de lobbying.

Como é calculado
class = paid    if harmonised code = paid
        unpaid  if code ∈ {unpaid, honorary}   else de/fr/it text match
        else unknown        (paid ≻ unpaid ≻ unknown, per organisation)

Votações

Como uma votação é desenhada

Hemiciclo de voto

O arco dos assentos é calculado no navegador: adicionam-se anéis até conterem todos os votantes, os assentos são distribuídos pelos anéis pelo método do maior resto ponderado pelo raio do anel, e cada assento é colocado no seu arco e ordenado da esquerda para a direita. As coordenadas são arredondadas a duas casas decimais para que o servidor e o cliente rendam de forma idêntica e a hidratação nunca divirja. Os partidos são coloridos por número de membros decrescente a partir de uma palete fixa, e o arco só é desenhado quando pelo menos 80 % dos votantes têm um assento conhecido.

Como é calculado
rings grown until Σ capacity ≥ N voters
seats per ring = largest-remainder allocation weighted by ring radius
coordinates rounded to 2 dp   (identical SSR + client render)

O próprio site

Indicadores operacionais

Estatísticas de tráfego

Os registos de pedidos são agregados em linhas de factos diárias imutáveis (uma por período, rota, língua, classe de visitante e dispositivo) com contadores aditivos (pedidos, latência somada e máxima) e um histograma de latência de oito classes; os dias com mais de 90 dias são condensados para granularidade mensal. O painel reagrega-os do lado do cliente: contadores e máximos fundem-se diretamente, a média é derivada como latência somada ÷ pedidos, e o percentil 95 é aproximado a partir do histograma (o limite superior da classe que contém o pedido do percentil 95), porque médias e percentis reais não podem ser refundidos a partir de totais armazenados. Os agentes de utilizador são classificados em classe de visitante e dispositivo uma só vez, no momento da agregação, para que as regras permaneçam revisáveis.

Como é calculado
fact = (period, route, lang, visitor, device) → reqs, sum_ms, max_ms, hist[8]
avg  = sum_ms / reqs
p95  ≈ upper edge of the latency bucket holding the 95th request