Income Distribution Database - IDD

Data - OECD

Last observation: 2025 (N = 193)

First observation: 1974 (N = 148)

Last data update: 01 sept. 2026, 04:08

Last compile: 02 sept. 2026, 23:27

Structure

France

GINI and GINIB

Code
IDD |>
  filter(MEASURE %in% c("INC_MRKT_GINI", "INC_DISP_GINI"), 
         DEFINITION == "D_CUR", 
         AGE == "_T", 
         REF_AREA == "FRA") |>
  year_to_date() |>
  ggplot() + ylab("Gini (Market, Disposable Income)") + xlab("") + theme_minimal() +
  geom_line(aes(x = date, y = obsValue, color = Measure)) +
  scale_color_manual(values = viridis(3)[1:2]) +
  scale_x_date(breaks = seq(1920, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(0, 60, 5),
                     limits = c(0.2, 0.55)) +
  theme(legend.position = c(0.3, 0.9),
        legend.title = element_blank())

P90/P10 and S80/S20

(ref:P90P10-S80S20-FRA) Disposable Income Decile and Quintile Ratios

Code
IDD |>
  filter(MEASURE %in% c("D9_1_INC_DISP", "QR_INC_DISP"), 
         DEFINITION == "D_CUR", 
         AGE == "_T", 
         REF_AREA == "FRA") |>
  year_to_date() |>
  ggplot() + ylab("P90/P10 and S80/S20") + xlab("") + theme_minimal() +
  geom_line(aes(x = date, y = obsValue, color = Measure)) +
  scale_color_manual(values = viridis(3)[1:2]) +
  scale_x_date(breaks = seq(1920, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = seq(0, 60, 0.1)) +
  theme(legend.position = c(0.3, 0.9),
        legend.title = element_blank())

(ref:P90P10-S80S20-FRA)

Germany

GINI and GINIB

(ref:GINI-GINIB-DEU) Gini Indicators in Germany: Market and Disposable Income

Code
IDD |>
  filter(MEASURE %in% c("INC_MRKT_GINI", "INC_DISP_GINI"), 
         DEFINITION == "D_CUR", 
         AGE == "_T", 
         REF_AREA == "DEU") |>
  year_to_date() |>
  ggplot() + ylab("Gini (Market, Disposable Income)") + xlab("") + theme_minimal() +
  geom_line(aes(x = date, y = obsValue, color = Measure)) +
  scale_color_manual(values = viridis(3)[1:2]) +
  scale_x_date(breaks = seq(1920, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(0, 60, 5),
                     limits = c(0.2, 0.55)) +
  theme(legend.position = c(0.3, 0.9),
        legend.title = element_blank())

(ref:GINI-GINIB-DEU)

P90/P10 and S80/S20

(ref:P90P10-S80S20-DEU) Disposable Income Decile and Quintile Ratios

Code
IDD |>
  filter(MEASURE %in% c("D9_1_INC_DISP", "QR_INC_DISP"), 
         DEFINITION == "D_CUR", 
         AGE == "_T", 
         REF_AREA == "DEU",
         METHODOLOGY == "METH2012") |>
  year_to_date() |>
  ggplot() + ylab("P90/P10 and S80/S20") + xlab("") + theme_minimal() +
  geom_line(aes(x = date, y = obsValue, color = Measure)) +
  scale_color_manual(values = viridis(3)[1:2]) +
  scale_x_date(breaks = seq(1920, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = seq(0, 60, 0.1)) +
  theme(legend.position = c(0.3, 0.9),
        legend.title = element_blank())

(ref:P90P10-S80S20-DEU)

Gini

Table

Code
IDD |>
  filter(MEASURE == "INC_DISP_GINI", 
         AGE == "_T", 
         obsTime %in% c("2018", "1998", "2008")) |>
  select(-REF_AREA) %>%
  select_if(~ n_distinct(.) > 1) |>
  spread(obsTime, obsValue) |>
  arrange(`2018`) |>
  mutate(Flag = gsub(" ", "-", str_to_lower(gsub(" ", "-", Ref_area))),
         Flag = paste0('<img src="../../icon/flag/vsmall/', Flag, '.png" alt="Flag">')) |>
  select(Flag, everything()) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}

France, Germany, United States

Code
IDD |>
  filter(MEASURE == "INC_DISP_GINI", 
         AGE == "_T", 
         REF_AREA %in% c("FRA", "DEU", "USA")) |>
  year_to_date() |>
  add_flag_color("Ref_area") |>
  ggplot() + geom_line(aes(x = date, y = obsValue, color = color)) +
  scale_color_identity() + theme_minimal() + add_3flags +
  scale_x_date(breaks = seq(1920, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.25, 0.9),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = 0.01*seq(0, 50, 2)) +
  ylab("Gini Index") + xlab("")

Inequality in Germany and France

All population

Code
IDD |>
  filter(MEASURE == "INC_DISP_GINI", 
         AGE == "_T", 
         REF_AREA %in% c("FRA", "DEU")) |>
  year_to_date() |>
  add_flag_color("Ref_area") |>
  ggplot() + geom_line(aes(x = date, y = obsValue, color = color)) +
  scale_color_identity() + theme_minimal() + add_2flags +
  scale_x_date(breaks = seq(1920, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.25, 0.9),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = 0.01*seq(0, 50, 2)) +
  ylab("Gini Index") + xlab("")

Age group 76+: mean disposable income (current prices)

Code
IDD |>
  filter(MEASURE == "INC_DISP",
         AGE == "Y_GE76",
         REF_AREA %in% c("FRA", "DEU"),
         DEFINITION == "D_CUR") |>
  year_to_date() |>
  add_flag_color("Ref_area") |>
  ggplot() + geom_line(aes(x = date, y = obsValue, color = color)) +
  scale_color_identity() + theme_minimal() + add_2flags +
  scale_x_date(breaks = seq(1920, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.25, 0.9),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = seq(10000, 50000, 1000)) +
  ylab("Age group 76+: mean disposable income (current prices)") + xlab("")

Age group 66-75: mean disposable income (current prices)

Code
IDD |>
  filter(MEASURE == "INC_DISP",
         AGE == "Y66T75",
         REF_AREA %in% c("FRA", "DEU"),
         DEFINITION == "D_CUR") |>
  year_to_date() |>
  add_flag_color("Ref_area") |>
  ggplot() + geom_line(aes(x = date, y = obsValue, color = color)) +
  scale_color_identity() + theme_minimal() + add_2flags +
  scale_x_date(breaks = seq(1920, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.25, 0.9),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = seq(10000, 50000, 1000)) +
  ylab("Age group 66-75: mean disposable income (current prices)") + xlab("")

Age group 41-50: mean disposable income (current prices)

Code
IDD |>
  filter(MEASURE == "INC_DISP",
         AGE == "Y41T50",
         REF_AREA %in% c("FRA", "DEU"),
         DEFINITION == "D_CUR") |>
  year_to_date() |>
  add_flag_color("Ref_area") |>
  ggplot() + geom_line(aes(x = date, y = obsValue, color = color)) +
  scale_color_identity() + theme_minimal() + add_2flags +
  scale_x_date(breaks = seq(1920, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.25, 0.9),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = seq(10000, 50000, 1000)) +
  ylab("Age group 41-50: mean disposable income (current prices)") + xlab("")

Age group 26-40: mean disposable income (current prices)

Code
# pdf(encoding = "ISOLatin9.enc")
IDD |>
  filter(MEASURE == "INC_DISP",
         AGE == "Y26T40",
         REF_AREA %in% c("FRA", "DEU"),
         DEFINITION == "D_CUR") |>
  year_to_date() |>
  add_flag_color("Ref_area") |>
  ggplot() + geom_line(aes(x = date, y = obsValue, color = color)) +
  scale_color_identity() + theme_minimal() + add_2flags +
  scale_x_date(breaks = seq(1920, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.25, 0.9),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = seq(10000, 50000, 1000),
                     labels = scales::dollar_format(accuracy = 1, suffix = "\u20ac", prefix = "")) +
  ylab("Age group 26-40: mean disposable income (current prices)") + xlab("")

INCHCTOTAL

Code
IDD |>
  filter(MEASURE == "INC_DISP",
         AGE == "Y18T65",
         REF_AREA %in% c("FRA", "DEU"),
         DEFINITION == "D_CUR") |>
  year_to_date() |>
  add_flag_color("Ref_area") |>
  ggplot() + geom_line(aes(x = date, y = obsValue, color = color)) +
  scale_color_identity() + theme_minimal() + add_2flags +
  scale_x_date(breaks = seq(1920, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.25, 0.9),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = seq(10000, 50000, 1000),
                     labels = scales::dollar_format(accuracy = 1, suffix = "\u20ac", prefix = "")) +
  ylab("All working-age household types: mean disposable income") + xlab("")

P90/P10 disposable income decile ratio

Code
IDD |>
  filter(MEASURE == "D9_1_INC_DISP", 
         REF_AREA %in% c("FRA", "DEU"), 
         DEFINITION == "D_CUR", 
         AGE == "_T") |>
  year_to_date() |>
  arrange(REF_AREA, date) |>
  filter(date >= as.Date("1994-01-01")) |>
  add_flag_color("Ref_area") |>
  ggplot() + geom_line(aes(x = date, y = obsValue, color = color)) +
  scale_color_identity() + theme_minimal() + add_2flags +
  scale_x_date(breaks = seq(1920, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.25, 0.9),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = seq(1, 5, 0.1)) +
  ylab("P90/P10 disposable income decile ratio") + xlab("")

P50/P10 disposable income decile ratio

Code
IDD |>
  filter(MEASURE == "D5_1_INC_DISP", 
         REF_AREA %in% c("FRA", "DEU"), 
         DEFINITION == "D_CUR", 
         AGE == "_T") |>
  year_to_date() |>
  arrange(REF_AREA, date) |>
  add_flag_color("Ref_area") |>
  ggplot() + geom_line(aes(x = date, y = obsValue, color = color)) +
  scale_color_identity() + theme_minimal() + add_2flags +
  scale_x_date(breaks = seq(1920, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.25, 0.9),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = seq(1, 5, 0.1)) +
  ylab("P90/P10 disposable income decile ratio") + xlab("")

S80/S20 disposable income quintile ratio

Code
IDD |>
  filter(MEASURE == "QR_INC_DISP", 
         REF_AREA %in% c("FRA", "DEU"), 
         DEFINITION == "D_CUR", 
         AGE == "_T") |>
  year_to_date() |>
  arrange(REF_AREA, date) |>
  add_flag_color("Ref_area") |>
  ggplot() + geom_line(aes(x = date, y = obsValue, color = color)) +
  scale_color_identity() + theme_minimal() + add_2flags +
  scale_x_date(breaks = seq(1920, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.25, 0.9),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = seq(1, 5, 0.1)) +
  ylab("S80/S20 disposable income quintile share") + xlab("")

Poverty (France, Germany)

PVT5A

Code
IDD |>
  filter(MEASURE == "PR_INC_DISP", POVERTY_LINE == "PL_50", 
         DEFINITION == "D_CUR", 
         AGE == "_T", 
         REF_AREA %in% c("DEU", "FRA")) |>
  year_to_date() |>
  add_flag_color("Ref_area") |>
  ggplot() + geom_line(aes(x = date, y = obsValue, color = color)) +
  scale_color_identity() + theme_minimal() + add_2flags +
  scale_x_date(breaks = seq(1920, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-7, 50, 1),
                     labels = percent_format(accuracy = 1)) +
  ylab("Poverty rate after taxes and transfers, Poverty line 50%") + xlab("")

PVT5B

Code
IDD |>
  filter(MEASURE == "PR_INC_MRKT", POVERTY_LINE == "PL_50", 
         DEFINITION == "D_CUR", 
         AGE == "_T", 
         REF_AREA %in% c("DEU", "FRA")) |>
  year_to_date() |>
  add_flag_color("Ref_area") |>
  ggplot() + geom_line(aes(x = date, y = obsValue, color = color)) +
  scale_color_identity() + theme_minimal() + add_2flags +
  scale_x_date(breaks = seq(1920, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.25, 0.9),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = 0.01*seq(-7, 50, 1),
                     labels = percent_format(accuracy = 1)) +
  ylab("Poverty rate before taxes and transfers, Poverty line 50%") + xlab("")

PALMA

Code
IDD |>
  filter(MEASURE == "PAL_INC_DISP", 
         DEFINITION == "D_CUR", 
         AGE == "_T", 
         REF_AREA %in% c("DEU", "FRA")) |>
  year_to_date() |>
  add_flag_color("Ref_area") |>
  ggplot() + geom_line(aes(x = date, y = obsValue, color = color)) +
  scale_color_identity() + theme_minimal() + add_2flags +
  scale_x_date(breaks = seq(1920, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.25, 0.9),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = seq(-7, 50, 0.05)) +
  ylab("Palma Ratio") + xlab("")

PVTAATOTAL

Code
IDD |>
  filter(MEASURE == "PR_INC_DISP", POVERTY_LINE == "PL_60", 
         DEFINITION == "D_CUR", 
         AGE == "_T", 
         REF_AREA %in% c("DEU", "FRA")) |>
  year_to_date() |>
  add_flag_color("Ref_area") |>
  ggplot() + geom_line(aes(x = date, y = obsValue, color = color)) +
  scale_color_identity() + theme_minimal() + add_2flags +
  scale_x_date(breaks = seq(1920, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.25, 0.9),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = 0.01*seq(-7, 50, 1),
                     labels = percent_format(accuracy = 1)) +
  ylab("Poverty Rate") + xlab("")

GINIB

Code
IDD |>
  filter(MEASURE == "INC_MRKT_GINI", 
         DEFINITION == "D_CUR", 
         AGE == "_T", 
         REF_AREA %in% c("DEU", "FRA")) |>
  year_to_date() |>
  add_flag_color("Ref_area") |>
  ggplot() + geom_line(aes(x = date, y = obsValue, color = color)) +
  scale_color_identity() + theme_minimal() + add_2flags +
  scale_x_date(breaks = seq(1920, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.25, 0.9),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = 0.01*seq(-7, 60, 1),
                     labels = percent_format(accuracy = 1)) +
  ylab("Gini (Market Income)") + xlab("")

Poverty rate after taxes and transfers

Code
IDD |>
  filter(MEASURE == "PR_INC_DISP", POVERTY_LINE == "PL_50", 
         DEFINITION == "D_CUR", 
         AGE == "_T", 
         REF_AREA %in% c("DEU", "FRA")) |>
  year_to_date() |>
  add_flag_color("Ref_area") |>
  ggplot() + geom_line(aes(x = date, y = obsValue, color = color)) +
  scale_color_identity() + theme_minimal() + add_2flags +
  scale_x_date(breaks = seq(1920, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.25, 0.9),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = 0.01*seq(-7, 50, 1),
                     labels = percent_format(accuracy = 1)) +
  ylab("Poverty rate after taxes and transfers, Poverty line 50%") + xlab("")

Poverty rate before taxes and transfers

Code
IDD |>
  filter(MEASURE == "PR_INC_MRKT", POVERTY_LINE == "PL_50", 
         DEFINITION == "D_CUR", 
         AGE == "_T", 
         REF_AREA %in% c("DEU", "FRA")) |>
  year_to_date() |>
  add_flag_color("Ref_area") |>
  ggplot() + geom_line(aes(x = date, y = obsValue, color = color)) +
  scale_color_identity() + theme_minimal() + add_2flags +
  scale_x_date(breaks = seq(1920, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.25, 0.9),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = 0.01*seq(-7, 50, 1),
                     labels = percent_format(accuracy = 1)) +
  ylab("Poverty rate before taxes and transfers, Poverty line 50%") + xlab("")

Palma

Code
IDD |>
  filter(MEASURE == "PAL_INC_DISP", 
         DEFINITION == "D_CUR", 
         AGE == "_T", 
         REF_AREA %in% c("DEU", "FRA")) |>
  year_to_date() |>
  add_flag_color("Ref_area") |>
  ggplot() + geom_line(aes(x = date, y = obsValue, color = color)) +
  scale_color_identity() + theme_minimal() + add_2flags +
  scale_x_date(breaks = seq(1920, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.25, 0.9),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = seq(-7, 50, 0.05)) +
  ylab("Palma Ratio") + xlab("")

Poverty Rate

Code
IDD |>
  filter(MEASURE == "PR_INC_DISP", POVERTY_LINE == "PL_60", 
         DEFINITION == "D_CUR", 
         AGE == "_T", 
         REF_AREA %in% c("DEU", "FRA")) |>
  year_to_date() |>
  add_flag_color("Ref_area") |>
  ggplot() + geom_line(aes(x = date, y = obsValue, color = color)) +
  scale_color_identity() + theme_minimal() + add_2flags +
  scale_x_date(breaks = seq(1920, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.25, 0.9),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = 0.01*seq(-7, 50, 1),
                     labels = percent_format(accuracy = 1)) +
  ylab("Poverty Rate") + xlab("")

Gini

Code
IDD |>
  filter(MEASURE == "INC_DISP_GINI", 
         AGE == "_T", 
         REF_AREA %in% c("FRA", "DEU", "USA")) |>
  year_to_date() |>
  add_flag_color("Ref_area") |>
  ggplot() + geom_line(aes(x = date, y = obsValue, color = color)) +
  scale_color_identity() + theme_minimal() + add_3flags +
  scale_x_date(breaks = seq(1920, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.25, 0.9),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = 0.01*seq(0, 50, 2)) +
  ylab("Gini Index") + xlab("")