10 votos

Determinar el mayor contribuyente en un grupo

No sé mucho acerca de las estadísticas así que tengan paciencia conmigo. Digamos que tengo un conjunto de 1000 trabajadores. Quiero averiguar quién es el más trabajador, pero yo sólo se puede medir la cantidad de trabajo que se lleven a cabo en grupos de 1 a 100 más de una hora de trabajo vale la pena. Suponiendo que cada trabajador hace siempre alrededor de la misma cantidad de trabajo, en un gran número de pruebas y combinaciones puedo clasificar mi los trabajadores por los que trabaja más duro?

nota: esto es sólo una metáfora, así que no te preocupes acerca de ejecutar las pruebas, sólo se supone que me tienen ya un gran conjunto de datos.

Editar: cuando digo "Suponiendo que cada trabajador hace siempre alrededor de la misma cantidad de trabajo", me refiero a que cada individuo hace alrededor de la misma cantidad de trabajo en una base de día a día. Así que joey va a hacer alrededor de 100 unidades de cada día de trabajo y greg se hacen alrededor de 50. El problema es que sólo se puede observar el número de unidades de trabajo realizado por el grupo.

Más ediciones: En lo que respecta al número de trabajadores que trabajan a la vez y la frecuencia de ellos. No puede haber cualquier número de obreros que trabajan al mismo tiempo. Algunos trabajadores probablemente va a terminar trabajando mucho más que otros, es decir, podemos suponer que algunos de los trabajadores va a trabajar casi el 90% del tiempo y otros casi nunca.

Sé que lo hace difícil, pero voy a tener un conjunto de datos muy grande, así que espero que la hace un poco más fácil.

Por cada hora que sabemos que los trabajadores están trabajando y la cantidad de trabajo que se realice. A partir de esa información quiero averiguar quién está haciendo la mayoría del trabajo.

si los datos en formato JSON que se vería algo como esto...

[
  {
    "work_done": 12345,
    "Workers": [ "andy", "bob", "cameron", "david" ]
  },
  {
    "work_done": 432,
    "Workers": [ "steve", "joe", "andy"]
  },
  {
    "work_done": 59042,
    "Workers": [ "bob", "aaron", "michelle", "scott", "henry" ]
  },
  ...
]

11voto

jldugger Puntos 7490

David Harris ha proporcionado una gran respuesta, pero ya que la pregunta sigue siendo editado, tal vez sería de gran ayuda para ver los detalles de su solución. Aspectos más destacados de los siguientes análisis:

  • Mínimos cuadrados ponderados es probablemente más apropiado que el de mínimos cuadrados ordinarios.

  • Debido a que las estimaciones pueden reflejar la variación en la productividad más allá de cualquier control de la persona, ser cautos con el uso de ellos para evaluar cada uno de los trabajadores.


Para llevar esto a cabo, vamos a crear algunos datos realistas, utilizando especificado fórmulas a fin de evaluar la precisión de la solución. Esto se hace con 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)

En estos pasos iniciales, tenemos:

  • Establecer una semilla para el generador de números aleatorios para que cualquiera pueda reproducir exactamente los resultados.

  • Especificar cuántos trabajadores hay con n.names.

  • Estipular el número esperado de trabajadores por grupo con groupSize.

  • Especificar cuántos casos (observaciones) están disponibles con n.cases. (Más tarde, algunos de estos serán eliminados, ya que se corresponden, como ocurre al azar, para ninguno de los trabajadores en el sintético de la fuerza laboral.)

  • Los arreglos para las cantidades de trabajo para diferentes al azar de lo que sería predecir sobre la base de la suma del trabajo de cada grupo "las competencias." El valor de cv es una típica variación porcentual; E. g., el $0.10$ aquí corresponde a un típico 10% de la variación (que podrían ir más allá del 30% en algunos casos).

  • Crear una fuerza de trabajo de las personas con diversos trabajar las competencias. Los parámetros que se dan aquí para computing proficiency crear una gama de más de 4:1 entre el mejor y el peor de los trabajadores (que en mi experiencia, incluso puede ser un poco estrecho para la tecnología y trabajos profesionales, pero tal vez es amplia para la rutina de los trabajos de la fabricación).

Con este sintético de la fuerza laboral en la mano, vamos a simular su trabajo. Esto equivale a la creación de un grupo de cada uno de los trabajadores (schedule) para cada observación (eliminando cualquier tipo de observaciones en el que ninguno de los trabajadores a todos los que estaban involucrados), la suma de las competencias de los trabajadores en cada grupo, y la multiplicación de esa suma por un valor aleatorio (en promedio, exactamente $1$) para reflejar las variaciones que inevitablemente se producen. (Si no hubo variación en todos, nos referiríamos a esta pregunta a las Matemáticas en el sitio, donde los encuestados podrían señalar que este problema es simplemente un conjunto de ecuaciones lineales simultáneas que podría resolverse exactamente para las competencias.)

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)

He encontrado que es conveniente poner todos los datos de grupo de trabajo en un único marco de datos para el análisis, pero para mantener los valores de trabajo independiente:

data <- data.frame(schedule)

Aquí es donde debemos empezar con datos reales: tendríamos el trabajador de la agrupación codificada por data (o schedule) y la observó el trabajo de los productos en el work de la matriz.

Por desgracia, si algunos trabajadores son siempre pares, R's lm procedimiento simplemente se produce un error. Debemos comprobar primero de tales vinculaciones. Es una manera de encontrar perfectamente correlacionadas los trabajadores en el calendario:

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

La salida de la lista de pares de siempre vinculado a los trabajadores: esto puede ser utilizado para combinar estos trabajadores en grupos, porque al menos se puede estimar la productividad de cada grupo, si no la de los individuos dentro de ella. Esperamos que sólo escupe character(0). Vamos a suponer que sí.

Un punto sutil, implícita en la anterior explicación, es que la variación en el trabajo que se realiza es multiplicativo, no aditivo. Este es realista: la variación en el rendimiento de un gran grupo de trabajadores, en una escala absoluta, ser mayor que la variación en grupos más pequeños. En consecuencia, vamos a obtener mejores estimaciones mediante mínimos cuadrados ponderados en lugar de mínimos cuadrados ordinarios. El mejor de los pesos a utilizar en este modelo en particular son los recíprocos de las cantidades de trabajo. (En el caso de algunos trabajos cantidades son cero, me fudge esto mediante la adición de una pequeña cantidad para evitar la división por cero).

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

Esto debería tomar sólo uno o dos segundos.

Antes de continuar debemos realizar algunas pruebas de diagnóstico de la fit. Aunque hablar de los nos llevaría demasiado lejos de aquí, R comando para producir útil de diagnóstico es

plot(fit)

(Esto tomará un par de segundos: se trata de un gran conjunto de datos!)

Aunque estas pocas líneas de código a hacer todo el trabajo, y escupir estimado de competencias para cada trabajador, no queremos escanear a través de todos los 1000 líneas de salida-al menos no de inmediato. Vamos a utilizar los gráficos para mostrar los 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")])

El histograma (parte inferior izquierda del panel de la figura de abajo) es de las diferencias entre el estimado y real de competencias, expresado como múltiplo del error estándar de la estimación. Para un buen procedimiento, estos valores casi siempre se encuentran entre las $-2$ $2$ y se distribuyen simétricamente alrededor de $0$. Con 1000 trabajadores involucrados, sin embargo, esperamos ver algunas de estas diferencias estandarizadas para estirar $3$, e incluso el $4$$0$. Este es exactamente el caso aquí: el histograma es tan bonita como uno podría esperar. (Uno podría cosa, por supuesto, es agradable: estos son los datos simulados, después de todo. Pero la simetría confirma los pesos están haciendo su trabajo correctamente. La utilización incorrecta de los pesos tienden a crear una relación asimétrica de histograma.)

El diagrama de dispersión (parte inferior del panel derecho de la figura) compara directamente estimado de los niveles actuales. Por supuesto, esto no estaría disponible en la realidad, porque no sabemos las reales competencias: aquí yace el poder de la simulación por ordenador. Observar:

  • Si no hubiera habido una variación aleatoria en el trabajo (set cv=0 y vuelva a ejecutar el código para ver esto), el diagrama de dispersión sería una perfecta línea diagonal. Todas las estimaciones, sería perfectamente exacta. Por lo tanto, la dispersión visto aquí refleja que la variación.

  • Ocasionalmente, se estima que el valor está muy lejos del valor real. Por ejemplo, hay un punto cercano (110, 160), donde la estimación de la competencia es un 50% mayor que la real competencia. Esto es casi inevitable en cualquier grupo grande de datos. Tener esto en mente si las estimaciones se pueden utilizar en un individuo , como para la evaluación de los trabajadores. En el conjunto de estos cálculos puede ser excelente, pero en la medida en que la variación en la productividad del trabajo debido a causas más allá de cualquier control de la persona, entonces para algunos de los trabajadores de las estimaciones será errónea: algunos demasiado alto, demasiado bajo. Y no hay manera de saber con precisión quiénes son los afectados.

Aquí están los cuatro gráficos generados durante este proceso.

Plots

Por último, tenga en cuenta que este método de regresión se adapta fácilmente a controlar otras variables que plausiblemente podría estar asociado con la productividad del grupo. Estos podrían incluir el tamaño del grupo, la duración de cada trabajo, de esfuerzo, un tiempo variable, un factor para el administrador de cada grupo, y así sucesivamente. Basta con incluir nuevas variables en la regresión.

7voto

Bou Puntos 1859

Te gustaría configurar sus datos de algo como esto, con el 1 indicando que la persona que fue parte del equipo que hizo la fila del trabajo:

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

Entonces, usted puede hacer la regresión lineal (suponiendo que todo lo que es aditivo, etc., como usted ha mencionado en los comentarios). En R, el comando sería

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

La "fórmula" work.done ~ . + 0 dice, en inglés, que la cantidad de trabajo realizado depende de todas las demás columnas (que es el ".") y que los grupos que sin los trabajadores no haría el trabajo (que es el "+ 0"). Esto le dará aproximado de la contribución de cada trabajador a la media del grupo de salida.

Como se discute en los comentarios, si usted tiene un par de trabajadores que están siempre juntos, el modelo no se distinguir las contribuciones de los dos trabajadores de uno y otro, y uno de ellos recibirá un "NA".

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X