僕たちが探している「普通」な人は「普通」な割合では見つからない

# おことわり
これは「普通」な能力を持つエンジニアを探しているのになかなか見つからない，と思っていた私が，「普通」とは何かとバカ真面目に問い詰めた結果生まれた検証です．
プログラミングの専門知識ではなく，自分たちの直感と現実の違いをプログラミングを用いて解決してみようと試みています．
もちろんエンジニアの採用にかかわらず，結婚相手を探すなどといった場合でも適用可能ではないかと思います．
誰かの参考になれば光栄ですし，ネタとして楽しんでいただいても幸いです．

# 概要
評価項目すべてが「普通」である人は「普通」ではない．
複数の評価項目を「普通」な割合で満たす「普通」な人を探した時に「普通」な割合で見つけるためには，「普通」を75%（4分の3）とすると良い．
75%の人が満たしていることを「普通」の基準とした場合，4項目中3項目を満たす「普通」な人は，75%程度の確率で見つかる．

# 本論
ここでは，どのように75%という数値を求めたのかを書いていく．
興味がない人は飛ばしていただいても構わない．

## すべてが「普通」な人（r=4/5）
ある評価項目について，世の中の5人のうち4人（80%）が満たしている基準を「普通」だとしよう．
そのような評価項目が5つあった場合，その5項目すべてが「普通」である人は，

```math
\Biggl(\frac{4}{5}\Biggr)^5 = 0.32768
```

となり約33%，すなわち3人に1人ということになってしまう．つまりこれは人材を探した時に「普通」な割合では見つからない．
5項目でこれだけ下がるので，もっと多くの項目で検査すれば「普通」な人が見つかる確率はどんどん下がっていく．

## 複数の評価項目を「普通」な割合で満たす人を探す（r=4/5）
複数の項目すべてを満たすのではなく，「普通」な割合で満たす人はどれだけいるのだろうか．
世の中の5人のうち4人（80%）が満たしている基準を「普通」として，5項目のうち4項目以上が「普通」である人を探した場合はどれだけ見つかるかと言うと，

```math
\Biggl(\frac{4}{5}\Biggr)^5 + \Biggl(\frac{4}{5}\Biggr)^4 \times \Biggl(\frac{1}{5}\Biggr) \times {}_5 \mathrm{C}_1 = 0.73728
```

つまり約74%の割合で見つかる．「普通」を80%とすると，複数の項目を「普通」の割合で満たす人は「普通」には見つからないのである．

## 複数の評価項目を「普通」な割合で満たす人を探す（r=3/4）
同じ計算を4分の3（75%）で計算する．

```math
\Biggl(\frac{3}{4}\Biggr)^4 + \Biggl(\frac{3}{4}\Biggr)^3 \times \Biggl(\frac{1}{4}\Biggr) \times {}_4 \mathrm{C}_1 = 0.73609...
```

ギリギリ「普通」には見つからない程度である．
だがこれはもう一致していると考えていいだろう．

## 一般化する（4,5→n）
精確な値を求めるために，一般化して検査してみる．
n分の(n-1)を普通とした場合は次のように計算できる．

```math
\Biggl(\frac{n-1}{n}\Biggr)^n + \Biggl(\frac{n-1}{n}\Biggr)^{(n-1)} \times \Biggl(\frac{1}{n}\Biggr) \times {}_n \mathrm{C}_1
```

しかもこのような人がn分の(n-1)の割合で見つかるためには，

```math
\Biggl(\frac{n-1}{n}\Biggr)^n + \Biggl(\frac{n-1}{n}\Biggr)^{(n-1)} \times \Biggl(\frac{1}{n}\Biggr) \times {}_n \mathrm{C}_1 = \Biggl(\frac{n-1}{n}\Biggr) \\
\Biggl(\frac{n-1}{n}\Biggr)^{(n-1)} \times \Biggl(\frac{n-1}{n} + 1 \Biggl) = \Biggl(\frac{n-1}{n}\Biggr) \\
\Biggl(\frac{n-1}{n}\Biggr)^{(n-1)} \times (2n-1) = (n-1)
```

となるnを見つければよい．

## nを求める
頭が悪い僕ではこの計算式を解くことができなかった．
しかしr=2/3を計算したときは2/3以上の割合で見つかることがわかったので，nは3と4の間であると推測できる．
ということで3と4の間で二分法で計算する以下のプログラムを書いて，n≒3.825，r≒0.739だという結果を得た．

```python
from math import pow 

error = 0.0000001
cnt = 0 
max_cnt = 10000

def left(n):                                                                                                                    
    return pow((n - 1) / n, (n - 1)) * (2 * n - 1)

def right(n):
    return n - 1 

def left_m_right(n):
    return left(n) - right(n)

a = 3.0 
b = 4.0 
m = 0 
vm = 0 

while True:
    m = (a + b) / 2 
    vm = left_m_right(m)
    if abs(vm) < error:
        break

    if vm > 0:
        a = m 
    else:
        b = m 
    cnt = cnt + 1 
    if cnt >= max_cnt:
        break

if cnt == max_cnt:
    print("n = {0:.4f}, abort after {1} iteration".format(m, max_cnt))
else:
    print("n = {0:.4f}, {1} < {2}".format(m, abs(vm), error))

def n_to_ratio(n):
    return ((n - 1) / n)
print("rate = {0:.1f}%".format(n_to_ratio(m)*100.0))
```

# 議論
各評価基準は独立であると仮定して計算をした．
これは評価基準の決め方に依存するので，成り立たない場合があるかもしれない．
実際に独立な評価基準を決められるわけではないと思いますが，
理想としては評価基準は独立であるべきだと思っています．

割合と言っておきながら，計算に使用したのは具体的な数値（4項目のうち3項目）であった．
これは簡単に計算を終わらせるためである．
8項目のうち6項目も同じく75%であるが，計算式は次のように変わってしまう．

```math
\Biggl(\frac{6}{8}\Biggr)^8 + \Biggl(\frac{6}{8}\Biggr)^7 \times \Biggl(\frac{2}{8}\Biggr)^1 \times {}_8 \mathrm{C}_1 + \Biggl(\frac{6}{8}\Biggr)^6 \times \Biggl(\frac{2}{8}\Biggr)^2 \times {}_8 \mathrm{C}_2
```

こんなものは計算したくないし，数が増えればもう投げ出したくなる．
考えてもいないが，nに一般化した場合どうしたらいいのかもうわからない．
ということで，このような暴挙をごまかして計算している．
すでに具体的な評価基準の数を持っている場合ならば，端数などを考慮した上でちゃんとした計算をしてもいいかもしれない．

またnを勝手に自然数から実数に変更したことも問題である．
組み合わせのCは実数nに対しても，

```math
{}_n \mathrm{C}_1 = n
```

が成り立つのかは知らない．

3と4の間だと推測して二分法で誤差が基準（0.0000001）以下になるnを探したが，本来はこの区間内で左辺の関数が連続性と単調性を持つことを確認しなければならない．
そこまで確認する時間を持ち合わせていなかったので，連続かつ単調であると仮定して計算した．
興味がある人は，微分して単調性を証明してみてほしい．

floatは丸め誤差などがあるため本当に誤差の基準以下になったかどうかはわからない．
ただ，nを小数点以下3桁までを求めるために十分な精度ではないかと考えている．
これは直感的な判断なので，本当に正しいのかは未検証である．

# 結論
乱暴な展開ではあったが，人間が直感的な判断をする上では4分の3（75%）を「普通」の基準とすると，「普通」な人を見つけることができるのではないかという答えを得た．
計算や論理展開に誤りがあったかもしれないし，議論し尽くせていないこともあるかもしれない．
もし発見した方がいらっしゃったら，ご指摘いただけると幸いである．