Determinando o maior colaborador de um grupo

9

Eu não sei muito sobre estatísticas, então tenha paciência comigo. Digamos que eu tenho um conjunto de 1000 trabalhadores. Quero descobrir quem é o trabalhador mais esforçado, mas só posso medir a quantidade de trabalho realizado em grupos de 1 a 100 em mais de uma hora de trabalho. Supondo que cada trabalhador sempre faça a mesma quantidade de trabalho, durante um grande número de tentativas e combinações posso classificar meus trabalhadores por quem trabalha mais?

Nota: isso é apenas uma metáfora; portanto, não se preocupe em executar os testes, basta assumir que eu já tenho um grande conjunto de dados.

Edit: Quando digo "Supondo que cada trabalhador sempre faça a mesma quantidade de trabalho", quero dizer que cada indivíduo faz a mesma quantidade de trabalho no dia a dia. Então, Joey fará cerca de 100 unidades de trabalho por dia e Greg fará cerca de 50. O problema é que só posso observar o número de unidades de trabalho realizadas pelo grupo.

Mais edições: em relação ao número de trabalhadores que trabalham ao mesmo tempo e a frequência deles trabalhando. Pode haver qualquer número de trabalhadores trabalhando ao mesmo tempo. Alguns trabalhadores provavelmente acabarão trabalhando muito mais do que outros, ou seja, podemos supor que alguns trabalhadores estejam trabalhando quase 90% das vezes e outros quase nunca.

Eu sei que isso dificulta, mas terei um conjunto de dados muito grande, espero que o torne um pouco mais fácil.

A cada hora, sabemos quais trabalhadores estão trabalhando e quanto trabalho foi feito. A partir dessas informações, quero descobrir quem está fazendo mais trabalho.

Se os dados estivessem no formato JSON, ficaria assim:

[
  {
    "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
fonte
3
O trabalho é aditivo, como a quantidade de algum produto? Em seguida, você pode usar a regressão linear para estimar a contribuição de cada trabalhador e classificar os trabalhadores por seus coeficientes. Se não for aditivo, você pode querer algo mais complicado.
Douglas Zare
Se você supõe que sabe quanto trabalho cada grupo realizou e também supõe que o trabalho é distribuído igualmente entre os participantes de cada grupo, basta dividir a quantidade de trabalho realizado pelo grupo pelo número de pessoas e a soma os trechos de trabalho que cada trabalhador realizou em diferentes grupos. Isso realmente não tem nada com estatísticas, no entanto.
QNAN
11
@DouglasZare Sim, o trabalho é aditivo
Greg Guida
11
Eu acho que a descrição é clara. Você apenas observa os trabalhadores em grupos e deseja fazer inferência sobre os trabalhadores individuais. Por exemplo, digamos que você tenha um total de 5 trabalhadores, no primeiro dia observa trabalhadores {1,2,3} juntos, no segundo dia vê trabalhadores {1,4,5}, no terceiro dia {2,3,4 }, etc., e seus dados são a produção total em cada dia. Então, você pode estimar a produção média de cada trabalhador individual? A resposta é sim - se você puder derivar a distribuição da soma dos trabalhadores, poderá anotar a probabilidade e maximizar em função dos meios individuais.
Macro
11
o que estou perdendo? Ainda não vejo até onde você consegue os meios individuais. Sempre sabemos quais trabalhadores estão em uma hora específica de dados? A quantidade total de trabalho por hora é de alguma forma fixa? Existe uma suposição clara na definição do problema que estou faltando?
Michael R. Chernick

Respostas:

10

David Harris forneceu uma ótima resposta , mas, como a pergunta continua sendo editada, talvez ajude a ver os detalhes de sua solução. Os destaques da análise a seguir são:

  • Os mínimos quadrados ponderados são provavelmente mais apropriados que os mínimos quadrados comuns.

  • Como as estimativas podem refletir variações na produtividade além do controle de qualquer indivíduo, tenha cuidado ao usá-las para avaliar trabalhadores individuais.


Para fazer isso, vamos criar alguns dados realistas usando fórmulas especificadas para avaliar a precisão da solução. Isso é feito com 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)

Nestas etapas iniciais, nós:

  • Defina uma semente para o gerador de números aleatórios para que qualquer pessoa possa reproduzir exatamente os resultados.

  • Especifique quantos trabalhadores existem n.names.

  • Estipule o número esperado de trabalhadores por grupo com groupSize.

  • Especifique com quantos casos (observações) estão disponíveis n.cases. (Mais tarde, alguns deles serão eliminados porque correspondem, como acontece aleatoriamente, a nenhum dos trabalhadores de nossa força de trabalho sintética.)

  • Organize para que as quantidades de trabalho diferam aleatoriamente do que seria previsto com base na soma das "proficiências" do trabalho de cada grupo. O valor de cvé uma variação proporcional típica; Por exemplo , o dado aqui corresponde a uma variação típica de 10% (que pode variar além de 30% em alguns casos).0.10

  • Crie uma força de trabalho de pessoas com diferentes habilidades de trabalho. Os parâmetros dados aqui para a computação proficiencycriam uma faixa de mais de 4: 1 entre os melhores e os piores trabalhadores (que, na minha experiência, podem até ser um pouco estreitos para trabalhos de tecnologia e profissionais, mas talvez sejam amplos para trabalhos rotineiros de fabricação).

Com essa força de trabalho sintética em mãos, vamos simular o trabalho deles . Isso equivale a criar um grupo de cada trabalhador ( schedule) para cada observação (eliminando as observações em que nenhum trabalhador estava envolvido), somando as proficiências dos trabalhadores em cada grupo e multiplicando essa soma por um valor aleatório (média de exatamente ) para refletir as variações que inevitavelmente ocorrerão. (Se não houvesse variação alguma, encaminharíamos essa questão para o site de Matemática, onde os entrevistados poderiam apontar que esse problema é apenas um conjunto de equações lineares simultâneas que poderiam ser resolvidas exatamente pelas proficiências.)1

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)

Eu achei conveniente colocar todos os dados do grupo de trabalho em um único quadro de dados para análise, mas manter os valores do trabalho separados:

data <- data.frame(schedule)

É aqui que começaríamos com dados reais: teríamos o agrupamento de trabalhadores codificado por data(ou schedule) e as saídas de trabalho observadas na workmatriz.

Infelizmente, se alguns trabalhadores estão sempre emparelhados, Ro lmprocedimento simplesmente falha com um erro. Devemos verificar primeiro esses pares. Uma maneira é encontrar trabalhadores perfeitamente correlacionados no cronograma:

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

A saída listará pares de trabalhadores sempre emparelhados: isso pode ser usado para combinar esses trabalhadores em grupos, porque pelo menos podemos estimar a produtividade de cada grupo, se não os indivíduos dentro dele. Esperamos que isso cuspa character(0). Vamos presumir que sim.

Um ponto sutil, implícito na explicação anterior, é que a variação no trabalho realizado é multiplicativa, não aditiva. Isso é realista: a variação na produção de um grande grupo de trabalhadores será, em escala absoluta, maior que a variação em grupos menores. Conseqüentemente, obteremos melhores estimativas usando os mínimos quadrados ponderados em vez dos mínimos quadrados comuns. Os melhores pesos a serem usados nesse modelo específico são os recíprocos dos valores do trabalho. (No caso de algumas quantidades de trabalho serem nulas, eu o refugo adicionando uma pequena quantidade para evitar dividir por zero.)

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

Isso deve levar apenas um ou dois segundos.

Antes de prosseguir, devemos realizar alguns testes de diagnóstico do ajuste. Embora discutir isso nos levaria muito longe aqui, um Rcomando para produzir diagnósticos úteis é

plot(fit)

(Isso levará alguns segundos: é um grande conjunto de dados!)

Embora essas poucas linhas de código façam todo o trabalho e cuspam as proficiências estimadas para cada trabalhador, não queremos examinar todas as 1000 linhas de saída - pelo menos não imediatamente. Vamos usar gráficos para exibir os resultados .

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 0. Este é exatamente o caso aqui: o histograma é o mais bonito que se poderia esperar. (É claro que é bom: são dados simulados, afinal. Mas a simetria confirma que os pesos estão fazendo seu trabalho corretamente. O uso de pesos errados tenderá a criar um histograma assimétrico.)

O gráfico de dispersão (painel inferior direito da figura) compara diretamente as proficiências estimadas às reais. É claro que isso não estaria disponível na realidade, porque não sabemos as proficiências reais: aqui reside o poder da simulação por computador. Observar:

  • Se não houvesse variação aleatória no trabalho (configure cv=0e execute novamente o código para ver isso), o gráfico de dispersão seria uma linha diagonal perfeita. Todas as estimativas seriam perfeitamente precisas. Assim, a dispersão vista aqui reflete essa variação.

  • Ocasionalmente, um valor estimado está bem longe do valor real. Por exemplo, há um ponto próximo (110, 160) em que a proficiência estimada é cerca de 50% maior que a proficiência real. Isso é quase inevitável em qualquer grande lote de dados. Tenha isso em mente se as estimativas serão usadas individualmente , como na avaliação de trabalhadores. No geral, essas estimativas podem ser excelentes, mas, na medida em que a variação na produtividade do trabalho se deve a causas além do controle de qualquer indivíduo, para alguns trabalhadores as estimativas serão errôneas: algumas muito altas, outras muito baixas. E não há como dizer com precisão quem é afetado.

Aqui estão os quatro gráficos gerados durante esse processo.

Parcelas

Por fim, observe que esse método de regressão é facilmente adaptado ao controle de outras variáveis ​​que podem estar associadas à produtividade do grupo. Isso pode incluir o tamanho do grupo, a duração de cada esforço de trabalho, uma variável de tempo, um fator para o gerente de cada grupo e assim por diante. Apenas inclua-os como variáveis ​​adicionais na regressão.

whuber
fonte
Uau, isso é muito difícil de entender. Acho que não tenho certeza de como posso dizer quem são os trabalhadores mais trabalhadores nessas tabelas.
Greg Guida
Os gráficos são por trabalhador?
Greg Guida
O painel inferior direito apresenta todas as 1.000 estimativas. O mais alto é de cerca de 200: aparece todo o caminho para a direita. O histograma de proficiência e o histograma residual também representam resultados para 1.000 trabalhadores. O painel superior direito, um histograma de trabalho, exibe a quantidade total de trabalho para quase 5.000 tarefas.
whuber
Ok, entendo o significado de cada um dos gráficos, mas não sei como usá-los para classificar os trabalhadores.
Greg Guida
De cima para baixo no painel inferior direito. O código também cria uma tabela com esses resultados (chamados results): você pode classificá-lo pelo valor estimado. Você pode exportá-lo para uma planilha etc.
whuber
7

Você deseja configurar seus dados da seguinte maneira: 1 indica que a pessoa fazia parte da equipe que fez o trabalho dessa linha:

 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
 ...

Então, você pode simplesmente fazer regressão linear (assumindo que tudo é aditivo, etc., como você mencionou nos comentários). Em R, o comando seria

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

A "fórmula" work.done ~ . + 0diz, em inglês, que a quantidade de trabalho realizado depende de todas as outras colunas (que é ".") E que grupos sem trabalhadores não funcionariam (esse é o "+ 0"). Isso fornecerá a contribuição aproximada de cada trabalhador para a produção média do grupo.

Como discutido nos comentários, se você tem um par de trabalhadores que estão sempre juntos, o modelo não diferencia as contribuições dos dois trabalhadores e um deles recebe um "NA".

David J. Harris
fonte
Importa que haja 1000 trabalhadores? O que ele quer dizer com grupos de 1 a 100? Mesmo com os esclarecimentos das 2 edições, não vejo onde cada conjunto de dados identifica os indivíduos do grupo? Tudo o que sei é que cada pessoa trabalha aproximadamente a mesma quantidade todos os dias. Como muitos de vocês pensam que existe uma solução possivelmente via regressão explicitamente, quais são as suposições subjacentes e como o trabalho de uma pessoa é identificável? Também estou intrigado com toda a discussão do trabalho cooperativo. Em nenhum lugar é assumido nada além de trabalhar independentemente.
Michael R. Chernick
A única restrição que vejo é que cada pessoa de alguma forma consegue fazer a mesma quantidade de trabalho em um grande número de tentativas? Parece que estamos tentando traduzir isso em algo sensato. Mas está claro que é isso que o OP pretendia?
Michael R. Chernick
@MichaelChernick Não sei se entendi sua preocupação. Será que o mesmo indivíduo poderia contribuir com quantias diferentes em ensaios diferentes ou há mais?
David J. Harris
@DavidHarris Acho que você tem uma boa solução se suas suposições estiverem corretas. Mas estou preocupado com a identificabilidade de cada pessoa com tantos trabalhadores. O OP acha que o grande tamanho da amostra ajuda. Mas precisa haver uma estrutura como a que você deu e algumas suposições de modelagem. Só acho que ele não especificou tudo o que precisamos para resolver o problema.
Michael R. Chernick
@MichaelChernick Acho que se assumirmos que os trabalhadores são independentes, que um modelo linear é bastante seguro, e a linearidade também nos protege de alguns problemas nos quais podemos encontrar. whuber provavelmente está certo sobre a ponderação, o que ajudaria. Efeitos aleatórios para trabalhadores e grupos podem ajudar a manter as estimativas de parâmetros sãs se houver problemas de identificação. Provavelmente existem mais melhorias que poderiam ser feitas, mas ainda acho que isso está no caminho certo, supondo que os trabalhadores sejam essencialmente independentes.
David J. Harris