% po_scatter(daes(x = SI.POV.GINI, y = HD.HCI.OVRL, group = country, tooltip = country)) %>% po_labels( title = "Índice de Desarrollo Humano en América del Sur", subtitle = "Fuente: Banco Mundial") El gráfico muestra que la correlación no es concluyente, ya que hay países con alta desigualdad y alto desarrollo humano, así como países con baja desigualdad y bajo desarrollo humano. Esto indica que otros factores también influyen en el desarrollo humano más allá de la desigualdad del ingreso." />

¿Qué es el Índice de Gini y cómo calcularlo?

[This article was first published on pacha.dev/blog, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

If this post is useful to you I kindly ask a minimal donation on Buy Me a Coffee. It shall be used to continue my Open Source efforts.

You can send me questions for the blog using this form and subscribe to receive an email when there is a new post.

Leí un post en LinkedIn que, además de la verguenza ajena que me provocó, contenía varios errores conceptuales sobre el Índice de Gini. Así que decidí escribir este post para aclarar qué es el Índice de Gini y cómo calcularlo. Espero que este post sea útil y ayude a desmitificar ese índice, el cuál no es “Inteligencia Artificial” ni “abstracción”, sino una simple medida estadística. En general, no considero bueno que se intente oscurecer conceptos en lugar de intentar explicarlos de manera clara y sencilla.

El Índice de Gini es una medida estadística que se utiliza para cuantificar la desigualdad en una distribución, comúnmente aplicada a la distribución del ingreso o la riqueza en una población. Es una medida de concentración que refleja cómo se distribuyen los recursos entre los individuos de un país o región.

Fue desarrollado por el italiano Corrado Gini en 1912. El valor del Índice de Gini varía entre 0 y 1 (o 0% y 100%), donde 0 representa una igualdad perfecta (todos tienen el mismo ingreso) y 1 representa una desigualdad máxima (una sola persona tiene todo el ingreso y los demás no tienen nada).

Para entender esto un poco mejor, analicemos la frase de Nicanor Parra: “Hay dos panes. Usted se come dos; yo, ninguno. Consumo promedio: un pan por persona”. Además del promedio de 1 pan por persona, por definición (y sin realizar cálculos), el Índice de Gini en este caso es 1 (desigualdad máxima), ya que una persona consume todo el pan.

El cálculo del Índice de Gini se basa en la curva de Lorenz, que representa la proporción acumulada del ingreso total recibido por el porcentaje acumulado de la población. El Índice de Gini se calcula como el área entre la curva de Lorenz y la línea de igualdad perfecta, dividido por el área total bajo la línea de igualdad perfecta.

Es decir, si el 1% más pobre de la población recibe el 1% del ingreso total, el 2% más pobre recibe el 2% del ingreso total, y así sucesivamente, se tiene un caso de igualdad perfecta con un Índice de Gini de 0.

De acuerdo a los datos de la Comisión Económica para América Latina y el Caribe (CEPAL) de 2024, Chile tiene la siguiente distribución del ingreso:

Decil Ingreso (%)
1 1.7
2 3.1
3 4.2
4 5.2
5 6.4
6 7.7
7 9.4
8 11.9
9 16.2
10 34.2

A partir de estos datos, se puede calcular el Índice de Gini de Chile, que es aproximadamente 0.44 (44%), indicando un nivel moderado de desigualdad en la distribución del ingreso.

Usando R, podemos calcular el Índice de Gini a partir de estos datos:

# Calculo sin usar librerías

# Porcentaje acumulado de ingreso por decil
ingreso <- c(1.7, 3.1, 4.2, 5.2, 6.4, 7.7, 9.4, 11.9, 16.2, 34.2)
ingreso_acumulado <- cumsum(ingreso)

# Población acumulada por decil
poblacion_acumulada <- seq(0.1, 1, by = 0.1)

# Convertir a proporciones acumuladas
ingreso_prop_acum <- ingreso_acumulado / 100

# Agregar el punto inicial (0,0) para la curva de Lorenz
x <- c(0, poblacion_acumulada)
y <- c(0, ingreso_prop_acum)

# Calculo del área bajo la curva de Lorenz usando regla del trapecio
area_lorenz <- sum((x[-1] - x[-length(x)]) * (y[-1] + y[-length(y)]) / 2)

# Calculo del Índice de Gini
# Gini = (Área entre línea de igualdad y curva de Lorenz) / (Área total bajo línea de igualdad)
# Área bajo línea de igualdad = 0.5, entonces:
# Gini = (0.5 - area_lorenz) / 0.5 = 1 - 2 * area_lorenz
indice_gini <- 1 - 2 * area_lorenz

indice_gini
[1] 0.4366

Usando la libreria “ineq”:

if (!require(ineq)) { install.packages("ineq", repos = "https://cran.r-project.org") }
Loading required package: ineq
library(ineq)

# Convertir datos acumulados a participación individual de cada decil
participacion_individual <- c(ingreso_acumulado[1], diff(ingreso_acumulado))

# Calcular Gini usando la librería ineq
Gini(participacion_individual)
[1] 0.4366

Es conveniente graficar estos datos para visualizar la curva de Lorenz y las áreas involucradas en el cálculo del Índice de Gini:

library(ggplot2)

# Datos para la curva de Lorenz
lorenz_data <- data.frame(
  Poblacion = c(0, poblacion_acumulada),
  Ingreso = c(0, ingreso_prop_acum))

ggplot(lorenz_data, aes(x = Poblacion, y = Ingreso)) +
  geom_line(color = "blue", linewidth = 1.2) +
  geom_abline(slope = 1, intercept = 0, linewidth = 1.2, linetype = "dashed", color = "red") +
  geom_ribbon(aes(ymin = Ingreso, ymax = Poblacion), fill = "lightblue", alpha = 0.5) +
  geom_ribbon(aes(ymin = 0, ymax = Ingreso), fill = "lightgreen", alpha = 0.5) +
  geom_text(aes(x = 0.6, y = 0.2), label = "B", color = "black", size = 8) +
  geom_text(aes(x = 0.6, y = 0.5), label = "A", color = "black", size = 8) +
  labs(title = "Curva de Lorenz",
       x = "Proporción acumulada de la población",
       y = "Proporción acumulada del ingreso") +
  theme_minimal()
Warning in geom_text(aes(x = 0.6, y = 0.2), label = "B", color = "black", : All aesthetics have length 1, but the data has 11 rows.
ℹ Please consider using `annotate()` or provide this layer with data containing
  a single row.
Warning in geom_text(aes(x = 0.6, y = 0.5), label = "A", color = "black", : All aesthetics have length 1, but the data has 11 rows.
ℹ Please consider using `annotate()` or provide this layer with data containing
  a single row.

Si el area entre la línea de igualdad perfecta y la curva de Lorenz es A, y el área bajo la curva de Lorenz es B, entonces el Índice de Gini se calcula como

En el gráfico, el área A está representada en azul claro y el área B en verde claro.

Geométricamente, una sociedad muy igualitaria tendrá un área A tendiendo a cero, mientras que una sociedad muy desigual tendrá un área B tendiendo a cero.

Volviendo al ejemplo de Nicanor Parra, para un promedio de un pan por persona se pueden tener distintas distribuciones del pan con el mismo promedio:

  1. Persona A come 1 pan, Persona B come 1 pan.
  2. Persona A come 2 panes, Persona B come 0 panes.
  3. Persona A come 0 panes, Persona B come 2 panes.

Para el caso 1, el Índice de Gini es 0 (igualdad perfecta). Para los casos 2 y 3, el Índice de Gini es 1 (desigualdad máxima), ya que una persona consume todo el pan y la otra no consume nada.

El Índice de Gini es un estadístico que complementa otras medidas como la media o la mediana, proporcionando una visión más completa de la distribución del ingreso en una población. El problema reside en que muchos tienden a interpretar el Índice de Gini como una medida absoluta de justicia social, lo cual es incorrecto. Es simplemente una herramienta para entender la distribución del ingreso y no resuelve cuestiones éticas o morales.

Más aún, el Índice de Gini no captura todas las dimensiones de la desigualdad, como la movilidad social o las diferencias en el acceso o calidad de los servicios. Por lo tanto, es importante utilizarlo junto con otras métricas y análisis para obtener una comprensión más completa de la desigualdad en una sociedad.

Veamos qué pasaría si hipotéticamente se expropiara 10% de la riqueza al decil más rico y este se diviera equitativamente entre todos los deciles. ¿Cómo afectaría esto al Índice de Gini?

ingreso2 <- ingreso
monto_expropiado <- ingreso2[10] * 0.1

ingreso2[10] <- ingreso2[10] * 0.9
ingreso2 <- ingreso2 + monto_expropiado / 10

ingreso_acumulado2 <- cumsum(ingreso2)

participacion_individual2 <- c(ingreso_acumulado2[1], diff(ingreso_acumulado2))

gini1 <- Gini(participacion_individual)
gini2 <- Gini(participacion_individual2)

c("Gini original" = gini1, "Gini hipotético" = gini2)
  Gini original Gini hipotético 
        0.43660         0.40582 
# Cambio porcentual en el Índice de Gini
(gini2 - gini1) / gini1 * 100
[1] -7.049931

De acuerdo al resultado, expropiar 10% del ingreso del decil más rico y dividirlo en partes iguales Índice de Gini en aproximadamente un 7%, lo que indica una disminución en la desigualdad sin mayor información respecto de lo justo o injusto de la medida.

Veamos los datos para América del Sur usando datos del Banco Mundial:

if (!require(wbstats)) { install.packages("wbstats", repos = "https://cran.r-project.org") }

library(wbstats)

# Obtener datos del Índice de Gini para América Latina
gini_data <- wb_data(indicator = "SI.POV.GINI", start_date = 2020, end_date = 2024)
# Filtrar datos para América del Sur y conservar el dato más reciente por país

library(dplyr)
Attaching package: 'dplyr'
The following objects are masked from 'package:stats':

    filter, lag
The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union
iso2 <- c("AR", "BO", "BR", "CL", "CO", "EC", "PE", "PR", "PY", "UY", "VE")

gini_data <- gini_data %>%
  filter(iso2c %in% iso2 & !is.na(SI.POV.GINI)) %>%
  group_by(iso2c) %>%
  slice_max(order_by = date, n = 1) %>%
  ungroup() %>%
  mutate(SI.POV.GINI = round(SI.POV.GINI / 100, 3))

print(gini_data, n = 11)
# A tibble: 9 × 9
  iso2c iso3c country    date SI.POV.GINI unit  obs_status footnote last_updated
  <chr> <chr> <chr>     <dbl>       <dbl> <chr> <chr>      <chr>    <date>      
1 AR    ARG   Argentina  2024       0.424 <NA>  <NA>       Based o… 2025-10-07  
2 BO    BOL   Bolivia    2023       0.421 <NA>  <NA>       Based o… 2025-10-07  
3 BR    BRA   Brazil     2023       0.516 <NA>  <NA>       Based o… 2025-10-07  
4 CL    CHL   Chile      2022       0.43  <NA>  <NA>       Based o… 2025-10-07  
5 CO    COL   Colombia   2023       0.539 <NA>  <NA>       Based o… 2025-10-07  
6 EC    ECU   Ecuador    2024       0.452 <NA>  <NA>       Based o… 2025-10-07  
7 PE    PER   Peru       2024       0.401 <NA>  <NA>       Based o… 2025-10-07  
8 PY    PRY   Paraguay   2024       0.442 <NA>  <NA>       Based o… 2025-10-07  
9 UY    URY   Uruguay    2024       0.4   <NA>  <NA>       Based o… 2025-10-07  

Veamos estos datos en un mapa usando “d3po”:

if (!require(d3po)) { install.packages("d3po", repos = "https://pachadotdev.r-universe.dev") }

library(d3po)

dout <- map_ids(maps$south_america$continent) %>%
  left_join(gini_data, by = c("id" = "iso2c"))

# dout %>%
#   filter(!is.na(value))
  
my_gradient <- c("#7e2119", "#cf3a33", "#ec5938", "#ee874d", "#f6cc84")

d3po(dout, width = 800, height = 600) %>%
  po_geomap(daes(group = id, size = SI.POV.GINI, color = my_gradient, gradient = T, tooltip = name),
    map = maps$south_america$continent) %>%
  po_labels(
    title = "Coeficiente de Gini en América del Sur",
    subtitle = "Fuente: Banco Mundial") %>%
  po_tooltip("<b>País: {name}</b><br/>Valor: {SI.POV.GINI}")

A primera vista, se observa que Brasil es el país con mayor desigualdad en América del Sur y que la desigualdad en Argentina y Chile son similares.

Comparemos estos datos con el Índice de Desarrollo Humano (IDH):

idh_data <- wb_data(indicator = "HD.HCI.OVRL", start_date = 2020, end_date = 2024)

idh_data <- idh_data %>%
  filter(iso2c %in% iso2 & !is.na(HD.HCI.OVRL)) %>%
  group_by(iso2c) %>%
  slice_max(order_by = date, n = 1) %>%
  ungroup() %>%
  mutate(HD.HCI.OVRL = round(HD.HCI.OVRL, 3))

print(idh_data, n = 11)
# A tibble: 8 × 9
  iso2c iso3c country    date HD.HCI.OVRL unit  obs_status footnote last_updated
  <chr> <chr> <chr>     <dbl>       <dbl> <chr> <chr>      <chr>    <date>      
1 AR    ARG   Argentina  2020       0.602 <NA>  <NA>       <NA>     2020-09-21  
2 BR    BRA   Brazil     2020       0.551 <NA>  <NA>       <NA>     2020-09-21  
3 CL    CHL   Chile      2020       0.652 <NA>  <NA>       <NA>     2020-09-21  
4 CO    COL   Colombia   2020       0.604 <NA>  <NA>       <NA>     2020-09-21  
5 EC    ECU   Ecuador    2020       0.594 <NA>  <NA>       <NA>     2020-09-21  
6 PE    PER   Peru       2020       0.605 <NA>  <NA>       <NA>     2020-09-21  
7 PY    PRY   Paraguay   2020       0.528 <NA>  <NA>       <NA>     2020-09-21  
8 UY    URY   Uruguay    2020       0.599 <NA>  <NA>       <NA>     2020-09-21  
dout_idh <- map_ids(maps$south_america$continent) %>%
  left_join(idh_data, by = c("id" = "iso2c"))

my_gradient <- c("#0b5394", "#3075b3", "#4583bb", "#6fa8dc", "#7fbce9")

d3po(dout_idh, width = 800, height = 600) %>%
  po_geomap(daes(group = id, size = HD.HCI.OVRL, color = my_gradient, gradient = T, tooltip = name),
    map = maps$south_america$continent) %>%
  po_labels(
    title = "Índice de Desarrollo Humano en América del Sur",
    subtitle = "Fuente: Banco Mundial") %>%
  po_tooltip("<b>País: {name}</b><br/>Valor: {HD.HCI.OVRL}")
To leave a comment for the author, please follow the link and comment on their blog: pacha.dev/blog.

R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Never miss an update!
Subscribe to R-bloggers to receive
e-mails with the latest R posts.
(You will not see this message again.)

Click here to close (This popup will not appear again)