Last data update: 26 oct. 2026, 20:08
Last compile: 26 oct. 2026, 20:09
Depuis 2020, l’Insee intègre dans le calcul de l’IPC des données de caisse (DDC) de la grande distribution pour une partie des produits. Ce classeur compare, pour l’année 2019, les indices de prix publiés sans données de caisse (méthode antérieure) et avec (nouvelle méthode), par regroupement conjoncturel (alimentation, produits manufacturés, énergie, services…), pour l’ensemble des ménages, les ménages urbains dont le chef est ouvrier ou employé, les ménages du premier quintile de niveau de vie et l’IPCH. Les indices sont en base 100 = décembre 2018 ; les évolutions sont arrondies à 0,1 point.
ens |>
filter(mesure == "Indice (base 100 = décembre 2018)") |>
mutate(serie = lab_ddc(avec_ddc)) |>
ggplot(aes(x = date, y = valeur, color = serie)) +
geom_hline(yintercept = 100, color = "grey60") +
geom_line(linewidth = 1.2) + geom_point(size = 2) +
scale_color_manual(values = cols_ddc, name = NULL) +
scale_x_date(date_breaks = "1 month", date_labels = "%b") +
theme_ddc() +
labs(x = NULL, y = "Base 100 = décembre 2018", title = "IPC d'ensemble en 2019 : peu de différence entre les deux méthodes")
ens |>
filter(mesure == "Indice (base 100 = décembre 2018)") |>
select(date, avec_ddc, valeur) |>
pivot_wider(names_from = avec_ddc, values_from = valeur, names_prefix = "avec_") |>
mutate(ecart = avec_TRUE - avec_FALSE) |>
ggplot(aes(x = date, y = ecart)) +
geom_hline(yintercept = 0, color = "grey50") +
geom_col(aes(fill = ecart > 0), show.legend = FALSE) +
scale_fill_manual(values = c(`TRUE` = rose, `FALSE` = bleu)) +
scale_x_date(date_breaks = "1 month", date_labels = "%b") +
theme_ddc() +
labs(x = NULL, y = "Points d'indice", title = "Écart d'indice d'ensemble (avec - sans données de caisse)")
ens |>
filter(mesure == "Glissement annuel (%)") |>
mutate(serie = lab_ddc(avec_ddc)) |>
ggplot(aes(x = date, y = valeur, color = serie)) +
geom_line(linewidth = 1.2) + geom_point(size = 2) +
scale_color_manual(values = cols_ddc, name = NULL) +
scale_x_date(date_breaks = "1 month", date_labels = "%b") +
theme_ddc() +
labs(x = NULL, y = "%", title = "Glissement annuel de l'IPC d'ensemble en 2019")
an |>
filter(str_detect(groupe, "^a\\)"), regroupement != "Ensemble") |>
mutate(regroupement = fct_reorder(regroupement, ponderation)) |>
ggplot(aes(y = regroupement)) +
geom_segment(aes(x = sans_ddc, xend = avec_ddc, yend = regroupement), color = "grey60", linewidth = 1) +
geom_point(aes(x = sans_ddc, color = "Sans données de caisse"), size = 3) +
geom_point(aes(x = avec_ddc, color = "Avec données de caisse"), size = 3) +
scale_color_manual(values = cols_ddc, name = NULL) +
theme_ddc() +
labs(x = "Évolution annuelle 2019 (%)", y = NULL, title = "Évolution des prix 2019 par regroupement, sans et avec données de caisse",
subtitle = "regroupements triés par pondération")
e <- an |> filter(str_detect(groupe, "^a\\)")) |>
mutate(regroupement = fct_reorder(regroupement, ecart))
nz <- sum(e$ecart != 0)
e |>
ggplot(aes(x = ecart, y = regroupement, fill = ecart < 0)) +
geom_vline(xintercept = 0, color = "grey50") +
geom_col(show.legend = FALSE) +
scale_fill_manual(values = c(`TRUE` = bleu, `FALSE` = rose)) +
theme_ddc() +
labs(x = "Point de pourcentage (avec - sans)", y = NULL, title = "Écart d'évolution annuelle 2019 : avec moins sans données de caisse",
subtitle = sprintf("%d regroupements sur %d ont un écart non nul (arrondi à 0,1 point)", nz, nrow(e)))
reg |>
filter(mesure == "Glissement annuel (%)", str_detect(groupe, "^a\\)")) |>
select(regroupement, ponderation, date, avec_ddc, valeur) |>
pivot_wider(names_from = avec_ddc, values_from = valeur, names_prefix = "avec_") |>
mutate(ecart = avec_TRUE - avec_FALSE, regroupement = fct_reorder(regroupement, ponderation)) |>
ggplot(aes(x = date, y = regroupement, fill = ecart)) +
geom_tile(color = "white") +
geom_text(aes(label = sprintf("%.1f", ecart)), size = 2.6) +
scale_fill_gradient2(low = bleu, mid = "white", high = rose, midpoint = 0, name = "Écart (pts)") +
scale_x_date(date_breaks = "1 month", date_labels = "%b", expand = c(0, 0)) +
theme_ddc() + theme(legend.position = "right") +
labs(x = NULL, y = NULL, title = "Écart de glissement annuel (avec - sans données de caisse)")
an |>
filter(str_detect(regroupement, "^Ensemble hors tabac$|^IPCH$|^Ensemble$")) |>
mutate(menage = case_when(str_detect(groupe, "^a\\)") & regroupement == "Ensemble hors tabac" ~ "Ensemble des ménages (hors tabac)",
str_detect(groupe, "^b\\)") ~ "Ménages urbains, chef ouvrier ou employé (hors tabac)",
str_detect(groupe, "^c\\)") ~ "Ménages du 1er quintile (hors tabac)",
regroupement == "IPCH" ~ "IPCH", TRUE ~ "Ensemble des ménages")) |>
select(menage, sans_ddc, avec_ddc) |>
pivot_longer(-menage, names_to = "serie", values_to = "evolution") |>
mutate(serie = if_else(serie == "avec_ddc", "Avec données de caisse", "Sans données de caisse")) |>
ggplot(aes(x = evolution, y = menage, fill = serie)) +
geom_col(position = "dodge") +
geom_text(aes(label = sprintf("%.1f", evolution)), position = position_dodge(width = 0.9), hjust = -0.2, size = 3) +
scale_fill_manual(values = cols_ddc, name = NULL) +
scale_x_continuous(expand = expansion(mult = c(0, 0.1))) +
theme_ddc() +
labs(x = "Évolution annuelle 2019 (%)", y = NULL, title = "Évolution des prix 2019 selon la catégorie de ménages")
an |> print_table_conditional()| regroupement | ponderation | groupe | sans_ddc | avec_ddc | ecart |
|---|---|---|---|---|---|
| Ensemble | 10000 | a) Ensemble des ménages | 1.1 | 1.1 | 0.0 |
| Alimentation | 1619 | a) Ensemble des ménages | 2.5 | 2.3 | -0.2 |
| Produits frais | 244 | a) Ensemble des ménages | 4.3 | 4.3 | 0.0 |
| Autre alimentation | 1375 | a) Ensemble des ménages | 2.1 | 2.0 | -0.1 |
| Tabac | 191 | a) Ensemble des ménages | 10.6 | 10.6 | 0.0 |
| Produits manufacturés | 2556 | a) Ensemble des ménages | -0.6 | -0.7 | -0.1 |
| Habillement et chaussures | 400 | a) Ensemble des ménages | -0.3 | -0.3 | 0.0 |
| Produits de santé | 416 | a) Ensemble des ménages | -2.8 | -2.8 | 0.0 |
| Autres produits manufacturés | 1740 | a) Ensemble des ménages | -0.1 | -0.2 | -0.1 |
| Énergie | 804 | a) Ensemble des ménages | 1.9 | 1.9 | 0.0 |
| dont Produits pétroliers | 425 | a) Ensemble des ménages | 0.6 | 0.6 | 0.0 |
| Services | 4830 | a) Ensemble des ménages | 1.0 | 1.0 | 0.0 |
| Loyers, eau et enlèvement des ordures ménagères | 746 | a) Ensemble des ménages | 0.4 | 0.4 | 0.0 |
| Services de santé | 604 | a) Ensemble des ménages | -0.1 | -0.1 | 0.0 |
| Transports | 285 | a) Ensemble des ménages | 0.7 | 0.7 | 0.0 |
| Communications | 219 | a) Ensemble des ménages | -1.1 | -1.1 | 0.0 |
| Autres services | 2976 | a) Ensemble des ménages | 1.6 | 1.6 | 0.0 |
| Ensemble hors loyers et hors tabac | 9208 | a) Ensemble des ménages | 1.0 | 0.9 | -0.1 |
| Ensemble hors tabac | 9809 | a) Ensemble des ménages | 0.9 | 0.9 | 0.0 |
| Ensemble hors tabac | 9707 | b) Ménages urbains dont le chef est ouvrier ou employé | 0.9 | 0.8 | -0.1 |
| Ensemble hors tabac | 9700 | c) Ménages du 1er quintile de la distribution des niveaux de vie | 0.9 | 0.8 | -0.1 |
| IPCH | 10000 | IPCH | 1.3 | 1.3 | 0.0 |
reg |> filter(mesure == "Glissement annuel (%)") |>
mutate(avec_ddc = lab_ddc(avec_ddc), date = format(date, "%Y-%m")) |>
select(groupe, regroupement, ponderation, avec_ddc, date, valeur) |>
print_table_conditional()