找到3个具有相同(大约)基尼系数的子样本

时间:2018-07-03 05:25:48

标签: python r pandas optimization gini

比方说,我有一个N个人样本和一个随机变量X,它们代表他们的外币年收入。 X的示例如下:

15000
11000
9000
4000
4000
3900
3800
3600
3400
1000
900
800
700
700
400
300
300
300
200
100

现在,我应该在3个“有序”子组中对20的{​​{1}}个组件进行“采样”(不必要使用相同数量的组件),以便它们具有(大约)相同的Gini系数。

  

作为对基尼系数的提醒:只需计算每种收入占总收入的百分比(例如Xp1=1500/(1500+1100+...),...,{{1 }}),然后累加%值(例如p2=1100/(1500+1100+...)p20=100/(1500+1100+...),...,c1=0+p1),然后计算累加(c2=p1+p2)下方的面积,因此基尼c20=p19+p20=1

这可以很容易地通过蛮力完成:将样本分成3个,计算三个样本的基尼系数,并尝试从中间样本的上,下成分移动到中间样本,以判断基尼系数之间的差异是改善还是恶化关。但是,手动完成操作非常耗时(例如在Excel上),尤其是当我有非常大的数据集时。

我怀疑还有更好的解决方案。我对A=(c1+...+c20-0.5)/(20)-0.5G=2*A都开放。

其他详细信息 输出将如下所示:对于Python

R

对于X,这三个子组的实际基尼系数

        1         2         3 
     1500      3900       400
     1100      3800       300
     9000      3600       300
     4000      3400       300
               1000       200
                900       100
                800
                700
                700

2 个答案:

答案 0 :(得分:1)

好的,这是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秒,因此可以扩展。

答案 1 :(得分:0)

回答自己的问题不是很礼貌,但我认为值得分享。这是我在Peter Ellis answer的启发下在def queue(lst): n = len(lst) swipe_count = 0 for i in range(n): for j in range(n - i - 1): if lst[j] > lst[j + 1]: lst[j], lst[j + 1] = lst[j + 1], lst[j] swipe_count += 1 return lst, swipe_count 中写的。欢迎任何评论/改进意见:

R