【问题标题】:Find 3 subsample with the same (approximately) Gini coefficient找到 3 个具有相同(近似)基尼系数的子样本
【发布时间】:2018-07-04 19:38:00
【问题描述】:

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

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

现在我应该在 3 个“有序”子组中“采样”X20 分量(不需要相同数量的分量),以便它们(大约)具有相同的基尼系数。

提醒一下基尼系数:只需计算每个收入占总收入的百分比(例如p1=1500/(1500+1100+...)p2=1100/(1500+1100+...)、...、p20=100/(1500+1100+...)),然后累积 % 值(例如 c1=0+p1c2=p1+p2、...、c20=p19+p20=1),然后计算累积的面积(A=(c1+...+c20-0.5)/(20)-0.5)和基尼系数G=2*A

这可以通过蛮力轻松完成:将样本一分为三,计算三个样本的基尼系数,并尝试从/移到中间样本的上下分量,以确定基尼系数的差异是改善还是恶化离开。但是,手动完成非常耗时(例如在 Excel 上),尤其是当我有一个非常大的数据集时。

我怀疑有一个更优雅的解决方案。我对PythonR 都开放。

其他细节 输出将是这样的:X

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

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

        1         2         3 
      0.4      0.41      0.39 

【问题讨论】:

  • 你能正确写出你的公式吗?
  • @Onyambu 请给我一个提示。我无法弄清楚缺少什么。
  • 这很有趣,我正在尝试。出于好奇,你为什么要这样做?
  • 首先你现在有prop.table(X),你需要3组还是2组? A的公式是什么?? A=c1+c2+...+c20-0,5 相加然后减去 0?减去零是没有意义的。,5 是关于什么的?同样在分母/(20)-0,5) 我不明白0,5 是什么,或者你的意思是0.5?如果是0.5,你是先除然后减还是先减后除?你能把你的公式写正确吗?
  • @Onyambu 抱歉,我放错了, 而不是.。意大利系统没有帮助......

标签: python r pandas optimization gini


【解决方案1】:

好的,这是 R 中的一种方法,它至少可以自动执行蛮力。它尝试了 1,000 种不同的总体随机排列,并在基尼系数具有最低标准偏差时选择一种。它适用于您的玩具数据集,几乎可以立即运行。

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

【讨论】:

  • 作为一个有趣的补充,三组的基尼系数每次都会不同。所以第二次运行它,他们收敛到 0.428(不是 0.505);然后下次在 0.468 上。
  • 当我检查 best_grouping 以实际查看组时发生了一些奇怪的事情:[1] 3 3 3 1 1 3 2 3 3 3 2 3 1 3 1 3 1 1 3 2。如果我理解正确,这意味着1500 必须在组#3 中,1100 组#3 等等,对吗?如果是这样,似乎代码通过放入“非常高的值集群”(#3)也是一个非常低的值300来平衡集群。第 1 组似乎也包括高价值和低价值。这很奇怪。因为我已经订购了数据,所以集群应该遵循这个顺序。
  • 我不明白你为什么觉得这很奇怪?将有很多方法来创建彼此具有相似基尼系数的集群;有些版本会在其他方面彼此相似,在其他方面与主要人群相似,有些版本会形成奇怪的小飞地,它们可能彼此完全不同(例如不同的均值和方差),但仍具有相同的基尼系数。
【解决方案2】:

回答自己的问题不太礼貌,但我认为值得分享。这是我从上面的Peter Ellis answer 中汲取灵感在R 中写的。欢迎任何评论/改进想法:

library(ineq)
x <-c(15000, 11000, 9000, 4000, 4000, 3900, 3800, 3600, 3400,
      1000, 900, 800, 700, 700, 400, 300, 300, 300, 200, 100)
n <- length(x)

best_sd <- 1
for(d in 2:n-2) for(u in 3:n-2){
  g <- c(Gini(x[1:d]), Gini(x[d+1:u]), Gini(x[u+1:n]))
  s <- sd(g) 
  if(s < best_sd){
    best_sd <- s
    best_grouping <- c(d,u)
    best_g <- g
  }
}

best_sd
#[1] 0.005250825
best_grouping
#[1]  9 11
best_g
#[1] 0.3046409 0.3144654 0.3127660

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    • 2016-04-30
    • 2021-12-27
    • 2020-08-31
    • 2023-03-10
    • 2019-05-30
    相关资源
    最近更新 更多