Хорошо, вот метод в R, который по крайней мере автоматизирует грубую силу. Он пробует 1000 различных случайных перестановок населения и выбирает случай, когда коэффициенты Джини имеют самое низкое стандартное отклонение. Он работает хорошо и практически мгновенно с вашим набором игрушечных данных.
library(ineq)
x <-c(1500, 1100, 9000, 4000, 4000, 3900, 3800, 3600, 3400,
1000, 900, 800, 700, 700, 400, 300, 300, 300, 200, 100)
Gini(x)
# 0.534
n <- length(x)
best_sd <- 1
for(i in 1:1000){
grouping <- sample(1:3, n, replace = TRUE)
ginis <- tapply(x, grouping, Gini)
s <- sd(ginis)
if(s < best_sd){
best_sd <- s
best_grouping <- grouping
best_i <- i}
}
best_sd
# 0.000891497
tapply(x, best_grouping, Gini)
# 1 2 3
# 0.5052780 0.5042017 0.5035088
Это не гарантировано, чтобы быть лучшим, но это, очевидно, довольно близко. Более элегантное решение - найти способы выбора и выбора точек, которые нужно поменять местами по мере приближения, но это, вероятно, замедлит вычислительные процессы и, безусловно, потребует гораздо больше времени для разработчиков!
С большим набором данных из 100 000 наблюдений это все равно займет всего 12 секунд на моем ноутбуке, поэтому он масштабируется нормально.