Ranked Choice NL

Exploration into different voting systems for the Netherlands. Simulating the 2025 Tweede Kamer elections under the normal proportional system, ranked choice, first passed the pole, two round run off and median voter.

DOsinga/ranked_choice_nl

The Dutch use proportional representation: every vote counts toward the national seat allocation. Other countries divide the country into districts and pick one winner per district. What would the 2025 Tweede Kamer election have looked like under those alternative systems? Each of the 343 gemeenten is treated as a single-member district. Click between systems to compare.

Parliament

Seat allocation

PartySeats%

How this works

The 2025 election results are public, broken down by gemeente (Dutch municipality). For each of the 343 gemeenten we know exactly how many votes each party got. The actual Dutch system pools all votes nationally and assigns seats proportionally — there are no district winners. But to simulate district-based systems we treat each gemeente as a single-member constituency and compute a winner per gemeente.

Each party gets a position on a left-to-right political spectrum (0 = far left, 10 = far right) using positions from the 2024 Chapel Hill Expert Survey. SP, GL-PvdA, and PvdD sit on the left; D66, CDA, and Volt around the center; VVD, JA21, PVV, and FvD on the right. This ordering is the only thing the simulation needs beyond the actual votes.

First Past the Post

Whichever party got the most votes in a gemeente wins it. No spectrum needed. PVV won the most votes in the Netherlands overall, so PVV wins the most gemeenten — but with only ~17% of the vote nationally, those wins typically come on a 25-30% plurality.

Two-Round Runoff

Top two parties advance. The other parties' voters then split between the two finalists based on which is closer on the spectrum. The midpoint between the two finalists' positions is the divider — voters left of it go to the more left-wing finalist, voters right go to the right-wing one. The finalist with more total votes wins.

Ranked Choice (Instant Runoff)

Repeated rounds. Each round, the smallest party is eliminated and its voters get redistributed. In a 1-D spectrum model, an eliminated party's voters split between its two surviving neighbors — voters on the left half of its support range go to the surviving neighbor on the left, voters on the right half to the right neighbor. The split point is always the midpoint between the two surviving neighbors' original positions, not the running tally.

We add a small twist: when redistributing, only 80% of voters follow the spectrum-based logic. The remaining 20% scatter proportionally to all surviving parties, modeling voters whose preference was idiosyncratic (single issue, specific candidate) rather than purely ideological. Without this softening, extreme parties get crushed harder than they probably would in reality.

Median Voter

Sort all the gemeente's voters left-to-right. Whichever party contains the 50th-percentile voter wins. This is the theoretical sweet spot of any ranked-preference system: in a 1-D model, the median voter's preferred party is the Condorcet winner against any other candidate. Real RCV doesn't quite reach this ideal — big wing parties can survive past their median-voter death knell — but it's a useful reference point.

Proportional Representation

What the Netherlands actually uses, applied per gemeente as a counterfactual. There's no single winner per district, so the map shows each gemeente as diagonal stripes in the colors of its top 2 or 3 parties (depending on whether the top party clears 40%, the top two clear 40%, or otherwise). The parliament diagram shows the seat allocation if all national votes were translated to seats proportionally over 343 seats.

The simulation has obvious limitations. The 1-D left-right spectrum isn't how voters actually rank parties — Dutch politics has religious, urban-rural, and EU dimensions that don't map onto a single axis. Centrist parties like CDA and D66 sit close together on the spectrum but are quite different in practice. Treat the results as a thought experiment rather than a prediction.

Source

Election results from data.overheid.nl (Kiesraad, CC-0). Gemeente boundaries from PDOK. The simulation code, including the matplotlib pipeline that produces the striped proportional background, is in the GitHub repo.

Downloads

ranked_choice.py
Voting system simulations (FPTP, RCV, runoff, median)
export_data.py
Pipeline that produces the GeoJSON and results.json