Wage

Data - Fred

Info

source dataset .html .RData
fred cpi 2024-11-21 2024-11-21
fred inflation 2024-11-21 2024-11-21
fred wage 2024-11-09 2024-11-21

Data on wages

source dataset .html .RData
eurostat earn_mw_cur 2024-11-08 2024-10-08
eurostat ei_lmlc_q 2024-11-08 2024-10-08
eurostat lc_lci_lev 2024-11-08 2024-10-08
eurostat lc_lci_r2_q 2024-11-08 2024-11-04
eurostat nama_10_lp_ulc 2024-11-08 2024-10-08
eurostat namq_10_lp_ulc 2024-11-05 2024-11-04
eurostat tps00155 2024-11-05 2024-10-08
fred wage 2024-11-09 2024-11-21
ilo EAR_4MTH_SEX_ECO_CUR_NB_A 2024-06-20 2023-06-01
ilo EAR_XEES_SEX_ECO_NB_Q 2024-06-20 2023-06-01
oecd AV_AN_WAGE 2024-04-16 2024-10-24
oecd AWCOMP 2024-09-15 2023-09-09
oecd EAR_MEI 2024-04-16 2024-04-16
oecd HH_DASH 2024-09-15 2023-09-09
oecd MIN2AVE 2024-09-15 2023-09-09
oecd RMW 2024-09-15 2024-03-12
oecd ULC_EEQ 2024-09-15 2024-04-15

LAST_COMPILE

LAST_COMPILE
2024-11-21

Last

date Nobs
2024-10-01 5

variable

Code
wage %>%
  left_join(variable,  by = "variable") %>%
  group_by(variable, Variable) %>%
  arrange(date) %>%
  summarise(Nobs = n(),
            first = first(date),
            last = last(date)) %>%
  arrange(-Nobs) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F) else .}

Employment Cost Index (Wages)

ECIWAG, ECICONWAG, CPIAUCSL

All

Code
wage %>%
  bind_rows(cpi) %>%
  filter(variable %in% c("ECIWAG", "ECICONWAG", "CPIAUCSL")) %>%
  filter(month(date) %in% c(1, 4, 7, 10),
         !is.na(value)) %>%
  select(date, variable, value) %>%
  group_by(variable) %>%
  filter(date >= as.Date("2001-01-01")) %>%
  arrange(date) %>%
  mutate(value_d1 = value/lag(value, 4) - 1) %>%
  na.omit %>%
  ggplot(.) + geom_line(aes(x = date, y = value_d1, color = variable)) + theme_minimal() +
  scale_x_date(breaks = "12 months",
               labels = date_format("%b %Y")) + 
  scale_y_continuous(breaks = 0.01*seq(-60, 60, 0.5),
                     labels = scales::percent_format(accuracy = .1)) + 
  xlab("") + ylab("ECI Inflation (%)") +
  theme(legend.position = c(0.4, 0.8),
        legend.title = element_blank(),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1))

2010-

Code
wage %>%
  bind_rows(cpi) %>%
  filter(variable %in% c("ECIWAG", "ECICONWAG", "CPIAUCSL")) %>%
  filter(month(date) %in% c(1, 4, 7, 10),
         !is.na(value)) %>%
  select(date, variable, value) %>%
  group_by(variable) %>%
  filter(date >= as.Date("2010-01-01")) %>%
  arrange(date) %>%
  mutate(value_d1 = value/lag(value, 4) - 1) %>%
  na.omit %>%
  ggplot(.) + geom_line(aes(x = date, y = value_d1, color = variable)) + theme_minimal() +
  scale_x_date(breaks = "12 months",
               labels = date_format("%b %Y")) + 
  scale_y_continuous(breaks = 0.01*seq(-60, 60, 0.5),
                     labels = scales::percent_format(accuracy = .1)) + 
  xlab("") + ylab("ECI Inflation (%)") +
  theme(legend.position = c(0.4, 0.8),
        legend.title = element_blank(),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1))

2017-

Code
wage %>%
  bind_rows(cpi) %>%
  filter(variable %in% c("ECIWAG", "ECICONWAG", "CPIAUCSL")) %>%
  filter(month(date) %in% c(1, 4, 7, 10),
         !is.na(value)) %>%
  select(date, variable, value) %>%
  group_by(variable) %>%
  filter(date >= as.Date("2017-01-01")) %>%
  arrange(date) %>%
  mutate(value_d1 = value/lag(value, 4) - 1) %>%
  na.omit %>%
  ggplot(.) + geom_line(aes(x = date, y = value_d1, color = variable)) + theme_minimal() +
  scale_x_date(breaks = "3 months",
               labels = date_format("%b %Y")) + 
  scale_y_continuous(breaks = 0.01*seq(-60, 60, 0.5),
                     labels = scales::percent_format(accuracy = .1)) + 
  xlab("") + ylab("ECI Inflation (%)") +
  theme(legend.position = c(0.4, 0.8),
        legend.title = element_blank(),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1))

ECIWAG, ECICONWAG

All

Code
wage %>%
  filter(variable %in% c("ECIWAG", "ECICONWAG")) %>%
  select(date, variable, value) %>%
  group_by(variable) %>%
  arrange(date) %>%
  mutate(value = value/lag(value, 4) - 1) %>%
  left_join(variable, by = "variable") %>%
  na.omit %>%
  ggplot(.) + geom_line(aes(x = date, y = value, color = Variable)) + theme_minimal() +
  scale_x_date(breaks = "12 months",
               labels = date_format("%b %Y")) + 
  scale_y_continuous(breaks = 0.01*seq(-60, 60, 0.5),
                     labels = scales::percent_format(accuracy = .1)) + 
  xlab("") + ylab("ECI Inflation (%)") +
  theme(legend.position = c(0.4, 0.8),
        legend.title = element_blank(),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1))

2010-

Code
wage %>%
  filter(variable %in% c("ECIWAG", "ECICONWAG")) %>%
  select(date, variable, value) %>%
  group_by(variable) %>%
  arrange(date) %>%
  mutate(value = value/lag(value, 4) - 1) %>%
  filter(date >= as.Date("2010-01-01")) %>%
  left_join(variable, by = "variable") %>%
  na.omit %>%
  ggplot(.) + geom_line(aes(x = date, y = value, color = Variable)) + theme_minimal() +
  scale_x_date(breaks = "12 months",
               labels = date_format("%b %Y")) + 
  scale_y_continuous(breaks = 0.01*seq(-60, 60, 0.5),
                     labels = scales::percent_format(accuracy = .1)) + 
  xlab("") + ylab("ECI Inflation (%)") +
  theme(legend.position = c(0.4, 0.8),
        legend.title = element_blank(),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1))

2019-

Code
wage %>%
  filter(variable %in% c("ECIWAG", "ECICONWAG")) %>%
  select(date, variable, value) %>%
  group_by(variable) %>%
  arrange(date) %>%
  mutate(value = value/lag(value, 4) - 1) %>%
  filter(date >= as.Date("2019-01-01")) %>%
  left_join(variable, by = "variable") %>%
  na.omit %>%
  ggplot(.) + geom_line(aes(x = date, y = value, color = Variable)) + theme_minimal() +
  scale_x_date(breaks = "3 months",
               labels = date_format("%b %Y")) + 
  scale_y_continuous(breaks = 0.01*seq(-60, 60, 0.5),
                     labels = scales::percent_format(accuracy = .1)) + 
  xlab("") + ylab("ECI Inflation (%)") +
  theme(legend.position = c(0.4, 0.8),
        legend.title = element_blank(),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1))

Real Average Hourly Earnings of All Employees, Total Private - CES3000000008

Index

All

Code
wage %>%
  bind_rows(cpi) %>%
  filter(variable %in% c("CPIAUCSL", "CES3000000008")) %>%
  select(date, variable, value) %>%
  unique %>%
  spread(variable, value) %>%
  mutate(CES3000000008_real = CES3000000008/CPIAUCSL) %>%
  filter(!is.na(CES3000000008_real)) %>%
  mutate(CES3000000008_real = 100*CES3000000008_real/CES3000000008_real[date == as.Date("1972-01-01")]) %>%
  ggplot(.) + geom_line(aes(x = date, y = CES3000000008_real)) + 
  ylab("Real Wages") + xlab("") + theme_minimal() +
  scale_y_log10(breaks = seq(0, 200, 5)) + 
  scale_x_date(breaks = as.Date(paste0(seq(1942, 2024, 5), "-01-01")),
               labels = date_format("%Y")) +
  geom_hline(yintercept = 100, linetype = "dashed", color = "red")

1970-

Code
wage %>%
  bind_rows(cpi) %>%
  filter(variable %in% c("CPIAUCSL", "CES3000000008")) %>%
  select(date, variable, value) %>%
  filter(date >= as.Date("1970-01-01")) %>%
  unique %>%
  spread(variable, value) %>%
  mutate(CES3000000008_real = CES3000000008/CPIAUCSL) %>%
  filter(!is.na(CES3000000008_real)) %>%
  mutate(CES3000000008_real = 100*CES3000000008_real/CES3000000008_real[1]) %>%
  ggplot(.) + geom_line(aes(x = date, y = CES3000000008_real)) + 
  ylab("Real Wages") + xlab("") + theme_minimal() +
  scale_y_log10(breaks = seq(0, 200, 2)) + 
  scale_x_date(breaks = as.Date(paste0(seq(1940, 2025, 5), "-01-01")),
               labels = date_format("%Y")) +
  geom_hline(yintercept = 100, linetype = "dashed", color = "red")

Round Stagflation: 1960-1980

Code
wage %>%
  bind_rows(cpi) %>%
  filter(variable %in% c("CPIAUCSL", "CES3000000008")) %>%
  select(date, variable, value) %>%
  filter(date >= as.Date("1960-01-01"),
         date <= as.Date("1980-01-01")) %>%
  unique %>%
  spread(variable, value) %>%
  mutate(CES3000000008_real = CES3000000008/CPIAUCSL) %>%
  filter(!is.na(CES3000000008_real)) %>%
  mutate(CES3000000008_real = 100*CES3000000008_real/CES3000000008_real[1]) %>%
  ggplot(.) + geom_line(aes(x = date, y = CES3000000008_real)) + 
  ylab("Real Wages") + xlab("") + theme_minimal() +
  scale_y_log10(breaks = seq(0, 200, 2)) + 
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2022, 2), "-01-01")),
               labels = date_format("%Y")) +
  geom_hline(yintercept = 100, linetype = "dashed", color = "red")

1972-

Code
wage %>%
  bind_rows(cpi) %>%
  filter(variable %in% c("CPIAUCSL", "CES3000000008")) %>%
  select(date, variable, value) %>%
  filter(date >= as.Date("1972-01-01")) %>%
  unique %>%
  spread(variable, value) %>%
  mutate(CES3000000008_real = CES3000000008/CPIAUCSL) %>%
  filter(!is.na(CES3000000008_real)) %>%
  mutate(CES3000000008_real = 100*CES3000000008_real/CES3000000008_real[1]) %>%
  ggplot(.) + geom_line(aes(x = date, y = CES3000000008_real)) + 
  ylab("Real Wages") + xlab("") + theme_minimal() +
  scale_y_log10(breaks = seq(0, 200, 2)) + 
  scale_x_date(breaks = as.Date(paste0(seq(1972, 2022, 5), "-01-01")),
               labels = date_format("%Y")) +
  geom_hline(yintercept = 100, linetype = "dashed", color = "red")

1995-

Code
wage %>%
  bind_rows(cpi) %>%
  filter(variable %in% c("CPIAUCSL", "CES3000000008")) %>%
  select(date, variable, value) %>%
  filter(date >= as.Date("1995-01-01")) %>%
  unique %>%
  spread(variable, value) %>%
  mutate(CES3000000008_real = CES3000000008/CPIAUCSL) %>%
  filter(!is.na(CES3000000008_real)) %>%
  mutate(CES3000000008_real = 100*CES3000000008_real/CES3000000008_real[1]) %>%
  ggplot(.) + geom_line(aes(x = date, y = CES3000000008_real)) + 
  ylab("Real Wages") + xlab("") + theme_minimal() +
  scale_y_log10(breaks = seq(0, 200, 2)) + 
  scale_x_date(breaks = as.Date(paste0(seq(1940, 2025, 5), "-01-01")),
               labels = date_format("%Y"))

2002-

Code
wage %>%
  bind_rows(cpi) %>%
  filter(variable %in% c("CPIAUCSL", "CES3000000008")) %>%
  select(date, variable, value) %>%
  filter(date >= as.Date("2002-01-01")) %>%
  unique %>%
  spread(variable, value) %>%
  mutate(CES3000000008_real = CES3000000008/CPIAUCSL) %>%
  filter(!is.na(CES3000000008_real)) %>%
  mutate(CES3000000008_real = 100*CES3000000008_real/CES3000000008_real[1]) %>%
  ggplot(.) + geom_line(aes(x = date, y = CES3000000008_real)) + 
  ylab("Real Wages") + xlab("") + theme_minimal() +
  scale_y_log10(breaks = seq(0, 200, 2)) + 
  scale_x_date(breaks = as.Date(paste0(seq(1940, 2025, 2), "-01-01")),
               labels = date_format("%Y"))

Log

Code
wage %>%
  bind_rows(cpi) %>%
  filter(variable %in% c("CPIAUCSL", "CES0500000003")) %>%
  filter(month(date) == 1) %>%
  select(date, variable, value) %>%
  spread(variable, value) %>%
  mutate(CES0500000003_real = CES0500000003/CPIAUCSL) %>%
  filter(!is.na(CES0500000003_real)) %>%
  mutate(wage_inflation = CES0500000003_real/lag(CES0500000003_real)-1) %>%
  ggplot(.) + ylab("Real Wage Inflation") + xlab("") +
  geom_line(aes(x = date, y = wage_inflation)) +
  scale_y_continuous(breaks = seq(-0.2, 0.4, 0.01),
                     labels = percent_format(acc = 1)) + 
  scale_x_date(breaks = as.Date(paste0(seq(1940, 2022, 2), "-01-01")),
               labels = date_format("%Y")) + 
  theme_minimal()

Real Average

Index

All

Code
wage %>%
  bind_rows(cpi) %>%
  filter(variable %in% c("CPIAUCSL", "CES0500000003")) %>%
  select(date, variable, value) %>%
  unique %>%
  spread(variable, value) %>%
  na.omit %>%
  mutate(CES0500000003_real = CES0500000003/CPIAUCSL) %>%
  filter(!is.na(CES0500000003_real)) %>%
  mutate(CES0500000003_real = 100*CES0500000003_real/CES0500000003_real[1]) %>%
  ggplot(.) + geom_line(aes(x = date, y = CES0500000003_real)) + 
  ylab("Real Wages") + xlab("") + theme_minimal() +
  scale_y_log10(breaks = seq(0, 200, 2)) + 
  scale_x_date(breaks = as.Date(paste0(seq(1942, 2024, 2), "-01-01")),
               labels = date_format("%Y")) +
  geom_hline(yintercept = 100, linetype = "dashed", color = "red")

1970-

Code
wage %>%
  bind_rows(cpi) %>%
  filter(variable %in% c("CPIAUCSL", "CES0500000003")) %>%
  select(date, variable, value) %>%
  filter(date >= as.Date("1970-01-01")) %>%
  unique %>%
  spread(variable, value) %>%
  mutate(CES0500000003_real = CES0500000003/CPIAUCSL) %>%
  filter(!is.na(CES0500000003_real)) %>%
  mutate(CES0500000003_real = 100*CES0500000003_real/CES0500000003_real[1]) %>%
  ggplot(.) + geom_line(aes(x = date, y = CES0500000003_real)) + 
  ylab("Real Wages") + xlab("") + theme_minimal() +
  scale_y_log10(breaks = seq(0, 200, 2)) + 
  scale_x_date(breaks = as.Date(paste0(seq(1940, 2025, 5), "-01-01")),
               labels = date_format("%Y")) +
  geom_hline(yintercept = 100, linetype = "dashed", color = "red")

Average Hourly Earnings of All Employees, Total Private - CES0500000003

Index

Code
wage %>%
  filter(variable == "CES0500000003") %>%
  ggplot(.) + geom_line(aes(x = date, y = value)) + 
  ylab("Wages") + xlab("") + theme_minimal() +
  scale_y_continuous(breaks = seq(0, 30, 2)) + 
  scale_x_date(breaks = as.Date(paste0(seq(1940, 2024, 2), "-01-01")),
               labels = date_format("%Y"))

Log

Code
wage %>%
  filter(variable == "CES0500000003") %>%
  mutate(year = year(date),
         month = month(date)) %>%
  filter(month == 1) %>%
  mutate(value_log = log(value),
         wage_inflation = value_log - lag(value_log)) %>%
  ggplot(.) + ylab("Wage Inflation") + xlab("") +
  geom_line(aes(x = date, y = wage_inflation)) +
  scale_y_continuous(breaks = seq(-0.2, 0.4, 0.01),
                     labels = percent_format(acc = 1)) + 
  scale_x_date(breaks = as.Date(paste0(seq(1940, 2022, 2), "-01-01")),
               labels = date_format("%Y")) + 
  theme_minimal()

CPIAUCSL

Index

Code
cpi %>%
  filter(variable == "CPIAUCSL") %>%
  ggplot(.) + geom_line(aes(x = date, y = value)) + 
  ylab("Wages") + xlab("") + theme_minimal() +
  scale_y_continuous(breaks = seq(0, 30, 2)) + 
  scale_x_date(breaks = as.Date(paste0(seq(1940, 2024, 2), "-01-01")),
               labels = date_format("%Y"))

Log

Code
cpi %>%
  filter(variable == "CPIAUCSL") %>%
  mutate(year = year(date),
         month = month(date)) %>%
  filter(month == 1) %>%
  mutate(value_log = log(value),
         wage_inflation = value_log - lag(value_log)) %>%
  filter(date >= as.Date("2008-01-01")) %>%
  ggplot(.) + ylab("Price Inflation") + xlab("") +
  geom_line(aes(x = date, y = wage_inflation)) +
  scale_y_continuous(breaks = seq(-0.2, 0.4, 0.01),
                     labels = percent_format(acc = 1)) + 
  scale_x_date(breaks = as.Date(paste0(seq(1940, 2022, 2), "-01-01")),
               labels = date_format("%Y")) + 
  theme_minimal()

U.S. Index of Manufacturing Wage Rates (07/1922 - 07/1935)

Index

(ref:us-index-CES3000000008) U.S. Index of Manufacturing Wage Rates (07/1922 - 07/1935)

Code
wage %>%
  filter(variable == "CES3000000008") %>%
  ggplot(.) +
  geom_line(aes(x = date, y = value)) + 
  ylab("Wages") + xlab("") +
  scale_y_continuous(breaks = seq(0, 30, 2)) + 
  scale_x_date(breaks = as.Date(paste0(seq(1940, 2020, 5), "-01-01")),
               labels = date_format("%Y")) + 
  theme_minimal()

(ref:us-index-CES3000000008)

Log

(ref:us-index-CES3000000008-d1ln) U.S. Index of Manufacturing Wage Rates (07/1922 - 07/1935)

Code
wage %>%
  filter(variable == "CES3000000008") %>%
  mutate(year = year(date),
         month = month(date)) %>%
  filter(month == 1) %>%
  mutate(value_log = log(value),
         wage_inflation = value_log - lag(value_log)) %>%
  ggplot(.) + ylab("Wage Inflation") + xlab("") +
  geom_line(aes(x = date, y = wage_inflation)) +
  scale_y_continuous(breaks = seq(-0.2, 0.4, 0.02),
                     labels = percent_format(acc = 1)) + 
  scale_x_date(breaks = as.Date(paste0(seq(1940, 2020, 5), "-01-01")),
               labels = date_format("%Y")) + 
  theme_minimal()

(ref:us-index-CES3000000008-d1ln)

Index of Manufacturing Wages (M0872BUSM234NNBR)

1928-1935

October 29, 1929 (“Black Tuesday”)

Code
wage %>%
  filter(variable == "M0872BUSM234NNBR",
         date >= as.Date("1928-01-01")) %>%
  ggplot(.) +
  geom_line(aes(x = date, y = value)) + 
  ylab("Wages") + xlab("") +
  geom_rect(data = nber_recessions, 
            aes(xmin = Peak, xmax = Trough, ymin = -Inf, ymax = +Inf), 
            fill = viridis(3)[3], alpha = 0.1) + 
  scale_y_continuous(breaks = seq(90, 110, 2.5),
                     limits = c(92.5, 110)) + 
  scale_x_date(breaks = as.Date(paste0(seq(1928, 1935, 1), "-01-01")),
               labels = date_format("%Y"),
               limits = c(as.Date("1928-01-01"), as.Date("1935-07-01"))) + 
  theme_minimal() + 
  geom_vline(xintercept = as.Date("1929-10-29"), linetype = "dashed", color = viridis(3)[1]) + 
  geom_vline(xintercept = as.Date("1933-04-01"), linetype = "dashed", color = viridis(3)[2])

2022-1935

October 29, 1929 (“Black Tuesday”)

(ref:us-index-manuf-wage) U.S. Index of Manufacturing Wage Rates (07/1922 - 07/1935)

Code
wage %>%
  filter(variable == "M0872BUSM234NNBR") %>%
  ggplot(.) +
  geom_line(aes(x = date, y = value)) + 
  ylab("Wages") + xlab("") +
  geom_rect(data = nber_recessions, 
            aes(xmin = Peak, xmax = Trough, ymin = -Inf, ymax = +Inf), 
            fill = 'grey', alpha = 0.5) + 
  scale_y_continuous(breaks = seq(90, 110, 2.5),
                     limits = c(92.5, 110)) + 
  scale_x_date(breaks = as.Date(paste0(seq(1922, 1935, 1), "-01-01")),
               labels = date_format("%Y"),
               limits = c(as.Date("1922-01-01"), as.Date("1935-07-01"))) + 
  theme_minimal() + 
  geom_vline(xintercept = as.Date("1929-10-29"), linetype = "dashed", color = viridis(3)[1]) + 
  geom_vline(xintercept = as.Date("1933-04-01"), linetype = "dashed", color = viridis(3)[2])

(ref:us-index-manuf-wage)