とらりもんHOME  Index  Search  Changes  Login

python入門: 血液型の人口動態シミュレーション

pythonを使って現実問題のシミュレーションをやってみよう。世の中にはいろんな血液型の人がいるが, それぞれの血液型が人口の中に占める比率は, 世代と共にどう変わっていくのだろうか?

 よく知られているように, 人の血液型は, A, B, Oの3種類の遺伝子が2つ組み合わさってできる(ここではRH+/-などは考えない)。AAとAO(=OA)はA型, BBとBO(=OB)はB型, ABはAB型, OOはO型である。そのような組み合わせまで考慮すれば, 人の血液型は, AA, AB, AO, BB, BO, OOの6種類である。

 AO型とAB型のカップルからは, AA, AB, AO, BOという4種類の血液型のどれかをもつ子が生まれる(OO型やBB型は生まれない!)。そのように, 生まれる子どもの血液型は親の血液型(の組み合わせ)で決まる。

 まず練習として, AA型, AB型, BB型しかいない世界を考えよう。ある世代における, それぞれの血液型の人の割合をAA, AB, BBと書き, 次世代のそれぞれの血液型の人の割合をnAA, nAB, nBBと書こう(nはnextの意味)。カップルの相性は血液型には依存しないとし(これは後に検討する), また, 血液型の人口比は男女でかわらないとする。pythonでは, nAA, nAB, nBBは次のように求められることはわかるだろうか?

nAA = AA*AA + AA*AB/2 + AB*AA/2
nAB = AA*BB + BB*AA + AB*BB/2 + AB*AB/2 + BB*AB/2
nBB = AB*BB/2 + BB*AB/2 + BB*BB
sum=nAA+nAB+nBB
nAA=nAA/sum
nAB=nAB/sum
nBB=nBB/sum

問1 この考え方を基に, 以下のような関数をpythonで作れ:

  • 名前はbloodAB()
  • 引数は, ある世代のAA, AB, BB型のそれぞれの割合と, そこから計算する世代の数(n)
  • 出力は, n世代後のAA, AB, BB型のそれぞれの割合

つまり, たとえばblood(0.4,0.3,0.3,10)と打てば, AA, AB, BBのそれぞれが4割, 3割, 3割の世代から10世代後の各血液型の割合が出てくる, というかんじ。

問2 これが正しく動いていることを確認せよ。どうやれば確認できるだろうか? 非常にシンプルなケース(全員AA型だとか, AAとBBが半々でABが0とか)について1世代だけまわしてみて, 理論的な結果に合うかどうかを確認するのである。こういう確認法は, 計算機シミュレーション研究では常套手段である。

問3 これを, AA, AB, AO, BB, BO, OOの6種類に拡張せよ。

問4 これが正しく動いていることを確認せよ。知恵を使おう!

問5 現在, 日本の血液型の人口比は, AA=0.08, AB=0.10, AO=0.31, BB=0.03, BO=0.19, OO=0.29である。この比率は, 1世代後, 5世代後, 100世代後のそれぞれではどうなるか?

さて, ネットで調べると, 「A型とB型はあんまり相性が良くない」という言説が見つかった。これが本当かどうかを調べよう。すなわち, A型とB型は(他の血液型どうしの組み合わせに比べて)カップルになりにくいとして, その影響をfというパラメータであらわそう。このfは, 0から1までの値をとる。たとえばf=0.9なら, 相性が問題ない(f=1.0)場合の0.9倍の本土でしかA型とB型のカップルが成立しない, という意味である(AA*BB, AO*BB, AA*BO, AO*BOのどの場合も共通のfを使う)。fも引数として関数に組み込むこと。

問6 このfを組み込んでシミュレーションを行え。もしf=0.9で, 100世代まわしたら, 血液型の人口比はどうなるか? そんな遊びをたくさんやって, 血液型どうしの相性の有無について, 君なりに考察せよ。

Last modified:2019/02/20 13:20:30
Keyword(s):
References:[python入門]