『AI・データ分析モデルのレシピ』のpystan部分を修正して動かす

## pystan ライブラリがない？？？
書籍『[AI・データ分析モデルのレシピ](https://www.ohmsha.co.jp/book/9784274227240/)』は Python 上で動く各種機械学習モデルについてサンプルデータを用いながら解説している。
第3章で pystan を用いた重回帰分析を行っているが、公式サイトが提供しているJupyterファイルを Google Colab 上で動かしても pystan が見つからないとエラーになってしまう。
![pystan1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/61c54e04-14cb-30e8-6de2-36cf15e2a15c.png)

公式サイトの正誤表には何ら記載が無く、サポートも期待できない（初版2021年6月であり、3年半もサポートすることは難しいか）。
![pystan2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/694f6fbd-6a44-dac9-c26c-805d6104cbb5.png)
ということで、ネットの情報をもとにコードを修正して動かせないか試すことにした。

## ライブラリ名は stan に変更、エラー回避も必要
まずライブラリが見つからない件は、ライブラリ名の変更が理由だとわかった。

https://toeming.hatenablog.com/entry/2022/08/28/pystan_import_error

インストールするモジュールは pystan であるが、 import するライブラリ名は stan に変わってしまった。
（ちなみに pystan は Google Colab に最初からインストールされなくなったようなので、 `!pip install pystan` で手動インストールが必要である。）

関数も変わっており、 `pystan.stan` を `stan.stan` に変更しても動かない。
![pystan3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/52e0a757-a338-51f1-628a-7814fed5d1ac.png)


[pystan Getting Start](https://pystan.readthedocs.io/en/latest/getting_started.html) を参考に
```python:
fit = pystan.stan(model_code=model, data=dat, seed=12345)
```
をいったん
```python:
fit = stan.build(model, data=dat, random_seed=12345)
```
に修正する。

しかし、
![pystan4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/24eef0dd-7862-2c93-fdd9-550a83b87b45.png)

`asyncio.run()` でエラーが発生してしまうので、

https://qiita.com/msx222/items/37da015a06758a05c990

を参考に
```python:
import nest_asyncio
nest_asyncio.apply()
```
を付け加える。
![pystan5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/2ffc3a74-a734-5cde-2b80-150eb9ac127b.png)

## stan 関数→build + sample
これでエラーは発生しないように見えるが、それ以降の arviz によるサンプリング結果の可視化が全く動かない。
![pystan6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/fc510b4e-4f3f-89e4-a9e0-e2fe2e1dd04a.png)

さらにネットの情報を探すと、以下のページが見つかった。

http://y-okamoto-psy1949.la.coocan.jp/Python/sampleprgs/OneVarStanPS3/

このページのソースコードによると、モデルの実行は
```python:
sm = stan.build(model, data=dat, random_seed=12345)
fit = sm.sample()
```
というように、モデル作成とサンプリングの2つに分けてやらないといけないようだ（おそらく前者はpystan.stanModel関数に相当するのだろう）。
![pystan7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/220a5c75-cf8f-e5ba-e7e6-c1f43f6ab65a.png)

## 要約統計量の出力も print だけではダメ
これで arviz によるサンプリングの可視化はできるようになった。
![pystan8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/9a12f89b-b968-8cc4-1dca-24b2f0dd5ff5.png)
が、今度は最後の各種統計量が表示されない。
![pystan9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/ab9fdf10-5bf6-8d5f-1e4e-0ea917941172.png)

「Stan (PyStan 3) 事始め」のページを再度参照し、 arviz を使って
```python:
print(fit)
```
を
```python:
i_data = arviz.from_pystan(posterior = fit, posterior_model = sm)
smry = arviz.summary(i_data)
print('Summary =\n',smry)
```
に変更。
![pystan10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/c89e22cc-4fd8-98b8-87fb-1dde1a3c604e.png)

これで無事統計量も表示できた。

なお、表示される要素が `print(fit)` の結果（以下参照）と若干異なるため、同一の要素を表示したい場合は arviz のドキュメントを参照する等、さらに調べる必要がある。
![pystan11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/2af4c299-a559-c350-c5db-4bc644c42f03.png)