Labour cost levels by NACE Rev. 2 activity - lc_ncost_r2

Data - Eurostat

Info

Last observation: Annual: 2020 (N = 1,004,862)

First observation: Annual: 2008 (N = 1,025,290)

Last data update: 11 aoû 2026, 18:28. Last compile: 12 aoû 2026, 00:50

Structure

Total Labour Costs per Hour (Business Economy, 10+ employees)

France, Germany, Italy, Spain

Code
lc_ncost_r2 |>
  filter(geo %in% c("FR", "DE", "IT", "ES"),
         currency == "EUR",
         unit == "P_SAL_H",
         sizeclas == "GE10",
         lcstruct == "D01",
         nace_r2 == "B-S_X_O") |>
  year_to_date() |>
  left_join(colors, by = c("Geo" = "country")) |>
  ggplot() + geom_line(aes(x = date, y = values, color = color)) +
  geom_point(aes(x = date, y = values, color = color)) +
  theme_minimal() + scale_color_identity() + add_flags +
  scale_x_date(breaks = as.Date(paste0(seq(2005, 2100, 4), "-01-01")),
               labels = date_format("%Y")) +
  xlab("") + ylab("Total labour costs (€ per hour)")

France: Labour Cost Structure

Total, Wages and Salaries, Direct Remuneration

Code
lc_ncost_r2 |>
  filter(geo == "FR",
         currency == "EUR",
         unit == "P_SAL_H",
         sizeclas == "GE10",
         nace_r2 == "B-S_X_O") |>
  year_to_date() |>
  ggplot() + geom_line(aes(x = date, y = values, color = Lcstruct)) +
  geom_point(aes(x = date, y = values, color = Lcstruct)) +
  theme_minimal() +
  scale_x_date(breaks = as.Date(paste0(seq(2005, 2100, 4), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = "right", legend.title = element_blank()) +
  xlab("") + ylab("Labour costs (€ per hour)")

Latest Wave: Labour Costs by Country and Sector

Code
latest_y <- lc_ncost_r2 |>
  filter(geo %in% c("FR", "DE", "IT", "ES"),
         currency == "EUR",
         unit == "P_SAL_H",
         sizeclas == "GE10",
         lcstruct == "D01",
         !is.na(values)) |>
  summarise(m = max(time)) |>
  pull(m)

lc_ncost_r2 |>
  filter(geo %in% c("FR", "DE", "IT", "ES"),
         currency == "EUR",
         unit == "P_SAL_H",
         sizeclas == "GE10",
         lcstruct == "D01",
         nace_r2 %in% c("B-S_X_O", "C", "F", "G-N"),
         time == latest_y) |>
  select(Nace_r2, Geo, values) |>
  spread(Geo, values) |>
  print_table_conditional()
Nace_r2 France Germany Italy Spain
Construction 36.16 32.85 24.59 20.64
Industry, construction and services (except public administration, defense, compulsory social security) 39.21 38.06 29.58 23.00
Manufacturing 41.94 43.22 29.41 24.23
Services of the business economy 39.15 36.02 28.52 21.85