とらりもん - python入門: 血液型の人口動態シミュレーション Diff
- Added parts are displayed like this.
- Deleted parts are displayed
like this.
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 + AB*AB/4
nAB = AA*BB + BB*AA + AB*BB/2 + AB*AB/2 + BB*AB/2 + AA*AB/2 + AB*AA/2
nBB = AB*AB/4 + AB*BB/2 + BB*AB/2 + BB*BB
sum=nAA+nAB+nBB
nAA /= sum
nAB /= sum
nBB /= sum
(ヒント: AA*BBのような掛け算の前半は父親, 後半は母親からそれぞれ来る対立遺伝子について考慮している。
sumは全員の人数。最後に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世代後の各血液型の割合が出てくる, というかんじ。おそらく以下のようなコードになる:
def bloodAB(AA, AB, BB, n):
for i in range (0, n):
nAA = AA*AA + AA*AB/2 + AB*AA/2
nAB = ...(略)...
nBB = ...(略)...
sum = nAA + nAB + nBB
nAA /= sum
... (略) ...
return(nAA, nAB, nBB)
問2. その関数が正しく作られていることを, 以下のケースを試して確認せよ:
* 最初, 全員がAA型である場合。何世代たっても全員AA型のはずである。
* AAとBBが半々でABが0の場合。何世代たってもAAとBBの割合は同じはずである(対称なので)。
問3. これを, AA, AB, AO, BB, BO, OOの6種類に拡張せよ(正しく作られたことを, 上記のような方法で確認せよ)。たとえば, nAAについては,
nAA = AA*AA + AA*AO/2 + AO*AA/2 + AO*AO/4 + AA*AB/2 + AB*AA/2 + AB*AO/4 + AO*AB/4 + AB*AB/4
のようになるだろう(最後にsumで割るとして)。
問4. 現在, 日本の血液型の人口比は, AA=0.08, AB=0.10, AO=0.31, BB=0.03, BO=0.19, OO=0.29である。この比率は, 1世代後, 5世代後, 100世代後のそれぞれではどうなるか?
問5. もしも, ある国がO型の移民の優遇策を打ち出した結果, 日本からO型の人全員が一斉に去ってしまったなら(OO=0), 日本の次世代以降の血液型の比率はどうなるか?
問6. 前問と同様のことがもしA型の人(AAおよびAO)について起きたなら, 日本の次世代以降の血液型の比率はどうなるか?
問7. 以上の結果を, ハーディー・ワインベルクの法則に基づいて考察せよ。
問8(任意). 血液型を決定するA, B, Oのように, 3つの対立遺伝子からなる遺伝子型に関するハーディー・ワインベルクの法則を数学的に証明せよ。
よく知られているように, 人の血液型は, 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 + AB*AB/4
nAB = AA*BB + BB*AA + AB*BB/2 + AB*AB/2 + BB*AB/2 + AA*AB/2 + AB*AA/2
nBB = AB*AB/4 + AB*BB/2 + BB*AB/2 + BB*BB
sum=nAA+nAB+nBB
nAA /= sum
nAB /= sum
nBB /= sum
(ヒント: AA*BBのような掛け算の前半は父親, 後半は母親からそれぞれ来る対立遺伝子について考慮している。
sumは全員の人数。最後に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世代後の各血液型の割合が出てくる, というかんじ。おそらく以下のようなコードになる:
def bloodAB(AA, AB, BB, n):
for i in range (0, n):
nAA = AA*AA + AA*AB/2 + AB*AA/2
nAB = ...(略)...
nBB = ...(略)...
sum = nAA + nAB + nBB
nAA /= sum
... (略) ...
return(nAA, nAB, nBB)
問2. その関数が正しく作られていることを, 以下のケースを試して確認せよ:
* 最初, 全員がAA型である場合。何世代たっても全員AA型のはずである。
* AAとBBが半々でABが0の場合。何世代たってもAAとBBの割合は同じはずである(対称なので)。
問3. これを, AA, AB, AO, BB, BO, OOの6種類に拡張せよ(正しく作られたことを, 上記のような方法で確認せよ)。たとえば, nAAについては,
nAA = AA*AA + AA*AO/2 + AO*AA/2 + AO*AO/4 + AA*AB/2 + AB*AA/2 + AB*AO/4 + AO*AB/4 + AB*AB/4
のようになるだろう(最後にsumで割るとして)。
問4. 現在, 日本の血液型の人口比は, AA=0.08, AB=0.10, AO=0.31, BB=0.03, BO=0.19, OO=0.29である。この比率は, 1世代後, 5世代後, 100世代後のそれぞれではどうなるか?
問5. もしも, ある国がO型の移民の優遇策を打ち出した結果, 日本からO型の人全員が一斉に去ってしまったなら(OO=0), 日本の次世代以降の血液型の比率はどうなるか?
問6. 前問と同様のことがもしA型の人(AAおよびAO)について起きたなら, 日本の次世代以降の血液型の比率はどうなるか?
問7. 以上の結果を, ハーディー・ワインベルクの法則に基づいて考察せよ。
問8(任意). 血液型を決定するA, B, Oのように, 3つの対立遺伝子からなる遺伝子型に関するハーディー・ワインベルクの法則を数学的に証明せよ。