Budget de l’État

Données - INSEE

Info

Last observation: 2026-05

First observation: 2009-01

Number of observations: 836

Last data update: 23 jul 2026, 22:47. Last compile: 24 jul 2026, 05:41

Structure

Publications

Code
tibble(date = "2023-07-31", key = "20942") %>%
  add_row(date = "2023-08-31", key = "21072") %>%
  add_row(date = "2023-06-30", key = "21005") %>%
  mutate(pdf = paste0('<a  target=_blank href=https://www.budget.gouv.fr/documentation/file-download/', key, ' > pdf </a>')) %>%
  select(-key) %>%
  arrange(desc(date)) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}
  • Situation mensuelle sur le budget de l’Etat. html /31 mai 2023 https://www.budget.gouv.fr/documentation/file-download/21005

https://www.budget.gouv.fr/documentation/file-download/21005

https://www.budget.gouv.fr/documentation/file-download/21072

Solde général d’exécution

Tous

Euros courants

Code
n_year <- year(Sys.Date()) - 2009
Sys.setlocale("LC_TIME", "fr_CA.UTF-8")
# [1] "fr_CA.UTF-8"
Code
`COMPTES-ETAT` %>%
  filter(INDICATEUR %in% c("SGE")) %>%
  month_to_date %>%
  mutate(date_year = ymd(paste(last_year, month(date), day(date))),
         year = paste0(year(date))) %>%
  select(date_year, year, OBS_VALUE) %>%
  arrange(date_year, year) %>%
  ggplot(.) + theme_minimal() + xlab("") + ylab("Solde général d'exécution (€ courants)") +
  geom_line(aes(x = date_year, y = OBS_VALUE/1000, color = year)) +
  theme(legend.title = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
        legend.direction = "horizontal",
        axis.text=element_text(size=12),
        axis.title=element_text(size=12,face="bold")) + 
  scale_colour_manual(values = c(viridis(n_year), "red")) +
  scale_linetype_manual(values = c("solid", "dashed", "solid", "dashed", "solid")) +
  scale_x_date(breaks = "1 month",
               labels = date_format("%B")) +
  scale_y_continuous(breaks = seq(-900, 900, 20),
                     labels = scales::dollar_format(pre = "", su = " Md€")) +
  geom_text_repel(data = . %>%
                    filter(year == last_year) %>%
                    tail(1),
                  aes(x = date_year, y = OBS_VALUE/1000, label = year), 
                  fontface ="plain", color = "red", size = 4) +
  geom_text_repel(data = . %>%
                    filter(date_year == as.Date(paste0(last_year, "-12-01"))),
                  aes(x = date_year, y = OBS_VALUE/1000, label = year), 
                  fontface ="plain", color = viridis(n_year), size = 4)

Euros constants

Code
Sys.setlocale("LC_TIME", "fr_CA.UTF-8")
# [1] "fr_CA.UTF-8"
Code
`COMPTES-ETAT` %>%
  filter(INDICATEUR %in% c("SGE")) %>%
  month_to_date %>%
  select(date, OBS_VALUE) %>%
  left_join(`IPCH-IPC-2015-ensemble` %>%
              select(date, INDICATEUR, OBS_VALUE) %>%
              spread(INDICATEUR, OBS_VALUE) %>%
              arrange(desc(date)), by = "date") %>%
  mutate(OBS_VALUE = IPC[1]*OBS_VALUE/IPC) %>%
  mutate(date_year = ymd(paste(last_year, month(date), day(date))),
         year = paste0(year(date))) %>%
  select(date_year, year, OBS_VALUE) %>%
  arrange(date_year, year) %>%
  ggplot(.) + theme_minimal() + xlab("") + ylab("Solde général d'exécution (€ constants)") +
  geom_line(aes(x = date_year, y = OBS_VALUE/1000, color = year)) +
  theme(legend.title = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
        legend.direction = "horizontal",
        axis.text=element_text(size=12),
        axis.title=element_text(size=12,face="bold")) + 
  scale_colour_manual(values = c(viridis(n_year), "red")) +
  scale_linetype_manual(values = c("solid", "dashed", "solid", "dashed", "solid")) +
  scale_x_date(breaks = "1 month",
               labels = date_format("%B")) +
  scale_y_continuous(breaks = seq(-900, 900, 20),
                     labels = scales::dollar_format(pre = "", su = " Md€")) +
  geom_text_repel(data = . %>%
                    filter(year == last_year) %>%
                    tail(1),
                  aes(x = date_year, y = OBS_VALUE/1000, label = year), 
                  fontface ="plain", color = "red", size = 4) +
  geom_text_repel(data = . %>%
                    filter(date_year == as.Date(paste0(last_year, "-12-01"))),
                  aes(x = date_year, y = OBS_VALUE/1000, label = year), 
                  fontface ="plain", color = viridis(n_year), size = 4)

% du PIB

Code
Sys.setlocale("LC_TIME", "fr_CA.UTF-8")
# [1] "fr_CA.UTF-8"
Code
`COMPTES-ETAT` %>%
  filter(INDICATEUR %in% c("SGE")) %>%
  month_to_date %>%
  select(date, OBS_VALUE) %>%
  mutate(year = year(date)) %>%
  left_join(gdp %>%
              transmute(gdp, year = year(date)), by = "year") %>%
  mutate(OBS_VALUE = OBS_VALUE/(gdp*1000)) %>%
  mutate(date_year = ymd(paste(last_year, month(date), day(date))),
         year = paste0(year(date))) %>%
  select(date_year, year, OBS_VALUE) %>%
  arrange(date_year, year) %>%
  ggplot(.) + theme_minimal() + xlab("") + ylab("Solde général d'exécution (% du PIB)") +
  geom_line(aes(x = date_year, y = OBS_VALUE, color = year)) +
  theme(legend.title = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
        legend.direction = "horizontal",
        axis.text=element_text(size=12),
        axis.title=element_text(size=12,face="bold")) + 
  scale_colour_manual(values = c(viridis(n_year), "red")) +
  scale_linetype_manual(values = c("solid", "dashed", "solid", "dashed", "solid")) +
  scale_x_date(breaks = "1 month",
               labels = date_format("%B")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 0, 1),
                     labels = percent_format(acc = 1)) +
  geom_text_repel(data = . %>%
                    filter(year == last_year) %>%
                    tail(1),
                  aes(x = date_year, y = OBS_VALUE, label = year), 
                  fontface ="plain", color = "red", size = 4) +
  geom_text_repel(data = . %>%
                    filter(date_year == as.Date(paste0(last_year, "-12-01"))),
                  aes(x = date_year, y = OBS_VALUE, label = year), 
                  fontface ="plain", color = viridis(n_year), size = 4)

2015-

Code
n_year <- year(Sys.Date()) - 2015
Sys.setlocale("LC_TIME", "fr_CA.UTF-8")
# [1] "fr_CA.UTF-8"
Code
`COMPTES-ETAT` %>%
  filter(INDICATEUR %in% c("SGE")) %>%
  month_to_date %>%
  filter(date >= as.Date("2015-01-01")) %>%
  mutate(date_year = ymd(paste(last_year, month(date), day(date))),
         year = paste0(year(date))) %>%
  select(date_year, year, OBS_VALUE) %>%
  arrange(date_year, year) %>%
  ggplot(.) + theme_minimal() + xlab("") + ylab("Solde général d'exécution") +
  geom_line(aes(x = date_year, y = OBS_VALUE/1000, color = year)) +
  theme(legend.title = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
        legend.direction = "horizontal",
        axis.text=element_text(size=12),
        axis.title=element_text(size=12,face="bold")) + 
  scale_colour_manual(values = c(viridis(n_year), "red")) +
  scale_linetype_manual(values = c("solid", "dashed", "solid", "dashed", "solid")) +
  scale_x_date(breaks = "1 month",
               labels = date_format("%B")) +
  scale_y_continuous(breaks = seq(-900, 900, 20),
                     labels = scales::dollar_format(pre = "", su = " Md€")) +
  geom_text_repel(data = . %>%
                    filter(year == last_year) %>%
                    tail(1),
                  aes(x = date_year, y = OBS_VALUE/1000, label = year), 
                  fontface ="plain", color = "red", size = 4) +
  geom_text_repel(data = . %>%
                    filter(date_year == as.Date(paste0(last_year, "-12-01"))),
                  aes(x = date_year, y = OBS_VALUE/1000, label = year), 
                  fontface ="plain", color = viridis(n_year), size = 4)

2017-

Code
`COMPTES-ETAT` %>%
  filter(INDICATEUR %in% c("SGE")) %>%
  month_to_date %>%
  filter(date >= as.Date("2017-01-01")) %>%
  ggplot(.) + theme_minimal() + xlab("") + ylab("") +
  geom_line(aes(x = date, y = OBS_VALUE/1000)) +
  theme(legend.title = element_blank(),
        legend.position = c(0.7, 0.9)) +
  scale_x_date(breaks = seq(1920, 2025, 1) %>% paste0("-01-01") %>% as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = seq(-900, 900, 20),
                     labels = scales::dollar_format(pre = "", su = "Mds€"))

2018-

Code
n_year <- year(Sys.Date()) - 2018
Sys.setlocale("LC_TIME", "fr_CA.UTF-8")
# [1] "fr_CA.UTF-8"
Code
`COMPTES-ETAT` %>%
  filter(INDICATEUR %in% c("SGE")) %>%
  month_to_date %>%
  filter(date >= as.Date("2018-01-01")) %>%
  mutate(date_year = ymd(paste(last_year, month(date), day(date))),
         year = paste0(year(date))) %>%
  select(date_year, year, OBS_VALUE) %>%
  arrange(date_year, year) %>%
  ggplot(.) + theme_minimal() + xlab("") + ylab("Solde général d'exécution") +
  geom_line(aes(x = date_year, y = OBS_VALUE/1000, color = year)) +
  theme(legend.title = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
        legend.direction = "horizontal",
        axis.text=element_text(size=12),
        axis.title=element_text(size=14,face="bold")) + 
  scale_colour_manual(values = c(viridis(n_year), "red")) +
  scale_linetype_manual(values = c("solid", "dashed", "solid", "dashed", "solid")) +
  scale_x_date(breaks = "1 month",
               labels = date_format("%B")) +
  scale_y_continuous(breaks = seq(-900, 900, 20),
                     labels = scales::dollar_format(pre = "", su = " Md€")) +
  geom_text_repel(data = . %>%
                    filter(year == last_year) %>%
                    tail(1),
                  aes(x = date_year, y = OBS_VALUE/1000, label = year), 
                  fontface ="plain", color = "red", size = 4) +
  geom_text_repel(data = . %>%
                    filter(date_year == as.Date(paste0(last_year, "-12-01"))),
                  aes(x = date_year, y = OBS_VALUE/1000, label = year), 
                  fontface ="plain", color = viridis(n_year), size = 4)

Dépenses

2009-

Code
n_year <- year(Sys.Date()) - 2009
Sys.setlocale("LC_TIME", "fr_CA.UTF-8")
# [1] "fr_CA.UTF-8"
Code
`COMPTES-ETAT` %>%
  filter(INDICATEUR %in% c("DEP")) %>%
  month_to_date %>%
  filter(date >= as.Date("2009-01-01")) %>%
  mutate(date_year = ymd(paste(last_year, month(date), day(date))),
         year = paste0(year(date))) %>%
  select(date_year, year, OBS_VALUE) %>%
  arrange(date_year, year) %>%
  ggplot(.) + theme_minimal() + xlab("") + ylab("Dépenses") +
  geom_line(aes(x = date_year, y = OBS_VALUE/1000, color = year)) +
  theme(legend.title = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
        legend.direction = "horizontal",
        axis.text=element_text(size=12),
        axis.title=element_text(size=14,face="bold")) + 
  scale_colour_manual(values = c(viridis(n_year), "red")) +
  scale_linetype_manual(values = c("solid", "dashed", "solid", "dashed", "solid")) +
  scale_x_date(breaks = "1 month",
               labels = date_format("%B")) +
  scale_y_continuous(breaks = seq(-900, 900, 50),
                     labels = scales::dollar_format(pre = "", su = " Md€")) +
  geom_text_repel(data = . %>%
                    filter(year == last_year) %>%
                    tail(1),
                  aes(x = date_year, y = OBS_VALUE/1000, label = year), 
                  fontface ="plain", color = "red", size = 4) +
  geom_text_repel(data = . %>%
                    filter(date_year == as.Date(paste0(last_year, "-12-01"))),
                  aes(x = date_year, y = OBS_VALUE/1000, label = year), 
                  fontface ="plain", color = viridis(n_year), size = 4)

2016-

Code
n_year <- year(Sys.Date()) - 2016
Sys.setlocale("LC_TIME", "fr_CA.UTF-8")
# [1] "fr_CA.UTF-8"
Code
`COMPTES-ETAT` %>%
  filter(INDICATEUR %in% c("DEP")) %>%
  month_to_date %>%
  filter(date >= as.Date("2016-01-01")) %>%
  mutate(date_year = ymd(paste(last_year, month(date), day(date))),
         year = paste0(year(date))) %>%
  select(date_year, year, OBS_VALUE) %>%
  arrange(date_year, year) %>%
  ggplot(.) + theme_minimal() + xlab("") + ylab("Dépenses") +
  geom_line(aes(x = date_year, y = OBS_VALUE/1000, color = year)) +
  theme(legend.title = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
        legend.direction = "horizontal",
        axis.text=element_text(size=12),
        axis.title=element_text(size=14,face="bold")) + 
  scale_colour_manual(values = c(viridis(n_year), "red")) +
  scale_linetype_manual(values = c("solid", "dashed", "solid", "dashed", "solid")) +
  scale_x_date(breaks = "1 month",
               labels = date_format("%B")) +
  scale_y_continuous(breaks = seq(-900, 900, 50),
                     labels = scales::dollar_format(pre = "", su = " Md€")) +
  geom_text_repel(data = . %>%
                    filter(year == last_year) %>%
                    tail(1),
                  aes(x = date_year, y = OBS_VALUE/1000, label = year), 
                  fontface ="plain", color = "red", size = 4) +
  geom_text_repel(data = . %>%
                    filter(date_year == as.Date(paste0(last_year, "-12-01"))),
                  aes(x = date_year, y = OBS_VALUE/1000, label = year), 
                  fontface ="plain", color = viridis(n_year), size = 4)

2018-

Code
n_year <- year(Sys.Date()) - 2018
Sys.setlocale("LC_TIME", "fr_CA.UTF-8")
# [1] "fr_CA.UTF-8"
Code
`COMPTES-ETAT` %>%
  filter(INDICATEUR %in% c("DEP")) %>%
  month_to_date %>%
  filter(date >= as.Date("2018-01-01")) %>%
  mutate(date_year = ymd(paste(last_year, month(date), day(date))),
         year = paste0(year(date))) %>%
  select(date_year, year, OBS_VALUE) %>%
  arrange(date_year, year) %>%
  ggplot(.) + theme_minimal() + xlab("") + ylab("Dépenses") +
  geom_line(aes(x = date_year, y = OBS_VALUE/1000, color = year)) +
  theme(legend.title = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
        legend.direction = "horizontal",
        axis.text=element_text(size=12),
        axis.title=element_text(size=14,face="bold")) + 
  scale_colour_manual(values = c(viridis(n_year), "red")) +
  scale_linetype_manual(values = c("solid", "dashed", "solid", "dashed", "solid")) +
  scale_x_date(breaks = "1 month",
               labels = date_format("%B")) +
  scale_y_continuous(breaks = seq(-900, 900, 50),
                     labels = scales::dollar_format(pre = "", su = " Md€")) +
  geom_text_repel(data = . %>%
                    filter(year == last_year) %>%
                    tail(1),
                  aes(x = date_year, y = OBS_VALUE/1000, label = year), 
                  fontface ="plain", color = "red", size = 4) +
  geom_text_repel(data = . %>%
                    filter(date_year == as.Date(paste0(last_year, "-12-01"))),
                  aes(x = date_year, y = OBS_VALUE/1000, label = year), 
                  fontface ="plain", color = viridis(n_year), size = 4)

Recettes

2009-

Code
n_year <- year(Sys.Date()) - 2009
Sys.setlocale("LC_TIME", "fr_CA.UTF-8")
# [1] "fr_CA.UTF-8"
Code
`COMPTES-ETAT` %>%
  filter(INDICATEUR %in% c("REC")) %>%
  month_to_date %>%
  filter(date >= as.Date("2009-01-01")) %>%
  mutate(date_year = ymd(paste(last_year, month(date), day(date))),
         year = paste0(year(date))) %>%
  select(date_year, year, OBS_VALUE) %>%
  arrange(date_year, year) %>%
  ggplot(.) + theme_minimal() + xlab("") + ylab("Recettes") +
  geom_line(aes(x = date_year, y = OBS_VALUE/1000, color = year)) +
  theme(legend.title = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
        legend.direction = "horizontal",
        axis.text=element_text(size=12),
        axis.title=element_text(size=14,face="bold")) + 
  scale_colour_manual(values = c(viridis(n_year), "red")) +
  scale_linetype_manual(values = c("solid", "dashed", "solid", "dashed", "solid")) +
  scale_x_date(breaks = "1 month",
               labels = date_format("%B")) +
  scale_y_continuous(breaks = seq(-900, 900, 50),
                     labels = scales::dollar_format(pre = "", su = " Md€")) +
  geom_text_repel(data = . %>%
                    filter(year == last_year) %>%
                    tail(1),
                  aes(x = date_year, y = OBS_VALUE/1000, label = year), 
                  fontface ="plain", color = "red", size = 4) +
  geom_text_repel(data = . %>%
                    filter(date_year == as.Date(paste0(last_year, "-12-01"))),
                  aes(x = date_year, y = OBS_VALUE/1000, label = year), 
                  fontface ="plain", color = viridis(n_year), size = 4)

2018-

Code
n_year <- year(Sys.Date()) - 2018
Sys.setlocale("LC_TIME", "fr_CA.UTF-8")
# [1] "fr_CA.UTF-8"
Code
`COMPTES-ETAT` %>%
  filter(INDICATEUR %in% c("REC")) %>%
  month_to_date %>%
  filter(date >= as.Date("2018-01-01")) %>%
  mutate(date_year = ymd(paste(last_year, month(date), day(date))),
         year = paste0(year(date))) %>%
  select(date_year, year, OBS_VALUE) %>%
  arrange(date_year, year) %>%
  ggplot(.) + theme_minimal() + xlab("") + ylab("Recettes") +
  geom_line(aes(x = date_year, y = OBS_VALUE/1000, color = year)) +
  theme(legend.title = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
        legend.direction = "horizontal",
        axis.text=element_text(size=12),
        axis.title=element_text(size=14,face="bold")) + 
  scale_colour_manual(values = c(viridis(n_year), "red")) +
  scale_linetype_manual(values = c("solid", "dashed", "solid", "dashed", "solid")) +
  scale_x_date(breaks = "1 month",
               labels = date_format("%B")) +
  scale_y_continuous(breaks = seq(-900, 900, 50),
                     labels = scales::dollar_format(pre = "", su = " Md€")) +
  geom_text_repel(data = . %>%
                    filter(year == last_year) %>%
                    tail(1),
                  aes(x = date_year, y = OBS_VALUE/1000, label = year), 
                  fontface ="plain", color = "red", size = 4) +
  geom_text_repel(data = . %>%
                    filter(date_year == as.Date(paste0(last_year, "-12-01"))),
                  aes(x = date_year, y = OBS_VALUE/1000, label = year), 
                  fontface ="plain", color = viridis(n_year), size = 4)

Dépenses, Recettes

Tous

Code
`COMPTES-ETAT` %>%
  filter(INDICATEUR %in% c("DEP", "REC")) %>%
  month_to_date %>%
  
  ggplot(.) + theme_minimal() + xlab("") + ylab("") +
  geom_line(aes(x = date, y = OBS_VALUE/1000, color = Indicateur)) + 
  
  theme(legend.title = element_blank(),
        legend.position = c(0.7, 0.9)) +
  scale_x_date(breaks = seq(1920, 2025, 1) %>% paste0("-01-01") %>% as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = seq(0, 900, 50),
                     labels = scales::dollar_format(pre = "", su = "Mds€"))

2017-

Code
`COMPTES-ETAT` %>%
  filter(INDICATEUR %in% c("DEP", "REC")) %>%
  month_to_date %>%
  filter(date >= as.Date("2017-01-01")) %>%
  
  ggplot(.) + theme_minimal() + xlab("") + ylab("") +
  geom_line(aes(x = date, y = OBS_VALUE/1000, color = Indicateur)) + 
  
  theme(legend.title = element_blank(),
        legend.position = c(0.2, 0.9)) +
  scale_x_date(breaks = seq(1920, 2025, 1) %>% paste0("-01-01") %>% as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = seq(0, 900, 50),
                     labels = scales::dollar_format(pre = "", su = "Mds€"))

Last year

Code
`COMPTES-ETAT` %>%
  filter(INDICATEUR %in% c("DEP", "REC")) %>%
  month_to_date %>%
  group_by(INDICATEUR) %>%
  arrange(date) %>%
  do(tail(., n = 12)) %>%
  
  ggplot(.) + theme_minimal() + xlab("") + ylab("") +
  geom_line(aes(x = date, y = OBS_VALUE/1000, color = Indicateur)) + 
  theme(legend.title = element_blank(),
        legend.position = c(0.2, 0.9)) +
  scale_x_date(breaks = "1 month",
               labels = date_format("%b %y")) +
  scale_y_continuous(breaks = seq(0, 900, 50),
                     labels = scales::dollar_format(pre = "", su = "Mds€"))