Income Distribution Database - IDD

Data - OECD

Info

source dataset Title .html .rData
oecd IDD Income Distribution Database - IDD 2026-08-11 2026-08-11

DOWNLOAD_TIME

DOWNLOAD_TIME
2026-04-12

Last

obsTime Nobs
2024 115

MEASURE

Code
IDD |>
  group_by(MEASURE, Measure) |>
  summarise(Nobs = n()) |>
  arrange(-Nobs) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F) else .}

AGE

Code
IDD |>
  group_by(AGE, Age) |>
  summarise(Nobs = n()) |>
  arrange(-Nobs) %>%
  {if (is_html_output()) print_table(.) else .}
AGE Age Nobs
_T Total 33117
Y18T65 From 18 to 65 years 31597
Y_GT65 Over 65 years 29730
Y18T25 From 18 to 25 years 3416
Y26T40 From 26 to 40 years 3416
Y41T50 From 41 to 50 years 3416
Y51T65 From 51 to 65 years 3416
Y66T75 From 66 to 75 years 3416
Y_LT18 Less than 18 years 3416
Y_GE76 76 years or over 3404

DEFINITION

Code
IDD |>
  group_by(DEFINITION, Definition) |>
  summarise(Nobs = n()) |>
  arrange(-Nobs) %>%
  {if (is_html_output()) print_table(.) else .}
DEFINITION Definition Nobs
D_CUR Current definition 105988
D_PREV Previous definition - with overlap year 7124
D_INC Previous definition - without overlap year 5232

REF_AREA

Code
IDD |>
  group_by(REF_AREA, Ref_area) |>
  summarise(Nobs = n()) |>
  arrange(-Nobs) |>
  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

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() |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  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() |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  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() |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  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() |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  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() |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  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() |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  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() |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  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")) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  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) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  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) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  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() |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  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() |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  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() |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  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() |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  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() |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  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() |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  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() |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  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() |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  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() |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  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() |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  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("")