問題
あるプログラムについて,互いに独立したテストa,bを実施したところ,それぞれ30個及び40個のバグが検出された。また,そのうち20個は共通のバグであった。プログラムに含まれる推定総バグ数は幾つか。
- 50
- 60
- 70
- 80
答え
60
解説
個体数を推定する標識再捕獲法をバグの数の推定に応用します。
標識再捕獲法
標識再捕獲法(ひょうしきさいほかくほう、英:mark-recapture)とは、個体群を構成する個体数を推定する為の方法の一つである。主に個体群生態学で使用される。捕獲再捕獲法 (capture‐recapture)、捕獲‐標識‐再捕獲法とも呼ばれる。[1]
出典: フリー百科事典『ウィキペディア(Wikipedia)』
個体群生態学において、全個体を把握し、その個体数を数える事は不可能に近いため、さまざまな個体数推定法が用いられる。推測された値は、絶対個体数 (absolute abundance) に対し、推定個体数 (relative abundance) と呼ばれる。実際には、個体数そのものではなく、対象を個体群の一部と見て、密度を推定する場合もある。その場合、密度推定の語も使われる。
標識再捕獲法は、言葉は難しそうですが、エッセンスは簡単な算数です。
全個体数\(N\)、標識をつけた個体数を\(t\)、二回目の採集で得た個体数を\(n\)、その中に含まれていた標識個体の数を\(s\)とします。
全個体数の中の標識をつけた個体数の割合は、二回目の採集で得た個体数の中の標識をつけた個体数の割合と等しいと考えられるので、
$$ \frac{t}{N} = \frac{s}{n} $$
と表すことができます。
よって、全個体数は、
$$ N={\frac {nt}{s}}$$
で求まります。
この考え方を上記の問題に当てはめると、求めたい全バグ数\(N\)として、まずテストaを行い見つかったバグ数\(t =30\)、2回目のテストbで見つかったバグ数\( n=40 \)、テストaとテストbでの共通のバグ数はテストaで見つかり標識をつけたバグの中でテストbで再び見つかったバグなので\(s=20\)となります。
よって、
$$ {\frac {30*40}{20}} = 60$$
となり、バグ数は60と推定されます。
普通は標識再捕獲法という考え方は知らないと思うので、以下のように考えて解くと思います。
まず、テストAとテストBに共通のバグが20個あるということから、テストBが検出したバグ40個のうちテストAは20個検出できていると考えることができ、つまり、テストAはテストBの50%のバグを検出できているとみなすことができます。
このことから、テストAは全体の50%のバグを検出できると推定できます。
テストAでは30個のバグを検出できており、またテストAは全体の50%のバグを検出できると推定されていることから、全体のバグ数を60個と推定することができます。