# Pay for progress: do head of state governments’ pay respond to performance?

R
Author

Philip Khor

Published

August 9, 2024

Malaysiakini’s data journalism team just published this fascinating analysis about the salaries of states’ heads of government:

Show setup code
library(dplyr)
library(tibble)
library(arrow)
library(tidyr)
library(ggplot2)
filter(lubridate::year(date) == 2022)

filter(lubridate::year(date) == 2022, percentile %in% c(1, 20), variable == "maximum") |>
pivot_wider(names_from = c(percentile), values_from = income, names_prefix = "pct_")

tribble(
~ state, ~ head_executive_pay, ~ gdppercap, ~median_wage,
"Kelantan", 20000, 16836, 1600,
"Sabah", 33033, 31147, 1800,
"Terengganu", 30000, 31111, 1900,
"Perlis", 20000, 24004, 1627,
"Kedah", 22000, 26353, 1845,
"Perak", 25000, 37170, 2000,
"Pahang", 30000, 46084, 2000,
"Sarawak", 39000, 72411, 2000,
"Malaysia", 22826, 54612, 2600,
"Selangor", 25000, 62492, 2900,
"Negeri Sembilan", 19175, 51709, 2245,
"Johor", 14907, 41902, 2400,
"Melaka", 18000, 53922, 2282,
"Pulau Pinang", 14175, 72586, 2645
) -> exec_pay

They find that there’s no relationship between the head of government’s pay and the state’s economic performance, as measured by GDP per capita:

Show setup code
ggplot(exec_pay, aes(x = gdppercap, y = head_executive_pay)) +
geom_point() + ggrepel::geom_text_repel(aes(label = state))

correlation coefficient (log-log): 0.0040797

and similarly for wages - if anything, they seem to be earning less where household income is higher? 1

Show setup code
ggplot(exec_pay, aes(x = median_wage, y = head_executive_pay)) +
geom_point() + ggrepel::geom_text_repel(aes(label = state))

correlation coefficient: -0.3210184

So I thought okay, maybe there’s something that isn’t captured in either of these metrics. Now that data is much easier to access on data.gov.my I thought I’d see if there’s any relationship between MB pay and 2022 values for the Malaysia Well-Being Index.

Yeah, this is very data-miney, but I think it’s quite far from what we saw before, that there’s no relationship. Below are the Pearson correlation coefficients. The index is made up of economic and social components. The economic and overall components are modestly correlated; at the sub-indicator levels, it looks like safety is the most closely linked to MB pay.

Show setup code
wellbeing |>
inner_join(exec_pay, by = "state") |>
pivot_longer(everything()) |>
arrange(desc(abs(value))) |>
mutate(cat = case_when(
name %in% c("overall", "economy", "social") ~ "overall",
stringr::str_sub(name, end = 6) == "social" ~ "social",
.default = "economy"),
cat = forcats::fct(cat, levels = c("overall", "economy", "social")),
name = stringr::str_remove(name, ".+\\_"),
name = forcats::fct_reorder(name, value)) |>
gt::gt(groupname_col = 'cat') |>
gt::fmt_number() 
name value
social
safety 0.78
participation −0.53
culture −0.37
health −0.27
environment 0.27
entertainment 0.24
governance 0.21
family −0.16
housing −0.14
overall
economy 0.59
overall 0.53
social 0.18
economy
income 0.55
educ 0.44
work 0.25
comms 0.12
transport −0.08
Show setup code
  # ggplot(aes(x = value, y = name)) +
# geom_col() +
# ggrepel::geom_text_repel(aes(label = round(value, 2))) +
# facet_wrap(vars(cat), scale = "free_y") + labs(y = "", x = "")

It kind of makes sense for politicians to be rewarded for economic welfare and social safety. So is the system … working?

It’s never a good idea to take a metric at face value, so let’s plot the index versus MB pay.

Show setup code
wellbeing |>
inner_join(exec_pay, by = "state") |>
ggplot(aes(x = overall - 100, y = head_executive_pay)) + geom_point() +
ggrepel::geom_text_repel(aes(label = state), colour = "grey30") +
ggthemes::theme_fivethirtyeight(base_size = 9) +
scale_x_continuous(labels = \(x) paste0("+", x, "%")) +
theme(panel.grid.major = element_blank(), plot.title.position = "plot") +
labs(
title = "Progress in overall well-being is correlated with MB pay",
subtitle = "Head of government's pay versus change in overall Malaysia Well-being Index since 2010",
x = "Change since 2010",
y = "Head of government's pay"
)

Seems fairly legit to me, except for Penang that’s underpaying, probably a legacy of a past administration’s belt-tightening approach to governance.

At this point it’s a good idea to take a step back and think about what the index means. I think the documentation wasn’t very clear, but essentially, each state has the value 100 for 2010. In other words, the index values for each state measure ‘overall progress’ on various indicators since 2010.

The strongest economic indicator has to do with income and distribution, and includes

• GDP per capita
• poverty rate
• Gini coefficient of household income

The correlation between executive pay and this sub-indicator seems modest (0.5493465).

Show setup code
income_index |>
ggplot(aes(x = economy_income - 100, y = head_executive_pay)) + geom_point() +
ggrepel::geom_text_repel(aes(label = state), colour = "grey30") +
ggthemes::theme_fivethirtyeight(base_size = 9) +
scale_x_continuous(labels = \(x) paste0("+", x, "%")) +
theme(panel.grid.major = element_blank(), plot.title.position = "plot") +
labs(
title = "Progress in the income and distribution index is correlated with MB pay",
subtitle = "Head of government's pay versus change in the income and distribution index since 2010",
x = "Change since 2010",
y = "Head of government's pay"
)

Okay great, but this doesn’t tell me much about what exactly about state’s economies that heads of government are rewarded for. 2 So I compare the annual growth of a few economic welfare metrics between 2016 and 2022.

## GDP per capita growth between 2016 and 2022: 0.6380104

Show setup code
gdp_growth |>
ggplot(aes(x = rat2216, y = head_executive_pay)) + geom_point() +
ggrepel::geom_text_repel(aes(label = State), colour = "grey30") +
scale_x_continuous(labels = scales::label_percent()) +
labs(title = "Are MBs/CMs rewarding themselves for economic growth?",
subtitle = "Head of government's pay vs annual growth rate of GDP per capita between 2016 and 2022") +
ggthemes::theme_fivethirtyeight(base_size = 9) +
theme(panel.grid.major = element_blank(), plot.title.position = "plot") + geom_smooth(alpha = .3, method = "lm", se = FALSE)
geom_smooth() using formula = 'y ~ x'
Warning: Removed 1 row containing non-finite outside the scale range
(stat_smooth()).
Warning: Removed 1 row containing missing values or values outside the scale range
(geom_point()).
Warning: Removed 1 row containing missing values or values outside the scale range
(geom_text_repel()).

## Household income growth between 2016 and 2022: 0.0952284

Show setup code
hhinc_growth |>
ggplot(aes(x = rat2216, y = head_executive_pay)) + geom_point() +
geom_text(aes(label = state)) +
scale_x_continuous(labels = scales::label_percent()) +
labs(x = "annual growth rate", y = "annual head of government pay") -> p1

## Change in inequality: -0.4524236

i.e. less inequality, more pay

Show setup code
gini_growth |> ggplot(aes(x = rat2216 * 100, y = head_executive_pay)) + geom_point() +
geom_text(aes(label = state)) +
labs(x = "change in gini between 2022 and 2016, percentage points",
y = "annual head of government pay",
caption = "Scale reversed for clarity. Greater gini is less equal, states are more equal towards the right of the x-axis ") +
scale_x_reverse()

This seems to suggest … the system is working?

Honestly, I’m more surprised to find that there seems to be some relationship between state heads’ salaries and their performance, than the other way round. Good to know though.

If anything, I think it makes more sense that politicians in states that progress faster are compensated better, rather than for politicians to be compensated for the work of those than come before them.

# Sidenote

On the other hand, I think there’s value in comparing top-of-the-line pay with the pay of those at the bottom. Newly released Data.gov.my data from the Household Income Surveys help us do that. Below I show how many times’ the head of government’s salary is of different percentiles in the household income distribution.

For instance, the Sarawak head of government earns almost 8 times that of the median Sarawakian household, over 13 times that of the bottom 20% of Sarawakian households, and almost 35 times that of the bottom 1% of Sarawakian households.

Show setup code
exec_pay |>
inner_join(hies_state, by = "state") |>
inner_join(hies_pct, by = "state") |>
mutate(
across(c(income_median, expenditure_mean, pct_1, pct_20), \(x) head_executive_pay / x),
state = forcats::fct_reorder(state, income_median)
) |>
pivot_longer(c(income_median, pct_1, pct_20)) |>
mutate(name = forcats::fct_reorder(name, value)) |>
ggplot(aes(y = state, x = value)) + geom_col() + facet_wrap(vars(name), nrow = 1, scale = "free_x") +
labs(y = "", x = "",
subtitle = "Head of government's salary as multiple of household income metrics")

## Footnotes

1. I didn’t verify if Malaysiakini’s numbers were from administrative data or the salaries surveys↩︎

2. For comparability with the Household Income Survey, I go with 2016 to 2022.↩︎