【ベイズ因子】オッズ比の使われ方を紹介します
オッズ比は二つのカテゴリに分けられるデータに対して有用な指標であり、特に、疾患や事象が発生する確率について研究する際に使用されます。
今回は、「オッズ」や「オッズ比」を統計学の観点から実例を通してみてみましょう。
オッズ比(odds ratio)
2832年12月1日、A市でノロウィルスの集団感染が起きました。感染した人たちの生活を辿ると、共通して一日前に「あるイタリアンレストラン」に行っていたことがわかりました。どうやら、このイタリアンレストランの料理が感染源で問題ないようです。 ただ、「どのメニューのどの材料」にウィルスが付着していたのかわからないと、同じ材料を使っている店に警告や販売元の市場へ販売停止命令ができません。 以下の表を見て、どのメニューにウィルスがついているか推測してください。 ただし、レストランに行き食中毒になったのは40人(X+Y)で、食中毒になっていないのは60人(A+B)です。
食べた(X) | 食べてない(Y) | 食べた(A) | 食べてない(B) | |
ボンゴレビアンゴ | 28 | 12 | 42 | 18 |
コブサラダ | 19 | 21 | 25 | 35 |
イカスミパスタ | 12 | 28 | 28 | 32 |
タイのマリネ | 38 | 2 | 19 | 41 |
食中毒など、死者が出る可能性もある事象においては、スピード感を持った判断が必要です。
このため、全ての証拠を集めた後、判断してから失敗のないように原因の食材を回収していくことはできません。
「食中毒が起きた」という結果から、もっとも可能性のある原因を見つけるという「ベイズ統計学」の考え方が使えます。
オッズ(odds)
では、解説を行います。まず、オッズ比の前に「オッズ」を理解する必要があります。
オッズとは、「ある事象が起きる確率を起こらない確率で割った値」のことです。
$$odds = \frac{P}{1-P}$$
そして、オッズ比とは「2つのオッズの比をとったもの」です。
では各メニューのオッズ比を見ていきましょう。
「食べたと食べてない」というオッズを2つ使い、「感染したと感染してない」という1つのオッズを作っているイメージです。
$$odds Ratio = \frac{\frac{X}{Y}}{\frac{A}{B}}$$
食べた(X) | 食べてない(Y) | 食べた(A) | 食べてない(B) | オッズ比 | |
ボンゴレビアンゴ | 28 | 12 | 42 | 18 | 1 |
コブサラダ | 19 | 21 | 25 | 35 | 1.274 |
イカスミパスタ | 12 | 28 | 28 | 32 | 0.489 |
タイのマリネ | 38 | 2 | 19 | 41 | 41.036 |
オッズ比が1よりも高くなると、原因である可能性が高いです。
そしてオッズ比を見ると、「タイのマリネ」が非常に高いことがわかります。
つまり、1単位食べるとノロウィルスに感染する確率が高い食材は「タイのマリネ」と言えます。
この後は、区間推定を行い下限が1よりも大きいことを確かめると信憑性は上がりますが、今回のオッズ比では「タイのマリネ」で間違い無いでしょう。
では原因は、鯛でしょうか?ソースでしょうか?野菜でしょうか?ここからは、調査員に任せましょう。
ベイズ因子
ベイズ統計学において、オッズ比はベイズ因子と呼ばれます。
ベイズ因子とは、ある結果が得られたことに、どれだけの証拠能力があるのかを測る指標として使われています。
ロジスティック回帰モデル(logistic regressor)
ロジスティック回帰でもオッズは使われています。
体系的に学びたい方は、【二項分布】ロジスティック回帰について(実例つき)をご覧ください。
また、pythonのコードを見たい方は【分類タスク】ロジスティック回帰の使い方|pythonをご覧ください。
今回の食中毒の例を取りましょう。
「ノロウィルスに感染するかしないか」という問題は、0か1をとる2値問題です。
以下のような回帰モデルを考えます。
ただしy<0の時はy=0,y>0の時はy=1を取るものとします。
$$y_{i} = α+βx_{i}+u_{i}$$
また、個人iがy=1(ノロウィルスにかかる)になる確率をpiとし、個人iがy=0になる確率(ノロウィルスにかからない)確率を1-piとします。
この時、誤差項を除いた説明変数α+βxとyの関係を分布関数で結ぶ時、
分布関数が正規分布:プロビットモデル
$$p_{i}=Φ(α+βx_{i})$$
分布関数がロジスティック分布:ロジット関数
$$log \frac{p_{i}}{1-p_{i}}=α+βx_{i}$$
ロジット関数の逆関数:ロジスティック回帰モデル
$$p_{i}= \frac{exp(α+βx_{i})}{1+exp(α+βx_{i})}$$
2番目のロジット関数を見てください。
先ほどの説明変数を、オッズを対数化したものと表します。これをロジットと呼びます。
オッズを知りたい場合は、ロジット関数を使い、確率を知りたい場合はロジスティック関数を使います。
CODE|python
以下はオッズ比を求めるpythonのコードです。
それぞれの観測回数と確率を算出できれば、オッズ比を算出することができます
# オッズ比を求めるために、2つのカテゴリに分けられるデータが必要です。
# 以下は、事象Aが起こる確率と、事象Bが起こる確率を求めるためのコードです。
event_a = 100 # 事象Aが起こった回数
event_b = 200 # 事象Bが起こった回数
total = event_a + event_b # トータル回数
prob_a = event_a / total # 事象Aが起こる確率
prob_b = event_b / total # 事象Bが起こる確率
# オッズ比を求める
odds_ratio = (prob_a / (1 - prob_a)) / (prob_b / (1 - prob_b))
print("Odds Ratio: ", odds_ratio)