Impôt de Solidarité sur la Fortune (ISF), 1999-2017

Données - DGFIP

Code
source(here::here("_rinit.R"))
invisible(Sys.setlocale("LC_TIME", "fr_FR.UTF-8"))
# cd ~/iCloud/website/data/dgfip; /usr/local/bin/R -e 'quarto::quarto_render("isf.qmd")'
# cd ~/iCloud/website/data; sh _status/run_all_silent.sh --only dgfip

knitr::opts_chunk$set(echo = TRUE, message = FALSE, warning = FALSE,
                       fig.width = 9, fig.height = 5.5, dpi = 150)

cases_path    <- here::here("data", "dgfip", "isf_cases.parquet")
communes_path <- here::here("data", "dgfip", "isf_communes.parquet")

cases    <- arrow::read_parquet(cases_path)
communes <- arrow::read_parquet(communes_path)

periode <- range(cases$Annee)

theme_isf <- theme_minimal(base_size = 12) +
  theme(plot.title = element_text(face = "bold"),
        plot.subtitle = element_text(colour = "grey35"),
        panel.grid.minor = element_blank())

L’Impôt de Solidarité sur la Fortune (ISF) a taxé le patrimoine net des ménages les plus fortunés de 1999 à 2017, avant d’être remplacé par l’Impôt sur la Fortune Immobilière (IFI) à partir de 2018. Les données ci-dessous, publiées par la DGFIP, détaillent chaque année le nombre de déclarations et les montants déclarés par case du formulaire (patrimoine imposable, abattements, réductions, impôt net), ainsi que le nombre de redevables et le patrimoine moyen par commune pour les villes de plus de 20 000 habitants comptant plus de 50 redevables à l’ISF (2012, 2015, 2016, 2017).

Nombre de redevables et patrimoine taxable, France entière

Code
foyers <- cases |>
  dplyr::filter(Case == "TOTAL", Type == "Nombre de declarations") |>
  dplyr::transmute(Annee, `Nombre de foyers redevables` = Valeur)

actif_net <- cases |>
  dplyr::filter(Case == "HI", Type == "Montant declare (EUR)") |>
  dplyr::transmute(Annee, `Actif net imposable total (EUR)` = Valeur)

isf_net <- cases |>
  dplyr::filter(Case == "ST", Type == "Montant declare (EUR)") |>
  dplyr::transmute(Annee, `Montant net d'ISF payé (EUR)` = Valeur)

synth <- foyers |>
  dplyr::left_join(actif_net, by = "Annee") |>
  dplyr::left_join(isf_net, by = "Annee")

synth |>
  gt::gt() |>
  gt::fmt_number(columns = -Annee, decimals = 0, sep_mark = " ") |>
  gt::tab_header(title = "Foyers redevables, patrimoine net taxable et ISF net payé") |>
  gt::tab_options(table.width = "100%")
Foyers redevables, patrimoine net taxable et ISF net payé
Annee Nombre de foyers redevables Actif net imposable total (EUR) Montant net d'ISF payé (EUR)
1999 212 868 370 348 061 783 1 795 910 626
2000 245 820 443 162 095 068 2 249 354 182
2001 269 713 482 526 927 092 2 407 725 975
2002 283 586 487 380 172 656 2 283 800 524
2003 298 466 489 959 857 001 2 170 628 969
2004 335 525 555 060 800 461 2 453 265 765
2005 390 915 643 263 847 059 2 777 516 179
2006 456 856 768 011 046 093 3 318 468 542
2007 527 866 908 679 070 025 4 031 444 924
2008 565 966 987 068 836 003 3 810 252 275
2009 559 727 947 943 715 883 3 266 314 105
2010 593 878 1 041 194 908 856 3 616 881 322
2011 291 630 772 285 523 200 3 872 595 608
2012 290 065 777 989 557 936 2 266 559 616
2013 312 406 839 566 296 054 3 634 230 007
2014 331 010 904 881 663 801 3 802 409 318
2015 342 972 949 144 703 520 3 892 960 314
2016 351 152 986 555 618 153 4 046 450 014
2017 358 198 1 028 782 221 597 4 226 166 708
Code
synth |>
  ggplot(aes(Annee, `Nombre de foyers redevables`)) +
  geom_col(fill = "#3b6f8a") +
  scale_y_continuous(labels = scales::label_number(big.mark = " ")) +
  scale_x_continuous(breaks = scales::breaks_pretty(8)) +
  labs(title = "Nombre de foyers redevables à l'ISF",
       subtitle = "France entière, 1999-2017", x = NULL, y = NULL) +
  theme_isf
Figure 1
Code
actif_net |>
  ggplot(aes(Annee, `Actif net imposable total (EUR)` / 1e9)) +
  geom_col(fill = "#c0392b") +
  scale_y_continuous(labels = scales::label_number(big.mark = " ")) +
  scale_x_continuous(breaks = scales::breaks_pretty(8)) +
  labs(title = "Actif net imposable total déclaré",
       subtitle = "France entière, milliards d'euros, 1999-2017", x = NULL, y = "Md€") +
  theme_isf
Figure 2

La forte baisse observée en 2011 correspond à la réforme de l’ISF (loi de finances rectificative de juillet 2011), qui a relevé le seuil d’entrée dans le barème de 800 000 € à 1,3 M€, faisant sortir du champ de l’impôt un grand nombre de foyers.

Composition du patrimoine taxable

Code
composition <- cases |>
  dplyr::filter(Case %in% c("AB", "AC", "CF", "CE", "CD", "CO"),
                Type == "Montant declare (EUR)") |>
  dplyr::mutate(Libelle = dplyr::recode(Case,
    AB = "Résidence principale", AC = "Autres immeubles",
    CF = "Liquidités", CE = "Autres valeurs mobilières",
    CD = "Droits sociaux", CO = "Contrats d'assurance-vie"))

composition |>
  ggplot(aes(Annee, Valeur / 1e9, colour = Libelle)) +
  geom_line(linewidth = 0.8) +
  scale_y_continuous(labels = scales::label_number(big.mark = " ")) +
  scale_x_continuous(breaks = scales::breaks_pretty(8)) +
  scale_colour_brewer(palette = "Dark2", name = NULL) +
  labs(title = "Principales composantes du patrimoine déclaré à l'ISF",
       subtitle = "Montants déclarés, milliards d'euros", x = NULL, y = "Md€") +
  theme_isf +
  theme(legend.position = "bottom")
Figure 3

Redevables par commune

Villes de plus de 20 000 habitants comptant plus de 50 redevables à l’ISF.

Code
communes |>
  dplyr::filter(Annee == max(Annee)) |>
  dplyr::slice_max(Nombre_redevables, n = 15) |>
  dplyr::mutate(Commune = forcats::fct_reorder(Commune, Nombre_redevables)) |>
  ggplot(aes(Nombre_redevables, Commune)) +
  geom_col(fill = "#3b6f8a") +
  scale_x_continuous(labels = scales::label_number(big.mark = " ")) +
  labs(title = sprintf("Communes ayant le plus de redevables à l'ISF en %d", max(communes$Annee)),
       x = "Nombre de redevables", y = NULL) +
  theme_isf
Figure 4
Code
communes |>
  dplyr::filter(Annee == max(Annee)) |>
  dplyr::slice_max(Patrimoine_moyen, n = 15) |>
  dplyr::mutate(Commune = forcats::fct_reorder(Commune, Patrimoine_moyen)) |>
  ggplot(aes(Patrimoine_moyen / 1e6, Commune)) +
  geom_col(fill = "#c0392b") +
  scale_x_continuous(labels = scales::label_number(big.mark = " ")) +
  labs(title = sprintf("Communes au patrimoine moyen déclaré le plus élevé en %d", max(communes$Annee)),
       x = "Patrimoine moyen (M€)", y = NULL) +
  theme_isf
Figure 5

Table complète — cases du formulaire

Code
cases |>
  dplyr::transmute(Case, Libellé = Libelle, Type, Année = Annee, Valeur) |>
  dplyr::arrange(Case, Type, Année) |>
  reactable::reactable(
    searchable = TRUE, filterable = TRUE, pagination = TRUE,
    defaultPageSize = 20, compact = TRUE, resizable = TRUE, highlight = TRUE, wrap = TRUE,
    defaultColDef = reactable::colDef(
      align = "left", headerStyle = list(fontWeight = "bold"),
      style = list(whiteSpace = "normal", wordBreak = "break-word")),
    columns = list(
      Case    = reactable::colDef(minWidth = 60, maxWidth = 70),
      Libellé = reactable::colDef(minWidth = 260),
      Type    = reactable::colDef(minWidth = 160),
      Année   = reactable::colDef(minWidth = 70, maxWidth = 90),
      Valeur  = reactable::colDef(minWidth = 110, align = "right",
                                   format = reactable::colFormat(separators = TRUE)))
  )

Table complète — communes

Code
communes |>
  dplyr::arrange(Annee, dplyr::desc(Nombre_redevables)) |>
  reactable::reactable(
    searchable = TRUE, filterable = TRUE, pagination = TRUE,
    defaultPageSize = 20, compact = TRUE, resizable = TRUE, highlight = TRUE, wrap = TRUE,
    defaultColDef = reactable::colDef(
      align = "left", headerStyle = list(fontWeight = "bold"),
      style = list(whiteSpace = "normal", wordBreak = "break-word")),
    columns = list(
      Annee                               = reactable::colDef(name = "Année", minWidth = 70, maxWidth = 90),
      Region                              = reactable::colDef(name = "Région", minWidth = 150),
      Departement                         = reactable::colDef(name = "Département", minWidth = 140),
      Code_commune                        = reactable::colDef(name = "Code INSEE", minWidth = 90, maxWidth = 110),
      Commune                             = reactable::colDef(minWidth = 160),
      Nombre_redevables                   = reactable::colDef(name = "Redevables", minWidth = 100, align = "right",
                                                                format = reactable::colFormat(separators = TRUE)),
      Patrimoine_moyen                    = reactable::colDef(name = "Patrimoine moyen (€)", minWidth = 140, align = "right",
                                                                format = reactable::colFormat(separators = TRUE)),
      Impot_moyen                         = reactable::colDef(name = "Impôt moyen (€)", minWidth = 120, align = "right",
                                                                format = reactable::colFormat(separators = TRUE)),
      Contribution_exceptionnelle_moyenne = reactable::colDef(name = "Contribution except. moyenne (€)", minWidth = 160, align = "right",
                                                                format = reactable::colFormat(separators = TRUE)),
      Impot_total_moyen                   = reactable::colDef(name = "Impôt total moyen (€)", minWidth = 140, align = "right",
                                                                format = reactable::colFormat(separators = TRUE)))
  )

Source & données

Code
tibble::tibble(
  ` ` = c("Jeu de données", "Producteur", "Licence", "Fichiers", "Mise à jour", "Observations"),
  `  ` = c(
    "Déclarations ISF 1999-2017 (nombres et montants par case) et fichiers communaux des redevables ISF — [impots.gouv.fr](https://www.impots.gouv.fr/) / [data.gouv.fr](https://www.data.gouv.fr/)",
    "Direction générale des Finances publiques (DGFIP)",
    "Licence Ouverte / Open Licence 2.0 (Etalab)",
    sprintf("`data/dgfip/isf_cases.parquet` (%s ko), `data/dgfip/isf_communes.parquet` (%s ko)",
            round(file.size(cases_path) / 1024), round(file.size(communes_path) / 1024)),
    format(as.Date(max(file.mtime(cases_path), file.mtime(communes_path))), "%d %B %Y"),
    sprintf("%d cases du formulaire, %d-%d ; %d communes sur %s",
            dplyr::n_distinct(cases$Case), min(cases$Annee), max(cases$Annee),
            dplyr::n_distinct(communes$Code_commune),
            paste(sort(unique(communes$Annee)), collapse = ", "))
  )
) |>
  gt::gt() |> gt::fmt_markdown(columns = `  `) |>
  gt::tab_options(table.width = "100%", column_labels.hidden = TRUE)
Jeu de données Déclarations ISF 1999-2017 (nombres et montants par case) et fichiers communaux des redevables ISF — impots.gouv.fr / data.gouv.fr
Producteur Direction générale des Finances publiques (DGFIP)
Licence Licence Ouverte / Open Licence 2.0 (Etalab)
Fichiers data/dgfip/isf_cases.parquet (13 ko), data/dgfip/isf_communes.parquet (50 ko)
Mise à jour 22 septembre 2026
Observations 67 cases du formulaire, 1999-2017 ; 399 communes sur 2012, 2015, 2016, 2017