"BOKU"のITな日常

還暦越えの文系システムエンジニアの”BOKU”は新しいことが大好きです。

数式を描くMathJax.jsを試すついでに、ベイズの定理の例題をやってみる/JavaScript・python

今回は、JavaScriptで数式を描く便利なライブラリの話です。

f:id:arakan_no_boku:20190301193447j:plain

 

はてなブログで数式を書く方法って、そういや知らない

 

ブログを1年以上書いているのに。 

はてなブログの見たままモードで、数式をどうやって書くかを知りませんでした。 

MarkDownモードにすれば書けるらしいのは知ってましたけど、正直、個人的にMarkDownは好きではなく、数式のためだけに使うのも馬鹿らしい。 

どうせ、文系SEだから、数式なんかほぼ書く機会もないし・・と思って。 

ところが、たまたま、こういう記事を見つけました。

stronger.hatenablog.com

 

あ、いいじゃないか。 

見たままモードでも問題なくやれそうなので、早速真似してみました。 

なお、上記の記事では、以下の赤字の部分が、「cdn.mathjax.org」となっています。

<script async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS_CHTML"></script>

ですが、どうも「cdn.mathjax.org」は2017年4月30日以降は廃止の方向らしく、いつ、使えなくなるかわからないっぽいので、補足しておきます。

 

せっかくなのでベイズの定理の練習問題でもやってみよう

 

最近、頻繁に目にしたり、聞いたりするので「ベイズの定理」の名前を知ってる人はいっぱいいると思います。 

自分はこの本で勉強しました。 

まずはこの一冊から 意味がわかるベイズ統計学 (BERET SCIENCE)

まずはこの一冊から 意味がわかるベイズ統計学 (BERET SCIENCE)

 

 

入門書を5冊くらい読んで、一番読みやすかった本です。 

現実的な例題が多くて、興味をつなぎやすいのですね。 

この本がなかったら、未だにベイズ統計って何?だったかもしれません。(笑) 

この本の中で一番気に入りの例題を引用します。

我が国のエイズ有病率は0.02%です。

HIVに感染している場合、検査によって陽性になる感度(確率)は99.90%です。

感染していなければ、(検査によって)陰性になる確率(特異度)は99.90%です。

(検査の)結果が陽性だった場合、HIVに感染している確率はどれくらいですか。

HIVに感染してたら99.90%陽性になる検査で、陽性なんです。 

普通・・、ほぼ100%近くHIVに感染していると思うじゃないですか? 

ところが、答えを先に言ってしまうと「約17%」なんです。 

え・・、そんなものなの?って思う。 

こういう意外性が面白くて、一気に引き込まれました。

 

さあて、ベイズの定理を数式で書いてみよう

 

ベイズの定理はこんな式です。 

$$\huge p(A|B) = \frac{p(B | A) p(A)}{p(B)}$$

 

p() は、「~の確率」を意味します。 

Aは「HIVに感染している人」です。 

Bは「検査で陽性である人」です。 

だから、p(A)は、HIVに感染している確率で、p(B)は、検査で陽性である確率です。 

同様に考えれば、p(A|B) は「検査が陽性の人が、HIVに感染している確率」ですから、まさに今求めようとしているものです。 

対して、 p(B|A) は「HIVに感染している人が、検査で陽性になる確率」です。 

そう考えれば、右側の式に必要な情報は、すでに問題の中にあります。 

P(B|A)は、99.90% ですね。 

P(A)は、0.02% です。 

P(B)・・検査が陽性である確率は、ちょっとひねる必要があります。 

検査が陽性である人とは、「HIVに感染する人のうち陽性になる人の確率=0.02%✕99.99%」と、「HIVに感染しない人が陽性になる人の確率=99.98%✕0.1%」を合計したものということになります。 

後者は、100%から感染する人の確率をひいたものと、検査で陽性になる人の確率をそれぞれ引いたものをかけ合わせたものになります。 

だから、その数字をはめこむと。

 $$\huge  \frac{ 99.9  \times  0.02 }{99.9  \times  0.02 + 0.1  \times  99.98}$$

 

という式で、「検査が陽性だった人がHIVに感染している確率」が求まります。 

なんてね。 

やっぱ、数式がきれいだといいな。

 

せっかくなので、pythonで解いてみよう

 

超カンタンなコードですけどね。

# p(B|A) HIV感染者が検査で陽性になる確率
pba = 99.9
# p(A) HIV感染者が存在する確率
pa = 0.02
# p(B) 検査で陽性になる確率
pb = (pba * pa) + ((100 - pba) * ( 100 - pa))
# p(A|B) 検査で陽性だったものがHIV感染者である確率
pab = (pba * pa) / pb
# 100をかけてパーセント表示にする
print("{0}%".format(round(pab * 100,1)))

表示される答えは。

16.7%

うん。 

本当に約17%なんですよね。