как назначить группировки на основе атрибутов? - PullRequest
0 голосов
/ 18 октября 2019

Представьте себе, у меня есть список из 51 персоны, каждая из которых имеет стандартизированное значение, присущее их 6 навыкам. Теперь мне интересно, есть ли программируемый способ для точного и одинакового распределения этих людей в равных командах с учетом уровней квалификации. Я не был уверен, какой формат данных более подходит, но на интуитивном уровне я решил, что длинный набор данных сделает это проще:

df <- structure(list(unique_id = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 
5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 
7L, 7L, 8L, 8L, 8L, 8L, 8L, 8L, 9L, 9L, 9L, 9L, 9L, 9L, 10L, 
10L, 10L, 10L, 10L, 10L, 11L, 11L, 11L, 11L, 11L, 11L, 12L, 12L, 
12L, 12L, 12L, 12L, 13L, 13L, 13L, 13L, 13L, 13L, 14L, 14L, 14L, 
14L, 14L, 14L, 15L, 15L, 15L, 15L, 15L, 15L, 16L, 16L, 16L, 16L, 
16L, 16L, 17L, 17L, 17L, 17L, 17L, 17L, 18L, 18L, 18L, 18L, 18L, 
18L, 19L, 19L, 19L, 19L, 19L, 19L, 20L, 20L, 20L, 20L, 20L, 20L, 
21L, 21L, 21L, 21L, 21L, 21L, 22L, 22L, 22L, 22L, 22L, 22L, 23L, 
23L, 23L, 23L, 23L, 23L, 24L, 24L, 24L, 24L, 24L, 24L, 25L, 25L, 
25L, 25L, 25L, 25L, 26L, 26L, 26L, 26L, 26L, 26L, 27L, 27L, 27L, 
27L, 27L, 27L, 28L, 28L, 28L, 28L, 28L, 28L, 29L, 29L, 29L, 29L, 
29L, 29L, 30L, 30L, 30L, 30L, 30L, 30L, 31L, 31L, 31L, 31L, 31L, 
31L, 32L, 32L, 32L, 32L, 32L, 32L, 33L, 33L, 33L, 33L, 33L, 33L, 
34L, 34L, 34L, 34L, 34L, 34L, 35L, 35L, 35L, 35L, 35L, 35L, 36L, 
36L, 36L, 36L, 36L, 36L, 37L, 37L, 37L, 37L, 37L, 37L, 38L, 38L, 
38L, 38L, 38L, 38L, 39L, 39L, 39L, 39L, 39L, 39L, 40L, 40L, 40L, 
40L, 40L, 40L, 41L, 41L, 41L, 41L, 41L, 41L, 42L, 42L, 42L, 42L, 
42L, 42L, 43L, 43L, 43L, 43L, 43L, 43L, 44L, 44L, 44L, 44L, 44L, 
44L, 45L, 45L, 45L, 45L, 45L, 45L, 46L, 46L, 46L, 46L, 46L, 46L, 
47L, 47L, 47L, 47L, 47L, 47L, 48L, 48L, 48L, 48L, 48L, 48L, 49L, 
49L, 49L, 49L, 49L, 49L, 50L, 50L, 50L, 50L, 50L, 50L, 51L, 51L, 
51L, 51L, 51L, 51L), attribute = structure(c(2L, 1L, 3L, 4L, 
5L, 6L, 2L, 1L, 3L, 4L, 5L, 6L, 2L, 1L, 3L, 4L, 5L, 6L, 2L, 1L, 
3L, 4L, 5L, 6L, 2L, 1L, 3L, 4L, 5L, 6L, 2L, 1L, 3L, 4L, 5L, 6L, 
2L, 1L, 3L, 4L, 5L, 6L, 2L, 1L, 3L, 4L, 5L, 6L, 2L, 1L, 3L, 4L, 
5L, 6L, 2L, 1L, 3L, 4L, 5L, 6L, 2L, 1L, 3L, 4L, 5L, 6L, 2L, 1L, 
3L, 4L, 5L, 6L, 2L, 1L, 3L, 4L, 5L, 6L, 2L, 1L, 3L, 4L, 5L, 6L, 
2L, 1L, 3L, 4L, 5L, 6L, 2L, 1L, 3L, 4L, 5L, 6L, 2L, 1L, 3L, 4L, 
5L, 6L, 2L, 1L, 3L, 4L, 5L, 6L, 2L, 1L, 3L, 4L, 5L, 6L, 2L, 1L, 
3L, 4L, 5L, 6L, 2L, 1L, 3L, 4L, 5L, 6L, 2L, 1L, 3L, 4L, 5L, 6L, 
2L, 1L, 3L, 4L, 5L, 6L, 2L, 1L, 3L, 4L, 5L, 6L, 2L, 1L, 3L, 4L, 
5L, 6L, 2L, 1L, 3L, 4L, 5L, 6L, 2L, 1L, 3L, 4L, 5L, 6L, 2L, 1L, 
3L, 4L, 5L, 6L, 2L, 1L, 3L, 4L, 5L, 6L, 2L, 1L, 3L, 4L, 5L, 6L, 
2L, 1L, 3L, 4L, 5L, 6L, 2L, 1L, 3L, 4L, 5L, 6L, 2L, 1L, 3L, 4L, 
5L, 6L, 2L, 1L, 3L, 4L, 5L, 6L, 2L, 1L, 3L, 4L, 5L, 6L, 2L, 1L, 
3L, 4L, 5L, 6L, 2L, 1L, 3L, 4L, 5L, 6L, 2L, 1L, 3L, 4L, 5L, 6L, 
2L, 1L, 3L, 4L, 5L, 6L, 2L, 1L, 3L, 4L, 5L, 6L, 2L, 1L, 3L, 4L, 
5L, 6L, 2L, 1L, 3L, 4L, 5L, 6L, 2L, 1L, 3L, 4L, 5L, 6L, 2L, 1L, 
3L, 4L, 5L, 6L, 2L, 1L, 3L, 4L, 5L, 6L, 2L, 1L, 3L, 4L, 5L, 6L, 
2L, 1L, 3L, 4L, 5L, 6L, 2L, 1L, 3L, 4L, 5L, 6L, 2L, 1L, 3L, 4L, 
5L, 6L, 2L, 1L, 3L, 4L, 5L, 6L, 2L, 1L, 3L, 4L, 5L, 6L), .Label = c("Analytics", 
"Communication", "Creativity", "Problem solving", "Programming", 
"Project management"), class = "factor"), skill_level = c(1, 
1, 2, 1, 0, 0, 1, 2, 1, 1, 1, 1, 4, 2, 2, 3, 2, 4, 2, 1, 1, 2, 
2, 2, 2, 0, 0, 3, 0, 0, 2, 3, 3, 2, 2, 1, 2, 1, 1, 2, 2, 2, 2, 
3, 3, 3, 3, 1, 3, 3, 3, 3, 1, 3, 1, 1, 1, 2, 2, 2, 4, 0, 0, 2, 
0, 0, 3, 2, 3, 3, 2, 1, 1, 3, 4, 4, 4, 3, 3, 2, 3, 3, 3, 1, 2, 
2, 1, 3, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 0, 2, 2, 2, 2, 3, 
1, 2, 1, 1, 1, 0, 0, 0, 3, 2, 2, 3, 4, 3, 2, 2, 2, 2, 0, 2, 2, 
2, 1, 2, 0, 0, 3, 3, 4, 3, 2, 3, 2, 1, 0, 3, 0, 2, 2, 1, 1, 2, 
1, 1, 2, 1, 1, 2, 0, 1, 2, 3, 3, 3, 2, 2, 2, 2, 1, 2, 1, 1, 2, 
1, 1, 2, 1, 1, 0, 1, 2, 2, 0, 2, 2, 1, 2, 2, 2, 2, 1, 1, 1, 2, 
1, 2, 1, 1, 1, 1, 1, 0, 1, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2, 1, 3, 
2, 2, 3, 0, 1, 3, 2, 3, 2, 3, 2, 1, 1, 1, 2, 0, 2, 2, 2, 2, 2, 
2, 1, 2, 2, 2, 2, 2, 0, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 
2, 2, 3, 2, 1, 2, 2, 1, 2, 1, 2, 2, 1, 2, 2, 2, 0, 2, 1, 2, 2, 
2, 1, 1, 2, 2, 2, 2, 1, 2, 2, 2, 2, 1, 1, 4, 3, 3, 3, 2, 3, 2, 
2, 2, 3, 1, 2, 2, 3, 2, 3, 1, 3)), class = c("spec_tbl_df", "tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -306L))

Моя идея заключалась в том, чтобы как-то сосредоточиться на средних значениях в каждой группе навыков, но яПонятия не имею, с чего начать.

Возможно, я слишком усложнил проблему, и это может быть достигнуто с помощью определенного набора операций группировки и сортировки. Честно говоря, я даже не уверен, как искать некоторые существующие проблемы с заданиями, подобные этой, что замедляет меня.

Спасибо.

1 Ответ

1 голос
/ 18 октября 2019

То, что вы описываете, звучит так, как будто вы хотите провести кластерный анализ. Вот один из них, использующий кластеризацию kmeans и 4 группы (поиск правильного номера кластера - более длинная история, я просто догадываюсь здесь):

library(tidyr)
library(dplyr)
library(broom)

# kmeans needs wide format
mat <- df %>% 
  pivot_wider(id_cols = unique_id, names_from = attribute, values_from = skill_level)

# for the clustering we remove the id as it would be seen as a variable
clust <- mat %>%
  select(-unique_id) %>% 
  kmeans(4)

# we can attach group memebership back to the data
df_new <- mat %>% 
  mutate(group = clust$cluster)

df_new %>% 
  select(unique_id, group)
#> # A tibble: 51 x 2
#>    unique_id group
#>        <int> <int>
#>  1         1     3
#>  2         2     3
#>  3         3     4
#>  4         4     2
#>  5         5     2
#>  6         6     1
#>  7         7     2
#>  8         8     1
#>  9         9     4
#> 10        10     2
#> # ... with 41 more rows

# and also obtain group averages
group_average <- clust %>% 
  tidy() %>% 
  rename(Communication = x1,
         Analytics = x2,
         Creativity = x3,
         "Problem solving" = x4,
         Programming = x5,
         "Project management" = x6)
group_average
#> # A tibble: 4 x 9
#>   Communication Analytics Creativity `Problem solvin~ Programming
#>           <dbl>     <dbl>      <dbl>            <dbl>       <dbl>
#> 1         2.11       1.94      2.22              2.33       1.94 
#> 2         2          1.22      0.944             2.22       0.667
#> 3         0.833      1.33      1.5               1          0.5  
#> 4         2.78       2.67      2.89              3          2.33 
#> # ... with 4 more variables: `Project management` <dbl>, size <int>,
#> #   withinss <dbl>, cluster <fct>

Теперь группы довольно однородны, то есть люди в каждой группеимеют относительно похожие значения навыков. Если вы намерены получить группы, которые были бы одинаково сильны, вы можете случайным образом выбрать людей из разных кластеров, чтобы в каждой группе было одинаковое количество людей из кластеров 1,2,3 и 4.

...