2009-04-24

企業の体質シミュレーションをやってみた

百式さんが、「企業の体質をシミュレーションするモデル」というエントリーを書いてらっしゃる。面白そうなので、少しモデルをいじってプログラムを組んでみた。

オリジナル・モデル

百式さんが紹介なさってるモデルはこんな感じ。

  • まず前提として企業はある一定の「出来る人」と「出来ない人」で構成されるとする(乱暴ですが、まぁ、仮定として)。
  • ある企業が毎年30人採用したとする。
  • その30人のうち、15%は出来る人で、85%は出来ない人だと仮定する。
  • 1年経るごとに、出来ない人のうち95%はずっと出来ないままで、一方出来る人のうち10%が出来ない人になっちゃうと仮定する。
  • 入社5年後にその人たちの20%が採用担当になる。
  • 出来ない人は70%の確率で出来ない人を採用する。出来る人は5%の確率で出来ない人を採用すると仮定する。
  • 3年ごとに出来ない人は15%の割合で退職し、出来る人は50%の割合で退職するとします。
  • さてn年後のこの企業、「出来る人」と「出来ない人」の割合はどうなるでしょうか?

企業の体質をシミュレーションするモデルが衝撃的だったお話 - IDEA*IDEA ~ 百式管理人のライフハックブログ ~ より引用

少し修正

このまんまだと、プログラミングとかが面倒なので少しモデルを変えてみた。

  • 「入社 5 年後に〜」のルールは撤廃。入社直後から採用担当に関わるとする。また、「全体の 20% が採用担当になる」ルールも撤廃。採用担当の「出来る人」と「出来ない人」の割合は、全体の「出来る人」と「出来ない人」の割合と同じとする。
  • 「退社は 3 年ごと」ルールを撤廃。毎年退社するものとする (毎年 15%/50% もの人が辞めたら困るので、1/3 の 5%/15% の人が辞めるように数値を変更)。

で、プログラムはこんな感じ。初期値では、出来る人 500 人、出来ない人 1500 人で計算した。

#include <stdio.h>

#define iMAX 50
static void simulate_cwork(void);

int main(void)
{
  simulate_cwork();

  return 0;
}

#define g2b      0.1            /* Good becomes Bad */
#define b2g      0.05           /* Bad becomes Good */
#define g_retire 0.15           /* Good retires */
#define b_retire 0.05           /* Bad retires */
#define g_hire_g 0.95           /* Good hires Good */
#define b_hire_g 0.3            /* Bad hires Good */
#define newbie   30             /* Number of Newbie */
static void simulate_cwork(void)
{
  int gn1 = 0;
  int bn1 = 0;
  int gn = 500;                 /* Number of Good worker */
  int bn = 1500;                /* Number of Bad worker */

  const double g2g = (1.0-g2b);
  const double b2b = (1.0-b2g);
  const double g_hire_b = (1.0-g_hire_g);
  const double b_hire_b = (1.0-b_hire_g);
  
  printf("%d %d %d\n", 0, gn, bn);
  for (int i=1; i<iMAX; i++){
    int k = gn + bn;            /* Number of All worker */

    double gn_g = g2g + (newbie * g_hire_g / k) - g_retire;
    double gn_b = b2g + (newbie * b_hire_g / k);
    double bn_g = g2b + (newbie * g_hire_b / k);
    double bn_b = b2b + (newbie * b_hire_b / k) - b_retire;
    
    gn1 = (gn_g * gn) + (gn_b * bn);
    bn1 = (bn_g * gn) + (bn_b * bn);

    gn = gn1;
    bn = bn1;
    printf("%d %d %d\n", i, gn, bn);
  }
  
  return;
}

Makefile 等は gist に上げてあるので、気になる人はどうぞ。

結果

50 年後、この会社の社員数はどうなってるかな? 「出来る人」と「出来ない人」の社員数をグラフにしてみた。

社員数の変動

みごとに単調減少。

考えてみたら、少くとも全社員数の 15% は退職してるのに、新入社員は 30 人しかないないんだから、200 人以上社員がいたら減るしかないんだよね。新入社員の数は、退職者とほぼ同数にしないといけないな。このモデルは、もう少し考慮が必要。でも、かうしてグラフにしてみると面白いね。色々とモデルをいじりたくなってしまう。

No comments:

Post a Comment