Określenie największego współpracownika w grupie

9

Nie znam się na statystykach, więc trzymaj się mnie. Powiedzmy, że mam zestaw 1000 pracowników. Chcę dowiedzieć się, kto jest najcięższym pracownikiem, ale mogę tylko zmierzyć ilość pracy wykonywanej w grupach 1-100 w ciągu godziny pracy. Zakładając, że każdy pracownik zawsze wykonuje taką samą ilość pracy, czy w ramach dużej liczby prób i kombinacji mogę uszeregować moich pracowników według tego, kto najciężej pracuje?

Uwaga: to tylko metafora, więc nie martw się faktycznym uruchomieniem testów, po prostu załóż, że mam już duży zestaw danych.

Edycja: Kiedy mówię „Zakładając, że każdy pracownik zawsze wykonuje tę samą pracę”, mam na myśli, że każda osoba wykonuje tę samą pracę każdego dnia. Joey wykona więc około 100 jednostek pracy każdego dnia, a Greg wykona około 50 jednostek. Problem polega na tym, że mogę obserwować tylko liczbę jednostek pracy wykonanych przez grupę.

Więcej zmian: w odniesieniu do liczby pracowników pracujących jednocześnie i częstotliwości ich pracy. Jednocześnie może pracować dowolna liczba pracowników. Niektórzy pracownicy prawdopodobnie ostatecznie będą pracować dużo więcej niż inni, to znaczy możemy założyć, że niektórzy pracownicy będą pracować prawie 90% czasu, a inni prawie nigdy.

Wiem, że to utrudnia, ale będę miał bardzo duży zestaw danych, więc mam nadzieję, że to trochę ułatwi.

Co godzinę wiemy, którzy pracownicy pracują i ile pracy wykonano. Na podstawie tych informacji chcę dowiedzieć się, kto wykonuje najwięcej pracy.

Gdyby dane były w formacie JSON, wyglądałoby to mniej więcej tak:

[
  {
    "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
źródło
3
Czy dodatek do pracy, na przykład ilość jakiegoś produktu? Następnie można użyć regresji liniowej do oszacowania wkładu każdego pracownika i posortować pracowników według ich współczynników. Jeśli nie jest addytywny, możesz chcieć czegoś bardziej skomplikowanego.
Douglas Zare
Jeśli założysz, że wiesz, ile pracy wykonała każda grupa, a także założysz, że praca jest równomiernie rozłożona między uczestników w każdej grupie, możesz po prostu podzielić ilość pracy wykonanej przez grupę przez liczbę osób i sumę w górę kawałków pracy, które każdy pracownik wykonał w różnych grupach. Jednak tak naprawdę nie ma to nic wspólnego ze statystykami.
Qnan
1
@DouglasZare Tak, praca jest addytywna
Greg Guida
1
Myślę, że opis jest jasny. Obserwujesz pracowników tylko w grupach i chcesz wnioskować o poszczególnych pracownikach. Załóżmy na przykład, że masz łącznie 5 pracowników, pierwszego dnia obserwujesz pracowników {1,2,3} razem, drugiego dnia widzisz pracowników {1,4,5}, trzeciego dnia {2,3,4 } itp., a dane stanowią całkowitą wydajność każdego dnia. Czy możesz zatem oszacować średnią wydajność każdego pracownika? Odpowiedź brzmi tak - jeśli możesz wyprowadzić rozkład sumy pracowników, możesz zapisać prawdopodobieństwo i zmaksymalizować jako funkcję poszczególnych środków.
Makro
1
czego mi brakuje? Nadal nie wiem, skąd bierzesz indywidualne środki. Czy zawsze wiemy, którzy pracownicy są w określonej godzinie danych? Czy łączna ilość pracy na godzinę jest jakoś ustalona? Czy istnieje założenie, które jest jasne w definicji problemu, którego mi brakuje?
Michael R. Chernick

Odpowiedzi:

10

David Harris udzielił świetnej odpowiedzi , ale ponieważ pytanie wciąż jest edytowane, być może pomogłoby to zobaczyć szczegóły jego rozwiązania. Najważniejsze cechy poniższej analizy to:

  • Ważone najmniejsze kwadraty są prawdopodobnie bardziej odpowiednie niż zwykłe najmniejsze kwadraty.

  • Ponieważ szacunki mogą odzwierciedlać różnice produktywności poza kontrolą jakiejkolwiek osoby, należy zachować ostrożność, używając ich do oceny poszczególnych pracowników.


Aby to zrobić, utwórzmy realistyczne dane przy użyciu określonych formuł, abyśmy mogli ocenić dokładność rozwiązania. Odbywa się to za pomocą 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)

W tych początkowych krokach:

  • Ustaw ziarno dla generatora liczb losowych, aby każdy mógł dokładnie odtworzyć wyniki.

  • Określ, ilu jest pracowników n.names.

  • Podaj oczekiwaną liczbę pracowników w grupie z groupSize.

  • Określ, ile przypadków (obserwacji) jest dostępnych n.cases. (Później kilka z nich zostanie wyeliminowanych, ponieważ odpowiadają przypadkowo żadnemu z pracowników naszej syntetycznej siły roboczej).

  • Ustal, aby ilość pracy różniła się losowo od przewidywanej na podstawie sumy „umiejętności” każdej grupy. Wartość cvjest typową odmianą proporcjonalną; Na przykład podana tutaj wartość odpowiada typowej 10% zmienności (która w niektórych przypadkach może przekraczać 30%).0.10

  • Stwórz siłę roboczą osób o różnych umiejętnościach pracy. Podane tutaj parametry obliczeniowe proficiencytworzą zakres ponad 4: 1 między najlepszymi i najgorszymi pracownikami (co z mojego doświadczenia może być nawet nieco wąskie dla prac technologicznych i zawodowych, ale być może jest szerokie dla rutynowych zadań produkcyjnych).

Mając tę ​​syntetyczną siłę roboczą pod ręką, symulujmy ich pracę . Sprowadza się to do utworzenia grupy każdego pracownika ( schedule) dla każdej obserwacji (eliminując wszelkie obserwacje, w których w ogóle nie uczestniczyli pracownicy), sumując umiejętności pracowników w każdej grupie i mnożąc tę ​​sumę przez wartość losową (średnio dokładnie ) w celu odzwierciedlenia zmian, które nieuchronnie wystąpią. (Gdyby w ogóle nie było żadnych zmian, odesłalibyśmy to pytanie na stronę Matematyki, gdzie respondenci mogliby wskazać, że ten problem to tylko zestaw równań liniowych, które można rozwiązać dokładnie dla biegłości.)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)

Odkryłem, że wygodnie jest umieścić wszystkie dane grupy roboczej w jednej ramce danych do analizy, ale zachować wartości pracy osobno:

data <- data.frame(schedule)

W tym miejscu zaczęlibyśmy od rzeczywistych danych: grupowanie pracowników byłoby zakodowane przez data(lub schedule), a obserwowane wyniki pracy w worktablicy.

Niestety, jeśli niektórzy pracownicy są zawsze w parze, Rjest lmprocedura po prostu nie powiedzie się z powodu błędu. Najpierw powinniśmy sprawdzić takie pary. Jednym ze sposobów jest znalezienie doskonale skorelowanych pracowników w harmonogramie:

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

W wyniku wyszczególnione zostaną pary zawsze sparowanych pracowników: można tego użyć do połączenia tych pracowników w grupy, ponieważ przynajmniej możemy oszacować produktywność każdej grupy, jeśli nie poszczególnych osób w jej obrębie. Mamy nadzieję, że po prostu wypluje character(0). Załóżmy, że tak.

Jednym subtelnym punktem, wynikającym z powyższego wyjaśnienia, jest to, że zmienność wykonywanej pracy jest multiplikatywna, a nie addytywna. Jest to realistyczne: zróżnicowanie wydajności dużej grupy pracowników, w skali bezwzględnej, będzie większe niż zróżnicowanie w mniejszych grupach. W związku z tym uzyskamy lepsze oszacowania, stosując ważone najmniejsze kwadraty zamiast zwykłych najmniejszych kwadratów. Najlepszymi wagami do zastosowania w tym konkretnym modelu są odwrotności kwot pracy. (W przypadku, gdy niektóre kwoty pracy wynoszą zero, fałszuję to, dodając niewielką ilość, aby uniknąć dzielenia przez zero).

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

Powinno to zająć tylko jedną lub dwie sekundy.

Przed kontynuowaniem powinniśmy wykonać testy diagnostyczne dopasowania. Chociaż omawianie ich zabrałoby nas tutaj zbyt daleko, jedno Rpolecenie do stworzenia użytecznej diagnostyki to

plot(fit)

(Zajmie to kilka sekund: to duży zestaw danych!)

Chociaż te kilka wierszy kodu wykonuje całą pracę i wyrzuca szacunkowe biegłości dla każdego pracownika, nie chcielibyśmy skanować wszystkich 1000 wierszy wyników - przynajmniej nie od razu. Użyjmy grafiki do wyświetlenia wyników .

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")])

Histogram (lewy dolny panel na poniższym rysunku) przedstawia różnice między szacunkową a rzeczywistą biegłością, wyrażone jako wielokrotność standardowego błędu oszacowania. Dla dobrej procedury wartości te prawie zawsze będą zawierać się między a i będą symetrycznie rozmieszczone wokół . Jednak przy zaangażowaniu 1000 pracowników w pełni spodziewamy się, że kilka z tych standardowych różnic rozciąga się na a nawet na220340. Dokładnie tak jest w tym przypadku: histogram jest tak ładny, jak można by oczekiwać. (Można oczywiście powiedzieć, że to miłe: w końcu są to dane symulowane. Ale symetria potwierdza, że ​​odważniki wykonują swoją pracę poprawnie. Użycie niewłaściwych odważników spowoduje tendencję do tworzenia asymetrycznego histogramu.)

Wykres rozrzutu (prawy dolny panel rysunku) bezpośrednio porównuje szacunkowe sprawności z rzeczywistymi. Oczywiście nie byłoby to możliwe w rzeczywistości, ponieważ nie znamy faktycznych biegłości: w tym tkwi siła symulacji komputerowej. Przestrzegać:

  • Gdyby nie było przypadkowych zmian w pracy (ustaw cv=0i ponownie uruchom kod, aby to zobaczyć), wykres rozproszenia byłby idealną ukośną linią. Wszystkie szacunki byłyby całkowicie dokładne. Widoczny tutaj rozproszenie odzwierciedla zatem tę zmianę.

  • Czasami oszacowana wartość jest dość daleka od wartości rzeczywistej. Na przykład, istnieje jeden punkt w pobliżu (110, 160), w którym szacowana biegłość jest o około 50% większa niż faktyczna biegłość. Jest to prawie nieuniknione w przypadku dużej partii danych. Pamiętaj o tym, jeśli szacunki będą wykorzystywane indywidualnie , na przykład do oceny pracowników. Ogólnie rzecz biorąc, te szacunki mogą być doskonałe, ale w zakresie, w jakim zróżnicowanie wydajności pracy jest spowodowane przyczynami niezależnymi od jakiejkolwiek osoby, wówczas dla niektórych pracowników oszacowania będą błędne: niektórzy za wysoko, inni za nisko. I nie ma sposobu, aby dokładnie powiedzieć, kogo to dotyczy.

Oto cztery wykresy wygenerowane podczas tego procesu.

Działki

Na koniec zauważ, że ta metoda regresji jest łatwo przystosowana do kontrolowania innych zmiennych, które prawdopodobnie mogą być związane z produktywnością grupy. Mogą one obejmować wielkość grupy, czas trwania każdego wysiłku, zmienną czasową, czynnik dla kierownika każdej grupy i tak dalej. Wystarczy uwzględnić je jako dodatkowe zmienne w regresji.

Whuber
źródło
Wow, to dużo do zaakceptowania. Wydaje mi się, że po prostu nie jestem pewien, jak z tych wykresów stwierdzić, kto jest najciężej pracującym pracownikiem.
Greg Guida
Czy wykresy dotyczą poszczególnych pracowników?
Greg Guida
Dolny prawy panel przedstawia wszystkie 1000 szacunków. Najwyższy ma około 200: pojawia się aż do prawej strony. Histogram biegłości i histogram resztkowy przedstawiają również wyniki dla 1000 pracowników. Prawy górny panel, histogram pracy, pokazuje całkowitą ilość pracy dla prawie 5000 zadań.
whuber
Ok, rozumiem znaczenie każdej z tabel, ale nie jestem pewien, jak ich użyć, aby uszeregować pracowników.
Greg Guida
Od góry do dołu w prawym dolnym panelu. Kod tworzy również tabelę tych wyników (nazywaną results): możesz sortować według wartości szacunkowej. Możesz go wyeksportować do arkusza kalkulacyjnego itp.
whuber
7

Chcesz skonfigurować swoje dane w taki sposób, przy czym 1 oznacza, że ​​dana osoba była częścią zespołu, który wykonał pracę w tym wierszu:

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

Następnie możesz po prostu wykonać regresję liniową (zakładając, że wszystko jest addytywne itp., Jak wspomniano w komentarzach). W R, polecenie byłoby

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

„Formuła” work.done ~ . + 0mówi po angielsku, że ilość wykonanej pracy zależy od wszystkich pozostałych kolumn (to jest „.”) I że grupy bez pracowników nie wykonałyby żadnej pracy (to jest „+ 0”). To da ci przybliżony wkład każdego pracownika w średnią produkcję grupową.

Jak omówiono w komentarzach, jeśli masz parę pracowników, którzy są zawsze razem, model nie będzie rozróżniał wkładów dwóch pracowników od siebie, a jeden z nich otrzyma „NA”.

David J. Harris
źródło
Czy to ważne, że jest 1000 pracowników? Co rozumie przez grupy 1-100? Nawet po wyjaśnieniach z 2 edycji nie widzę, gdzie każdy zestaw danych identyfikuje osoby w grupie? Wiem tylko, że każda osoba każdego dnia pracuje w przybliżeniu w tej samej ilości. Ponieważ wielu z was sądzi, że istnieje rozwiązanie, które może być możliwe poprzez regresję, jakie są podstawowe założenia i jak można zidentyfikować pracę danej osoby? Zastanawiam się także nad wszystkimi dyskusjami na temat współpracy. Nigdzie nie zakłada się niczego poza niezależną pracą.
Michael R. Chernick
Jedynym ograniczeniem, jakie widzę, jest to, że każdej osobie udaje się wykonać taką samą ilość pracy w dużej liczbie prób? Wygląda na to, że staramy się przetłumaczyć to nie coś sensownego. Ale czy jest jasne, że właśnie to zamierzał PO?
Michael R. Chernick
@MichaelChernick Nie jestem pewien, czy rozumiem twoje obawy. Czy to samo, że ta sama osoba może wnieść różne kwoty do różnych badań, czy może jest coś więcej?
David J. Harris,
@DavidHarris Myślę, że masz dobre rozwiązanie, jeśli twoje założenia są słuszne. Ale martwię się o identyfikowalność każdej osoby o tak dużej liczbie pracowników. OP uważa, że ​​duża próbka pomaga. Ale musi istnieć struktura podobna do tego, co dałeś i pewne założenia dotyczące modelowania. Po prostu nie sądzę, że określił wszystko, czego potrzebujemy, aby rozwiązać problem.
Michael R. Chernick,
@MichaelChernick Myślę, że jeśli zakładamy, że pracownicy są niezależni, to model liniowy jest całkiem bezpieczny, a liniowość chroni nas również przed niektórymi problemami, które mogą wystąpić. whuber prawdopodobnie ma rację co do ważenia, co by pomogło. Losowe efekty dla pracowników i grup mogłyby pomóc zachować rozsądny szacunek parametrów, jeśli występują problemy z identyfikowalnością. Prawdopodobnie można wprowadzić więcej ulepszeń, ale nadal uważam, że jest to właściwy kierunek, zakładając, że pracownicy są zasadniczo niezależni.
David J. Harris,