#librerías
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
library(ineq)
#definiendo funciones para las medidas de desigualdad
# Coeficiente de Gini
calcular_gini <- function(ingresos) {
return(ineq::Gini(ingresos))
}
# Desviaci?n est?ndar de logaritmos (necesitamos manejar ceros)
calcular_sd_log <- function(ingresos) {
# Agregar 1 para evitar problemas con log(0) y luego ajustar
ingresos_ajustados <- ingresos + 1
return(sd(log(ingresos_ajustados)))
}
# Ratio P90/P10
calcular_ratio_p90_p10 <- function(ingresos) {
p90 <- quantile(ingresos, 0.9)
p10 <- quantile(ingresos, 0.1)
return(as.numeric(p90 / p10))
}
# ?ndice de Theil
calcular_theil <- function(ingresos) {
n <- length(ingresos)
ingreso_promedio <- mean(ingresos)
# F?rmula: Theil = (1/n) * ?? (x_i/??) * log(x_i/??)
theil <- (1/n) * sum((ingresos/ingreso_promedio) * log(ingresos/ingreso_promedio))
return(theil)
}
# ?ndice de Atkinson con diferentes ?psilons
calcular_atkinson <- function(ingresos, epsilon = 0.5) {
n <- length(ingresos)
ingreso_promedio <- mean(ingresos)
if (epsilon == 1) {
# Caso especial cuando epsilon = 1
atkinson <- 1 - (prod(ingresos)^(1/n)) / ingreso_promedio
} else {
# Caso general para epsilon ??? 1
atkinson <- 1 - (mean((ingresos/ingreso_promedio)^(1-epsilon))^(1/(1-epsilon)))
}
return(atkinson)
}
#vector base/original
ingresos_base <- c(10, 15, 20, 25, 30, 35, 40, 60, 100, 200)
# 4 escenarios
# CAMBIO 1: Aumento de población (se duplica la población,
# sigue la misma distribución)
ingresos_poblacion <- c(ingresos_base, ingresos_base)
# CAMBIO 2: Ingresos aumentan en un 150%, todos ganan,
# su ingreso se multiplica por 2.5
ingresos_escalado <- ingresos_base * 2.5
# CAMBIO 3: Transferencia social universal
# (Se aplica un aumento de 15 puntos a los 5 ingresos más pequeños, sin quitarle a nadie)
ingresos_transferencia_social <- c(25, 30, 35, 40, 45, 35, 40, 60, 100, 200)
# CAMBIO 4: Transferencia progresiva (Principio de Pigou-Dalton)
# se transfieren 50 puntos del más rico, o sea de 200 a 150, al más pobre que pasa de 10 a 60.
ingresos_transferencia_progresiva <- c(60, 15, 20, 25, 30, 35, 40, 60, 100, 150)
# Función que calcula las 5 medidas de desigualdad del vector base de ingresos
calcular_todas_medidas <- function(ingresos, nombre) {
data.frame(
Escenario = nombre,
Gini = round(calcular_gini(ingresos), 4),
SD_Log = round(calcular_sd_log(ingresos), 4),
Ratio_P90_P10 = round(calcular_ratio_p90_p10(ingresos), 2),
Theil = round(calcular_theil(ingresos), 4),
Atkinson_05 = round(calcular_atkinson(ingresos, 0.5), 4),
Atkinson_10 = round(calcular_atkinson(ingresos, 1.0), 4),
Atkinson_15 = round(calcular_atkinson(ingresos, 1.5), 4),
Media = round(mean(ingresos), 2),
Mediana = round(median(ingresos), 2)
)
}
resultados <- rbind(
calcular_todas_medidas(ingresos_base, "0. Base (desigual)"),
calcular_todas_medidas(ingresos_poblacion, "1. Aumento de población"),
calcular_todas_medidas(ingresos_escalado, "2. Escalamiento proporcional (x2.5)"),
calcular_todas_medidas(ingresos_transferencia_social, "3. Transferencia social universal"),
calcular_todas_medidas(ingresos_transferencia_progresiva, "4. Transferencia progresiva (Pigou-Dalton)")
)
print(resultados)
## Escenario Gini SD_Log Ratio_P90_P10 Theil
## 1 0. Base (desigual) 0.4776 0.8681 7.59 0.4014
## 2 1. Aumento de población 0.4776 0.8450 7.59 0.4014
## 3 2. Escalamiento proporcional (x2.5) 0.4776 0.8827 7.59 0.4014
## 4 3. Transferencia social universal 0.3639 0.6171 3.73 0.2557
## 5 4. Transferencia progresiva (Pigou-Dalton) 0.3822 0.7021 5.38 0.2418
## Atkinson_05 Atkinson_10 Atkinson_15 Media Mediana
## 1 0.1830 0.3249 0.4279 53.50 32.50
## 2 0.1830 0.3249 0.4279 53.50 32.50
## 3 0.1830 0.3249 0.4279 133.75 81.25
## 4 0.1131 0.1971 0.2574 61.00 40.00
## 5 0.1152 0.2153 0.2977 53.50 37.50
# Configurar panel de 2x2
par(mfrow = c(2, 2))
# Gráfico 1: Comparación de distribuciones (los 4 escenarios de 10 personas)
plot(1:10, ingresos_base, type = "b", col = "black", lwd = 2,
ylim = c(0, max(ingresos_escalado)),
xlab = "Individuos (ordenados por ingreso)", ylab = "Ingreso",
main = "Distribuciones (10 personas)", cex.main = 0.9)
lines(1:10, ingresos_escalado, type = "b", col = "blue", lwd = 2)
lines(1:10, ingresos_transferencia_social, type = "b", col = "darkgreen", lwd = 2)
lines(1:10, ingresos_transferencia_progresiva, type = "b", col = "red", lwd = 2)
legend("topleft", legend = c("Base", "Escalado x2.5", "Transf. social", "Transf. progresiva"),
col = c("black", "blue", "darkgreen", "red"), lwd = 2, cex = 0.6)
# Gráfico 2: Aumento de población (dedicado, porque tiene 20 personas)
plot(1:10, ingresos_base, type = "b", col = "black", lwd = 2,
ylim = c(0, max(ingresos_poblacion)),
xlab = "Individuos", ylab = "Ingreso",
main = "Base (10) vs Población (20)", cex.main = 0.9)
lines(1:20, ingresos_poblacion, type = "b", col = "purple", lwd = 2, pch = 1)
legend("topleft", legend = c("Base (10 personas)", "Población duplicada (20 personas)"),
col = c("black", "purple"), lwd = 2, cex = 0.6)
# Gráfico 3: Coeficiente de Gini comparado (los 5 escenarios)
barplot(resultados$Gini, names.arg = resultados$Escenario,
col = c("gray", "purple", "skyblue", "darkgreen", "tomato"),
main = "Coeficiente de Gini", las = 2, cex.names = 0.55, cex.main = 0.9)
# Gráfico 4: Ratio P90/P10 comparado (los 5 escenarios)
barplot(resultados$Ratio_P90_P10, names.arg = resultados$Escenario,
col = c("gray", "purple", "skyblue", "darkgreen", "tomato"),
main = "Ratio P90/P10", las = 2, cex.names = 0.55, cex.main = 0.9)

# Gráfico 5: Índice de Atkinson con diferentes epsilons (los 5 escenarios)
atkinson_data <- as.matrix(resultados[, c("Atkinson_05", "Atkinson_10", "Atkinson_15")])
barplot(t(atkinson_data), beside = TRUE,
names.arg = resultados$Escenario,
col = c("lightblue", "blue", "darkblue"),
main = "Índice de Atkinson por ε", cex.main = 0.9,
legend.text = c("ε=0.5", "ε=1.0", "ε=1.5"),
las = 2, cex.names = 0.5, args.legend = list(cex = 0.6))
