¿Qué es el Índice de Gini y cómo calcularlo?
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:
- Persona A come 1 pan, Persona B come 1 pan.
- Persona A come 2 panes, Persona B come 0 panes.
- 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}")
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.
