Labour productivity and unit labour costs

Data - Eurostat

Info

source dataset .html .qmd .RData
eurostat namq_10_lp_ulc 2024-09-15 2024-06-14 2024-09-15
eurostat nasq_10_nf_tr 2024-09-02 NA 2024-09-02

Data on wages

source dataset Title Download Compile
eurostat namq_10_lp_ulc Labour productivity and unit labour costs 2024-09-15 [2024-09-15]
eurostat earn_mw_cur Monthly minimum wages - bi-annual data 2024-09-15 [2024-09-18]
eurostat ei_lmlc_q Labour cost index, nominal value - quarterly data 2024-09-15 [2024-09-18]
eurostat lc_lci_lev Labour cost levels by NACE Rev. 2 activity 2024-09-15 [2024-09-19]
eurostat lc_lci_r2_q Labour cost index by NACE Rev. 2 activity - nominal value, quarterly data 2024-08-20 [2024-09-19]
eurostat nama_10_lp_ulc Labour productivity and unit labour costs 2024-09-15 [2024-09-19]
eurostat tps00155 Minimum wages 2024-09-15 [2024-09-15]
fred wage Wage 2024-09-18 [2024-09-18]
ilo EAR_4MTH_SEX_ECO_CUR_NB_A Mean nominal monthly earnings of employees by sex and economic activity -- Harmonized series 2023-06-01 [2024-06-20]
ilo EAR_XEES_SEX_ECO_NB_Q Mean nominal monthly earnings of employees by sex and economic activity -- Harmonized series 2023-06-01 [2024-06-20]
oecd AV_AN_WAGE Average annual wages 2024-09-15 [2024-04-16]
oecd AWCOMP Taxing Wages - Comparative tables 2023-09-09 [2024-09-15]
oecd EAR_MEI Hourly Earnings (MEI) 2024-04-16 [2024-04-16]
oecd HH_DASH Household Dashboard 2023-09-09 [2024-09-15]
oecd MIN2AVE Minimum relative to average wages of full-time workers - MIN2AVE 2023-09-09 [2024-09-15]
oecd RMW Real Minimum Wages - RMW 2024-03-12 [2024-09-15]
oecd ULC_EEQ Unit labour costs and labour productivity (employment based), Total economy 2024-04-15 [2024-09-15]

Last

Code
namq_10_lp_ulc %>%
  group_by(time) %>%
  summarise(Nobs = n()) %>%
  arrange(desc(time)) %>%
  head(1) %>%
  print_table_conditional()
time Nobs
2024Q2 673

Info

  • Eurostat. Unit labour cost (ULC) measures the average cost of labour per unit of output. It is calculated as the ratio of labour costs to labour productivity. ULC represents a link between productivity and the cost of labour in producing output. Input data are obtained through official transmissions of national accounts’ country data in the European system of accounts - ESA 2010 - transmission programme. Nominal ULC (NULC) is calculated as: [ D1 / EEM] / [ B1GQ / ETO], where: D1 = Compensation of employees, all industries, in current prices EEM = Employees, all industries, in persons (following the domestic concept) B1GQ = Gross domestic product at market prices in millions, chain-linked volumes ETO = Total employment, all industries, in persons (following the domestic concept).

  • BLS. Unit Labor Cost (ULC) is how much a business pays its workers to produce one unit of output. Businesses pay workers compensation that can include both wages and benefits, such as health insurance and retirement contributions.

https://www.bls.gov/k12/productivity-101/content/what-is-productivity/what-is-unit-labor-cost.htm

unit

Code
namq_10_lp_ulc %>%
  left_join(unit, by = "unit") %>%
  group_by(unit, Unit) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  {if (is_html_output()) print_table(.) else .}
unit Unit Nobs
I10 Index, 2010=100 27552
I15 Index, 2015=100 27552
PCH_SM Percentage change compared to same period in previous year 26148
CLV_PCH_SM Chain linked volumes, percentage change compared to same period in previous year 19150
PCH_PRE Percentage change on previous period 8843
CLV_PCH_PRE Chain linked volumes, percentage change on previous period 6528

s_adj

Code
namq_10_lp_ulc %>%
  left_join(s_adj, by = "s_adj") %>%
  group_by(s_adj, S_adj) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  {if (is_html_output()) print_table(.) else .}
s_adj S_adj Nobs
NSA Unadjusted data (i.e. neither seasonally adjusted nor calendar adjusted data) 66784
SCA Seasonally and calendar adjusted data 48989

na_item

Code
namq_10_lp_ulc %>%
  left_join(na_item, by = "na_item") %>%
  group_by(na_item, Na_item) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  {if (is_html_output()) print_table(.) else .}
na_item Na_item Nobs
RLPR_PER Real labour productivity per person 42993
RLPR_HW Real labour productivity per hour worked 40166
NULC_PER Nominal unit labour cost based on persons 16729
NULC_HW Nominal unit labour cost based on hours worked 15885

geo

Code
namq_10_lp_ulc %>%
  left_join(geo, by = "geo") %>%
  group_by(geo, Geo) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  mutate(Geo = ifelse(geo == "DE", "Germany", Geo)) %>%
  mutate(Flag = gsub(" ", "-", str_to_lower(Geo)),
         Flag = paste0('<img src="../../bib/flags/vsmall/', Flag, '.png" alt="Flag">')) %>%
  select(Flag, everything()) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}

na_item: France, Germany, Italy

2022Q2

Code
namq_10_lp_ulc %>%
  filter(geo %in% c("FR", "DE", "IT"),
         time == "2022Q2") %>%
  quarter_to_date %>%
  left_join(na_item, by = "na_item") %>%
  left_join(unit, by = "unit") %>%
  left_join(geo, by = "geo") %>%
  select(s_adj, na_item, Na_item, values, unit, Unit, Geo) %>%
  spread(Geo, values) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F) else .}

2022Q3

Code
namq_10_lp_ulc %>%
  filter(geo %in% c("FR", "DE", "IT"),
         time == "2022Q3") %>%
  quarter_to_date %>%
  left_join(na_item, by = "na_item") %>%
  left_join(unit, by = "unit") %>%
  left_join(geo, by = "geo") %>%
  select(s_adj, na_item, Na_item, values, unit, Unit, Geo) %>%
  spread(Geo, values) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F) else .}

2022Q4

Code
namq_10_lp_ulc %>%
  filter(geo %in% c("FR", "DE", "IT"),
         time == "2022Q4") %>%
  quarter_to_date %>%
  left_join(na_item, by = "na_item") %>%
  left_join(unit, by = "unit") %>%
  left_join(geo, by = "geo") %>%
  select(s_adj, na_item, Na_item, values, unit, Unit, Geo) %>%
  spread(Geo, values) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F) else .}

RLPR_HW - Real labour productivity per hour worked

France, Germany, Italy

All

Code
namq_10_lp_ulc %>%
  filter(geo %in% c("FR", "DE", "IT"),
         na_item == "RLPR_HW",
         unit == "I15",
         s_adj == "SCA") %>%
  quarter_to_date %>%
  left_join(geo, by = "geo") %>%
  left_join(colors, by = c("Geo" = "country")) %>%
  ggplot + theme_minimal() + xlab("") + ylab("") +
  geom_line(aes(x = date, y = values, color = color)) +
  scale_color_identity() + add_3flags +
  theme(legend.position = c(0.3, 0.85),
        legend.title = element_blank()) +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2024, 2), "-01-01")),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = seq(0, 200, 10),
                     labels = scales::dollar_format(su = "", p = ""))

1995-

Code
namq_10_lp_ulc %>%
  filter(geo %in% c("FR", "DE", "IT"),
         na_item == "RLPR_HW",
         unit == "I15",
         s_adj == "SCA") %>%
  quarter_to_date %>%
  filter(date >= as.Date("1995-01-01")) %>%
  left_join(geo, by = "geo") %>%
  left_join(colors, by = c("Geo" = "country")) %>%
  ggplot + theme_minimal() + xlab("") + ylab("") +
  geom_line(aes(x = date, y = values, color = color)) +
  scale_color_identity() + add_3flags +
  theme(legend.position = c(0.3, 0.85),
        legend.title = element_blank()) +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2024, 2), "-01-01")),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = seq(0, 200, 5),
                     labels = scales::dollar_format(su = "", p = ""))

1996-

Code
namq_10_lp_ulc %>%
  filter(geo %in% c("FR", "DE", "IT"),
         na_item == "RLPR_HW",
         unit == "I15",
         s_adj == "SCA") %>%
  quarter_to_date %>%
  filter(date >= as.Date("1996-01-01")) %>%
  left_join(geo, by = "geo") %>%
  left_join(colors, by = c("Geo" = "country")) %>%
  group_by(geo) %>%
  mutate(values = 100*values/ values[date == as.Date("1996-01-01")]) %>%
  ggplot + theme_minimal() + xlab("") + ylab("") +
  geom_line(aes(x = date, y = values, color = color)) +
  scale_color_identity() + add_3flags +
  theme(legend.position = c(0.3, 0.85),
        legend.title = element_blank()) +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2024, 2), "-01-01")),
               labels = date_format("%Y")) +
  scale_y_log10(breaks = seq(0, 200, 5),
                     labels = scales::dollar_format(su = "", p = "", acc = 1))

2010-

Code
namq_10_lp_ulc %>%
  filter(geo %in% c("FR", "DE", "IT"),
         na_item == "RLPR_HW",
         unit == "I15",
         s_adj == "SCA") %>%
  quarter_to_date %>%
  filter(date >= as.Date("2010-01-01")) %>%
  left_join(geo, by = "geo") %>%
  left_join(colors, by = c("Geo" = "country")) %>%
  ggplot + theme_minimal() + xlab("") + ylab("") +
  geom_line(aes(x = date, y = values, color = color)) +
  scale_color_identity() + add_3flags +
  theme(legend.position = c(0.3, 0.85),
        legend.title = element_blank()) +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2024, 2), "-01-01")),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = seq(0, 200, 2),
                     labels = scales::dollar_format(su = "", p = ""))

RLPR_PER - Real labour productivity per person

France, Germany, Italy

All

Code
namq_10_lp_ulc %>%
  filter(geo %in% c("FR", "DE", "IT"),
         na_item == "RLPR_PER",
         unit == "I15",
         s_adj == "SCA") %>%
  quarter_to_date %>%
  left_join(geo, by = "geo") %>%
  left_join(colors, by = c("Geo" = "country")) %>%
  ggplot + theme_minimal() + xlab("") + ylab("") +
  geom_line(aes(x = date, y = values, color = color)) +
  scale_color_identity() + add_3flags +
  theme(legend.position = c(0.3, 0.85),
        legend.title = element_blank()) +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2024, 2), "-01-01")),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = seq(0, 200, 10),
                     labels = scales::dollar_format(su = "", p = ""))

1995-

Code
namq_10_lp_ulc %>%
  filter(geo %in% c("FR", "DE", "IT"),
         na_item == "RLPR_PER",
         unit == "I15",
         s_adj == "SCA") %>%
  quarter_to_date %>%
  filter(date >= as.Date("1995-01-01")) %>%
  left_join(geo, by = "geo") %>%
  left_join(colors, by = c("Geo" = "country")) %>%
  ggplot + theme_minimal() + xlab("") + ylab("") +
  geom_line(aes(x = date, y = values, color = color)) +
  scale_color_identity() + add_3flags +
  theme(legend.position = c(0.3, 0.85),
        legend.title = element_blank()) +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2024, 2), "-01-01")),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = seq(0, 200, 5),
                     labels = scales::dollar_format(su = "", p = ""))

1996-

Code
namq_10_lp_ulc %>%
  filter(geo %in% c("FR", "DE", "IT"),
         na_item == "RLPR_PER",
         unit == "I15",
         s_adj == "SCA") %>%
  quarter_to_date %>%
  filter(date >= as.Date("1996-01-01")) %>%
  left_join(geo, by = "geo") %>%
  left_join(colors, by = c("Geo" = "country")) %>%
  group_by(geo) %>%
  mutate(values = 100*values/ values[date == as.Date("1996-01-01")]) %>%
  ggplot + theme_minimal() + xlab("") + ylab("") +
  geom_line(aes(x = date, y = values, color = color)) +
  scale_color_identity() + add_3flags +
  theme(legend.position = c(0.3, 0.85),
        legend.title = element_blank()) +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2024, 2), "-01-01")),
               labels = date_format("%Y")) +
  scale_y_log10(breaks = seq(0, 200, 5),
                     labels = scales::dollar_format(su = "", p = "", acc = 1))

2010-

Code
namq_10_lp_ulc %>%
  filter(geo %in% c("FR", "DE", "IT"),
         na_item == "RLPR_PER",
         unit == "I15",
         s_adj == "SCA") %>%
  quarter_to_date %>%
  filter(date >= as.Date("2010-01-01")) %>%
  left_join(geo, by = "geo") %>%
  left_join(colors, by = c("Geo" = "country")) %>%
  ggplot + theme_minimal() + xlab("") + ylab("") +
  geom_line(aes(x = date, y = values, color = color)) +
  scale_color_identity() + add_3flags +
  theme(legend.position = c(0.3, 0.85),
        legend.title = element_blank()) +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2024, 2), "-01-01")),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = seq(0, 200, 2),
                     labels = scales::dollar_format(su = "", p = ""))

NULC_PER - Nominal unit labour cost based on persons

Greece, Spain, Portugal

Code
namq_10_lp_ulc %>%
  filter(geo %in% c("EL", "ES", "PT"),
         na_item == "NULC_PER",
         unit == "I15",
         s_adj == "NSA") %>%
  quarter_to_date %>%
  left_join(geo, by = "geo") %>%
  left_join(colors, by = c("Geo" = "country")) %>%
  ggplot + theme_minimal() + xlab("") + ylab("Nominal unit labour cost based on persons") +
  geom_line(aes(x = date, y = values, color = color)) +
  scale_color_identity() + add_3flags +
  theme(legend.position = c(0.3, 0.85),
        legend.title = element_blank()) +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2024, 2), "-01-01")),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = seq(0, 200, 10),
                     labels = scales::dollar_format(su = "", p = ""))

France, Germany, Italy

Code
namq_10_lp_ulc %>%
  filter(geo %in% c("FR", "DE", "IT"),
         na_item == "NULC_PER",
         unit == "I15",
         s_adj == "NSA") %>%
  quarter_to_date %>%
  left_join(geo, by = "geo") %>%
  left_join(colors, by = c("Geo" = "country")) %>%
  ggplot + theme_minimal() + xlab("") + ylab("Nominal unit labour cost based on persons") +
  geom_line(aes(x = date, y = values, color = color)) +
  scale_color_identity() + add_3flags +
  theme(legend.position = c(0.3, 0.85),
        legend.title = element_blank()) +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2024, 2), "-01-01")),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = seq(0, 200, 10),
                     labels = scales::dollar_format(su = "", p = ""))

France, Germany

NSA

Code
namq_10_lp_ulc %>%
  filter(geo %in% c("FR", "DE"),
         na_item == "NULC_PER",
         unit == "I15",
         s_adj == "NSA") %>%
  quarter_to_date %>%
  filter(date >= as.Date("1990-01-01")) %>%
  left_join(geo, by = "geo") %>%
  left_join(colors, by = c("Geo" = "country")) %>%
  ggplot + theme_minimal() + xlab("") + ylab("Nominal unit labour cost based on persons") +
  geom_line(aes(x = date, y = values, color = color)) +
  scale_color_identity() + add_2flags +
  theme(legend.position = c(0.3, 0.85),
        legend.title = element_blank()) +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2024, 2), "-01-01")),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = seq(0, 200, 5),
                     labels = scales::dollar_format(su = "", p = ""))

NSA

Code
namq_10_lp_ulc %>%
  filter(geo %in% c("FR", "DE"),
         na_item == "NULC_PER",
         unit == "I15",
         s_adj == "NSA") %>%
  quarter_to_date %>%
  filter(date >= as.Date("1990-01-01")) %>%
  left_join(geo, by = "geo") %>%
  left_join(colors, by = c("Geo" = "country")) %>%
  ggplot + theme_minimal() + xlab("") + ylab("Nominal unit labour cost based on persons") +
  geom_line(aes(x = date, y = values, color = color)) +
  scale_color_identity() + add_2flags +
  theme(legend.position = c(0.3, 0.85),
        legend.title = element_blank()) +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2024, 2), "-01-01")),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = seq(0, 200, 5),
                     labels = scales::dollar_format(su = "", p = ""))

NULC_HW - Nominal unit labour cost based on hours worked

France, Germany, Italy

Code
namq_10_lp_ulc %>%
  filter(geo %in% c("FR", "DE", "IT"),
         na_item == "NULC_HW",
         unit == "I15",
         s_adj == "NSA") %>%
  quarter_to_date %>%
  left_join(geo, by = "geo") %>%
  left_join(colors, by = c("Geo" = "country")) %>%
  ggplot + theme_minimal() + xlab("") + ylab("Nominal unit labour cost based on hours worked") +
  geom_line(aes(x = date, y = values, color = color)) +
  scale_color_identity() + add_3flags +
  theme(legend.position = c(0.3, 0.85),
        legend.title = element_blank()) +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2024, 2), "-01-01")),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = seq(0, 200, 10),
                     labels = scales::dollar_format(su = "", p = ""))