Production in construction - monthly data - sts_copr_m
Data - Eurostat
Info
Last observation: Monthly: 2026M05 (N = 597)
First observation: Monthly: 1980M01 (N = 4)
Last data update: 23 jul 2026, 22:30. Last compile: 25 jul 2026, 20:58
Structure
Construction Production
France, Germany, Italy
Code
sts_copr_m %>%
filter(nace_r2 == "F",
unit == "I15",
geo %in% c("FR", "DE", "IT"),
s_adj == "SCA") %>%
select(geo, Geo, time, values) %>%
group_by(geo) %>%
mutate(values = 100*values/values[time == "1997M01"]) %>%
mutate(Geo = ifelse(geo == "DE", "Germany", Geo)) %>%
month_to_date %>%
left_join(colors, by = c("Geo" = "country")) %>%
ggplot() + ylab("Construction Production") + xlab("") + theme_minimal() +
geom_line(aes(x = date, y = values, color = color)) +
scale_color_identity() + add_flags +
scale_color_manual(values = c("#0055a4", "#000000", "#008c45")) +
scale_x_date(breaks = seq(1920, 2100, 2) %>% paste0("-01-01") %>% as.Date,
labels = date_format("%Y")) +
geom_image(data = . %>%
filter(date == as.Date("2007-01-01")) %>%
mutate(date = as.Date("2007-01-01"),
image = paste0("../../icon/flag/", str_to_lower(Geo), ".png")),
aes(x = date, y = values, image = image), asp = 1.5) +
theme(legend.position = "none") +
scale_y_log10(breaks = seq(-60, 300, 10))
Covid-19
Table
Code
sts_copr_m %>%
filter(nace_r2 == "F",
unit == "I15",
s_adj == "SCA",
time %in% c("2019M11", "2020M02", "2020M03", "2020M04", "2020M05", "2020M08", "2020M11"),
!(geo %in% c("IE", "EU28"))) %>%
select(geo, Geo, time, values) %>%
group_by(geo) %>%
mutate(values = 100*values/values[time == "2019M11"]) %>%
spread(time, values) %>%
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()) %>%
arrange(`2020M04`) %>%
{if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}2018
Code
sts_copr_m %>%
filter(nace_r2 == "F",
unit == "I15",
geo %in% c("FR", "DE", "IT"),
s_adj == "SCA") %>%
select(geo, Geo, time, values) %>%
group_by(geo) %>%
mutate(values = 100*values/values[time == "2018M01"]) %>%
mutate(Geo = ifelse(geo == "DE", "Germany", Geo)) %>%
month_to_date %>%
filter(date >= as.Date("2018-01-01")) %>%
left_join(colors, by = c("Geo" = "country")) %>%
ggplot() + ylab("Construction Production") + xlab("") + theme_minimal() +
geom_line(aes(x = date, y = values, color = color)) +
scale_color_identity() + add_flags +
scale_color_manual(values = c("#0055a4", "#000000", "#008c45")) +
scale_x_date(breaks = "3 months",
labels = date_format("%b %Y")) +
geom_image(data = . %>%
filter(date == as.Date("2020-08-01")) %>%
mutate(image = paste0("../../icon/flag/", str_to_lower(Geo), ".png")),
aes(x = date, y = values, image = image), asp = 1.5) +
theme(legend.position = "none") +
scale_y_log10(breaks = seq(-60, 300, 10))
2019M09
Code
sts_copr_m %>%
filter(nace_r2 == "F",
unit == "I15",
geo %in% c("FR", "DE", "IT"),
s_adj == "SCA") %>%
select(geo, Geo, time, values) %>%
group_by(geo) %>%
mutate(values = 100*values/values[time == "2019M09"]) %>%
mutate(Geo = ifelse(geo == "DE", "Germany", Geo)) %>%
month_to_date %>%
filter(date >= as.Date("2019-09-01")) %>%
left_join(colors, by = c("Geo" = "country")) %>%
ggplot() + ylab("Construction Production") + xlab("") + theme_minimal() +
geom_line(aes(x = date, y = values, color = color)) +
scale_color_identity() + add_flags +
scale_color_manual(values = c("#0055a4", "#000000", "#008c45")) +
scale_x_date(breaks = "2 months",
labels = date_format("%b %Y")) +
geom_image(data = . %>%
filter(date == as.Date("2020-08-01")) %>%
mutate(image = paste0("../../icon/flag/", str_to_lower(Geo), ".png")),
aes(x = date, y = values, image = image), asp = 1.5) +
theme(legend.position = "none") +
scale_y_log10(breaks = seq(-60, 300, 10))
2020M02
Code
sts_copr_m %>%
filter(nace_r2 == "F",
unit == "I15",
geo %in% c("FR", "DE", "IT", "ES"),
s_adj == "SCA") %>%
select(geo, Geo, time, values) %>%
group_by(geo) %>%
mutate(values = 100*values/values[time == "2020M02"]) %>%
mutate(Geo = ifelse(geo == "DE", "Germany", Geo)) %>%
month_to_date %>%
filter(date >= as.Date("2020-02-01")) %>%
left_join(colors, by = c("Geo" = "country")) %>%
ggplot() + ylab("Construction Production") + xlab("") + theme_minimal() +
geom_line(aes(x = date, y = values, color = color)) +
scale_color_identity() + add_flags +
scale_color_manual(values = c("#0055a4", "#000000", "#008c45", "#C60B1E")) +
scale_x_date(breaks = "1 month",
labels = date_format("%b %Y")) +
geom_image(data = . %>%
filter(date == as.Date("2020-08-01")) %>%
mutate(image = paste0("../../icon/flag/", str_to_lower(Geo), ".png")),
aes(x = date, y = values, image = image), asp = 1.5) +
theme(legend.position = "none") +
scale_y_log10(breaks = seq(-60, 300, 10))
Cumulative loss in production
Code
sts_copr_m %>%
filter(nace_r2 == "F",
unit == "I15",
geo %in% c("FR", "DE", "IT", "ES"),
s_adj == "SCA") %>%
select(geo, Geo, time, values) %>%
group_by(geo) %>%
mutate(values = 100*values/values[time == "2020M02"]) %>%
month_to_date %>%
filter(date >= as.Date("2020-02-01")) %>%
group_by(Geo) %>%
arrange(date) %>%
mutate(values = values-100,
values = cumsum(values)) %>%
left_join(colors, by = c("Geo" = "country")) %>%
ggplot() + ylab("Construction Production") + xlab("") + theme_minimal() +
geom_line(aes(x = date, y = values, color = color)) +
scale_color_identity() + add_flags +
scale_color_manual(values = c("#0055a4", "#000000", "#008c45", "#C60B1E")) +
scale_x_date(breaks = "1 month",
labels = date_format("%b %Y")) +
geom_image(data = . %>%
filter(date == as.Date("2020-06-01")) %>%
mutate(image = paste0("../../icon/flag/", str_to_lower(Geo), ".png")),
aes(x = date, y = values, image = image), asp = 1.5) +
theme(legend.position = "none") +
scale_y_continuous(breaks = seq(-300, 300, 10))