はじめに
私は,製造業のデータサイエンス組織で管理職をしている。業務でデータ分析プロジェクトを推進する立場にいるが,推定結果の不確実性を扱うことができるベイズ統計学は,意思決定において有用であると考えられる。
ベイズ統計学や統計モデリングについて改めて学ぶために,当分野において名著として名高い,馬場真哉 著 「RとStanではじめる ベイズ統計モデリングによるデータ分析入門」 を読むことにした。
NumPyroを用いた実装
本書は,プログラミングや統計モデリングにR言語とStanが用いられているが,ブログ筆者はPythonユーザであるため,生成AIと相談しながらPythonで実装することとした。
ベイジアンモデリングを扱うためのPythonライブラリとして
- PyMC Home — PyMC project website
- Pyro Pyro
- NumPyro NumPyro documentation — NumPyro documentation
などが挙げられるが,今回はNumPyroを主に用いることとした。
num.pyro.ai
NumPyroの特徴は,以下のようなものが挙げられる(参考:「Pythonではじめるベイズ機械学習入門」を読む ~第2章 確率的プログラミング言語(PPL)③~ - jiku log)
- バックエンドがJAXであり,高速であると言われている。
- NumPy互換性のある配列や演算を使って確率モデリングを書くことが可能である。
- HMC法を改善したNUTS(No-U-Turn Sampler)が実装されている。
- NUTSアルゴリズムがJAXのJITコンパイルに対応できるように工夫されているので,大規模なデータセットに対して高速なMCMCサンプリングが可能になる。
- 基本的な変分推論法の実装と,自動微分変分推論(ADVI)が用意されている。
本書の参考ページ
馬場ベイズ本の実装を通じて感じたNumPyroのメリット
NumPyroのメリット:Pythonの各種ライブラリとの親和性が高い
データ分析業務に従事する人の中には,Pythonユーザが多い。NumPyroはPythonのライブラリであるため,Pythonの機械学習パイプラインに組込みやすい。
たとえば
df = pd.read_csv("data.csv") x = jnp.array(df["x"].values) y = jnp.array(df["y"].values)
のように,Pythonコード上で読み込んだ変数を,NumPyro用に変換するして使うことができる。
一方でR・Stanを用いる場合は,StanのコードとRのコードが別々に書かれており,RのコードからStanのコードを呼び出すことになる。
この構成では,デバッグをするときなどに,異なる種類のコード間を行ったり来たりする必要があるので,不便になると考えられる。
NumPyroのメリット:統計モデルの自由度が高い
最初のメリットともかかわっているが,NumPyroの統計モデルはPythonの関数として記述するため,Pythonの各種関数を使うことができる。
たとえば,馬場ベイズ本をNumPyroで実装 ~第5部・第3章 状態空間モデルによる予測~ - jiku log で扱ったように,統計モデルの中にif文を組み込むことができる。
# 将来予測 if pred_term > 0: ...
そのため,処理内容を関数の引数によって切り替えることも可能であるし,どのような処理が書かれているか理解しやすい。
NumPyroのメリット:機能が豊富である
NumPyro documentation — NumPyro documentationのサイトを見ると,チュートリアルや応用例がグラフィカルに紹介されており,試してみたいことに近いことを探しやすくなっている。
今回はあまりNumPyroの機能に立ち入れていないが,今後試したい機能が出てきたときに便利である。

R・Stanのメリット:可視化機能が強い
たとえばRでは,marginal_effectsという関数が準備されていて,可視化周りのコードがかなり便利だったが,Pythonでは関数を手組みする必要があった。
R・Stanのメリット:収束判定の説明が充実している
MCMCを用いていると,収束判定が気になる。また収束しなかったときやWarningが出たときの対処方法も知りたくなる。
Stanにおいては,How to Diagnose and Resolve Convergence Problemsというサイトにおいて,収束の判断機能について説明されている。NumPyroを使う場合でも,これらの観点は役立つと考えられる。
mc-stan.org
