Quarterly GDP and components - expenditure approach - QNA_EXPENDITURE_NATIO_CURR

Data - OECD

Info

Last observation: Q: 2026-Q4 (N = 1) · A: 2025 (N = 3751)

First observation: A: 1947 (N = 37) · Q: 1947-Q1 (N = 37)

Last data update: 16 aoû 2026, 20:56. Last compile: 18 aoû 2026, 02:05

Structure

U.S. VS Europe

Table

Code
QNA_EXPENDITURE_NATIO_CURR |>
  filter(REF_AREA %in% c("USA", "EA"),
         FREQ == "Q",
         # L = Chain linked volume
         PRICE_BASE == "L",
         ADJUSTMENT == "Y",
         SECTOR == "S1",
         obsTime %in% c("1999-Q1", "2023-Q4")) |>
  
     left_join(QNA_POP_EMPNC_extract, by = c("obsTime", "REF_AREA", "Ref_area")) |>
  mutate(obsValue = 4*obsValue/population) %>%
  select_if(~ n_distinct(.) > 1) |>
  select(REF_AREA, TRANSACTION, Transaction, obsTime, obsValue) |>
  spread(obsTime, obsValue) |>
  mutate(change = `2023-Q4`-`1999-Q1`) |>
  select(REF_AREA, TRANSACTION, Transaction, change) |>
  spread(REF_AREA, change) |>
  print_table_conditional()
TRANSACTION Transaction EA USA
B11 External balance of goods and services 1.487252 -1.7562333
B1GQ Gross domestic product 8.293334 20.2089680
P3 Final consumption expenditure 5.406933 16.9323870
P3_P51G Final domestic demand excluding inventories NA 21.9965672
P3T5 Domestic demand NA 21.9885562
P5 Gross capital formation 1.363472 5.1699033
P51G Gross fixed capital formation 1.765036 5.1380607
P52 Changes in inventories NA -0.2244694
P5M Changes in inventories and acquisitions less disposals of valuables NA -0.2244694
P6 Exports of goods and services 9.958429 3.3483935
P61 Exports of goods 6.157792 2.2416424
P62 Exports of services 3.853228 1.1334371
P7 Imports of goods and services 8.471177 5.1046312
P71 Imports of goods 5.067714 4.1602559
P72 Imports of services 3.555563 0.9461343
YA0 Statistical discrepancy (expenditure approach) NA -0.2418460

P3 - Final consumption expenditure / capita

Code
plot <- QNA_EXPENDITURE_NATIO_CURR |>
  filter(REF_AREA %in% c("USA", "EA"),
         FREQ == "Q",
         TRANSACTION == "P3",
         # L = Chain linked volume
         PRICE_BASE == "L",
         ADJUSTMENT == "Y",
         SECTOR == "S1") |>
  left_join(QNA_POP_EMPNC_extract, by = c("obsTime", "REF_AREA", "Ref_area")) |>
  mutate(obsValue = obsValue/population) |>
  quarter_to_date() |>
  
  filter(date >= as.Date("1999-01-01")) |>
  mutate(Ref_area = ifelse(REF_AREA == "EA", "Zone euro", Ref_area)) |>
  group_by(Ref_area) |>
  arrange(date) |>
  mutate(obsValue = 100 * obsValue / obsValue[1]) |>
  ggplot() + theme_minimal() + xlab("") + ylab("Consommation par habitant (1999T1 = 100)") +
  geom_line(aes(x = date, y = obsValue, color = Ref_area)) +
  scale_color_manual(values = c("#B22234", "#003399")) +
  scale_x_date(breaks = c(seq(1999, 2100, 5), seq(1997, 2100, 5)) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.26, 0.8),
        legend.title = element_blank()) +
  scale_y_log10(breaks = seq(50, 200, 5)) +
  geom_rect(data = nber_recessions |>
              filter(Peak > as.Date("1999-01-01")), 
            aes(xmin = Peak, xmax = Trough, ymin = 0, ymax = +Inf),
            fill = '#B22234', alpha = 0.1)  +
  geom_rect(data = cepr_recessions |>
              filter(Peak > as.Date("1999-01-01")), 
            aes(xmin = Peak, xmax = Trough, ymin = 0, ymax = +Inf), 
            fill = '#003399', alpha = 0.1) +
  labs(caption = "Source: OCDE, Comptes Trimestriels, Volumes chaînés")

plot

Code
save(plot, file = "QNA_EXPENDITURE_NATIO_CURR_files/figure-html/USA-EA-1999-percapita-1.RData")

U.S., Europe, France, Germany

B1GQ - GDP

1995-

Code
QNA_EXPENDITURE_NATIO_CURR |>
  filter(REF_AREA %in% c("USA", "EA", "FRA", "DEU"),
         FREQ == "Q",
         TRANSACTION == "B1GQ",
         PRICE_BASE == "L",
         ADJUSTMENT == "Y",
         SECTOR == "S1") |>
  quarter_to_date() |>
  arrange(desc(date)) |>
  
  filter(date >= as.Date("1995-01-01")) |>
  mutate(Ref_area = ifelse(REF_AREA == "EA", "Europe", Ref_area)) |>
  group_by(Ref_area) |>
  arrange(date) |>
  mutate(obsValue = 100 * obsValue / obsValue[1]) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  mutate(color = ifelse(Ref_area != "DEU", color2, color)) |>
  ggplot() + theme_minimal() + xlab("") + ylab("") +
  geom_line(aes(x = date, y = obsValue, color = color)) + add_4flags +
  scale_color_identity() +
  scale_x_date(breaks = c(seq(1995, 2100, 5)) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = "none") +
  scale_y_log10(breaks = seq(50, 200, 5)) + 
  geom_label_repel(data = . %>% filter(date == max(date)),
             aes(x = date, y = obsValue, label = round(obsValue, 1), color = color))

1999-

Total

Code
QNA_EXPENDITURE_NATIO_CURR |>
  filter(REF_AREA %in% c("USA", "EA", "FRA", "DEU"),
         FREQ == "Q",
         TRANSACTION == "B1GQ",
         PRICE_BASE == "L",
         ADJUSTMENT == "Y",
         SECTOR == "S1") |>
  quarter_to_date() |>
  
  filter(date >= as.Date("1999-01-01")) |>
  mutate(Ref_area = ifelse(REF_AREA == "EA", "Europe", Ref_area)) |>
  group_by(Ref_area) |>
  arrange(date) |>
  mutate(obsValue = 100 * obsValue / obsValue[1]) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  mutate(color = ifelse(Ref_area != "DEU", color2, color)) |>
  ggplot() + theme_minimal() + xlab("") + ylab("") +
  geom_line(aes(x = date, y = obsValue, color = color)) + add_4flags +
  scale_color_identity() +
  scale_x_date(breaks = c(seq(1999, 2100, 5), seq(1997, 2100, 5)) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = "none") +
  scale_y_log10(breaks = seq(50, 200, 5)) + 
  geom_label_repel(data = . %>% filter(date == max(date)),
             aes(x = date, y = obsValue, label = round(obsValue, 1), color = color))

Per Capita

Code
QNA_EXPENDITURE_NATIO_CURR |>
  filter(REF_AREA %in% c("USA", "EA", "FRA", "DEU"),
         FREQ == "Q",
         TRANSACTION == "B1GQ",
         # L = Chain linked volume
         PRICE_BASE == "L",
         ADJUSTMENT == "Y",
         SECTOR == "S1") |>
  left_join(QNA_POP_EMPNC_extract, by = c("obsTime", "REF_AREA", "Ref_area")) |>
  mutate(obsValue = obsValue/population) |>
  quarter_to_date() |>
  
  
  filter(date >= as.Date("1999-01-01")) |>
  mutate(Ref_area = ifelse(REF_AREA == "EA", "Europe", Ref_area)) |>
  group_by(Ref_area) |>
  arrange(date) |>
  mutate(obsValue = 100 * obsValue / obsValue[1]) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  mutate(color = ifelse(Ref_area != "DEU", color2, color)) |>
  ggplot() + theme_minimal() + xlab("") + ylab("") +
  geom_line(aes(x = date, y = obsValue, color = color)) + add_4flags +
  scale_color_identity() +
  scale_x_date(breaks = c(seq(1999, 2100, 5), seq(1997, 2100, 5)) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = "none") +
  scale_y_log10(breaks = seq(50, 200, 5)) + 
  geom_label_repel(data = . %>% filter(date == max(date)),
             aes(x = date, y = obsValue, label = round(obsValue, 1), color = color))

P51G - Gross fixed capital formation

1995-

Code
QNA_EXPENDITURE_NATIO_CURR |>
  filter(REF_AREA %in% c("USA", "EA", "FRA", "DEU"),
         FREQ == "Q",
         TRANSACTION == "P51G",
         PRICE_BASE == "L",
         ADJUSTMENT == "Y",
         SECTOR == "S1") |>
  quarter_to_date() |>
  arrange(desc(date)) |>
  
  
  filter(date >= as.Date("1995-01-01")) |>
  mutate(Ref_area = ifelse(REF_AREA == "EA", "Europe", Ref_area)) |>
  group_by(Ref_area) |>
  arrange(date) |>
  mutate(obsValue = 100 * obsValue / obsValue[1]) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  mutate(color = ifelse(Ref_area != "DEU", color2, color)) |>
  ggplot() + theme_minimal() + xlab("") + ylab("") +
  geom_line(aes(x = date, y = obsValue, color = color)) + add_4flags +
  scale_color_identity() +
  scale_x_date(breaks = c(seq(1995, 2100, 5)) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = "none") +
  scale_y_log10(breaks = seq(50, 500, 5)) + 
  geom_label_repel(data = . %>% filter(date == max(date)),
             aes(x = date, y = obsValue, label = round(obsValue, 1), color = color))

1999-

Total

Code
QNA_EXPENDITURE_NATIO_CURR |>
  filter(REF_AREA %in% c("USA", "EA", "FRA", "DEU"),
         FREQ == "Q",
         TRANSACTION == "P51G",
         PRICE_BASE == "L",
         ADJUSTMENT == "Y",
         SECTOR == "S1") |>
  quarter_to_date() |>
  
  
  filter(date >= as.Date("1999-01-01")) |>
  mutate(Ref_area = ifelse(REF_AREA == "EA", "Europe", Ref_area)) |>
  group_by(Ref_area) |>
  arrange(date) |>
  mutate(obsValue = 100 * obsValue / obsValue[1]) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  mutate(color = ifelse(Ref_area != "DEU", color2, color)) |>
  ggplot() + theme_minimal() + xlab("") + ylab("") +
  geom_line(aes(x = date, y = obsValue, color = color)) + add_4flags +
  scale_color_identity() +
  scale_x_date(breaks = c(seq(1999, 2100, 5), seq(1997, 2100, 5)) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = "none") +
  scale_y_log10(breaks = seq(50, 200, 5)) + 
  geom_label_repel(data = . %>% filter(date == max(date)),
             aes(x = date, y = obsValue, label = round(obsValue, 1), color = color))

Per Capita

Code
QNA_EXPENDITURE_NATIO_CURR |>
  filter(REF_AREA %in% c("USA", "EA", "FRA", "DEU"),
         FREQ == "Q",
         TRANSACTION == "P51G",
         # L = Chain linked volume
         PRICE_BASE == "L",
         ADJUSTMENT == "Y",
         SECTOR == "S1") |>
  left_join(QNA_POP_EMPNC_extract, by = c("obsTime", "REF_AREA", "Ref_area")) |>
  mutate(obsValue = obsValue/population) |>
  quarter_to_date() |>
  
  
  filter(date >= as.Date("1999-01-01")) |>
  mutate(Ref_area = ifelse(REF_AREA == "EA", "Europe", Ref_area)) |>
  group_by(Ref_area) |>
  arrange(date) |>
  mutate(obsValue = 100 * obsValue / obsValue[1]) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  mutate(color = ifelse(Ref_area != "DEU", color2, color)) |>
  ggplot() + theme_minimal() + xlab("") + ylab("") +
  geom_line(aes(x = date, y = obsValue, color = color)) + add_4flags +
  scale_color_identity() +
  scale_x_date(breaks = c(seq(1999, 2100, 5), seq(1997, 2100, 5)) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = "none") +
  scale_y_log10(breaks = seq(50, 200, 5)) + 
  geom_label_repel(data = . %>% filter(date == max(date)),
             aes(x = date, y = obsValue, label = round(obsValue, 1), color = color))

P3 - Final consumption expenditure

All

Code
QNA_EXPENDITURE_NATIO_CURR |>
  filter(REF_AREA %in% c("USA", "EA", "FRA", "DEU"),
         FREQ == "Q",
         TRANSACTION == "P3",
         PRICE_BASE == "L",
         ADJUSTMENT == "Y",
         SECTOR == "S1") |>
  quarter_to_date() |>
  arrange(desc(date)) |>
  
  
  mutate(Ref_area = ifelse(REF_AREA == "EA", "Europe", Ref_area)) |>
  group_by(Ref_area) |>
  arrange(date) |>
  mutate(obsValue = 100 * obsValue / obsValue[1]) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  mutate(color = ifelse(Ref_area != "DEU", color2, color)) |>
  ggplot() + theme_minimal() + xlab("") + ylab("") +
  geom_line(aes(x = date, y = obsValue, color = color)) + add_4flags +
  scale_color_identity() +
  scale_x_date(breaks = c(seq(1900, 2100, 5)) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = "none") +
  scale_y_log10(breaks = seq(20, 600, 20))

1995-

Code
QNA_EXPENDITURE_NATIO_CURR |>
  filter(REF_AREA %in% c("USA", "EA", "FRA", "DEU"),
         FREQ == "Q",
         TRANSACTION == "P3",
         PRICE_BASE == "L",
         ADJUSTMENT == "Y",
         SECTOR == "S1") |>
  quarter_to_date() |>
  arrange(desc(date)) |>
  
  
  filter(date >= as.Date("1995-01-01")) |>
  mutate(Ref_area = ifelse(REF_AREA == "EA", "Europe", Ref_area)) |>
  group_by(Ref_area) |>
  arrange(date) |>
  mutate(obsValue = 100 * obsValue / obsValue[1]) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  mutate(color = ifelse(Ref_area != "DEU", color2, color)) |>
  ggplot() + theme_minimal() + xlab("") + ylab("") +
  geom_line(aes(x = date, y = obsValue, color = color)) + add_4flags +
  scale_color_identity() +
  scale_x_date(breaks = c(seq(1995, 2100, 5)) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = "none") +
  scale_y_log10(breaks = seq(50, 200, 5)) + 
  geom_label_repel(data = . %>% filter(date == max(date)),
             aes(x = date, y = obsValue, label = round(obsValue, 1), color = color))

1999-

Total

Code
QNA_EXPENDITURE_NATIO_CURR |>
  filter(REF_AREA %in% c("USA", "EA", "FRA", "DEU"),
         FREQ == "Q",
         TRANSACTION == "P3",
         # L = Chain linked volume
         PRICE_BASE == "L",
         ADJUSTMENT == "Y",
         SECTOR == "S1") |>
  quarter_to_date() |>
  
  
  filter(date >= as.Date("1999-01-01")) |>
  mutate(Ref_area = ifelse(REF_AREA == "EA", "Europe", Ref_area)) |>
  group_by(Ref_area) |>
  arrange(date) |>
  mutate(obsValue = 100 * obsValue / obsValue[1]) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  mutate(color = ifelse(Ref_area != "DEU", color2, color)) |>
  ggplot() + theme_minimal() + xlab("") + ylab("") +
  geom_line(aes(x = date, y = obsValue, color = color)) + add_4flags +
  scale_color_identity() +
  scale_x_date(breaks = c(seq(1999, 2100, 5), seq(1997, 2100, 5)) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.26, 0.8),
        legend.title = element_blank()) +
  scale_y_log10(breaks = seq(50, 200, 5)) + 
  geom_label_repel(data = . %>% filter(date == max(date)),
             aes(x = date, y = obsValue, label = round(obsValue, 1), color = color))

Per Capita

Code
plot <- QNA_EXPENDITURE_NATIO_CURR |>
  filter(REF_AREA %in% c("USA", "EA", "FRA", "DEU"),
         FREQ == "Q",
         TRANSACTION == "P3",
         # L = Chain linked volume
         PRICE_BASE == "L",
         ADJUSTMENT == "Y",
         SECTOR == "S1") |>
  left_join(QNA_POP_EMPNC_extract, by = c("obsTime", "REF_AREA", "Ref_area")) |>
  mutate(obsValue = obsValue/population) |>
  quarter_to_date() |>
  
  filter(date >= as.Date("1999-01-01")) |>
  mutate(Ref_area = ifelse(REF_AREA == "EA", "Zone euro", Ref_area)) |>
  group_by(Ref_area) |>
  arrange(date) |>
  mutate(obsValue = 100 * obsValue / obsValue[1]) |>
  ggplot() + theme_minimal() + xlab("") + ylab("Consommation par habitant (1999T1 = 100)") +
  geom_line(aes(x = date, y = obsValue, color = Ref_area)) +
  scale_color_manual(values = c("#000000", "#B22234", "#808080", "#003399")) +
  scale_x_date(breaks = c(seq(1999, 2100, 5), seq(1997, 2100, 5)) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.26, 0.8),
        legend.title = element_blank()) +
  scale_y_log10(breaks = seq(50, 200, 5))  +
  geom_rect(data = nber_recessions |>
              filter(Peak > as.Date("1999-01-01")), 
            aes(xmin = Peak, xmax = Trough, ymin = 0, ymax = +Inf),
            fill = '#B22234', alpha = 0.1)  +
  geom_rect(data = cepr_recessions |>
              filter(Peak > as.Date("1999-01-01")), 
            aes(xmin = Peak, xmax = Trough, ymin = 0, ymax = +Inf), 
            fill = '#003399', alpha = 0.1)  +
  labs(caption = "Source: OCDE, Comptes Trimestriels, Volumes chaînés")


save(plot, file = "QNA_EXPENDITURE_NATIO_CURR_files/figure-html/USA-EA-FRA-DEU-1999-percapita-1.RData")

plot

P31 - Individual consumption expenditure

Code
QNA_EXPENDITURE_NATIO_CURR |>
  filter(REF_AREA %in% c("USA", "EA", "FRA", "DEU"),
         FREQ == "Q",
         TRANSACTION == "P31",
         # L = Chain linked volume
         PRICE_BASE == "L",
         ADJUSTMENT == "Y") |>
  left_join(QNA_POP_EMPNC_extract, by = c("obsTime", "REF_AREA", "Ref_area")) |>
  mutate(obsValue = obsValue/population) |>
  quarter_to_date() |>
  
  
  filter(date >= as.Date("1999-01-01")) |>
  mutate(Ref_area = ifelse(REF_AREA == "EA", "Europe", Ref_area)) |>
  group_by(Ref_area) |>
  arrange(date) |>
  mutate(obsValue = 100 * obsValue / obsValue[1]) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  mutate(color = ifelse(Ref_area != "DEU", color2, color)) |>
  ggplot() + theme_minimal() + xlab("") + ylab("") +
  geom_line(aes(x = date, y = obsValue, color = color)) + add_3flags +
  scale_color_identity() +
  scale_x_date(breaks = c(seq(1999, 2100, 5), seq(1997, 2100, 5)) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = "none") +
  scale_y_log10(breaks = seq(50, 200, 5)) + 
  geom_label_repel(data = . %>% filter(date == max(date)),
             aes(x = date, y = obsValue, label = round(obsValue, 1), color = color))

P32 - Collective consumption expenditure

Code
QNA_EXPENDITURE_NATIO_CURR |>
  filter(REF_AREA %in% c("USA", "EA", "FRA", "DEU"),
         FREQ == "Q",
         TRANSACTION == "P32",
         # L = Chain linked volume
         PRICE_BASE == "L",
         ADJUSTMENT == "Y") |>
  left_join(QNA_POP_EMPNC_extract, by = c("obsTime", "REF_AREA", "Ref_area")) |>
  mutate(obsValue = obsValue/population) |>
  quarter_to_date() |>
  
  
  filter(date >= as.Date("1999-01-01")) |>
  mutate(Ref_area = ifelse(REF_AREA == "EA", "Europe", Ref_area)) |>
  group_by(Ref_area) |>
  arrange(date) |>
  mutate(obsValue = 100 * obsValue / obsValue[1]) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  mutate(color = ifelse(Ref_area != "DEU", color2, color)) |>
  ggplot() + theme_minimal() + xlab("") + ylab("") +
  geom_line(aes(x = date, y = obsValue, color = color)) + add_3flags +
  scale_color_identity() +
  scale_x_date(breaks = c(seq(1999, 2100, 5), seq(1997, 2100, 5)) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = "none") +
  scale_y_log10(breaks = seq(50, 200, 5)) + 
  geom_label_repel(data = . %>% filter(date == max(date)),
             aes(x = date, y = obsValue, label = round(obsValue, 1), color = color))

P41 - Actual individual consumption

Code
QNA_EXPENDITURE_NATIO_CURR |>
  filter(REF_AREA %in% c("USA", "EA", "FRA", "DEU"),
         FREQ == "Q",
         TRANSACTION == "P41",
         # L = Chain linked volume
         PRICE_BASE == "L",
         ADJUSTMENT == "Y") |>
     left_join(QNA_POP_EMPNC_extract, by = c("obsTime", "REF_AREA", "Ref_area")) |>
  mutate(obsValue = obsValue/population) |>
  quarter_to_date() |>
  
  
  filter(date >= as.Date("1999-01-01")) |>
  mutate(Ref_area = ifelse(REF_AREA == "EA", "Europe", Ref_area)) |>
  group_by(Ref_area) |>
  arrange(date) |>
  mutate(obsValue = 100 * obsValue / obsValue[1]) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  mutate(color = ifelse(Ref_area != "DEU", color2, color)) |>
  ggplot() + theme_minimal() + xlab("") + ylab("") +
  geom_line(aes(x = date, y = obsValue, color = color)) + add_2flags +
  scale_color_identity() +
  scale_x_date(breaks = c(seq(1999, 2100, 5), seq(1997, 2100, 5)) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = "none") +
  scale_y_log10(breaks = seq(50, 200, 5)) + 
  geom_label_repel(data = . %>% filter(date == max(date)),
             aes(x = date, y = obsValue, label = round(obsValue, 1), color = color))

P3T5 - Domestic demand

Code
QNA_EXPENDITURE_NATIO_CURR |>
  filter(REF_AREA %in% c("USA", "EA", "FRA", "DEU"),
         FREQ == "Q",
         TRANSACTION == "P3T5",
         # L = Chain linked volume
         PRICE_BASE == "L",
         ADJUSTMENT == "Y") |>
     left_join(QNA_POP_EMPNC_extract, by = c("obsTime", "REF_AREA", "Ref_area")) |>
  mutate(obsValue = obsValue/population) |>
  quarter_to_date() |>
  
  
  filter(date >= as.Date("1999-01-01")) |>
  mutate(Ref_area = ifelse(REF_AREA == "EA", "Europe", Ref_area)) |>
  group_by(Ref_area) |>
  arrange(date) |>
  mutate(obsValue = 100 * obsValue / obsValue[1]) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  mutate(color = ifelse(Ref_area != "DEU", color2, color)) |>
  ggplot() + theme_minimal() + xlab("") + ylab("") +
  geom_line(aes(x = date, y = obsValue, color = color)) + add_3flags +
  scale_color_identity() +
  scale_x_date(breaks = c(seq(1999, 2100, 5), seq(1997, 2100, 5)) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = "none") +
  scale_y_log10(breaks = seq(50, 200, 5)) + 
  geom_label_repel(data = . %>% filter(date == max(date)),
             aes(x = date, y = obsValue, label = round(obsValue, 1), color = color))

Net exports

Eurozone, US, France, Germany

Tous

Code
QNA_EXPENDITURE_NATIO_CURR |>
  filter(REF_AREA %in% c("EA", "USA", "DEU", "FRA"),
         FREQ == "Q",
         TRANSACTION %in% c("B11", "B1GQ"),
         # L = Chain linked volume
         PRICE_BASE == "V",
         ADJUSTMENT == "Y") |>
  
  mutate(Ref_area = ifelse(REF_AREA == "EA", "Europe", Ref_area)) |>
  group_by(Ref_area) %>%
  select_if(~ n_distinct(.) > 1) |>
  select(-OBS_STATUS) |>
  spread(TRANSACTION, obsValue) |>
  quarter_to_date() |>
  filter(date >= as.Date("1970-01-01")) |>
  transmute(date, Ref_area, obsValue = B11/B1GQ) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  ggplot() + geom_line(aes(x = date, y = obsValue, color = color)) +
  theme_minimal() + xlab("") + ylab("") + scale_color_identity() + add_4flags +
  scale_x_date(breaks = c(seq(1970, 2100, 5)) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-100, 100, 1),
                labels = percent_format(acc = 1)) +
  theme(legend.position = c(0.2, 0.8),
        legend.title = element_blank()) +
  geom_hline(yintercept = 0, linetype = "dashed")

1990-

Code
QNA_EXPENDITURE_NATIO_CURR |>
  filter(REF_AREA %in% c("EA", "USA", "DEU", "FRA"),
         FREQ == "Q",
         TRANSACTION %in% c("B11", "B1GQ"),
         # L = Chain linked volume
         PRICE_BASE == "V",
         ADJUSTMENT == "Y") |>
  
     
  mutate(Ref_area = ifelse(REF_AREA == "EA", "Europe", Ref_area)) |>
  group_by(Ref_area) %>%
  select_if(~ n_distinct(.) > 1) |>
  select(-OBS_STATUS) |>
  spread(TRANSACTION, obsValue) |>
  quarter_to_date() |>
  filter(date >= as.Date("1990-01-01")) |>
  transmute(date, Ref_area, obsValue = B11/B1GQ) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  ggplot() + geom_line(aes(x = date, y = obsValue, color = color)) +
  theme_minimal() + xlab("") + ylab("") + scale_color_identity() + add_4flags +
  scale_x_date(breaks = c(seq(1970, 2100, 5)) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-100, 100, 1),
                labels = percent_format(acc = 1)) +
  theme(legend.position = c(0.2, 0.8),
        legend.title = element_blank()) +
  geom_hline(yintercept = 0, linetype = "dashed")

Eurozone, US

Tous

Code
QNA_EXPENDITURE_NATIO_CURR |>
  filter(REF_AREA %in% c("EA", "USA"),
         FREQ == "Q",
         TRANSACTION %in% c("B11", "B1GQ"),
         # L = Chain linked volume
         PRICE_BASE == "V",
         ADJUSTMENT == "Y") |>
  
  mutate(Ref_area = ifelse(REF_AREA == "EA", "Europe", Ref_area)) |>
  group_by(Ref_area) %>%
  select_if(~ n_distinct(.) > 1) |>
  spread(TRANSACTION, obsValue) |>
  quarter_to_date() |>
  transmute(date, REF_AREA, Ref_area, obsValue = B11/B1GQ) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  mutate(color = ifelse(REF_AREA == "USA", color2, color)) |>
  ggplot() + geom_line(aes(x = date, y = obsValue, color = color)) +
  theme_minimal() + xlab("") + ylab("") + scale_color_identity() + add_2flags +
  scale_x_date(breaks = c(seq(1920, 2100, 5)) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-100, 100, 1),
                labels = percent_format(acc = 1)) +
  theme(legend.position = c(0.2, 0.8),
        legend.title = element_blank()) +
  geom_hline(yintercept = 0, linetype = "dashed")

1970-

Code
QNA_EXPENDITURE_NATIO_CURR |>
  filter(REF_AREA %in% c("EA", "USA"),
         FREQ == "Q",
         TRANSACTION %in% c("B11", "B1GQ"),
         # L = Chain linked volume
         PRICE_BASE == "V",
         ADJUSTMENT == "Y") |>
  
  mutate(Ref_area = ifelse(REF_AREA == "EA", "Europe", Ref_area)) |>
  group_by(Ref_area) %>%
  select_if(~ n_distinct(.) > 1) |>
  spread(TRANSACTION, obsValue) |>
  quarter_to_date() |>
  filter(date >= as.Date("1970-01-01")) |>
  transmute(date, REF_AREA, Ref_area, obsValue = B11/B1GQ) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  mutate(color = ifelse(REF_AREA == "USA", color2, color)) |>
  ggplot() + geom_line(aes(x = date, y = obsValue, color = color)) +
  theme_minimal() + xlab("") + ylab("") + scale_color_identity() + add_2flags +
  scale_x_date(breaks = c(seq(1970, 2100, 5)) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-100, 100, 1),
                labels = percent_format(acc = 1)) +
  theme(legend.position = c(0.2, 0.8),
        legend.title = element_blank()) +
  geom_hline(yintercept = 0, linetype = "dashed")

1990-

Code
QNA_EXPENDITURE_NATIO_CURR |>
  filter(REF_AREA %in% c("EA", "USA"),
         FREQ == "Q",
         TRANSACTION %in% c("B11", "B1GQ"),
         # L = Chain linked volume
         PRICE_BASE == "V",
         ADJUSTMENT == "Y") |>
  
  mutate(Ref_area = ifelse(REF_AREA == "EA", "Europe", Ref_area)) |>
  group_by(Ref_area) %>%
  select_if(~ n_distinct(.) > 1) |>
  spread(TRANSACTION, obsValue) |>
  quarter_to_date() |>
  filter(date >= as.Date("1995-01-01")) |>
  transmute(date, REF_AREA, Ref_area, obsValue = B11/B1GQ) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  mutate(color = ifelse(REF_AREA == "USA", color2, color)) |>
  ggplot() + geom_line(aes(x = date, y = obsValue, color = color)) +
  theme_minimal() + xlab("") + ylab("") + scale_color_identity() + add_2flags +
  scale_x_date(breaks = c(seq(1970, 2100, 5)) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-100, 100, 1),
                labels = percent_format(acc = 1)) +
  theme(legend.position = c(0.2, 0.8),
        legend.title = element_blank()) +
  geom_hline(yintercept = 0, linetype = "dashed")

Exports and Imports as a % of GDP

EA 20

Code
QNA_EXPENDITURE_NATIO_CURR |>
  filter(REF_AREA %in% c("EA"),
         FREQ == "Q",
         TRANSACTION %in% c("P6", "P7", "B1GQ"),
         # L = Chain linked volume
         PRICE_BASE == "L",
         ADJUSTMENT == "Y") %>%
  select_if(~ n_distinct(.) > 1) |>
  select(-OBS_STATUS) |>
  spread(TRANSACTION, obsValue) |>
  quarter_to_date() |>
  transmute(date, `Exports (% of GDP)` = P6/B1GQ, `Imports (% of GDP)` = P7/B1GQ) |>
  gather(variable, value, -date) |>
  ggplot() + geom_line(aes(x = date, y = value, color = variable)) +
  theme_minimal() + xlab("") + ylab("") +
  scale_x_date(breaks = c(seq(1999, 2100, 5), seq(1997, 2100, 5)) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-100, 100, 5),
                labels = percent_format(acc = 1)) +
  theme(legend.position = c(0.2, 0.8),
        legend.title = element_blank())

USA

Code
QNA_EXPENDITURE_NATIO_CURR |>
  filter(REF_AREA %in% c("USA"),
         FREQ == "Q",
         TRANSACTION %in% c("P6", "P7", "B1GQ"),
         # L = Chain linked volume
         PRICE_BASE == "V",
         ADJUSTMENT == "Y") %>%
  select_if(~ n_distinct(.) > 1) |>
  spread(TRANSACTION, obsValue) |>
  quarter_to_date() |>
  transmute(date, `Exports (% of GDP)` = P6/B1GQ, `Imports (% of GDP)` = P7/B1GQ) |>
  gather(variable, value, -date) |>
  ggplot() + geom_line(aes(x = date, y = value, color = variable)) +
  theme_minimal() + xlab("") + ylab("") +
  scale_x_date(breaks = c(seq(1940, 2100, 5)) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-100, 100, 2),
                labels = percent_format(acc = 1)) +
  theme(legend.position = c(0.2, 0.8),
        legend.title = element_blank())

Germany

Code
QNA_EXPENDITURE_NATIO_CURR |>
  filter(REF_AREA %in% c("DEU"),
         FREQ == "Q",
         TRANSACTION %in% c("P6", "P7", "B1GQ"),
         # L = Chain linked volume
         PRICE_BASE == "V",
         ADJUSTMENT == "Y") %>%
  select_if(~ n_distinct(.) > 1) |>
  spread(TRANSACTION, obsValue) |>
  quarter_to_date() |>
  transmute(date, `Exports (% of GDP)` = P6/B1GQ, `Imports (% of GDP)` = P7/B1GQ) |>
  gather(variable, value, -date) |>
  ggplot() + geom_line(aes(x = date, y = value, color = variable)) +
  theme_minimal() + xlab("") + ylab("") +
  scale_x_date(breaks = c(seq(1940, 2100, 5)) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-100, 100, 2),
                labels = percent_format(acc = 1)) +
  theme(legend.position = c(0.2, 0.8),
        legend.title = element_blank())

France

Code
QNA_EXPENDITURE_NATIO_CURR |>
  filter(REF_AREA %in% c("FRA"),
         FREQ == "Q",
         TRANSACTION %in% c("P6", "P7", "B1GQ"),
         # L = Chain linked volume
         PRICE_BASE == "V",
         ADJUSTMENT == "Y") %>%
  select_if(~ n_distinct(.) > 1) |>
  spread(TRANSACTION, obsValue) |>
  quarter_to_date() |>
  transmute(date, `Exports (% of GDP)` = P6/B1GQ, `Imports (% of GDP)` = P7/B1GQ) |>
  gather(variable, value, -date) |>
  ggplot() + geom_line(aes(x = date, y = value, color = variable)) +
  theme_minimal() + xlab("") + ylab("") +
  scale_x_date(breaks = c(seq(1940, 2100, 5)) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-100, 100, 2),
                labels = percent_format(acc = 1)) +
  theme(legend.position = c(0.2, 0.8),
        legend.title = element_blank())