なんでもベイズ統計は、現代においては欠かせない考え方らしい。
しかし、ベイズ統計のテキストで「ある疾病の有無を確認する検査で陽性と出た。さてあなたがその疾病に罹患している確率は・・・」という例題をよく見かける。
意外と低い確率の答えにビックリ!!
この答えを医者が目の前の患者に告げたらきっと患者から殴り飛ばされるであろう・・・
患者は減り医院も廃業てなことにならないために、ちよっと勉強をしてみた。
言いたいことは分かる気がするしインパクトのある例題とは思うが、個人的には例題として持ち出す事に好きにはなれません。確率を考えるときのscope(範囲)というか基準というか素人に説明不足のような気がして・・・。
てなことで「ThinkBayes2」を読んでみた。勿論google翻訳で、日本語のベイズ統計のテキストも
尚、以下の操作はすべてGoogle Colabで行っています。
01章.Probability¶
この章では、実際のデータセットを使用して、条件付き確率から始めてベイズの定理へとその概観をたどる。 プロローグに出でてくるリンダという銀行員の話も、上の疾病の検査の話と似て考えさせられる。
まずは、ここで使用するデータファイルのダウンロード。
# Load the data file
from os.path import basename, exists
def download(url):
filename = basename(url)
if not exists(filename):
from urllib.request import urlretrieve
local, _ = urlretrieve(url, filename)
print('Downloaded ' + local)
download('https://github.com/AllenDowney/ThinkBayes2/raw/master/data/gss_bayes.csv')
Downloaded gss_bayes.csv
データをPandasで読み込みます。
import pandas as pd
gss = pd.read_csv('gss_bayes.csv')
gss
caseid | year | age | sex | polviews | partyid | indus10 | |
---|---|---|---|---|---|---|---|
0 | 1 | 1974 | 21.0 | 1 | 4.0 | 2.0 | 4970.0 |
1 | 2 | 1974 | 41.0 | 1 | 5.0 | 0.0 | 9160.0 |
2 | 5 | 1974 | 58.0 | 2 | 6.0 | 1.0 | 2670.0 |
3 | 6 | 1974 | 30.0 | 1 | 5.0 | 4.0 | 6870.0 |
4 | 7 | 1974 | 48.0 | 1 | 5.0 | 4.0 | 7860.0 |
... | ... | ... | ... | ... | ... | ... | ... |
49285 | 2863 | 2016 | 57.0 | 2 | 1.0 | 0.0 | 7490.0 |
49286 | 2864 | 2016 | 77.0 | 1 | 6.0 | 7.0 | 3590.0 |
49287 | 2865 | 2016 | 87.0 | 2 | 4.0 | 5.0 | 770.0 |
49288 | 2866 | 2016 | 55.0 | 2 | 5.0 | 5.0 | 8680.0 |
49289 | 2867 | 2016 | 72.0 | 1 | 5.0 | 3.0 | 5170.0 |
49290 rows × 7 columns
columnsは
caseid
: 回答者の識別子。year
: 回答者が調査された年。age
: 調査時の回答者の年齢。sex
: 男性または女性。polviews
: リベラルから保守までの範囲にわたる政治的見解。partyid
: 所属政党、民主党、無所属、または共和党。indus10
: 回答者が働いている業界のコード。
indus10
から始めて、これらの変数をさらに詳しく見てみよう。
Fraction of Bankers¶
"銀行業務と関連アクティビティ"のコードは 6870 なので、次のように銀行家を選択できます。
banker = (gss['indus10'] == 6870)
banker
0 False 1 False 2 False 3 True 4 False ... 49285 False 49286 False 49287 False 49288 False 49289 False Name: indus10, Length: 49290, dtype: bool
この操作はgssの[indus10]のみをデータとしてbankerに取り出している。
caseid indus10
0 4970.0
1 9160.0
2 2670.0
3 6870.0
4 7860.0
その際 ['indus10'] == 6870
とすることでデータが、
caseid indus10
0 False
1 False
2 False
3 True
4 False
とブール値 True
と False
を含む Pandas Series
に変換されている。
テータ総数は49,290件
この Series
で sum
関数を使用すると、True
は 1、False
は 0 として扱われるため、合計がバンカーの数になる。
banker.sum()
728
このデータセットには 728 人の銀行家がいます。
銀行家の割合を計算するには、Series
内の True
値の割合を計算する関数 mean
を使用できます。
banker.mean()
0.014769730168391155
mean関数は平均を求める関数だが、True=1,False=0なので
mean関数で求めた計算値が、結果としてTrueの割合を表すことになる。
回答者の約 1.5% が銀行勤務であるため、データセットからランダムに人物を選択した場合、その人物が銀行員である確率は約 1.5% になる。
The Probability Function¶
前のセクションのコード使って、ブール系列を受け取り、確率を返す関数を作ります。
def prob(A):
"""Computes the probability of a proposition, A."""
return A.mean()
したがって、銀行家の割合を次のように計算できる。
prob(banker)
0.014769730168391155
銀行家の割合は約1.5%です。
次に、このデータセット内の別の変数を見てみましょう。 列 sex の値は次のようにエンコードされます。
1 Male
2 Female
列sexには 1
or 2
が入力されていて、それぞれMaleとFemaleを表している。
したがって、女性の回答者については True、それ以外の場合は False となるブール系列を作成できます。
female = (gss['sex'] == 2)
female
0 False 1 False 2 True 3 False 4 False ... 49285 True 49286 False 49287 True 49288 True 49289 False Name: sex, Length: 49290, dtype: bool
gss['sex'] == 2が真(True)
、即ちFemaleがTrue
となるブール値となる。
そしてそれを使用して、回答者の女性の割合を計算します。
prob(female)
0.5378575776019476
このデータセットに含まれる女性の割合は約54%です。
Political Views and Parties¶
次に注目する他の変数は、回答者の政治的見解を表す polviews
と、政党への所属を表す partyid
です。
polview
の値は 7 段階のスケールで表されます。
1 Extremely liberal
2 Liberal
3 Slightly liberal
4 Moderate
5 Slightly conservative
6 Conservative
7 Extremely conservative
私はliberal
を、"Extremely liberal"、"Liberal"、または "Slightly liberal"と回答した人と定義し True
となるブール値を作ります。
liberal = (gss['polviews'] <= 3)
liberal.sum()
13493
liberal
な人は13493人で、その割合は、
prob(liberal)
0.27374721038750255
このデータセットからランダムに人物を選択した場合、その人物がliberal
である確率は約 27% です。
次にpartyid
の値は次のようにエンコードされます。
0 Strong democrat
1 Not strong democrat
2 Independent, near democrat
3 Independent
4 Independent, near republican
5 Not strong republican
6 Strong republican
7 Other party
"Strong democrat"または"Not strong democrat"を選択した回答者をdemocrat
と定義します。
democrat = (gss['partyid'] <= 1)
democrat.sum()
18053
この定義によるdemocrat
は18053人で、その割合は、
prob(democrat)
0.3662609048488537
このデータセットからランダムに人物を選択した場合、その人物がdemocrat
である確率は約 37% です。
Conjunction¶
確率の定義とそれを計算する関数ができたので、Conjunction
(結合)に移りましょう。
Conjunction
は、論理積および演算の別名です。 2 つの命題 A
と B
がある場合、論理積 A と B
は、A
と B
の両方が True
の場合は True
、それ以外の場合は False
になります。
2 つのブール系列がある場合、&
演算子を使用してそれらの論理積を計算できます。 たとえば、回答者がbankerである確率はすでに計算されています。
prob(banker)
0.014769730168391155
そして回答者がDemocratである確率は、
prob(democrat)
0.3662609048488537
これで、回答者が banker
でありかつ Democrat
である確率を計算できる。
prob(banker & democrat)
0.004686548995739501
回答者が banker
でありかつ Democrat
である確率は、約0.5%です。
Conditional Probability¶
条件付き確率は条件に依存する確率ですが、ここではいくつかの例を示します。
回答者が liberal であるとすると、その回答者が Democrat である確率はどれくらいですか?
回答者が banker である場合、その回答者が female である確率はどれくらいですか?
回答者が female である場合、その回答者が liberal である確率はどれくらいですか?
最初の質問から始めましょう。これは次のように解釈できる。「 liberal の回答者全員のうち、Democrats は何割ですか?」
この確率は 2 つのステップで計算できる:
liberal な回答者をすべて選択する。
選択した回答者のうち Democrats の割合を計算する。
liberal な回答者を選択するには、次のように ブラケット演算子 []
を使用する:
democrat
0 False 1 True 2 True 3 False 4 False ... 49285 True 49286 False 49287 False 49288 False 49289 False Name: partyid, Length: 49290, dtype: bool
selected = democrat[liberal]
selected
8 False 17 True 18 False 24 True 28 False ... 49267 False 49271 True 49278 False 49279 True 49285 True Name: partyid, Length: 13493, dtype: bool
selected
には liberal な回答者のdemocrat
のブール値が含まれているため、prob(selected)
は liberals の Democrats の割合です:
prob(selected)
0.5206403320240125
liberal
の約半分強の52%がdemocrat
です。
2 番目の例、"回答者が銀行員である場合、その回答者が女性である確率はどのくらいですか?" を試してみる。 これは、"銀行員である全回答者のうち、女性は何パーセントですか?" という意味であると解釈できる。
ここでもブラケット演算子を使用して銀行家のみを選択し、probを使って女性の割合を計算します。
selected = female[banker]
prob(selected)
0.7706043956043956
このデータセットに含まれる銀行家の約 77% は女性です。
この計算を関数でラップしましょう。 条件付きを定義して、命題と与えられた 2 つのブール系列を取り、与えられたものを条件とする命題の条件付き確率を計算します。
def conditional(proposition, given):
"""Probability of A conditioned on given."""
return prob(proposition[given])
条件付きを使用して、回答者が女性であることを前提としてリベラルである確率を計算してみる。
conditional(liberal, given=female)
0.27581004111500884
女性回答者の約 28% はliberal
です。
この式を読みやすくするために、パラメータfemale
とともにキーワードgiven
を含めました。
Conditional Probability Is Not Commutative¶
conjunctionが可換であることを見てきました。 つまり、prob(A & B)
は常に prob(B & A)
と等しくなります。
しかし、条件付き確率は可換ではありません。 つまり、conditional(A, B)
はconditional(B, A)
と同じではありません。
例を見てみればそれは明らかです。 以前に、回答者が銀行家であると仮定して、回答者が女性である確率を計算しました。
conditional(female, given=banker)
0.7706043956043956
その結果、銀行員の77%が女性であることが分かりました。 これは、回答者が女性である場合に銀行家である確率と同じではありません。
conditional(banker, given=female)
0.02116102749801969
女性回答者のうち銀行員はわずか約2%です。
この例で、条件付き確率が可換でないことが明らかになったと思いますが、おそらくすでに理解されていたと思います。 それにもかかわらず、conditional(A, B)
とconditional(B, A)
を混同するのはよくある間違いです。 後でいくつかの例を見てみます。
Condition and Conjunction¶
条件付き確率と論理積を組み合わせることができます。 たとえば、回答者がliberal Democratであると仮定した場合、回答者が女性である確率は次のとおり。
conditional(female, given=liberal & democrat)
0.576085409252669
liberal Democratsの約57%は女性です。
そして、彼らが銀行家であると仮定した場合、彼らがリベラルな女性である確率は次のとおりです。
conditional(liberal & female, given=banker)
0.17307692307692307
銀行家の約17%はリベラルな女性です。
Laws of Probability¶
次のいくつかのセクションでは、結合と条件付き確率の間の 3 つの関係を導き出します:
条件付き確率を計算するために論理積を使用する。
条件付き確率を使用して論理積を計算する。
conditional(A, B)
を使用してconditional(B, A)
を計算する。
定理 3 はベイズの定理としても知られている。
これらの定理を確率の数学的表記を使用して書く。
$P(A)$ は命題 $A$の確率です。
$P(A~\mathrm{and}~B)$ は $A$ と $B$ の論理積の確率、つまり両方が真である確率。
$P(A | B)$ は、$B$ が true である場合の $A$ の条件付き確率。 $A$ と $B$ の間の縦線は "ギヴン" と発音される。
Theorem 1¶
銀行員の何パーセントが女性ですか? 答えを計算する 1 つの方法はすでに見てきた。
ブラケット演算子を使用してバンカーを選択し、
平均を使用して、女性の銀行員の割合を計算する。
これらのステップは次のように記述できる。
female[banker].mean()
0.7706043956043956
または、同じことを行うconditional
関数を使用することもできる。
conditional(female, given=banker)
0.7706043956043956
ただし、2 つの確率の比を計算することで、この条件付き確率を計算する別の方法もあります。
回答者に占める女性銀行員の割合、および
回答者のうち銀行員の割合。
言い換えれば、全銀行員のうち女性銀行員は何パーセントでしょうか?
この比率を計算する方法は次のとおり。
prob(female & banker) / prob(banker)
0.7706043956043956
結果は同じです。 この例では、条件付き確率と論理積に関連する一般規則を示します。 数学表記では次のようになります。
$$P(A|B) = \frac{P(A~\mathrm{and}~B)}{P(B)}$$それが定理 1 です。
Theorem 2¶
定理 1 から始めて両辺に $P(B)$ を掛けると、定理 2 が得られる。
$$P(A~\mathrm{and}~B) = P(B) ~ P(A|B)$$この式は、論理積を計算する 2 番目の方法を提案しています。&
演算子を使用する代わりに、2 つの確率の積を計算でる。
それがliberal
とdemocrat
にとってうまくいくかどうか見てみる。 &
を使用した結果は次のとおり。
prob(liberal & democrat)
0.1425238385067965
結果は14.3%
定理 2 を使用した結果は次のとおり。
prob(democrat) * conditional(liberal, given=democrat)
0.1425238385067965
結果は同じ
Theorem 3¶
conjunctionが可換であることを証明した。 数学表記では、これは次のことを意味する。
$$P(A~\mathrm{and}~B) = P(B~\mathrm{and}~A)$$定理 2 を両辺に適用すると、次のようになる。
$$P(B) P(A|B) = P(A) P(B|A)$$これを解釈する 1 つの方法は次のとおり。 A と B をチェックしたい場合は、どちらの順序でも実行できる。
最初に $B$ をチェックし、次に $B$ に条件付けされた $A$ をチェックするか、または
最初に $A$ をチェックし、次に $A$ を条件として $B$ をチェックできる。
$P(B)$ で割ると、定理 3 が得られる。
$$P(A|B) = \frac{P(A) P(B|A)}{P(B)}$$それが ベイズの定理
それがどのように機能するかを確認するために、最初にconditional
を使用して、リベラルな銀行家の割合を計算してみる。
conditional(liberal, given=banker)
0.2239010989010989
結果は22.4%
次にベイズの定理を使用すると
prob(liberal) * conditional(banker, liberal) / prob(banker)
0.2239010989010989
結果は同じ
The Law of Total Probability¶
これら 3 つの定理に加えて、ベイズ統計を行う必要があることがもう 1 つある。それは、全確率の法則。 法則の 1 つの形式を数学的表記で表したものが次のとおり。
$$P(A) = P(B_1 \mathrm{and} A) + P(B_2 \mathrm{and} A)$$言い換えると、$A$ の確率の合計は、$B_1$ と $A$ が真であるか、$B_2$ と $A$ が真であるという 2 つの可能性の合計。
ただし、この法則は、$B_1$ と $B_2$ が次の場合にのみ適用される。
相互に排他的です。つまり、そのうちの 1 つだけが真になり得る。
集合的に網羅的、つまり、そのうちの 1 つが真実でなければならないことを意味する。
例として、この法則を使用して、回答者が 銀行家 である確率を計算してみる。 次のように直接計算できる。
prob(banker)
0.014769730168391155
結果は1.5%
そこで、男性の銀行家と女性の銀行家を別々に計算しても同じ結果が得られることを確認してみる。
このデータセットでは、すべての回答者が男性または女性に指定されている。女性が True
であるブール型の Series
がすでにある。 男性向けの補足的 Series
は次のとおり。
male = (gss['sex'] == 1)
これで、次のように 銀行家 の合計確率を計算できるようになる。
prob(male & banker) + prob(female & banker)
0.014769730168391155
結果は同じ1.5%
男性と女性は相互排他的かつ集団的に網羅的 (MECE) であるため、バンカーの確率を直接計算した場合と同じ結果が得られる。
定理 2 を適用すると、合計確率の法則を次のように書くこともできる
$$P(A) = P(B_1) P(A|B_1) + P(B_2) P(A|B_2)$$同じ例で確認できる。
(prob(male) * conditional(banker, given=male) +
prob(female) * conditional(banker, given=female))
0.014769730168391153
条件が 3 つ以上ある場合は、総確率の法則を合計として記述するとより簡潔になる。
$$P(A) = \sum_i P(B_i) P(A|B_i)$$繰り返すが、これは、条件 $B_i$ が相互に排他的であり、集合的に網羅的である限り当てはまる。 例として、7 つの異なる値を持つ polviews
を考えてみる。
B = gss['polviews']
B.value_counts().sort_index()
1.0 1442 2.0 5808 3.0 6243 4.0 18943 5.0 7940 6.0 7319 7.0 1595 Name: polviews, dtype: int64
このスケールでは、4.0
は"Moderate"を表します。 したがって、moderate bankerの確率を次のように計算できる。
i = 4
prob(B==i) * conditional(banker, B==i)
0.005822682085615744
また、sum
とgenerator expressionを使用して合計を計算できる。
sum(prob(B==i) * conditional(banker, B==i)
for i in range(1, 8))
0.014769730168391157
結果は同じ1.5%
この例では、合計確率の法則を使用するのは、確率を直接計算するよりもはるかに手間がかかりますが、必ず役立つことがわかる。
0 件のコメント:
コメントを投稿