What would happen if Canada used instant runoff voting for its electoral system?
If the Liberal Party’s platform was a high school, electoral reform would be president of the student council. Restoring the long-form census would be a star mathlete, or maybe a chess player. Marijuana legalization would be captain of the football team, getting more attention than he probably should while his grades go up in smoke, but I digress. Back to elections.
So I was taking a look at the Liberal website and reading their stance on electoral reform. It promised to look into all kinds of good things, but committing only to ending first-past-the-post (leaving pretty much any other system in play).
We are committed to ensuring that 2015 will be the last federal election conducted under the first-past-the-post voting system.
We will convene an all-party Parliamentary committee to review a wide variety of reforms, such as ranked ballots, proportional representation, mandatory voting, and online voting.
Among a number of discussions I’ve seen online, the idea of instant runoff voting has lurked in dark corners. It’s a system in which voters rank the candidates. The last place candidates are knocked out (not literally, unfortunately) and their votes redistributed to the next ranked parties until one party has a majority (i.e. more than 50%). Instant runoff has a couple of things going for it: intuitively, it seems like it must choose better candidates, and it’s also easy for your average voter to understand — something some of the proportional representation systems don’t share.
So this got me thinking: what would happen if Canada used instant runoff voting?
Being the super-cool-and-not-at-all-nerdy guy that I am, I figured it would be lots of fun to find an answer to that question. Spoiler: it totally was. So I started working on a simulation that would project the outcome of the forty-second Canadian election under such a system.
Assumptions (a.k.a. Why My Results are Wrong)
The tough part about simulating an instant runoff election based on first-past-the-post results is that you don’t have the data required to do so. Instant runoff uses ranked ballots… but each of our real votes was cast for a (single) favourite candidate.
So what do you do when your project needs data that doesn’t exist? You make assumptions!
Assumption 1: Generating Ranked Ballots from Second Choice Polls
Nanos Research is a polling company who did a good job of predicting the popular vote for the Canadian election (each party was within 2% of the prediction). In their last report released the day before the election, they included polling data for voters’ second choices.
Since I was looking to turn our real election results into ranked ballots (each an order of preferences), the “second choice” data proved advantageous.
Using this data, I assumed that for any given rank on a ballot, the next rank would follow the probability distribution from Nanos’ “second choice” report. So for example, if Liberal was a voter’s second choice, there would be 49% chance that his third choice would be NDP and a 16% chance he would make no third choice at all. So that was my first assumption, and it allowed me to generate ranked ballots for instant runoff without totally pulling numbers out of a hat.
Assumption 2: Same Popular Vote for Both Methods
So here’s an interesting thing. I assumed that the popular vote for our real election would be the same if we used a different system. That’s probably wrong! Data suggests that strategic voting was significant in this election, which means the popular vote doesn’t actually represent voters’ true top choices. (I have a sneaky feeling that the Liberals wouldn’t have done quite so well without it.)
Different electoral systems have different ways of voting strategically. And in some, voters may not feel the need to do so at all. Moral of the story: we’re all a bunch of liars and our votes can’t be trusted. On to the results!
The simulation I wrote runs right in your web browser. So if you don’t want to take my word for it, you can go run it yourself (or check out the source code). For each Canadian riding, it randomly regenerates the votes of that riding as ranked ballots.
- The first ranks follow (closely) the popular vote of the riding
- The subsequent ranks follow the “second choice” distribution from Nanos Research
It then runs a local instant runoff election for each of those ridings and tallies the results. Simple!
Whoa! The simulation projects that if Canada used an instant runoff system in its last election, the liberals would have taken a whopping 213 seats in a landslide victory! And that’s still with only 39% of the popular vote. Here’s the plus/minus versus the real election results:
- Bloc Québécois: –10 seats (this is probably the weak point in my simulation, which doesn’t account for Bloc running only in Quebec)
- Conservative Party: –30 seats
- Green Party: +0 seats (same result, congrats Elizabeth May!)
- Liberal Party: +29 seats
- NDP: +11 seats
About that “Instant Runoff” Thing…
Assuming that my simulation is reasonable — and that’s for you to decide — it says a few things about instant runoff voting. The most glaring thing is that it does not achieve proportional representation. Within each riding, the winning candidate probably better represents the voters of that riding on average, but the national results are totally skewed in favour of the large parties. Smaller parties like the Green Party still end up miserably underrepresented when all is said and done.
I would say that instant runoff generally favours large, centrist parties. These types of parties (such as the Liberals) can eventually gobble up votes from numerous smaller parties to achieve the majority they need.
There You Have It
Alright Liberal platform! Who’s the football team captain now?
Yep… still marijuana legalization. :)
If you found this article interesting, here’s a friendly reminder to comment/recommend/share. It’s always appreciated!
Also, in case you missed the links earlier in the story, you can run my instant runoff simulation in your browser, and the source code is available for your perusal on GitHub.
Thanks for reading!