Déterminer le plus grand contributeur d'un groupe

9

Je ne connais pas grand-chose aux statistiques, alors restez avec moi. Disons que j'ai un ensemble de 1000 travailleurs. Je veux savoir qui est le travailleur le plus acharné, mais je ne peux mesurer que la quantité de travail effectuée en groupes de 1 à 100 personnes sur une heure de travail. En supposant que chaque travailleur effectue toujours la même quantité de travail, sur un grand nombre d'essais et de combinaisons, puis-je classer mes travailleurs en fonction de ceux qui travaillent le plus?

Remarque: ce n'est qu'une métaphore, alors ne vous inquiétez pas de l'exécution des tests, supposez simplement que j'ai déjà un grand ensemble de données.

Edit: Quand je dis «en supposant que chaque travailleur effectue toujours la même quantité de travail», je veux dire que chaque individu effectue environ la même quantité de travail au jour le jour. Ainsi, Joey fera environ 100 unités de travail chaque jour et Greg en fera environ 50. Le problème est que je ne peux observer que le nombre d'unités de travail effectuées par le groupe.

Plus de modifications: en ce qui concerne le nombre de travailleurs travaillant simultanément et leur fréquence de travail. Il pourrait y avoir un nombre illimité de travailleurs travaillant en même temps. Certains travailleurs finiront probablement par travailler beaucoup plus que d'autres, c'est-à-dire que nous pouvons supposer que certains travailleurs travailleront presque 90% du temps et d'autres presque jamais.

Je sais que cela rend les choses difficiles, mais j'aurai un très grand ensemble de données, donc j'espère que cela le rendra un peu plus facile.

Pour chaque heure, nous savons quels travailleurs travaillent et combien de travail a été fait. À partir de ces informations, je veux savoir qui fait le plus de travail.

Si les données étaient au format JSON, cela ressemblerait à ceci:

[
  {
    "work_done": 12345,
    "Workers": [ "andy", "bob", "cameron", "david" ]
  },
  {
    "work_done": 432,
    "Workers": [ "steve", "joe", "andy"]
  },
  {
    "work_done": 59042,
    "Workers": [ "bob", "aaron", "michelle", "scott", "henry" ]
  },
  ...
]
Greg Guida
la source
3
Le travail est-il additif, comme la quantité de certains produits? Vous pouvez ensuite utiliser la régression linéaire pour estimer la contribution de chaque travailleur et trier les travailleurs en fonction de leurs coefficients. Si ce n'est pas additif, vous voudrez peut-être quelque chose de plus compliqué.
Douglas Zare
Si vous supposez que vous savez combien de travail chaque groupe a accompli et que vous supposez également que le travail est réparti également entre les participants de chaque groupe, vous pouvez simplement diviser la quantité de travail effectuée par le groupe par le nombre de personnes et la somme le travail que chaque travailleur a effectué dans différents groupes. Cependant, cela n'a rien à voir avec les statistiques.
Qnan
1
@DouglasZare Oui, le travail est additif
Greg Guida
1
Je pense que la description est claire. Vous observez uniquement les travailleurs en groupe et souhaitez faire des inférences sur les travailleurs individuels. Par exemple, supposons que vous ayez un total de 5 travailleurs, le premier jour vous observez les travailleurs {1,2,3} ensemble, le deuxième jour vous voyez les travailleurs {1,4,5}, le troisième jour {2,3,4 }, etc. et vos données correspondent à la production totale de chaque jour. Ensuite, pouvez-vous estimer la production moyenne de chaque travailleur individuel? La réponse est oui - si vous pouvez dériver la distribution de la somme des travailleurs, alors vous pouvez écrire la probabilité et maximiser en fonction des moyens individuels.
Macro
1
Qu'est-ce que je rate? Je ne vois toujours pas où vous obtenez les moyens individuels même. Savons-nous toujours quels travailleurs se trouvent à une heure de données particulière? La quantité totale de travail par heure est-elle fixe? Y a-t-il une hypothèse claire dans la définition du problème qui me manque?
Michael R. Chernick

Réponses:

10

David Harris a fourni une excellente réponse , mais comme la question continue d'être modifiée, il serait peut-être utile de voir les détails de sa solution. Les points saillants de l'analyse suivante sont les suivants:

  • Les moindres carrés pondérés sont probablement plus appropriés que les moindres carrés ordinaires.

  • Étant donné que les estimations peuvent refléter des variations de productivité indépendantes de la volonté de tout individu, soyez prudent lorsque vous les utilisez pour évaluer des travailleurs individuels.


Pour ce faire, créons des données réalistes à l' aide de formules spécifiées afin d'évaluer la précision de la solution. Cela se fait avec R:

set.seed(17)
n.names <- 1000
groupSize <- 3.5
n.cases <- 5 * n.names  # Should exceed n.names
cv <- 0.10              # Must be 0 or greater
groupSize <- 3.5        # Must be greater than 0
proficiency <- round(rgamma(n.names, 20, scale=5)); hist(proficiency)

Dans ces étapes initiales, nous:

  • Définissez une valeur de départ pour le générateur de nombres aléatoires afin que n'importe qui puisse reproduire exactement les résultats.

  • Précisez le nombre de travailleurs avec n.names.

  • Déterminez le nombre prévu de travailleurs par groupe avec groupSize.

  • Spécifiez le nombre de cas (observations) disponibles avec n.cases. (Plus tard, certains d'entre eux seront éliminés car ils ne correspondent, comme cela arrive au hasard, à aucun des travailleurs de notre main-d'œuvre synthétique.)

  • cv0.10

  • Créez une main-d'œuvre composée de personnes aux compétences professionnelles variées. Les paramètres donnés ici pour l'informatique proficiencycréent une plage de plus de 4: 1 entre les meilleurs et les pires travailleurs (ce qui, selon mon expérience, peut même être un peu étroit pour les emplois technologiques et professionnels, mais peut-être est large pour les emplois de fabrication de routine).

schedule1

schedule <- matrix(rbinom(n.cases * n.names, 1, groupSize/n.names), nrow=n.cases)
schedule <- schedule[apply(schedule, 1, sum) > 0, ]
work <- round(schedule %*% proficiency * exp(rnorm(dim(schedule)[1], -cv^2/2, cv)))
hist(work)

J'ai trouvé qu'il était pratique de mettre toutes les données du groupe de travail dans une seule trame de données pour l'analyse, mais de garder les valeurs de travail séparées:

data <- data.frame(schedule)

C'est là que nous commencerions avec des données réelles: nous aurions le groupe de travailleurs encodé par data(ou schedule) et les sorties de travail observées dans le worktableau.

Malheureusement, si certains travailleurs sont toujours jumelés, Rla lmprocédure de échoue simplement avec une erreur. Nous devons d'abord vérifier ces appariements. Une façon consiste à trouver des travailleurs parfaitement corrélés dans le calendrier:

correlations <- cor(data)
outer(names(data), names(data), paste)[which(upper.tri(correlations) & 
                                             correlations >= 0.999999)]

La sortie listera des paires de travailleurs toujours appariés: cela peut être utilisé pour combiner ces travailleurs en groupes, car au moins nous pouvons estimer la productivité de chaque groupe, sinon les individus qui le composent. Nous espérons que ça crache character(0). Supposons que ce soit le cas.

Un point subtil, implicite dans l'explication qui précède, est que la variation du travail effectué est multiplicative et non additive. Ceci est réaliste: la variation de la production d'un grand groupe de travailleurs sera, sur une échelle absolue, plus grande que la variation dans des groupes plus petits. Par conséquent, nous obtiendrons de meilleures estimations en utilisant les moindres carrés pondérés plutôt que les moindres carrés ordinaires. Les meilleurs poids à utiliser dans ce modèle particulier sont les inverses des montants de travail. (Dans le cas où certains montants de travail sont nuls, je fausse ceci en ajoutant un petit montant pour éviter de diviser par zéro.)

fit <- lm(work ~ . + 0, data=data, weights=1/(max(work)/10^3+work))
fit.sum <- summary(fit)

Cela ne devrait prendre qu'une ou deux secondes.

Avant de continuer, nous devons effectuer des tests de diagnostic de l'ajustement. Bien que les discuter nous mènerait trop loin ici, une Rcommande pour produire des diagnostics utiles est

plot(fit)

(Cela prendra quelques secondes: c'est un grand ensemble de données!)

Bien que ces quelques lignes de code fassent tout le travail et génèrent des compétences estimées pour chaque travailleur, nous ne voudrions pas parcourir les 1000 lignes de sortie - du moins pas tout de suite. Utilisons graphiques pour afficher les résultats .

fit.coef <- coef(fit.sum)
results <- cbind(fit.coef[, c("Estimate", "Std. Error")], 
             Actual=proficiency, 
             Difference=fit.coef[, "Estimate"] - proficiency,
             Residual=(fit.coef[, "Estimate"] - proficiency)/fit.coef[, "Std. Error"])
hist(results[, "Residual"])
plot(results[, c("Actual", "Estimate")])

220340. C'est exactement le cas ici: l'histogramme est aussi joli qu'on pourrait l'espérer. (Une chose pourrait bien sûr être agréable: ce sont des données simulées, après tout. Mais la symétrie confirme que les poids font leur travail correctement. L'utilisation de mauvais poids aura tendance à créer un histogramme asymétrique.)

Le nuage de points (panneau inférieur droit de la figure) compare directement les compétences estimées aux compétences réelles. Bien sûr, cela ne serait pas disponible dans la réalité, car nous ne connaissons pas les compétences réelles: c'est là que réside la puissance de la simulation informatique. Observer:

  • S'il n'y avait pas eu de variation aléatoire dans le travail (définir cv=0et réexécuter le code pour le voir), le nuage de points serait une ligne diagonale parfaite. Toutes les estimations seraient parfaitement exactes. Ainsi, la dispersion observée ici reflète cette variation.

  • Parfois, une valeur estimée est assez éloignée de la valeur réelle. Par exemple, il y a un point près (110, 160) où la compétence estimée est environ 50% supérieure à la compétence réelle. Cela est presque inévitable dans tout grand lot de données. Gardez cela à l'esprit si les estimations seront utilisées sur une base individuelle , par exemple pour évaluer les travailleurs. Dans l'ensemble, ces estimations peuvent être excellentes, mais dans la mesure où la variation de la productivité du travail est due à des causes indépendantes de la volonté de tout individu, alors pour quelques-uns des travailleurs, les estimations seront erronées: certaines trop élevées, d'autres trop faibles. Et il n'y a aucun moyen de dire précisément qui est touché.

Voici les quatre graphiques générés au cours de ce processus.

Parcelles

Enfin, notez que cette méthode de régression est facilement adaptée pour contrôler d'autres variables qui pourraient vraisemblablement être associées à la productivité du groupe. Il peut s'agir de la taille du groupe, de la durée de chaque effort de travail, d'une variable de temps, d'un facteur pour le responsable de chaque groupe, etc. Il suffit de les inclure comme variables supplémentaires dans la régression.

whuber
la source
Wow, c'est beaucoup à prendre en compte. Je suppose que je ne suis tout simplement pas sûr de savoir comment je peux dire qui sont les travailleurs les plus travailleurs de ces tableaux.
Greg Guida
Les graphiques sont-ils par travailleur?
Greg Guida
Le panneau inférieur droit présente les 1 000 estimations. Le plus haut est d'environ 200: il apparaît tout à fait à droite. L'histogramme de compétence et l'histogramme résiduel illustrent également les résultats pour 1 000 travailleurs. Le panneau supérieur droit, un histogramme du travail, affiche les quantités totales de travail pour près de 5 000 travaux.
whuber
D'accord, j'ai la signification de chacun des graphiques, mais je ne sais pas comment les utiliser pour classer les travailleurs.
Greg Guida
De haut en bas dans le panneau inférieur droit. Le code crée également un tableau de ces résultats (appelé results): vous pouvez le trier par valeur estimée. Vous pouvez l'exporter vers une feuille de calcul, etc.
whuber
7

Vous souhaitez configurer vos données comme ceci, 1 indiquant que la personne faisait partie de l'équipe qui a effectué le travail de cette ligne:

 work.done Alice Bob Carl Dave Eve Fred Greg Harry Isabel
 1.6631071     0   1    1    0   1    0    0     0      0
 0.7951651     1   1    0    0   0    0    0     1      0
 0.2650049     1   1    1    0   0    0    0     0      0
 1.2733771     0   0    0    0   1    0    0     1      1
 0.8086390     1   0    1    0   0    0    0     0      1
 1.7323428     1   0    0    0   0    0    1     0      1
 ...

Ensuite, vous pouvez simplement faire une régression linéaire (en supposant que tout est additif, etc., comme vous l'avez mentionné dans les commentaires). Dans R, la commande serait

lm(work.done ~ . + 0, data = my.data)

La "formule" work.done ~ . + 0indique, en anglais, que la quantité de travail effectuée dépend de toutes les autres colonnes (c'est le ".") Et que les groupes sans travailleurs ne feraient aucun travail (c'est le "+ 0"). Cela vous donnera la contribution approximative de chaque travailleur à la production moyenne du groupe.

Comme discuté dans les commentaires, si vous avez une paire de travailleurs qui sont toujours ensemble, le modèle ne fera pas la distinction entre les contributions des deux travailleurs et l'un d'eux obtiendra un "NA".

David J. Harris
la source
Est-il important qu'il y ait 1000 travailleurs? Que veut-il dire par groupes de 1-100? Même avec les clarifications des 2 contrôles, je ne vois pas où chaque ensemble de données identifie les individus dans le groupe? Tout ce que je sais, c'est que chaque personne travaille environ le même montant chaque jour. Étant donné que plusieurs d'entre vous pensent qu'il existe une solution, éventuellement par régression, quelles sont les hypothèses sous-jacentes et comment le travail d'une personne est-il identifiable? Je suis également perplexe à propos de toutes les discussions sur le travail coopératif. On ne suppose nulle part autre chose que de travailler de façon indépendante.
Michael R. Chernick
La seule contrainte que je vois est que chaque personne parvient en quelque sorte à faire la même quantité de travail sur un grand nombre d'essais? Il semble que nous essayons de traduire cela en quelque chose de sensé. Mais est-il clair que c'est ce que le PO prévoyait ??
Michael R. Chernick
@MichaelChernick Je ne suis pas sûr de comprendre votre inquiétude. Est-ce que le même individu pourrait contribuer des montants différents sur différents essais, ou y a-t-il plus?
David J. Harris
@DavidHarris Je pense que vous avez une bonne solution si vos hypothèses sont bonnes. Mais je m'inquiète de l'identifiabilité pour chaque personne avec autant de travailleurs. L'OP pense que la grande taille de l'échantillon aide. Mais il doit y avoir une structure comme ce que vous avez donné et certaines hypothèses de modélisation. Je ne pense pas qu'il ait spécifié tout ce dont nous avons besoin pour résoudre le problème.
Michael R. Chernick
@MichaelChernick Je pense que si nous supposons que les travailleurs sont indépendants, qu'un modèle linéaire est assez sûr, et la linéarité nous protège également de certains problèmes que nous pourrions rencontrer. whuber a probablement raison sur la pondération, ce qui serait utile. Des effets aléatoires pour les travailleurs et les groupes pourraient aider à garder les estimations des paramètres saines en cas de problèmes d'identification. Il y a probablement plus d'améliorations qui pourraient être apportées, mais je pense toujours que c'est sur la bonne voie, en supposant que les travailleurs sont essentiellement indépendants.
David J. Harris