グループ内の最大の貢献者を決定する


9

統計についてはあまり知りませんので、ご容赦ください。1000人の労働者のセットがあるとします。私は最も困難な労働者が誰であるかを知りたいのですが、1時間に相当する1時間から100人のグループで行われる作業量しか測定できません。各労働者が常にほぼ同じ量の作業を行うと仮定すると、多数の試行と組み合わせで、最も勤勉な人によって私の労働者をランク付けできますか?

注:これは単なる比喩なので、実際にテストを実行することについて心配しないでください。大量のデータセットがすでにあると仮定してください。

編集: 「各労働者が常にほぼ同じ量の仕事をすることを想定している」と私が言うとき、私は各個人が日常的にほぼ同じ量の仕事をすることを意味します。したがって、Joeyは毎日約100単位の作業を行い、Gregは約50の作業を行います。問題は、グループで行われた作業単位の数しか観察できないことです。

その他の編集: 一度に作業する労働者の数と作業頻度について。同時に働く労働者の数はいくらでもあり得ます。一部の労働者はおそらく他の労働者よりもはるかに多く働くことになります。つまり、一部の労働者はほぼ90%の時間勤務し、他の労働者はほとんど勤務しないと想定できます。

私はそれが難しいことを知っていますが、私は非常に大きなデータセットを持っているので、それが少し簡単になることを願っています。

1時間ごとに、どのワーカーが作業しているか、どのくらいの作業が完了したかがわかります。その情報から、誰が最も多くの仕事をしているのかを知りたいのです。

データがJSON形式の場合、次のようになります。

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

3
一部の製品の量など、作業添加物はありますか?次に、線形回帰を使用して各ワーカーからの寄与を推定し、係数でワーカーを並べ替えることができます。それが加算的でない場合は、もっと複雑なものが必要になるでしょう。
Douglas Zare、2012年

各グループが行った作業量を知っていると想定し、さらに各グループの参加者間で均等に作業が配分されていると想定した場合、グループで行われた作業量をグループ内の人数と合計で割ることができます。各ワーカーがさまざまなグループで行った作業のビットをアップします。ただし、これには統計情報はありません。
Qnan 2012年

1
@DouglasZareはい、追加作業です
グレッグ・グイダ

1
説明は明確だと思います。あなたはグループで労働者を観察し、個々の労働者について推論したいだけです。たとえば、合計5人の労働者がいて、1日目に労働者{1,2,3}を一緒に観察し、2日目に労働者{1,4,5}を観察し、3日目に{2,3,4 }など。データは毎日の合計出力です。次に、個々の労働者の平均生産量を推定できますか?答えは「はい」です。労働者の合計の分布を導き出すことができれば、可能性を書き留め、個々の手段の関数として最大化することができます。
マクロ

1
何が欠けていますか?個人的な手段をどこで手に入れるかさえまだわかりません。私たちは常に、特定の時間のデータにどの労働者がいるかを知っていますか?1時間あたりの総作業量はどういうわけか固定されていますか?問題の定義で、私が見落としているという明確な仮定はありますか?
Michael R. Chernick

回答:


10

David Harrisは素晴らしい答えを提供してくれましたが、質問は引き続き編集されているため、おそらく彼の解決策の詳細を確認するのに役立ちます。以下の分析のハイライトは次のとおりです。

  • 加重最小二乗法は、おそらく通常の最小二乗法よりも適切です。

  • 推定値は、個人の制御が及ばない生産性の変動を反映している可能性があるため、それらを使用して個々の労働者を評価することについては注意してください。


これを実行するには、指定された式を使用して現実的なデータ作成して、ソリューションの精度を評価できるようにします。これは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)

これらの最初のステップでは、次のことを行います。

  • 誰でも正確に結果を再現できるように、乱数ジェネレータのシードを設定します。

  • で働くワーカーの数を指定しますn.names

  • でグループあたりの予想労働者数を規定しgroupSizeます。

  • で使用できるケース(観測)の数を指定しn.casesます。(後でこれらはランダムに発生するため、合成労働力の労働者には対応しないため、いくつか削除されます。)

  • cv0.10

  • さまざまな業務能力を持つ人々の労働力を創出します。ここで計算用に与えられたパラメーターproficiencyは、最高の労働者と最悪の労働者の間に4:1を超える範囲を生み出します(私の経験では、これはテクノロジーや専門職の仕事には少し狭いかもしれませんが、日常の製造業にはおそらく広いです)。

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)

分析のためにすべてのワークグループデータを単一のデータフレームに入れるのが便利ですが、作業値を分離しておくと便利です。

data <- data.frame(schedule)

これは、実際のデータから始める場所です。data(またはschedule)によってエンコードされたワーカーグループと、work配列内の観測された作業出力を使用します。

残念ながら、一部のワーカーが常にペアリングされている場合、Rlm手順は単にエラーで失敗します。 最初にそのようなペアリングを確認する必要があります。1つの方法は、スケジュールで完全に相関するワーカーを見つけることです。

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

出力には常にペアになっているワーカーのペアが一覧表示されます。これは、これらのワーカーをグループに結合するために使用できます。少なくとも、グループ内の個人ではないとしても、各グループの生産性を推定できるためです。私たちはそれがちょうど吐き出すことを望みcharacter(0)ます。それがあると仮定しましょう。

前述の説明で暗に示されている微妙な点の1つは、実行される作業の変化は乗法的であり、加法的ではないことです。これは現実的です。大規模な労働者グループの生産量の変動は、絶対的な規模では、小規模なグループの変動よりも大きくなります。したがって、通常の最小二乗ではなく、加重最小二乗法を使用することで、より適切な推定が得られます。この特定のモデルで使用するのに最適な重みは、作業量の逆数です。(一部の作業量がゼロの場合、ゼロで除算しないように少量を追加してこれを回避します。)

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

これには1秒か2秒かかります。

先に進む前に、フィットのいくつかの診断テストを実行する必要があります。それらを議論することはここではあまりにも遠くに連れて行きますが、R有用な診断を生成するための1つのコマンドは

plot(fit)

(これには数秒かかります:これは大きなデータセットです!)

これらの数行のコードがすべての作業を実行し、各ワーカーの推定熟練度を吐き出しますが、少なくともすぐには、1000行すべての出力をスキャンする必要はありません。 グラフィックを使用して結果を表示してみましょう

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。これはまさにここに当てはまります:ヒストグラムは期待できるほどきれいです。(当然のことながら、これらはシミュレートされたデータです。しかし、対称性により、重みが正しく機能していることが確認されます。間違った重みを使用すると、非対称のヒストグラムが作成される傾向があります。)

散布図図の右下のパネル)は、推定された習熟度を実際の習熟度と直接比較します。もちろん、実際の熟練度がわからないため、これは実際には利用できません。ここに、コンピュータシミュレーションの力があります。観察する:

  • 作業にランダムな変化がない場合(cv=0これを確認するためにコードを設定して再実行する)、散布図は完全な対角線になります。すべての見積もりは完全に正確です。したがって、ここで見られるばらつきはその変動を反映しています。

  • 場合によっては、推定値が実際の値からかなり離れていることがあります。たとえば、(110、160)の近くに1つのポイントがあり、推定される習熟度は実際の習熟度よりも約50%高くなっています。これは、データの大規模なバッチではほとんど避けられません。推定値が労働者の評価など、個別に使用される場合は、このことを覚えておいてください。概してこれらの推定値は優れている可能性がありますが、仕事の生産性のばらつきが個人の制御が及ばない原因によるものである場合、一部の労働者にとって推定値は誤っています。高すぎるもの、低すぎるものがあります。また、影響を受けるユーザーを正確に特定する方法はありません。

これは、このプロセス中に生成された4つのプロットです。

プロット

最後に、この回帰方法は、グループの生産性に関連している可能性がある他の変数を制御するために簡単に適応できることに注意してください。これらには、グループサイズ、各作業時間、時間変数、各グループのマネージャーの係数などが含まれます。それらを回帰の追加変数として含めるだけです。


うわー、それは多くのことを取り入れます。しかし、私はこれらのチャートからどのように最も勤勉な労働者が誰であるかを知ることができるかわからないだけだと思います。
グレッググイダ

グラフはワーカーごとですか?
グレッググイダ

右下のパネルには、1,000の見積もりすべてが表示されます。最も高いのは約200です。右端まで表示されます。習熟度ヒストグラムと残差ヒストグラムも、1,000人の労働者の結果を示しています。右上のパネルは作業のヒストグラムで、ほぼ5,000のジョブの合計作業量を表示します。
whuber

わかりました、各グラフの意味はわかりますが、それらを使用してワーカーをランク付けする方法がわかりません。
グレッググイダ

右下のパネルで上から下へ。コードは、これらの結果の表(と呼ばれるresults)も作成します。推定値で並べ替えることができます。スプレッドシートなどにエクスポートできます
whuber

7

データを次のように設定する必要があります。1は、その人物がその行の作業を行ったチームの一員であることを示します。

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

その後、線形回帰を実行できます(コメントで述べたように、すべてが加法的であると仮定した場合など)。ではR、コマンドは

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

「式」work.done ~ . + 0は、英語で、実行される作業量は他のすべての列(つまり「。」)に依存し、ワーカーを持たないグループは作業を行わない(つまり「+ 0」)と述べています。これにより、各ワーカーから平均グループ出力へのおおよその貢献度がわかります。

コメントで説明したように、常に一緒になっているワーカーのペアがある場合、モデルは2つのワーカーの寄与を互いに区別せず、そのうちの1つは「NA」を取得します。


1000人の労働者がいることは重要ですか?1〜100人のグループとはどういう意味ですか。2つの編集の説明があっても、すべてのデータセットがグループ内の個人を識別する場所がわかりませんか?私が知っているのは、一人一人が毎日ほぼ同じ量を働いているということです。あなたの何人かは、おそらく回帰を介した解決策があると明確に考えているので、根本的な仮定は何であり、人の仕事はどのように識別可能ですか?また、共同作業に関するすべての議論に戸惑っています。独立して作業する以外に何も想定されていません。
Michael R. Chernick

私が目にする唯一の制約は、各人が何とかして多数の試行にわたって同じ量の作業を何とかして行うことができるということですか?私たちはそれを理にかなった何かに翻訳しようとしているようです。しかし、これがOPが意図したものであることは明らかですか?
Michael R. Chernick

@MichaelChernick私はあなたの懸念を理解しているとは思いません。同じ個人が異なる試験で異なる金額を寄付する可能性があるのですか、それともそれ以上ですか
David J. Harris

@DavidHarris想定が正しければ、素晴らしい解決策があると思います。しかし、私は非常に多くの労働者を持つ一人一人の識別可能性について心配しています。OPは、大きなサンプルサイズが役立つと考えています。しかし、あなたが与えたような構造といくつかのモデリングの仮定が必要です。彼が問題を解決するために必要なすべてを指定したとは思いません。
Michael R. Chernick

@MichaelChernickワーカーが独立していると想定すれば、線形モデルはかなり安全であり、線形性は、遭遇する可能性のあるいくつかの問題から私たちを保護すると思います。whuberはおそらく重み付けについて正しいでしょう。識別可能性の問題がある場合、労働者とグループにランダムな影響を与えることで、パラメーター推定を正気に保つことができます。おそらくもっと改善できる可能性がありますが、労働者が本質的に独立していると仮定すると、これは正しい方向に進んでいると私は思います。
David J. Harris
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.