バナナでもわかる話

開設当初は計量経済学・統計学が専門の大学院生でした。今はデータを扱うお仕事をしています。統計学・経済学・投資理論・マーケティング等々に関する勉強・解説ブログ。ときどき趣味も。極力数式は使わずイメージで説明出来るよう心掛けていますが、時々暴走します。

階層ベイズモデルとは~国ごとの犯罪件数のデータからグループ差を考えるモデル

※すみません。データからとタイトルを書きましたが、実際のデータは使いません(見つからなかった....)。
あくまで階層ベイズの使い方の説明ということでご覧ください。

スポンサーリンク



例えば国毎の犯罪件数のデータなんかがあったとします。

仮に犯罪件数のデータ Yがあったとして、やはり犯罪件数はその地域の治安、もっと丁寧に言えば「社会保障の充実度」「失業率」「人口密度」「1人当たり年収」等々の影響で起こっていると考えることが出来ますよね。これらをまとめて Xと置いてやることにしましょう。


で、世界中の様々な地域の犯罪件数データ Yを取ってきたとします。
そして、線形回帰でえいやっと次のようなモデルを作ってみることにしました。


 Y=\alpha+X\beta+\epsilon
 \epsilon~N(0,\sigma)

なんかうまくいきそうな気がしますが、恐らく誤差のバラツキである \sigmaの推定値がメチャメチャ大きくなるはずです。

なんでかというと簡単で、元のデータセットが世界中の様々な地域の犯罪件数データだからです。


例えばこのデータを日本の地域データだけで考えるのであれば、東京の港区だとか大阪の北の方だとかは、治安が良さそうだけど足立区だとか難波の方だとかは比較的治安は良くないだとかは年収の水準でかわりそうだし、一方田舎に目を移すと人口密度の関係か犯罪件数は低下するだとか。この程度なら用意した説明変数でどうにか説明出来そうですが、

今回は日本だ中国だメキシコだブラジルだサウジアラビア、インド、イギリス、フランスとそれはもう色々な国のデータがあるわけで、当然国ごとに \alpha \betaの値は異なっていそうです。それを全てないまぜに処理してしまえば当然誤差は大きくなり、分散も大きくなるにきまっています。



そんな時に

国ごとに分けて推定しよう!

って考えて、日本の地域で回帰、フィリピンの地域で回帰なんてことをやるのも悪くないわけですが



 Yひとまとめとしてはデータが100個あるけど、日本のデータ自体は東京と大阪のデータしかない!フィリピンのデータ自体はマニラとエウロパのデータしかない!これじゃあ地域ごとに分けたらサンプルサイズ2のデータで回帰することになってしまう!!!

という状況が当然考えられるわけです。
そんな時、ベイズ分析に緩い仮定を加えることでうまくデータを利用することが出来るよというのが今回の話です。


モデルの修正

元のモデルはこんな感じでした。
 Y=\alpha+X\beta+\epsilon
 \epsilon~N(0,\sigma)
省略してますが、ベイズ分析を行うので各パラメータに対して適当な事前分布も設定しておきます。


要は今の問題点は各地域(k=1,2,....K)について共通のパラメータを使っていることが問題なので話を次のように修正してやります。

「各地域におけるパラメータ \alpha,\betaは地域ごとの特殊な影響と、共通の影響に分解できる、そして、地域ごとの特殊な影響は共通の分布に従っている」と仮定することにします。

つまり
 \alpha=\alpha^*+\alpha_k
 \beta=\beta^*+\beta_k

更に事前分布として
 \alpha_k~N(0,\sigma_a)
 \beta_k~N(0,\sigma_b)

と設定してやります。各地域特有の影響は地域ごとに異なりますが、背後に共通の事前分布を設定することで、各地域を別個に考えるのではなく緩い繋がりを持たせていると言ってイメージ沸きますかね。


このように考えることで、各地域別個のデータとしてモデルを組んでいるにもかかわらず、全体の傾向も反映でき、過学習を回避するモデルを作ることが出来るわけです。

このモデルを階層ベイズモデルと呼びます。


"階層"という名前にしているのは、パラメータの事前分布に更にパラメータ(ハイパーパラメータ)を持つ分布を採用し階層的に分析を行っているからです。


非ベイズの枠組みでこういうことを行うのは無理ですよね。
 \alphaを分解した時点で識別条件に引っかかるし、先に全体平均を引いて各グループごとに回帰を行っても、全体の統一は確保出来ません。事前の情報として、分布を与えることでのみ出来る芸当かなと思います。