【问题标题】:Group data by minimizing variance in R通过最小化 R 中的方差对数据进行分组
【发布时间】:2018-04-02 16:52:22
【问题描述】:

首先,我想向整个社区表达我的感激之情 - 通过浏览论坛,我学到了很多东西。

我有一个关于变量分组的问题,希望能得到帮助。

我有一个包含多列(“1”到“5”)的数据集。我想以这样一种方式对数据进行分组,即“1”列(Banding)的平均值最接近 100%。例如,假设数据如下所示:

Banding Gender  Country Type    BirthYear   Salary
220.9%  Male    Canada  alpha   1962    7,779.15
112.2%  Male    Canada  alpha   1946    1,355.64
80.8%   Male    Canada  alpha   1959    24,535.52
83.7%   Male    Canada  alpha   1943    3,961.32
112.6%  Male    Canada  alpha   1965    17,388.12
146.2%  Male    Canada  beta    1943    2,915.33
54.8%   Male    Canada  beta    1949    5,005.50
138.6%  Male    Canada  beta    1949    17,297.12
141.5%  Male    Canada  beta    1942    494.52
137.0%  Male    Canada  beta    1943    2,054.52
54.0%   Male    UStates alpha   1940    208.56
62.1%   Male    UStates alpha   1946    1,216.68
19.5%   Male    UStates alpha   1960    5,589.45
134.6%  Male    UStates alpha   1959    5,928.50
39.6%   Male    UStates alpha   1952    4,486.02
149.5%  Male    UStates beta    1954    3,427.36
95.6%   Male    UStates beta    1940    313.10
113.7%  Male    UStates beta    1942    927.00
120.4%  Male    UStates beta    1954    3,408.36
170.7%  Male    UStates beta    1937    606.60
88.1%   Male    Canada  alpha   1941    727.67
201.1%  Male    Canada  alpha   1946    1,715.88
347.3%  Male    Canada  alpha   1969    1,438.92
380.3%  Male    Canada  alpha   1941    282.60
506.2%  Male    Canada  alpha   1942    1,167.48
418.7%  Female  Canada  beta    1943    934.40
109.0%  Female  Canada  beta    1952    4,831.43
223.7%  Female  Canada  beta    1953    2,161.06
193.8%  Female  Canada  beta    1954    5,119.91
83.9%   Female  Canada  beta    1963    14,716.20
76.3%   Female  UStates alpha   1960    6,255.56
241.6%  Female  UStates alpha   1944    1,567.68
79.9%   Female  UStates alpha   1942    622.77
42.8%   Female  UStates alpha   1952    2,149.20
78.0%   Female  UStates alpha   1951    2,689.20
65.7%   Female  UStates beta    1951    11,721.19
179.7%  Female  UStates beta    1923    1,362.00
136.0%  Female  UStates beta    1945    528.48
74.1%   Female  UStates beta    1966    25,290.89
127.1%  Female  UStates beta    1963    7,451.59
19.2%   Female  Canada  alpha   1942    2,070.19
116.2%  Female  Canada  alpha   1936    298.66
118.6%  Female  Canada  alpha   1958    428.28
108.1%  Female  Canada  alpha   1954    3,610.08
99.1%   Female  Canada  alpha   1943    519.48
135.9%  Female  UStates beta    1940    63.96
144.2%  Female  UStates beta    1968    23,851.96
119.3%  Female  UStates beta    1936    1,376.76
112.9%  Female  UStates beta    1951    2,527.56
129.0%  Female  UStates beta    1949    1,061.88

我想得到一个看起来像第二个表的输出。从第二个表中,程序确定 BirthYear 不是一个重要变量,并同时对薪水进行了分组,以使“分组”的 bin 尽可能接近 100。使用所有变量并不重要,但最好在每个分组中有最少数量的样本。

现在,我正在使用 Excel 中的一系列数据透视表和 R 中的 CART 分析来使条带接近 100。这是大量的试验/错误,需要很多小时(真实的数据集包含许多变量和超过 50,000 行)。

Gender  Country             Type    Salary      Banding 
Male    Canada and Ustates  Alpha   <1000           112.5           
Male    Canada and Ustates  Alpha   1000-4000       117             
Male    Canada and Ustates  Alpha   >4000           108         
Male    Canada and Ustates  Beta    <1000           110         
Male    Canada and Ustates  Beta    1000-4000       98              
Male    Canada and Ustates  Beta    >4000           97          
Female  Canada              Alpha   <1000           100
Female  Canada              Alpha   1000-4000       115 
Female  Canada              Alpha   >4000           117.5
Female  Canada              Beta    <1000           118
Female  Canada              Beta    1000-4000       110 
Female  Canada              Beta    >4000           115
Female  Ustates             Alpha   <1000           102
Female  Ustates             Alpha   1000-4000       99  
Female  Ustates             Alpha   >4000           101
Female  Ustates             Beta    <1000           116
Female  Ustates             Beta    1000-4000       102 
Female  Ustates             Beta    >4000           98

谢谢大家。任何帮助都是感谢朋友。

快乐编码。

【问题讨论】:

  • 组(性别 x 国家 x 类型)是固定的吗?所有组最终都会有相同的薪水箱吗?您希望 110 和 115 的 2 个垃圾箱还是 101,111,116 的 3 个垃圾箱?您如何在接近 100 和 bin 数量之间进行权衡?
  • @MaxFt。感谢您的澄清问题。这些组确实都是固定的。工资箱不必相同(尽管大多数情况下它们是相同的)。过去,当我使用 Pivot 表/CART 进行这种分析时,我通常希望每个最终 bin 中的样本数量最少(~1000)。如果我遇到这样一种情况,即箱数的增加将箱中的样本减少到小于 1000,我将这些箱组合在一起。谢谢你的朋友。
  • 每个 bin 至少有 1000 个观察值。假设您有一个由 6000 人组成的小组。你宁愿选择 2 个 3000 人的工资箱,平均为 90 和 110,还是 3 个 2000 人的工资箱,平均为 98,105,115?例如。我的问题是:组内或组间差异是否重要?或者,重要的是您与所有组的 100 人的平均距离
  • @MaxFt。再次感谢。我明白你的问题。主要目标是保持所有组的平均距离为 100。我遇到了一些与您发布的情况类似的情况:1)2 箱 3000; 2) 3 个 2000 的 bin。在这些情况下,如果在添加另一个 bin 后平均 Banding 没有接近 100,那么我就错误地选择了更少的 bin。谢谢。

标签: r database algorithm function


【解决方案1】:

您应该考虑您到底要优化什么,然后以数学方式定义它。你的限制是什么,你对每个目标有多少权重,等等?这将比其他任何事情都更能帮助您找到最佳分组。

这是使用随机搜索的一种方法:

library(dplyr)
dat$Banding <- gsub("\\%", "", dat$Banding) %>% as.numeric
band_vals <- matrix(dat$Banding, ncol=1)
max_groups <- 20
min_groups <- 10
min_group_size <- 2

iters <- 100000
cost_vector <- rep(NA, iters)
best_cost <- Inf
n_groups <- sample(min_groups:max_groups, size=iters, replace=T)
for(iter in 1:iters) {
  set.seed(iter)
  x <- sample(n_groups[i], size=nrow(dat), replace=T)
  if(any(table(x) < min_group_size)) next;
  x_mat <- matrix(nrow = n_groups[i], ncol = nrow(dat), 0)
  for (i in 1:length(x)) {
    x_mat[x[i], i] <- 1/sum(x==x[i])
  }
  cost <- sum(( (x_mat %*% band_vals) - 100 )^2)
  if(cost < best_cost) {
    best_cost <- cost
    best_x <- x
  }
  cost_vector[iter] <- best_cost
}

dat$group <- best_x
plot(na.omit(cost_vector), type="l")
dat %>% group_by(group) %>% summarize(avg_banding = mean(Banding), n=n())

   group avg_banding     n
   <int>       <dbl> <int>
 1     1       114       2
 2     2       153       6
 3     3       114       4
 4     4       120       3
 5     5       170      10
 6     6       154       2
 7     7       138       2
 8     8        57.6     2
 9     9       100       2
10    10       119       3
11    11       134       3
12    12       176       6
13    13       127       3
14    14        95.8     2

随时间变化的成本:

【讨论】:

  • 感谢您的发帖。我现在已经做了大约 15 次这种类型的分析。每次性别和国家都表明很重要。所以我知道他们需要被包括在内。主要目标只是使值尽可能接近 100。我一直跟着你的剧本。最后,输出显示每个 bin 的样本数和平均值。有没有办法弄清楚决定因素是什么(即 1、114、2 是指男性、加拿大和阿尔法吗?)谢谢你的朋友。
  • 您可以在拨打summarize 时获取该信息,例如,list(Country) 列出特定组中的所有国家/地区。
  • 非常感谢您的帮助。当我根据您的建议输入以下行时: dat %>% group_by(group) %>% summarize(avg_banding = mean(Banding), n=n(), list(Country)) 我最终得到一个列表,其中所有内容写成 。也许我的脚本错了?再次感谢朋友!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多