Taxing Wages - Comparative tables - AWCOMP

Data - OECD

Last observation: 2022 (N = 4768)

First observation: 2000 (N = 4768)

Last data update: 02 août 2026, 08:56

Last compile: 02 sept. 2026, 23:12

Structure

obsTime

Code
AWCOMP |>
  group_by(obsTime) |>
  summarise(Nobs = n()) |>
  arrange(desc(obsTime)) |>
  print_table_conditional()
obsTime Nobs
2022 4768
2021 4768
2020 4768
2019 4768
2018 4768
2017 4768
2016 4768
2015 4768
2014 4768
2013 4768
2012 4768
2011 4768
2010 4768
2009 4768
2008 4768
2007 4768
2006 4768
2005 4768
2004 4768
2003 4768
2002 4768
2001 4768
2000 4768

Countries

Germany

Code
AWCOMP |>
  filter(COU == "DEU",
         UNIT == "PC",
         FAM_TYPE == "MARRIED2") |>
  year_to_date() |>
  left_join(AWCOMP_var$INDICATOR, by = c("INDICATOR")) |>
  mutate(obsValue = obsValue/100) |>
  ggplot() + 
  geom_line(aes(x = date, y = obsValue, color = Indicator, linetype = Indicator)) +
  scale_color_manual(values = viridis(11)[1:10]) +
  theme_minimal() +
  scale_x_date(breaks = seq(1920, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.65, 0.6),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = 0.01*seq(0, 100, 5),
                     labels = percent_format(accuracy = 1)) + 
  ylab("Tax Rate (%)") + xlab("")

France

Code
AWCOMP |>
  filter(COU == "FRA",
         UNIT == "PC",
         FAM_TYPE == "MARRIED2") |>
  year_to_date() |>
  left_join(AWCOMP_var$INDICATOR, by = c("INDICATOR")) |>
  mutate(obsValue = obsValue/100) |>
  ggplot() + 
  geom_line(aes(x = date, y = obsValue, color = Indicator, linetype = Indicator)) +
  scale_color_manual(values = viridis(11)[1:10]) +
  theme_minimal() +
  scale_x_date(breaks = seq(1920, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.65, 0.6),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = 0.01*seq(0, 100, 5),
                     labels = percent_format(accuracy = 1)) + 
  ylab("Tax Rate (%)") + xlab("")

Wages: Gross vs. Net

2021

Code
AWCOMP |>
  filter(obsTime == "2021",
         INDICATOR %in% c("5_1", "5_2"),
         FAM_TYPE == "SINGLE2") |>
  left_join(AWCOMP_var$COU, by = "COU") |>
  left_join(AWCOMP_var$INDICATOR, by = "INDICATOR") |>
  select(COU, Cou, Indicator, obsValue) |>
  spread(Indicator, obsValue) |>
  mutate(Flag = gsub(" ", "-", str_to_lower(gsub(" ", "-", Cou))),
         Flag = paste0('<img src="../../icon/flag/vsmall/', Flag, '.png" alt="Flag">')) |>
  select(Flag, everything()) |>
  arrange(-`Total gross earnings before taxes in US dollars using PPP exchange rates`) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}

2020

Code
AWCOMP |>
  filter(obsTime == "2020",
         INDICATOR %in% c("5_1", "5_2"),
         FAM_TYPE == "SINGLE2") |>
  left_join(AWCOMP_var$COU, by = "COU") |>
  left_join(AWCOMP_var$INDICATOR, by = "INDICATOR") |>
  select(COU, Cou, Indicator, obsValue) |>
  spread(Indicator, obsValue) |>
  mutate(Flag = gsub(" ", "-", str_to_lower(gsub(" ", "-", Cou))),
         Flag = paste0('<img src="../../icon/flag/vsmall/', Flag, '.png" alt="Flag">')) |>
  select(Flag, everything()) |>
  arrange(-`Total gross earnings before taxes in US dollars using PPP exchange rates`) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}

2000

Code
AWCOMP |>
  filter(obsTime == "2000",
         INDICATOR %in% c("5_1", "5_2"),
         FAM_TYPE == "SINGLE2") |>
  left_join(AWCOMP_var$COU, by = "COU") |>
  left_join(AWCOMP_var$INDICATOR, by = "INDICATOR") |>
  select(COU, Cou, Indicator, obsValue) |>
  spread(Indicator, obsValue) |>
  mutate(Flag = gsub(" ", "-", str_to_lower(gsub(" ", "-", Cou))),
         Flag = paste0('<img src="../../icon/flag/vsmall/', Flag, '.png" alt="Flag">')) |>
  select(Flag, everything()) |>
  arrange(-`Net income after taxes in US dollars using PPP exchange rates`) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}

France, Germany, Italy, United States

Gross/net

Code
AWCOMP |>
  filter(COU %in% c("FRA", "DEU", "ITA", "USA", "CHE"),
         INDICATOR %in% c("5_1", "5_2"),
         FAM_TYPE == "SINGLE2") |>
  left_join(AWCOMP_var$COU, by = "COU") |>
  left_join(AWCOMP_var$INDICATOR, by = c("INDICATOR")) |>
  year_to_date() |>
  group_by(Cou) |>
  add_flag_color("Cou") |>
  rename(Location = Cou) |>
  ggplot() + geom_line(aes(x = date, y = obsValue, color = color, linetype = Indicator)) + 
  scale_color_identity() + add_10flags +
  theme_minimal() + xlab("") + ylab("Wages") +
  scale_x_date(breaks = seq(1910, 2100, 5) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.4, 0.95),
        legend.title = element_blank()) +
  scale_y_log10(breaks = 1000*seq(-10, 300, 10),
                     labels = dollar_format(accuracy = 1))

Gross

Value

Code
AWCOMP |>
  filter(COU %in% c("FRA", "DEU", "ITA", "USA", "CHE"),
         INDICATOR %in% c("5_1"),
         FAM_TYPE == "SINGLE2") |>
  left_join(AWCOMP_var$COU, by = "COU") |>
  year_to_date() |>
  group_by(Cou) |>
  add_flag_color("Cou") |>
  rename(Location = Cou) |>
  ggplot() + geom_line(aes(x = date, y = obsValue, color = color)) + 
  scale_color_identity() + add_5flags +
  theme_minimal() + xlab("") + ylab("Wages") +
  scale_x_date(breaks = seq(1910, 2100, 5) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_log10(breaks = 1000*seq(-10, 300, 10),
                     labels = dollar_format(accuracy = 1))

Base 100

Code
AWCOMP |>
  filter(COU %in% c("FRA", "DEU", "ITA", "USA", "CHE"),
         INDICATOR %in% c("5_1"),
         FAM_TYPE == "SINGLE2") |>
  left_join(AWCOMP_var$COU, by = "COU") |>
  year_to_date() |>
  group_by(Cou) |>
  mutate(obsValue = 100*obsValue/obsValue[date == as.Date("2000-01-01")]) |>
  add_flag_color("Cou") |>
  rename(Location = Cou) |>
  ggplot() + geom_line(aes(x = date, y = obsValue, color = color)) + 
  scale_color_identity() + add_5flags +
  theme_minimal() + xlab("") + ylab("Wages") +
  scale_x_date(breaks = seq(1910, 2100, 5) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_log10(breaks = seq(-10, 300, 10),
                     labels = dollar_format(accuracy = 1, prefix = ""))

Net

Value

Code
AWCOMP |>
  filter(COU %in% c("FRA", "DEU", "ITA", "USA", "CHE"),
         INDICATOR %in% c("5_2"),
         FAM_TYPE == "SINGLE2") |>
  left_join(AWCOMP_var$COU, by = "COU") |>
  year_to_date() |>
  group_by(Cou) |>
  add_flag_color("Cou") |>
  rename(Location = Cou) |>
  ggplot() + geom_line(aes(x = date, y = obsValue, color = color)) + 
  scale_color_identity() + add_5flags +
  theme_minimal() + xlab("") + ylab("Wages") +
  scale_x_date(breaks = seq(1910, 2100, 5) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_log10(breaks = 1000*seq(-10, 300, 10),
                     labels = dollar_format(accuracy = 1))

Base 100

Code
AWCOMP |>
  filter(COU %in% c("FRA", "DEU", "ITA", "USA", "CHE"),
         INDICATOR %in% c("5_2"),
         FAM_TYPE == "SINGLE2") |>
  left_join(AWCOMP_var$COU, by = "COU") |>
  year_to_date() |>
  group_by(Cou) |>
  add_flag_color("Cou") |>
  rename(Location = Cou) |>
  mutate(obsValue = 100*obsValue/obsValue[date == as.Date("2000-01-01")]) |>
  ggplot() + geom_line(aes(x = date, y = obsValue, color = color)) + 
  scale_color_identity() + add_5flags +
  theme_minimal() + xlab("") + ylab("Wages") +
  scale_x_date(breaks = seq(1910, 2100, 5) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_log10(breaks = seq(-10, 300, 10),
                     labels = dollar_format(accuracy = 1, prefix = ""))