Counting a Ranked Choice election is easy to explain to a layperson, but can get mathematically pretty complicated. For the former, check out:
For those who want to get deeper in the math, you’re in the right place. A few caveats:
Important Caveats
- Ranked Choice Voting involves many steps, including iterative re-calculations of vote hold and transfer factors and the target vote count to win. I will not list every single step.
- Ranked Choice Voting involves many steps, and as a human, I may have made a copy-paste error while building this information. If there is any discrepancy, the information on ElectionBuddy is correct.
- Some steps are presented here in a slightly different order than what happened in reality. This is to help clarify the story of what votes are moving where – minor steps may be out of order, and if done in the right order, the numbers may be slightly different. ElectionBuddy is correct, this is just an illustration.
- There is some complicated discussion about fixed point vs floating point math that I won’t get into. Rest assured that Election Nerds care a lot about it, and ElectionBuddy did it right. I just used a Google Sheet.
Detailed Vote Counting Explanation
To get deeper in the math, here are the round 1 vote totals for each candidate:
Candidate | Hold Coefficient | Votes |
Kyle Ryc | 1 | 18 |
Rob McKenzie | 1 | 45 |
Brook Gardner-Durbin | 1 | 35 |
Tobias Vyseri | 1 | 20 |
Joe Klopchic | 1 | 26 |
Steet | 1 | 3 |
Steven Krysiak | 1 | 24 |
John Brian McCarthy | 1 | 31 |
Hold coefficients show the percentage of a vote that is kept by that candidate. The rest of the vote gets passed down to each voter’s next preference. They always start at 1. They go to 0 if a candidate cannot be elected (to transfer all their votes to their voters’ next preference), or they get decreased proportionally to how far past the bar a candidate is, if they get elected.
The Quota for this round is 33.67. Rob and Brook both met that quota, so they are marked as elected, and we calculate new hold coefficients for them.
Brook only had a few extra votes. His new coefficient is 0.96, reducing his total by 1.33. All of the other candidates pick up a few fractions from his voters. Rob had more extra votes, so he has more to transfer. His coefficient is 0.75. In reality, these get applied simultaneously – but here’s the effect of applying each one:
Candidate | Vote Change – Brook’s Quota | Vote Change – Rob’s Quota |
Kyle Ryc | 0.23 | 0.25 |
Rob McKenzie | 0.30 | -11.33 |
Brook Gardner-Durbin | -1.33 | 2.52 |
Tobias Vyseri | 0.23 | 0.76 |
Joe Klopchic | 0.23 | 2.27 |
Steet | 0.11 | 0.50 |
Steven Krysiak | 0.04 | 1.76 |
John Brian McCarthy | 0.15 | 3.27 |
This shows that Rob’s voters generally preferred John Brian, Joe, or Brook as a second place, and Brook’s voters were spread out more.
I got these Round 2 vote totals. Remember that these may not be exactly correct due to rounding – ElectionBuddy is authoritative here.
Candidate | Hold Coefficient | Votes |
Kyle Ryc | 1 | 18.50 |
Rob McKenzie | 0.748 | 33.89 |
Brook Gardner-Durbin | 0.962 | 36.09 |
Tobias Vyseri | 1 | 21.00 |
Joe Klopchic | 1 | 28.54 |
Steet | 1 | 3.62 |
Steven Krysiak | 1 | 25.84 |
John Brian McCarthy | 1 | 34.47 |
The Quota is now 33.66. It decreased slightly either because someone’s ballot was exhausted – they only voted for Rob or Brook – or because of weird rounding peculiarities. The votes John Brian received are enough to push him over the quota. I’ll apply the new quotas, and show you the change in votes due to each one.
Candidate | Vote Change – Rob’s Quota (0.748 -> 0.743) | Vote Change – Brook’s Quota (0.962 -> 0.897) | Vote Change – John Brian’s Quota (1.000 -> 0.976) |
Kyle Ryc | 0.01 | 0.42 | 0.08 |
Rob McKenzie | -0.23 | 0.39 | 0.12 |
Brook Gardner-Durbin | 0.05 | -2.43 | 0.13 |
Tobias Vyseri | 0.02 | 0.42 | 0.06 |
Joe Klopchic | 0.05 | 0.47 | 0.33 |
Steet | 0.01 | 0.19 | 0.01 |
Steven Krysiak | 0.04 | 0.13 | 0.05 |
John Brian McCarthy | 0.07 | 0.34 | -0.81 |
These are relatively small changes, because the candidates weren’t too far above the quota. ElectionBuddy also re-calculated the hold coefficients a few times – because of transfers to candidates who already won, or exhausted ballots, it takes a few iterations for this to stabilize. ElectionBuddy wants to try its best to see if anyone new will be elected, because it starts eliminating candidates. However, these were small changes, and while everyone gets a bit closer, no one new can meet the quota.
This means that a candidate must be eliminated instead – Steet in Round 3, and because that didn’t push anyone over the quota, Kyle in Round 4. Here are the results of that. Again, this is approximate. There’s a re-calculation of coefficients here that I’m skipping over for the sake of illustrating the major changes in votes.
Candidate | Vote Change – Eliminate Steet | Vote Change – Eliminate Kyle |
Kyle Ryc | 0.06 | -19.23 |
Rob McKenzie | 0.81 | 1.75 |
Brook Gardner-Durbin | 1.13 | 1.81 |
Tobias Vyseri | 0.45 | 6.69 |
Joe Klopchic | 0.13 | 3.46 |
Steet | -3.91 | 0.00 |
Steven Krysiak | 0.13 | 2.27 |
John Brian McCarthy | 1.22 | 2.87 |
That brings us to Round 5, and a race between Joe, Tobias, and Steven for the last two seats. Joe meets the new quota of 33.55:
Candidate | Hold Coefficient | Votes |
Kyle Ryc | 0 | 0.00 |
Rob McKenzie | 0.6996491791 | 35.50 |
Brook Gardner-Durbin | 0.8433564963 | 35.41 |
Tobias Vyseri | 1 | 29.59 |
Joe Klopchic | 1 | 35.20 |
Steet | 0 | 0.00 |
Steven Krysiak | 1 | 29.24 |
John Brian McCarthy | 0.907150297 | 36.35 |
Rob, Brook, Joe, and John Brian now have to transfer some votes. This is an iterative process, and several re-calculations of hold coefficients are needed before this elects a fifth candidate. This table shows the total changes.
Candidate | Vote Change – Transfers from Rob (0.700 -> 0.595) | Vote Change – Transfers from Brook (0.843 -> 0.702) | Vote Change – Transfers from Joe (1.000 -> 0.813) | Vote Change – Transfers from John Brian (0.907 -> 0.746) |
Kyle Ryc | 0.00 | 0.00 | 0.00 | 0.00 |
Rob McKenzie | -5.33 | 1.09 | 1.28 | 1.24 |
Brook Gardner-Durbin | 1.06 | -5.93 | 2.35 | 0.99 |
Tobias Vyseri | 0.73 | 1.42 | 0.45 | 0.52 |
Joe Klopchic | 1.18 | 1.62 | -6.58 | 3.04 |
Steet | 0.00 | 0.00 | 0.00 | 0.00 |
Steven Krysiak | 0.84 | 0.81 | 0.40 | 0.48 |
John Brian McCarthy | 1.41 | 0.70 | 2.04 | -6.44 |
This transferred enough votes to Tobias that she was able to reach the quota, and Steven was not, giving the Round 6 results:
Candidate | Hold Coefficient | Votes |
Kyle Ryc | 0 | 0.00 |
Rob McKenzie | 0.5946478316 | 33.63 |
Brook Gardner-Durbin | 0.7021204085 | 33.67 |
Tobias Vyseri | 1 | 33.60 |
Joe Klopchic | 0.8131115587 | 33.70 |
Steet | 0 | 0.00 |
Steven Krysiak | 1 | 32.23 |
John Brian McCarthy | 0.7464395913 | 33.65 |
For this reason, Rob, Brook, Tobias, Joe, and John Brian were deemed elected.
Data Sources
If you want to run this analysis yourself, you can grab the ballots from this CSV file. They are anonymous, of course – no one can tell how any specific person voted. If you do use these, note the following:
NOTE: This file does NOT follow the same numbering convention as the ballot. On the ballot, you ranked your most preferred candidate as a 1, for first place. In this file, that is reversed. We apologize for any confusion; this is the format used by our election provider.