The United National Party turned 70 this week. I thought I'd take a look at their electoral record, for funsies.

The data for this (short) analysis was sourced from Wikipedia. That data was in turn sourced from Department of Elections PDF files. I didn't cross-check the numbers because this is a blog and there is no accountability. ¯\_(ツ)_/¯

I'll only be looking at General Election data because that's the only election that matters. :P

Election Leader* Valid Votes Votes Won % Votes Total Seats Seats Won % Seats W/L 1947 D. S. Senanayake 1,887,364 751,432 39.81 95 42 44.21 W 1952 Dudley Senanayake 2,327,626 1,026,005 44.08 95 54 56.84 W 1956 John Kotelawala 2,647,247 738,810 27.91 95 8 8.42 L March 1960 Dudley Senanayake 3,041,420 909,043 29.89 151 50 33.11 W July 1960 Dudley Senanayake 3,076,869 1,144,166 37.19 151 30 19.87 L 1965 Dudley Senanayake 4,046,720 1,590,929 39.31 151 66 43.71 W 1970 Dudley Senanayake 4,991,798 1,892,525 37.91 151 17 11.26 L 1977 J. R. Jayewardene 6,243,573 3,179,221 50.92 168 140 83.33 W 1989 R. Premadasa 5,596,468 2,838,005 50.71 225 125 55.56 W 1994 D. B. Wijetunga 7,943,706 3,498,370 44.04 225 94 41.78 L 2000 Ranil Wickremesinghe 8,647,668 3,477,770 40.22 225 89 39.56 L 2001 Ranil Wickremesinghe 8,955,869 4,086,026 45.62 225 109 48.44 W 2004 Ranil Wickremesinghe 9,262,732 3,504,200 37.83 225 82 36.44 L 2010 Ranil Wickremesinghe 8,033,717 2,357,057 29.34 225 60 26.67 L 2015 Ranil Wickremesinghe 11,166,975 5,098,916 45.66 225 106 47.11 W

A win is when the UNP went on to form a government. This was sometimes done by forming coalitions (e.g. in 1965).

Some Descriptive Statistics

>>> df['% Votes'].describe() count 15.000000 mean 40.029333 std 7.121773 min 27.910000 25% 37.510000 50% 39.810000 75% 44.850000 max 50.920000

On average the UNP won 40% of the vote, with a fairly low deviation from that norm. The percentage of seats it has won has varied wildly from 8.4% to 83.3% (in the infamous 1977 election), mostly thanks to the winner-takes-all craziness of the First Past The Post electoral system.

>>> df['% Seats'].describe() count 15.000000 mean 39.754000 std 18.945885 min 8.420000 25% 29.890000 50% 41.780000 75% 47.775000 max 83.330000

Some Interesting Notes

Sri Lanka, at least electorally, is not a two-party system. The UNP only won the majority of the popular vote on two occasions (1977 and 1989), and both under extraordinary circumstances. In 1977, the country was emerging from an unpopular experiment with a strictly-controlled, statist economy. The 1989 election was held during an extremely violent period of the country's history (more on that below).

The percentage of the popular vote mattered little in the First Past The Post system. The election was essentially a series of isolated local contests to win a particular electorate. It is even more surprising, then, to see that the UNP has only managed to win absolute majorities in only 3 of the 15 elections we looked at, and only twice under the FPTP system.

In the 1947 election, 29.11% of the popular vote and 21 (of 95) seats were won by independent candidates. One wonders how Sri Lankan electoral history would've evolved if Proportional Representation was introduced during this time.

1977 remains the UNP's biggest electoral victory. The UNP won 50.92% of the popular vote and a 5/6th majority in parliament. The biggest win ever recorded (in terms of the popular vote) by any party though was 6 years ago, by the UPFA led by Mahinda Rajapaksa, which managed to win 60.33% of the popular vote.

Two of the UNP's most celebrated leaders, J. R. Jayewardene and D. S. Senanayake, have both only led a single election each, winning comfortably. J. R. avoided having the election due for 1983 by sneakily holding a referendum to extend the term of the 1977 parliament. D. S. fell off a horse.

The term leader becomes a bit muddled (like everything else) after the Executive Presidency is created. In 1989, R. Premadasa was the leader of the UNP but wasn't running for the post of Prime Minister, and after the 1994 election Gamini Dissanayake went on to become the Leader of the Opposition (over Ranil Wickremesinghe, the previous UNP Prime Minister).

Ranil Wickremesinghe has led the UNP at 5 General Elections, winning twice. If he leads the UNP at the next General Election, he'll surpass Dudley Senanayake (5 elections, 3 wins) as the UNP leader who's led at the most number of General Elections.

In the First Past The Post era, the UNP frequently won the plurality of the total vote, but lost the election thanks to the way electorates and the system was structured. Note the discrepancies between percentage votes and percentage seats, and the drastic reduction after Proportional Representation was introduced in the 80s:

Before PR:

Election % Votes % Seats % Diff 1947 39.81 44.21 4.40 1952 44.08 56.84 12.76 1956 27.91 8.42 19.49 March 1960 29.89 33.11 3.22 July 1960 37.19 19.87 17.32 1965 39.31 43.71 4.39 1970 37.91 11.26 26.65 1977 50.92 83.33 32.41

After PR:

Election % Votes % Seats % Diff 1989 50.71 55.56 4.84 1994 44.04 41.78 2.26 2000 40.22 39.56 0.66 2001 45.62 48.44 2.82 2004 37.83 36.44 1.39 2010 29.34 26.67 2.67 2015 45.66 47.11 1.45

The number of valid votes increased from just under 2 million in 1947 to 11 million in 2015. The troughs of 1989 and 2010 are also interesting, because these elections took place under extraordinary circumstances. In 1989, there was a full-blown insurgency ravaging the south, and 2010 was the year after the Sri Lankan Civil War was finally concluded.

Swings

Election Vote Swing Seat Swing 1952 4.27 12.63 1956 -16.17 -48.42 March 1960 1.98 24.69 July 1960 7.30 -13.24 1965 2.12 23.84 1970 -1.40 -32.45 1977 13.01 72.07 1989 -0.21 -27.77 1994 -6.67 -13.78 2000 -3.82 -2.22 2001 5.40 8.88 2004 -7.79 -12.00 2010 -8.49 -9.77 2015 16.32 20.44

In terms of vote swing (the different in percentage votes between the current and last election), the 'revolution' of 1956 was the UNP's biggest defeat, losing 16.17% of its previous vote share.

After the poor showing of 2010, 2015 was (surprisingly) the UNP's biggest gain yet, with a 16.32% increase. It edged out the 13.01% increase of 1977.

In terms of seat swing (the different in percentage seats won between the current and last election), 1956 was again the biggest loss (-48.42%). The UNP went from the 54 seats won in 1952 to a mere 8.

1977 was the biggest gain at 72.07%. The UNP went from having won 17 (of 151) seats in 1970, to 140 (of 168) seats - J. R.'s infamous 5/6th majority.

Data Viz

Making these graphs in Seaborn took a helluva long time, mostly because I am incompetant. See, I even managed to misspell incompetent.

Here's the code for the vote/seat difference graph:

import matplotlib as mpl import matplotlib.pyplot as plt import seaborn as sns import pandas as pd df = pd . read_csv ( 'unp.csv' ) sns . set ( style = "whitegrid" , font = "Georgia" ) plot = sns . barplot ( x = "Election" , y = "Diff" , data = df , color = "forestgreen" ) for i in plot . get_xticklabels (): i . set_rotation ( 90 ) sns . plt . show ()

And for the Vote Percentage graph:

import matplotlib as mpl import matplotlib.pyplot as plt import seaborn as sns import pandas as pd df = pd . read_csv ( 'unp.csv' ) df [ '50 Percent' ] = df [ 'Valid Votes' ] / df [ 'Valid Votes' ] * 50 ; df [ '100 Percent' ] = df [ 'Valid Votes' ] / df [ 'Valid Votes' ] * 100 ; sns . set ( style = "whitegrid" , font = "Georgia" ) # Initialize the matplotlib figure f , ax = plt . subplots () sns . barplot ( x = "100 Percent" , y = "Election" , data = df , label = "Valid Votes" , color = "grey" ) sns . barplot ( x = "50 Percent" , y = "Election" , data = df , label = "50 % o f Valid Votes" , color = "white" ) sns . barplot ( x = "% Votes" , y = "Election" , data = df , label = "Percetage of Votes Won" , color = "forestgreen" ) # Add a legend and informative axis label ax . legend ( ncol = 1 , loc = "upper right" , frameon = True ) ax . set ( ylabel = "Election" , xlabel = "UNP Share of Votes" ) sns . despine ( left = True , bottom = True ) plt . show ()

And the vote and seat swing graphs:

import matplotlib as mpl import matplotlib.pyplot as plt import seaborn as sns import pandas as pd df = pd . read_csv ( 'unp.csv' ) sns . set ( style = "whitegrid" , font = "Georgia" ) df [ "swingVotes" ] = df [ "% Votes" ] . diff ( 1 ) df [ "swingSeats" ] = df [ "% Seats" ] . diff ( 1 ) # replace swingSeats with swingVotes for vote swing graph ax = sns . barplot ( y = "Election" , x = "swingSeats" , data = df , color = "forestgreen" ) sns . plt . show ()

The data I used is in a publicly shared csv file. Consider everything MIT Licensed.