Skip to content

Instantly share code, notes, and snippets.

@ataka
Created April 22, 2009 21:57
Show Gist options
  • Save ataka/100121 to your computer and use it in GitHub Desktop.
Save ataka/100121 to your computer and use it in GitHub Desktop.
企業の体質をシミュレーションするモデル
README for corporate work
= 企業の体質をシミュレーションするモデルが衝撃的だったお話 =
ref. http://www.ideaxidea.com/archives/2009/04/how_corporate_works.html
またしても小話。大学生のときに次のようなモデルでシミュレーションをした先生がいました。結果が衝撃的だったので今でもよく覚えています。
どんなモデルかというと次のような感じ(ちょっとうろ覚えだけど)。
* まず前提として企業はある一定の「出来る人」と「出来ない人」で構成されるとする(乱暴ですが、まぁ、仮定として)。
* ある企業が毎年30人採用したとする。
* その30人のうち、15%は出来る人で、85%は出来ない人だと仮定する。
* 1年経るごとに、出来ない人のうち95%はずっと出来ないままで、一方出来る人のうち10%が出来ない人になっちゃうと仮定する。
* 入社5年後にその人たちの20%が採用担当になる。
* 出来ない人は70%の確率で出来ない人を採用する。出来る人は5%の確率で出来ない人を採用すると仮定する。
* 3年ごとに出来ない人は15%の割合で退職し、出来る人は50%の割合で退職するとします。
* さてn年後のこの企業、「出来る人」と「出来ない人」の割合はどうなるでしょうか?
上記の数値はわかりやすくするために適当にでっちあげましたが、大学のときに見たシミュレーションではこれらの数値をパラメータにして「10年後のこの企業は・・・」「20年後では・・・」といった具合にシミュレーションしていました。
具体的な数値は忘れましたが、そのときは「ふむ、そういう割合もあるうるねぇ」と大学生なりに納得できる現実的な数値を入れたところ、数年後にはひどいことになっていましたよ・・・。
大学の先生も「悲しいことに出来ない人が出来ない人を生むシステムになっちゃっていますね・・・」とコメントしていたような。
企業のサイズによってパラメータを変えるべきとか、その他の要因なんかも考えるべきですが、考えさせられる実験ですよね。いつかシミュレータ作ってみようかな・・・エクセルで作れそうだ。
#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;
}
set terminal png
set output "cwork.png"
set style data lines
plot "cwork.data" using 1:2 title "Good Worker", \
"cwork.data" using 1:3 title "Bad Worker"
# Corporate Work program
# Author: Masayuki Ataka <masayuki.ataka@gmail.com>
PROGRAM = cwork
CC = gcc
CFLAGS = -W -Wall -g -O2 -std=c99
CPPFLAGS = -DDEBUG
GNUPLOT = gnuplot
all: cwork.png
$(PROGRAM): cwork.o
$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $^
cwork.o: cwork.c
cwork.data: $(PROGRAM)
./$(PROGRAM) > $@
cwork.png: cwork.gp cwork.data cwork.gp
$(GNUPLOT) $<
#
# clean
#
RM = rm -f
clean:
$(RM) *~
$(RM) *.o
distclean: clean
$(RM) $(PROGRAM)
$(RM) *.data
$(RM) *.png
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment