Introduction
Understanding voting behavior in the European Parliament (EP) is essential for analyzing European decision-making processes (Carrubba and Gabel Reference Carrubba and Gabel1999). While Members of the European Parliament (MEPs) belong to transnational political groups, their actual votes often tell a more complex story (Hix, Noury and Roland Reference Hix, Noury and Roland2009): issue-specific coalitions emerge, unexpected alliances form, and party groups exhibit varying levels of unity. There is a large body of literature analyzing roll-call voting data in the EP to address various research questions, such as party cohesion, coalition formation, and ideological alignment (eg Hix, Noury and Roland Reference Hix, Noury and Roland2007; Hix, Noury and Roland Reference Hix, Noury and Roland2009; Cherepnalkoski, Karpf, Mozeti et al. Reference Cherepnalkoski, Karpf, Mozetič and Grčar2016). Simply knowing an MEP’s party affiliation does not always predict their vote (Hix, Noury and Roland Reference Hix, Noury and Roland2007; Cherepnalkoski et al. Reference Cherepnalkoski, Karpf, Mozetič and Grčar2016). This complexity is intriguing and crucial for understanding EU policy and requires flexible ways to explore the data without rigid assumptions (Méndez, Moreno and Mendoza Reference Méndez, Moreno and Mendoza2022).
To support such exploratory research, this article introduces ParliamentLab, an interactive application that provides intuitive access to EP roll-call votes, covering the period from 2004 to 2022. ParliamentLab consolidates publicly available datasets from VoteWatch.eu (Hix, Frantescu and Hagemann Reference Hix, Frantescu and Hagemann2022) and Parltrack.eu (Parltrack Community 2025), integrating detailed voting records with biographical information and attendance data (Høyland, Sircar and Hix Reference Høyland, Sircar and Hix2009). The resulting structured dataset, combined with an interactive interface, significantly lowers the barrier to empirical research and public engagement with EP data.
Previous approaches to studying EP voting behavior primarily relied on static data presentations, either through traditional datasets or existing platforms such as VoteWatch.eu and Parltrack.eu. These tools, although valuable (Hix, Noury and Roland Reference Hix, Noury and Roland2006; Bressanelli, Koop and Reh Reference Bressanelli, Koop and Reh2016), are often limited to predefined metrics such as voting loyalty or party cohesion and typically do not provide users with interactive or exploratory functionalities (Kaniok and Mocek Reference Kaniok and Mocek2017; Michon and Wiest Reference Michon and Wiest2021). In contrast, legislative behavior analysis in the United States frequently benefits from interactive and exploratory tools that encourage hypothesis-driven research and public engagement (Bell, Bach and Kauer Reference Bell, Bach and Kauer2022; Méndez, Moreno and Mendoza Reference Méndez, Moreno and Mendoza2022). ParliamentLab directly addresses this gap by providing interactive visualizations and exploratory workflows, thus allowing a more flexible and user-driven exploration of voting patterns in the European Parliament context (Méndez, Moreno and Mendoza Reference Méndez, Moreno and Mendoza2022). This opens up a wide range of practical questions: Do Members from different countries within the same group vote differently on climate policy? Which MEPs most frequently deviate from their party line, and in which policy areas? How do coalition patterns shift across legislative terms? Are highly active MEPs also more likely to attend and win votes?
With ParliamentLab we aim to bridge the gap between the vast amount of available raw data and the practical need to explore it, ask questions, and generate hypotheses. This makes the application particularly suited for educational contexts, journalistic investigations, and preliminary academic research, where interactive data exploration is beneficial. Our core goals were accessibility, openness, and usability. Its open and modular code structure enables further community-driven extensions and enhancements, ensuring its continued relevance and adaptability to evolving research questions.
Data sources, preparation and feature engineering
While parliamentary voting data is increasingly available, it is often not readily accessible in a format that encourages genuine exploration. Existing sources are often limited to static presentations, require technical skills to analyze or focus on predefined metrics such as group loyalty. This motivated the development of the web app. The merged dataset used in this study combines roll-call voting records with metadata on MEPs, covering the period from 2004 to 2022. It draws on two publicly available sources: VoteWatch (Hix, Frantescu and Hagemann Reference Hix, Frantescu and Hagemann2022) and Parltrack (Parltrack Community 2025).
VoteWatch Europe, active from 2009 until its closure in 2022, provided structured records of plenary votes in the European Parliament. The platform made available vote-level data for each MEP, including decisions categorized as Yes, No, Abstain, and different forms of Not Present. This dataset spans four legislative terms and comprises over 36,000 roll-call votes.
Parltrack supplements this with biographical and institutional metadata, including nationality, gender, political group affiliation, committee memberships, and parliamentary activity such as authored reports and motions. Combining these sources allows researchers to get a more detailed insight into legislative life.
To harmonize the data, all voting records were merged together in a dataset, where each observation represents the voting decision of a specific MEP in a specific roll-call. Group names were standardized to ensure comparability across legislative periods. The same applies to inconsistencies in metadata, for example, variations in national party labels or political group codes. Missing values occur mainly for biographical attributes. Values in variables such as place and date of birth were added manually where possible. Committee activity and authored reports, retrieved through the Parltrack API, were retained even where some entries were missing, as the absence of recorded activity often reflects actual parliamentary behavior rather than data gaps. Due to turnover and resignations, the number of entries per term exceeds the number of official seats. Abstentions and non-participation were recorded as distinct categories, preserving the difference between deliberate dissent and absence. No MEPs were excluded at this stage.
In addition to the raw vote data, several variables were generated to support interpretation and the exploratory analysis. These include the following:
-
• Attendance Index: proportion of roll-call votes attended by each MEP.
-
• Loyalty Index: share of votes cast in line with the majority position of the MEP’s European Political Group (EPG).
-
• Activity Index: calculated as the (weighted) average of an MEP’s recorded activity counts over all available activity dimensions, ignoring missing values:
$A{I_i} = {{\sum\nolimits_{k = 1}^K {{w_k}\cdot{a_{ik}}} } \over {\sum\nolimits_{k = 1}^K {{w_k}\cdot1\left( {{a_{ik}} \ne {\rm{NA}}} \right)} }}$
where
${a_{ik}}$
is the raw count of activity
$k$
for MEP
$i$
,
${w_k}$
is the weight assigned to activity
$k$
(defaulting to
$1$
for all
$k$
), and the denominator sums only over non-missing entries.
-
• Winning Index: frequency with which an MEP voted on the winning side in the plenary.
-
• Domain-specific voting scores: every roll-call is tagged with an OEIL (European Legislative Observatory) policy label (eg economy, civil liberties, environment, foreign affairs). Votes are coded as
$ +\! 1$
(yes),
$ - \!1$
(no) or 0 (abstain/absent) and averaged within each domain, optionally weighted by vote salience. Vote salience here indicates whether the calculation includes all roll-calls or is restricted to final votes only. The resulting value (rescaled to
$\left[ {0,1} \right]$
) summarizes how consistently an MEP supports legislation in that policy area.
These indicators were calculated as illustrative examples and are not intended as definitive measures. Rather than prescribing a specific weighting or aggregation method, options inside the application allow users to explore and interpret these features flexibly. The full data processing workflow has been implemented in R, with all scripts and documentation available via GitHub.Footnote 1
ParliamentLab application
ParliamentLab aims to offer low-threshold access to the underlying data in order to make it usable for a broader audience, especially for those interested in generating their own questions rather than testing existing ones.
The application has been developed in R using the Shiny framework (Chang, Cheng, Allaire et al. Reference Chang, Cheng, Allaire, Xie and McPherson2021; R Core Team 2024), which enables an intuitive user interface and dynamic visualizations based on user input. The app is fully self-contained and can be run locally or visited online via ParliamentLab.eu. The application runs directly in modern web browsers without further installations.
We deliberately avoided a fixed outcome and instead built a pipeline process where users can compare, interpret, and adjust freely. Thus, the application is not tied to a specific research question. Instead, it is intended as a tool to support exploratory approaches – for example, identifying unexpected coalitions, examining national deviations or looking into individual MEP behavior across legislative terms. Users make active choices about how data is handled: how strictly to filter it, whether to remove outliers, how to define specific features or metrics. A key aspect of the tool is showing the immediate consequences of these choices. Changing a filter setting or tweaking how a feature is calculated visibly alters the resulting graphs and tables.
While research questions long for objective answers, the process of finding them yields decisions made by the researcher. ParliamentLab is designed to demonstrate the impact of these decisions.
Functionality overview
The application mirrors the structure of a classical research process. Each tab represents a distinct step in the analysis pipeline, allowing users to follow a coherent path from data selection to interpretation. As a starting point, a legislative period has to be selected. This choice defines the scope of all subsequent data operations. The user can then narrow the dataset by applying their own rules regarding the handling of missing data or the identification of outliers. These selections are carried over to all views in the application.
In the Data Preparation and Feature Engineering tab (Figure A3), users are introduced to the structure of the dataset. Key variables such as attendance, loyalty, or voting alignment are precomputed and can be included or excluded from the analysis. Some features, like binned attendance categories or topic-specific indices, can also be adjusted manually. These steps reflect the kind of early-stage decisions that researchers often make before moving to statistical modeling. The user-specified pre-processed data set can be easily downloaded for subsequent use.
The Exploratory Analysis tab (Figure A4) provides tools for visualizing patterns and distributions. Users can examine feature values across political groups or countries, display selected variables as boxplots or histograms, and inspect profiles of individual MEPs. A special component is the interactive parliament plot (Figure 1), which shows MEPs in a semicircular layout inspired by the actual seating order. Clicking on a member reveals detailed biographical data and summary statistics, supporting focused comparisons or outlier detection.
Interactive parliament plot in the Exploratory Analysis tab.
Note: MEPs are arranged in a semicircle reflecting the actual seating order of the European Parliament. Members aged between 30 and 55 are highlighted in color; all others are shown in grey. Clicking on a member reveals a tooltip with biographical data and summary statistics.

Finally, the Clustering tab (Figure A5) allows users to run dimensionality reduction techniques (eg UMAP (McInnes, Healy and Melville Reference McInnes, Healy and Melville2020) or W-NOMINATE (Poole and Rosenthal Reference Poole and Rosenthal2000)) and apply clustering algorithms such as k-means (Jain Reference Jain2010), PAM (Kaufman and Rousseeuw Reference Kaufman and Rousseeuw2009), or HDBSCAN (McInnes, Healy and Astels Reference McInnes, Healy and Astels2017). The outputs are shown as two- or three-dimensional scatterplots, where users can explore how the resulting data-driven grouping relates to the known party affiliation. Furthermore, multiple evaluation metrics, including the Silhouette Score (Rousseeuw Reference Rousseeuw1987), Davies–Bouldin Index (DBI) (Davies and Bouldin Reference Davies and Bouldin1979), and the Caliński–Harabasz Index (CHI) (Caliński and Harabasz Reference Caliński and Harabasz1974), are provided in a separate tab to assess clustering quality. Interactive visualization of the results of the clustering process can be found in the Results tab (Figure A6).
Exploratory workflows and hypothesis generation
One of the key strengths of ParliamentLab lies in its support for open-ended, explorative use. Unlike static dashboards or predefined indicator systems, the application is designed to let users navigate the data freely, combine filters dynamically, and generate their own questions as they interact with the visualizations.
For example, users might start by comparing voting cohesion between two groups in a specific policy area, notice an unexpected alliance, and then zoom in on the individual MEPs responsible for that deviation. Alternatively, they might ask whether newer member states show different voting alignments compared to founding members, or whether MEPs with high attendance rates are more likely to deviate from their party line. Other questions include: do Green MEPs from different countries vote more like each other or like their national coalitions? Are there consistent voting differences between MEPs who hold committee leadership roles and those who do not? This list does not represent the findings of this paper; rather, it includes sample questions that the tool can assist users in answering.
The app supports this kind of iterative inquiry by keeping filtering, visualization, and comparison tightly coupled. Selections made in one panel immediately update the others. This allows users to explore patterns without needing to reload data or re-run scripts, making it particularly well suited for seminar settings, teaching environments, or public communication, where quick access to relevant evidence is often more important than exhaustive analysis. Students and instructors can use the Clustering tab to generate W-NOMINATE or UMAP visualizations that can be directly compared to respective findings and the corresponding figures in the literature (Hix, Noury and Roland Reference Hix, Noury and Roland2006; Hix, Noury and Roland Reference Hix, Noury and Roland2007; Hix and Høyland Reference Hix and Høyland2013).
Example: unsupervised clustering of voting behavior
To illustrate one possible use case, we briefly highlight the clustering module of ParliamentLab. This feature allows users to group MEPs based on their voting patterns without relying on formal party affiliations or ideological labels. The resulting latent coalitions are referred to as ‘silent parties’: blocs of legislators who vote alike but rarely present themselves as a unified actor in public debate. The clusters are visualized in different ways, eg a radar chart on major policy areas (see Figure 3).
Clustering workflow for the 6th European Parliament (2004–2009) based on all roll-call votes.

Cluster analysis of MEP voting behavior.
Note: W-NOMINATE scores along the left–right axis, with MEPs color-coded by data-driven cluster (left). Radar plot showing the average policy positions of each cluster across six issue areas (right).

Users can choose the number of clusters and the algorithm (eg
$k$
-means, PAM, or HDBSCAN), as well as the dimensionality reduction technique used for visualization (eg UMAP or W-NOMINATE). The resulting plot shows each MEP as a point in two-dimensional space, colored by cluster membership.
Consider the voting data from the 6th European Parliament (2004–2009) exemplarily: applying UMAP and HDBSCAN identified five well-separated clusters. These clusters partially align with official party groups but also highlight unexpected voting coalitions. For instance, members of the Green and Left factions form a single cohesive cluster (Cluster 1 in Figure 2(b)), suggesting overlapping preferences, particularly on environmental and civil rights issues. Meanwhile, a shared cluster of MEPs from the European People’s Party (EPP) and the eurosceptic IND/DEM group reveals unexpected alignment on key economic votes, echoing broader trends of cross-cutting issue alignments and ideological complexity in modern legislatures (Dalton Reference Dalton2018). Silhouette Scores and other evaluation metrics confirm that these clusters were moderately well-defined, with HDBSCAN outperforming
$k$
-means in handling heterogeneous densities and detecting outliers.
In another example using data from the 9th Parliament (2019–2022), we identified seven distinct clusters, again reflecting the seven official European Political Groups. Notably, several liberal and Green MEPs were grouped with more conservative factions. By adjusting parameters like the minimum number of points per cluster or selecting only final votes, users can explore how voting alliances shift under different assumptions.
Beyond visualization, ParliamentLab lets users compare data-driven clusters with the official European Parliament groups, making it easy to study intra-party cohesion, cross-party alliances, and ideological drift. By expanding any cluster in the overview table, one can immediately spot MEPs whose voting behavior systematically diverges from their declared affiliations (see Figure 4).
Interactive overview of all data-driven clusters.
Note: The table summarizes key metrics for each cluster (size, age, experience, loyalty, activity, etc.). Expanding a row reveals two widgets: distribution of official parliamentary groups within the cluster (left) and the five most active MEPs based on the activity index (right).

The clustering feature is not intended to produce definitive classifications but to offer a complementary view on parliamentary behavior. It allows users to experiment with alternative groupings and compare them to formal affiliations, potentially raising new questions about coalition-building. As with any unsupervised method, results should be interpreted with care: cluster structures depend on methodological choices such as the selected algorithm, parameter settings, and preprocessing steps. Rather than offering final answers, the feature is designed to support exploration and hypothesis generation, especially in political contexts where alliances are often fluid and situational.
Conclusion
This article introduced ParliamentLab, an interactive tool and dataset for exploring voting behavior in the European Parliament. By integrating detailed roll-call votes with biographical and procedural metadata from publicly accessible sources, the tool lowers the entry barrier to empirical research and enables users to engage with the data in a structured yet flexible way. The full workflow is traceable via the documented pipeline (Appendix A, Figure A1).
ParliamentLab is not tied to a single research question or methodology. Users can filter votes, compare party groups, inspect individual MEPs, and apply clustering methods to uncover alternative voting blocs. These functions are tightly integrated and update dynamically, making the app suitable for both exploratory research and teaching contexts.
All components of the project are openly available and designed to be extended. While the current version focuses on voting data from 2004 to 2022, the structure allows for future updates and adaptation to other parliaments or data sources. We hope that the tool contributes to more transparent and hands-on approaches to studying European politics and that it encourages further experimentation with open, interactive research infrastructure.
Data availability statement
All data and code are available at: https://github.com/john-bruene/parliamentlab.
Author contributions
J.F.B.: Conceptualization, implementation, analysis, writing. S.P., E.B.: Conceptualization, interpretation, critical revision.
Financial support
The first author is supported by the European Union’s Horizon Europe Marie Skłodowska-Curie COFUND program under grant agreement No. 101126733 (FutureData4EU). Views and opinions expressed are, however, those of the author(s) only and do not necessarily reflect those of the European Union or the European Research Executive Agency.
Competing interests
The authors declare no conflict of interest.
Ethical standards
Not applicable.
Consent for publication
Not applicable.
AI assistance
Artificial intelligence tools were used to assist with modifications to R code, including adjustments to plotting functions and the Shiny application structure. All AI-assisted code was reviewed, tested, and validated by the authors. The final research design, methodological choices, and scientific interpretation remain the sole responsibility of the authors.
Appendix A
Illustration of the data pipeline for clustering.
Note: Starting from raw datasets and culminating in clustering results. Dimensionality reduction methods (UMAP, MCA, W-NOMINATE) and clustering quality metrics (Silhouette, DBI, CHI, Elbow) are applied to ensure robust groupings.

Introduction tab.
Note: This tab describes the problem and goals of the analysis.

Data preparation tab.
Note: This tab provides tools for cleaning, filtering, and transforming the dataset.

Data exploration tab.
Note: Users can explore summary statistics and visualize data distributions here.

Figure A4. Long description
Panel A: The box plot shows the distribution of loyalty scores by political group. The x-axis lists different political groups, and the y-axis represents the loyalty score ranging from 0 to 1. Each box plot displays the median, interquartile range, and potential outliers for the loyalty scores within each political group. Panel B: The country map visualizes the average loyalty score per country. Countries are color-coded based on their average loyalty score, with a legend indicating the score range. Panel C: The table lists the top and bottom countries ranked by their average loyalty score. The table includes columns for country names, average loyalty scores, and ranks. Panel D: The politician details section shows a photo of a politician with their name, political group, country, and age. Panel E: The Parliament View section displays a circular plot with politicians grouped by their political affiliations, color-coded according to a legend.
Dimension reduction and clustering tab.
Note: This tab applies methods like MCA and UMAP and visualizes clustering results.

Results page.
Note: This tab summarizes the outcomes of the clustering analysis with visualizations and interpretations.
