├── .gitignore ├── ERRATA.md ├── LICENSE ├── README.md └── python ├── dollaryen.csv ├── electricity.csv ├── pybayes_beta_distribution.py ├── pybayes_beta_prior.py ├── pybayes_conjugate_bernoulli.py ├── pybayes_conjugate_gaussian.py ├── pybayes_conjugate_poisson.py ├── pybayes_conjugate_regression.py ├── pybayes_gaussian_distribution.py ├── pybayes_gibbs_gaussian.py ├── pybayes_gibbs_regression.py ├── pybayes_invgamma_t.py ├── pybayes_mcmc_ar1.py ├── pybayes_mcmc_decomp.py ├── pybayes_mcmc_logit.py ├── pybayes_mcmc_poisson.py ├── pybayes_mcmc_probit.py ├── pybayes_mcmc_reg_ex1.py ├── pybayes_mcmc_reg_ex2.py ├── pybayes_mcmc_reg_ex3.py ├── pybayes_mcmc_reg_ex4.py ├── pybayes_mcmc_sv.py ├── pybayes_poisson_gamma.py ├── pybayes_posterior_inference.py ├── pybayes_timeseries_data.py └── pymc3 ├── pybayes_mcmc_ar1.py ├── pybayes_mcmc_decomp.py ├── pybayes_mcmc_logit.py ├── pybayes_mcmc_poisson.py ├── pybayes_mcmc_probit.py ├── pybayes_mcmc_reg_ex1.py ├── pybayes_mcmc_reg_ex2.py ├── pybayes_mcmc_reg_ex3.py ├── pybayes_mcmc_reg_ex4.py └── pybayes_mcmc_sv.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Mac 2 | .DS_Store 3 | .AppleDouble 4 | .LSOverride 5 | 6 | # Icon must end with two \r 7 | Icon 8 | 9 | # Thumbnails 10 | ._* 11 | 12 | # Files that might appear on external disk 13 | .Spotlight-V100 14 | .Trashes 15 | 16 | # Directories potentially created on remote AFP share 17 | .AppleDB 18 | .AppleDesktop 19 | Network Trash Folder 20 | Temporary Items 21 | .apdisk 22 | 23 | # Windows thumbnail cache files 24 | Thumbs.db 25 | ehthumbs.db 26 | ehthumbs_vista.db 27 | 28 | # Dump file 29 | *.stackdump 30 | 31 | # Folder config file 32 | [Dd]esktop.ini 33 | 34 | # Recycle Bin used on file shares 35 | $RECYCLE.BIN/ 36 | 37 | # Windows Installer files 38 | *.cab 39 | *.msi 40 | *.msm 41 | *.msp 42 | 43 | # Windows shortcuts 44 | *.lnk 45 | 46 | # PyCharm 47 | .idea/ 48 | 49 | # Jupyter Notebook 50 | # *.ipynb 51 | .ipynb_checkpoints/ 52 | 53 | # Windows default autosave extension 54 | *.asv 55 | 56 | # OSX / *nix default autosave extension 57 | *.m~ 58 | 59 | # Compiled MEX binaries (all platforms) 60 | *.mex* 61 | 62 | # Packaged app and toolbox files 63 | *.mlappinstall 64 | *.mltbx 65 | 66 | # Generated helpsearch folders 67 | helpsearch*/ 68 | 69 | # Simulink code generation folders 70 | slprj/ 71 | sccprj/ 72 | 73 | # Simulink autosave extension 74 | *.autosave 75 | 76 | # Octave session info 77 | octave-workspace 78 | 79 | ## Core latex/pdflatex auxiliary files: 80 | *.aux 81 | *.lof 82 | *.log 83 | *.lot 84 | *.fls 85 | *.out 86 | *.toc 87 | *.fmt 88 | *.fot 89 | *.cb 90 | *.cb2 91 | 92 | ## Intermediate documents: 93 | *.dvi 94 | *-converted-to.* 95 | # these rules might exclude image files for figures etc. 96 | # *.ps 97 | # *.eps 98 | # *.pdf 99 | 100 | ## Generated if empty string is given at "Please type another file name for output:" 101 | .pdf 102 | 103 | ## Bibliography auxiliary files (bibtex/biblatex/biber): 104 | *.bbl 105 | *.bcf 106 | *.blg 107 | *-blx.aux 108 | *-blx.bib 109 | *.run.xml 110 | 111 | ## Build tool auxiliary files: 112 | *.fdb_latexmk 113 | *.synctex 114 | *.synctex(busy) 115 | *.synctex.gz 116 | *.synctex.gz(busy) 117 | *.pdfsync 118 | 119 | ## Auxiliary and intermediate files from other packages: 120 | # algorithms 121 | *.alg 122 | *.loa 123 | 124 | # achemso 125 | acs-*.bib 126 | 127 | # amsthm 128 | *.thm 129 | 130 | # beamer 131 | *.nav 132 | *.pre 133 | *.snm 134 | *.vrb 135 | 136 | # changes 137 | *.soc 138 | 139 | # cprotect 140 | *.cpt 141 | 142 | # elsarticle (documentclass of Elsevier journals) 143 | *.spl 144 | 145 | # endnotes 146 | *.ent 147 | 148 | # fixme 149 | *.lox 150 | 151 | # feynmf/feynmp 152 | *.mf 153 | *.mp 154 | *.t[1-9] 155 | *.t[1-9][0-9] 156 | *.tfm 157 | 158 | #(r)(e)ledmac/(r)(e)ledpar 159 | *.end 160 | *.?end 161 | *.[1-9] 162 | *.[1-9][0-9] 163 | *.[1-9][0-9][0-9] 164 | *.[1-9]R 165 | *.[1-9][0-9]R 166 | *.[1-9][0-9][0-9]R 167 | *.eledsec[1-9] 168 | *.eledsec[1-9]R 169 | *.eledsec[1-9][0-9] 170 | *.eledsec[1-9][0-9]R 171 | *.eledsec[1-9][0-9][0-9] 172 | *.eledsec[1-9][0-9][0-9]R 173 | 174 | # glossaries 175 | *.acn 176 | *.acr 177 | *.glg 178 | *.glo 179 | *.gls 180 | *.glsdefs 181 | 182 | # gnuplottex 183 | *-gnuplottex-* 184 | 185 | # gregoriotex 186 | *.gaux 187 | *.gtex 188 | 189 | # hyperref 190 | *.brf 191 | 192 | # knitr 193 | *-concordance.tex 194 | # TODO Comment the next line if you want to keep your tikz graphics files 195 | *.tikz 196 | *-tikzDictionary 197 | 198 | # listings 199 | *.lol 200 | 201 | # makeidx 202 | *.idx 203 | *.ilg 204 | *.ind 205 | *.ist 206 | 207 | # minitoc 208 | *.maf 209 | *.mlf 210 | *.mlt 211 | *.mtc[0-9]* 212 | *.slf[0-9]* 213 | *.slt[0-9]* 214 | *.stc[0-9]* 215 | 216 | # minted 217 | _minted* 218 | *.pyg 219 | 220 | # morewrites 221 | *.mw 222 | 223 | # nomencl 224 | *.nlo 225 | 226 | # pax 227 | *.pax 228 | 229 | # pdfpcnotes 230 | *.pdfpc 231 | 232 | # sagetex 233 | *.sagetex.sage 234 | *.sagetex.py 235 | *.sagetex.scmd 236 | 237 | # scrwfile 238 | *.wrt 239 | 240 | # sympy 241 | *.sout 242 | *.sympy 243 | sympy-plots-for-*.tex/ 244 | 245 | # pdfcomment 246 | *.upa 247 | *.upb 248 | 249 | # pythontex 250 | *.pytxcode 251 | pythontex-files-*/ 252 | 253 | # thmtools 254 | *.loe 255 | 256 | # TikZ & PGF 257 | *.dpth 258 | *.md5 259 | *.auxlock 260 | 261 | # todonotes 262 | *.tdo 263 | 264 | # easy-todo 265 | *.lod 266 | 267 | # xindy 268 | *.xdy 269 | 270 | # xypic precompiled matrices 271 | *.xyc 272 | 273 | # endfloat 274 | *.ttt 275 | *.fff 276 | 277 | # Latexian 278 | TSWLatexianTemp* 279 | 280 | ## Editors: 281 | # WinEdt 282 | *.bak 283 | *.sav 284 | 285 | # Texpad 286 | .texpadtmp/ 287 | 288 | # Kile 289 | *.backup 290 | 291 | # KBibTeX 292 | *~[0-9]* 293 | 294 | # auto folder when using emacs and auctex 295 | /auto/* 296 | 297 | # expex forward references with \gathertags 298 | *-tags.tex 299 | 300 | # Visual Studio Code 301 | .vscode/ 302 | 303 | # graphics 304 | *.png 305 | -------------------------------------------------------------------------------- /ERRATA.md: -------------------------------------------------------------------------------- 1 | # 「Pythonによるベイズ統計学入門」正誤表 2 | 3 | ## 2023年8月1日改定 4 | 5 | ### PyMCの仕様変更に伴う修正 6 | 7 | #### ArviZの必須化 8 | 9 | バージョン3.11より,記述統計や作図に関連する関数はPyMCから[ArviZ](https://arviz-devs.github.io/arviz/index.html)に移された.そのためArviZを 10 | 11 | ```IPython 12 | import arviz as az 13 | ``` 14 | 15 | と読み込み,ArviZの関数を呼び出す必要が生じる. 16 | 17 | #### 111ページ 18 | 19 | + `pm.traceplot()`の代わりに`az.plot_trace()`を,`pm.plot_posterior()`の代わりに`az.plot_posterior()`を使わなければならない. 20 | + さらに,`pm.traceplot()`(つまり`az.plot_trace()`)はオプション`ax`を受け付けなくなった.したがって,最初の`plt.subplots()`の部分を削除し,続く`pm.traceplot()`内の`ax=ax1`も削除しなければならない. 21 | + また,`pm.plot_posterior()`(つまり`az.plot_posterior()`)もオプション`kde_plot`を無視するようになった.デフォルトでは滑らかなカーネル推定が描かれるが(`kind='kde'`),ヒストグラムを描く際には引数に`kind='hist'`を指定しなければならない. 22 | 23 | #### コード6.1`pybayes_gibbs_gaussian.py`とコード6.2`pybayes_gibbs_regression.py`において 24 | 25 | + `pm.mc_error()`を`az.mcse()`へ 26 | + `pm.hpd()`を`az.hdi()`へ 27 | + `pm.gelman_rubin()`を`az.rhat()`へ 28 | 29 | と置き換える.そして、`pm.hpd()`(つまり`az.hdi()`)内の`1.0 - prob`を`prob`に変更する.さらに`az.mcse()`は`pm.mc_error()`から用法も変更されているので注意. 30 | 31 | ### 誤植 32 | 33 | #### 1ページ、下から11行目 34 | 35 | + (誤)集めれられた 36 | + (正)集められた 37 | 38 | #### 12ページ、図2.1の凡例 39 | 40 | + (誤)一様分布 ($\alpha = 1$, $\beta = 1$) 41 | + (正)一様分布 ($a = 1$, $b = 1$) 42 | 43 | #### 13ページと20ページ、Pythonコード2.1の28行目と本文中でこれに言及している部分 44 | 45 | + (誤)`$\\alpha$ = 1, $\\beta$ = 1` 46 | + (正)`a = 1, b = 1` 47 | 48 | #### 28ページ、(2.9)式の直後の行 49 | 50 | + (誤)つまり,$p(D|q)$はデータ$D$が観測される平均的な可能性と解釈される. 51 | + (正)つまり,$p(D)$はデータ$D$が観測される平均的な可能性と解釈される. 52 | 53 | #### 54ページ、(2.38)式の下の2つの式 54 | 55 | + (誤) 56 | 57 | $$\nabla_\delta R(\delta^*|D) = 2P(\delta^*|\mathbf{x}) - 1 = 0,\quad\nabla_\delta^2 R(\delta^*|D) = 2p(\delta^*|\mathbf{x}) > 0,$$ 58 | 59 | $$P(\delta^*|\mathbf{x}) = \frac12,$$ 60 | 61 | + (正) 62 | 63 | $$\nabla_\delta R(\delta^*|D) = 2P(\delta^*|D) - 1 = 0,\quad\nabla_\delta^2 R(\delta^*|D) = 2p(\delta^*|D) > 0,$$ 64 | 65 | $$P(\delta^*|D) = \frac12,$$ 66 | 67 | #### 55ページ、最後の2つの式 68 | 69 | + (誤) 70 | 71 | $$\Pr\{q=q_0|D\}= \frac{q_0 p(D|q_0)}{q_0 p(D|q_0)+(1-q_0)\int_0^1p(D|q)f(q)dq}, \\ \Pr\{q\ne q_0|D\} = \frac{(1-q_0)\int_0^1 p(D|q)f(q)dq}{q_0 p(D|q_0)+(1-q_0)\int_0^1p(D|q)f(q)dq},$$ 72 | 73 | + (正) 74 | 75 | $$\Pr\{q=q_0|D\} = \frac{p_0 p(D|q_0)}{p_0 p(D|q_0)+(1-p_0)\int_0^1p(D|q)f(q)dq}, \\ \Pr\{q\ne q_0|D\} = \frac{(1-p_0)\int_0^1 p(D|q)f(q)dq}{p_0 p(D|q_0)+(1-p_0)\int_0^1p(D|q)f(q)dq},$$ 76 | 77 | #### 56ページ、(2.43)式 78 | 79 | + (誤) 80 | 81 | $$\frac{\Pr\{q=q_0|D\}}{\Pr\{q\ne q_0|D\}} = \frac{q_0}{1-q_0} \times \frac{p(D|q_0)}{\int_0^1 p(D|q)f(q)dq},$$ 82 | 83 | + (正) 84 | 85 | $$\frac{\Pr\{q=q_0|D\}}{\Pr\{q\ne q_0|D\}} = \frac{p_0}{1-p_0} \times \frac{p(D|q_0)}{\int_0^1 p(D|q)f(q)dq},$$ 86 | 87 | 88 | #### 61ページ、(3.6)式の右辺の2行目 89 | 90 | + (誤)$x^{\alpha_0-1}$ 91 | + (正)$\lambda^{\alpha_0-1}$ 92 | 93 | #### 69ページ、(3.17)式の右側の逆ガンマ分布 94 | 95 | + (誤)$\sigma^2\sim$ 96 | + (正)$\sigma^2|D\sim$ 97 | 98 | #### コード3.3 pybayes\_conjugate\_regression.py 第79行 99 | 100 | + (誤)`nu_star = n + nu0` 101 | + (正)`nu_star = y.size + nu0` 102 | 103 | #### 86ページ、iPythonでのコマンド実行の説明箇所で`In [2]:`で始まる行 104 | 105 | + (誤)`scale=h_star` 106 | + (正)`scale=h` 107 | 108 | #### 120ページ、上から5行目 109 | 110 | + (誤)(4.2) 式のコーシー分布を 111 | + (正)(4.23) 式のコーシー分布を 112 | 113 | #### 138ページ、上から3行目 114 | 115 | + (誤)Kitagawand Gersch (1984) 116 | + (正)Kitagawa and Gersch (1984) 117 | 118 | #### 176ページ、(6.8)式の2行目の積分内の関数 119 | 120 | + (誤)$f_t(x_{t-1})$ 121 | + (正)$f_{t-1}(x_{t-1})$ 122 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Teruo Nakatsuma 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 中妻照雄「Pythonによるベイズ統計学入門」 2 | 3 | [朝倉書店ウェブサイト](https://www.asakura.co.jp/books/isbn/978-4-254-12898-7/ "朝倉書店ウェブサイト") 4 | 5 | --- 6 | 7 | - [中妻照雄「Pythonによるベイズ統計学入門」](#中妻照雄pythonによるベイズ統計学入門) 8 | - [PyMC 4.0のリリースについて](#pymc-40のリリースについて) 9 | - [正誤表(2023年8月1日改定)](#正誤表2023年8月1日改定) 10 | - [PythonとPyMCのインストール手順](#pythonとpymcのインストール手順) 11 | - [ステップ1: Anacondaのインストール](#ステップ1-anacondaのインストール) 12 | - [ステップ2: PyMCを実行する環境の設定](#ステップ2-pymcを実行する環境の設定) 13 | - [Jupyter Notebookを始める方法](#jupyter-notebookを始める方法) 14 | - [方法1: Anaconda NavigatorからJupyter Notebookを起動する方法](#方法1-anaconda-navigatorからjupyter-notebookを起動する方法) 15 | - [方法2: CLIから起動する方法](#方法2-cliから起動する方法) 16 | - [Pythonコード](#pythonコード) 17 | - [第2章](#第2章) 18 | - [第3章](#第3章) 19 | - [第4章](#第4章) 20 | - [第5章](#第5章) 21 | - [第6章](#第6章) 22 | 23 | --- 24 | 25 | ## PyMC 4.0のリリースについて 26 | 27 | + [公式発表(英語)](https://www.pymc.io/blog/v4_announcement.html) 28 | + PyMCは、バージョン4.0より名称が**PyMC3**から**PyMC**に戻る。そのためPyMC 4.0を`conda`でインストールするためには、`pymc3`ではなく`pymc`としなければならない。PyMCのインストール手順については、 [PythonとPyMCのインストール手順](#pythonとpymcのインストール手順)およびPyMCの[公式サイト](https://www.pymc.io/projects/docs/en/stable/installation.html)を参照のこと。 29 | + PyMC 4.0へのアップグレードにより、パッケージの仕様の一部が変更となった。それを反映させたPythonコードをレポジトリの`python`というフォルダに置いてある。 30 | + 同じ`python`の中の`pymc3`というフォルダ内にPyMC 3.11.5で動作するPythonコードがあるので、古いPyMC3を引き続き使用する人はこちらのコードを使って欲しい。なお`pymc3`に置かれているのは仕様変更の影響を受けるコードのみである。そうでない場合は親フォルダである`python`のコードがそのまま動く。 31 | 32 | ## 正誤表(2023年8月1日改定) 33 | 34 | + [ERRATA.md](ERRATA.md) 35 | 36 | ## PythonとPyMCのインストール手順 37 | 38 | ### ステップ1: Anacondaのインストール 39 | 40 | 1. 古いAnacondaがインストールされているときは、この[手順](https://docs.anaconda.com/anaconda/install/uninstall/)でアンインストールしておく。 41 | 42 | 2. Anacondaのインストーラー (Windows, macOS or Linux) を[ここ](https://www.anaconda.com/products/distribution)から入手する. 43 | 44 | 3. ダウンロードしたインストーラーをダブルクリックして Anacondaのインストールを行う。 45 | 46 | ### ステップ2: PyMCを実行する環境の設定 47 | 48 | `Anaconda Powershell Prompt` (Windows) あるいは`Terminal` (macos, Linux) を立ち上げて、 49 | 50 | ```IPython 51 | conda create -c conda-forge -n bayes jupyterlab seaborn tqdm pymc 52 | ``` 53 | 54 | とする。続けて 55 | 56 | ```IPython 57 | conda activate bayes 58 | ``` 59 | 60 | として、最後に 61 | 62 | ```IPython 63 | python -m ipykernel install --user --name bayes --display-name "Python (Bayes)" 64 | ``` 65 | 66 | とすれば、環境の設定が完了する。 67 | 68 | --- 69 | 70 | ## Jupyter Notebookを始める方法 71 | 72 | ### 方法1: Anaconda NavigatorからJupyter Notebookを起動する方法 73 | 74 | `Anaconda Navigator`を`Start Menu` (Windows) か `Launchpad` (macOS) から起動する。 あるいは、`Anaconda Powershell Prompt` (Windows) か `Terminal` (macOS, Linux) を立ち上げて、 75 | 76 | ```IPython 77 | anaconda-navigator 78 | ``` 79 | 80 | としてもよい。そして、`Anaconda Navigator`で`Jupyter Notebook`の`Launch`ボタンをクリックする。 81 | 82 | ### 方法2: CLIから起動する方法 83 | 84 | `Anaconda Powershell Prompt` (Windows) か `Terminal` (macOS, Linux) を立ち上げて、 85 | 86 | ```IPython 87 | conda activate bayes 88 | jupyter notebook 89 | ``` 90 | 91 | とする。 92 | 93 | 方法1あるいは方法2を実行すると、規定のブラウザーが立ち上がり、Jupyter Notebookが起動する。その画面の右上にある`New`のプルダウンメニューの中にある`Python (Bayes)`を選んでNotebookを開始すればよい。 94 | 95 | **注意:** `New`のプルダウンメニューの中にある`Python 3`を選んでNotebookを開始すると、PyMCを使用することができない。 96 | 97 | ## Pythonコード 98 | 99 | ### 第2章 100 | 101 | + コード2.1 ベルヌーイ分布の成功確率の事前分布: [pybayes\_beta\_prior.py](python/pybayes_beta_prior.py) 102 | + コード2.2 ベータ分布のグラフ: [pybayes\_beta\_distribution.py](python/pybayes_beta_distribution.py) 103 | + コード2.3 ベルヌーイ分布の成功確率の事後分布と事後統計量: [pybayes\_conjugate\_bernoulli.py](python/pybayes_conjugate_bernoulli.py) 104 | + コード2.4 損失関数と区間推定の図示: [pybayes\_posterior\_inference.py](python/pybayes_posterior_inference.py) 105 | 106 | ### 第3章 107 | 108 | + コード3.1 ポアソン分布のλの事後分布と事後統計量: [pybayes\_conjugate\_poisson.py](python/pybayes_conjugate_poisson.py) 109 | + コード3.2 正規分布の平均と分散の事後分布と事後統計量: [pybayes\_conjugate\_gaussian.py](python/pybayes_conjugate_gaussian.py) 110 | + コード3.3 回帰係数と誤差項の分散の事後分布と事後統計量: [pybayes\_conjugate\_regression.py](python/pybayes_conjugate_regression.py) 111 | + コード3.4 ポアソン分布とガンマ分布の例: [pybayes\_poisson\_gamma.py](python/pybayes_poisson_gamma.py) 112 | + コード3.5 正規分布の例: [pybayes\_gaussian\_distribution.py](python/pybayes_gaussian_distribution.py) 113 | + コード3.6 逆ガンマ分布とt分布の例: [pybayes\_invgamma\_t.py](python/pybayes_invgamma_t.py) 114 | 115 | ### 第4章 116 | 117 | **注意** バージョン3.9以降のPyMCでは、以下のコードはJupyter Notebook上でのみ実行可能となっている。そのためコード全体をJupyter Notebook内のセルにコピーして実行しなければならない。 118 | 119 | + コード4.1 回帰モデルのベイズ分析(自然共役事前分布): [pybayes\_mcmc\_reg\_ex1.py](python/pybayes_mcmc_reg_ex1.py) 120 | + コード4.2 回帰モデルのベイズ分析(正規分布 + 逆ガンマ分布): [pybayes\_mcmc\_reg\_ex2.py](python/pybayes_mcmc_reg_ex2.py) 121 | + コード4.3 回帰モデルのベイズ分析(重回帰モデル): [pybayes\_mcmc\_reg\_ex3.py](python/pybayes_mcmc_reg_ex3.py) 122 | + コード4.4 回帰モデルのベイズ分析(ラプラス分布 + 半コーシー分布): [pybayes\_mcmc\_reg\_ex4.py](python/pybayes_mcmc_reg_ex4.py) 123 | + コード4.5 ロジット・モデルのベイズ分析: [pybayes\_mcmc\_logit.py](python/pybayes_mcmc_logit.py) 124 | + コード4.6 プロビット・モデルのベイズ分析: [pybayes\_mcmc\_probit.py](python/pybayes_mcmc_probit.py) 125 | + コード4.7 ポアソン回帰モデルのベイズ分析: [pybayes\_mcmc\_poisson.py](python/pybayes_mcmc_poisson.py) 126 | 127 | ### 第5章 128 | 129 | **注意** バージョン3.9以降のPyMCでは、コード5.1-5.3はJupyter Notebook上でのみ実行可能となっている。そのためコード全体をJupyter Notebook内のセルにコピーして実行しなければならない。 130 | 131 | + コード5.1 ノイズを含むAR(1)過程: [pybayes\_mcmc\_ar1.py](python/pybayes_mcmc_ar1.py) 132 | + コード5.2 使用電力量のトレンドと季節変動: [pybayes\_mcmc\_decomp.py](python/pybayes_mcmc_decomp.py) 133 | + コード5.3 確率的ボラティリティ・モデル: [pybayes\_mcmc\_sv.py](python/pybayes_mcmc_sv.py) 134 | + コード5.4 時系列データのプロット: [pybayes\_timeseries\_data.py](python/pybayes_timeseries_data.py) 135 | + ドル円為替レート日次データ: [dollaryen.csv](python/dollaryen.csv) 136 | + 電灯電力需要実績月報・用途別使用電力量・販売電力合計・10社計: [electricity.csv](python/electricity.csv) 137 | 138 | ### 第6章 139 | 140 | + コード6.1 正規分布に対するギブズ・サンプラー: [pybayes\_gibbs\_gaussian.py](python/pybayes_gibbs_gaussian.py) 141 | + コード6.2 回帰モデルに対するギブズ・サンプラー: [pybayes\_gibbs\_regression.py](python/pybayes_gibbs_regression.py) 142 | -------------------------------------------------------------------------------- /python/dollaryen.csv: -------------------------------------------------------------------------------- 1 | ,JPY/USD 2 | 2014/1/2,104.86 3 | 2014/1/3,104.47 4 | 2014/1/6,104.4 5 | 2014/1/7,104.6 6 | 2014/1/8,104.89 7 | 2014/1/9,104.74 8 | 2014/1/10,104.07 9 | 2014/1/13,103.32 10 | 2014/1/14,103.84 11 | 2014/1/15,104.42 12 | 2014/1/16,104.36 13 | 2014/1/17,104.29 14 | 2014/1/20,104.2 15 | 2014/1/21,104.2 16 | 2014/1/22,104.33 17 | 2014/1/23,103.63 18 | 2014/1/24,102.43 19 | 2014/1/27,102.29 20 | 2014/1/28,102.84 21 | 2014/1/29,102.18 22 | 2014/1/30,102.86 23 | 2014/1/31,102.29 24 | 2014/2/3,101.15 25 | 2014/2/4,101.61 26 | 2014/2/5,101.38 27 | 2014/2/6,101.9 28 | 2014/2/7,102.3 29 | 2014/2/10,102.11 30 | 2014/2/11,102.65 31 | 2014/2/12,102.45 32 | 2014/2/13,102.23 33 | 2014/2/14,101.86 34 | 2014/2/18,102.27 35 | 2014/2/19,102.27 36 | 2014/2/20,102.34 37 | 2014/2/21,102.75 38 | 2014/2/24,102.48 39 | 2014/2/25,102.16 40 | 2014/2/26,102.37 41 | 2014/2/27,102.11 42 | 2014/2/28,102.07 43 | 2014/3/3,101.39 44 | 2014/3/4,102.15 45 | 2014/3/5,102.32 46 | 2014/3/6,103.06 47 | 2014/3/7,103.35 48 | 2014/3/10,103.21 49 | 2014/3/11,103.21 50 | 2014/3/12,102.69 51 | 2014/3/13,102.1 52 | 2014/3/14,101.44 53 | 2014/3/17,101.67 54 | 2014/3/18,101.33 55 | 2014/3/19,101.53 56 | 2014/3/20,102.37 57 | 2014/3/21,102.42 58 | 2014/3/24,102.25 59 | 2014/3/25,102.34 60 | 2014/3/26,102.32 61 | 2014/3/27,102.1 62 | 2014/3/28,102.92 63 | 2014/3/31,103.01 64 | 2014/4/1,103.54 65 | 2014/4/2,103.77 66 | 2014/4/3,103.91 67 | 2014/4/4,103.37 68 | 2014/4/7,103.01 69 | 2014/4/8,102.07 70 | 2014/4/9,101.9 71 | 2014/4/10,101.41 72 | 2014/4/11,101.58 73 | 2014/4/14,101.86 74 | 2014/4/15,101.58 75 | 2014/4/16,102.3 76 | 2014/4/17,102.21 77 | 2014/4/21,102.62 78 | 2014/4/22,102.57 79 | 2014/4/23,102.24 80 | 2014/4/24,102.39 81 | 2014/4/25,102.15 82 | 2014/4/28,102.44 83 | 2014/4/29,102.55 84 | 2014/4/30,102.12 85 | 2014/5/1,102.29 86 | 2014/5/2,102.36 87 | 2014/5/5,102.1 88 | 2014/5/6,101.59 89 | 2014/5/7,101.74 90 | 2014/5/8,101.67 91 | 2014/5/9,101.77 92 | 2014/5/12,102.13 93 | 2014/5/13,102.18 94 | 2014/5/14,101.75 95 | 2014/5/15,101.46 96 | 2014/5/16,101.51 97 | 2014/5/20,101.31 98 | 2014/5/21,101.42 99 | 2014/5/22,101.76 100 | 2014/5/23,101.87 101 | 2014/5/26,101.92 102 | 2014/5/27,102.15 103 | 2014/5/28,101.75 104 | 2014/5/29,101.57 105 | 2014/5/30,101.75 106 | 2014/6/2,102.3 107 | 2014/6/3,102.39 108 | 2014/6/4,102.69 109 | 2014/6/5,102.47 110 | 2014/6/6,102.49 111 | 2014/6/9,102.54 112 | 2014/6/10,102.39 113 | 2014/6/11,101.94 114 | 2014/6/12,101.79 115 | 2014/6/13,102.05 116 | 2014/6/16,101.78 117 | 2014/6/17,102.18 118 | 2014/6/18,102.16 119 | 2014/6/19,101.86 120 | 2014/6/20,102.14 121 | 2014/6/23,101.91 122 | 2014/6/24,102.09 123 | 2014/6/25,101.72 124 | 2014/6/26,101.68 125 | 2014/6/27,101.39 126 | 2014/6/30,101.29 127 | 2014/7/2,101.78 128 | 2014/7/3,102.15 129 | 2014/7/4,102.1 130 | 2014/7/7,101.83 131 | 2014/7/8,101.56 132 | 2014/7/9,101.72 133 | 2014/7/10,101.31 134 | 2014/7/11,101.32 135 | 2014/7/14,101.53 136 | 2014/7/15,101.66 137 | 2014/7/16,101.7 138 | 2014/7/17,101.25 139 | 2014/7/18,101.39 140 | 2014/7/21,101.39 141 | 2014/7/22,101.56 142 | 2014/7/23,101.52 143 | 2014/7/24,101.82 144 | 2014/7/25,101.83 145 | 2014/7/28,101.8 146 | 2014/7/29,102.08 147 | 2014/7/30,102.92 148 | 2014/7/31,102.74 149 | 2014/8/1,102.43 150 | 2014/8/5,102.81 151 | 2014/8/6,102.3 152 | 2014/8/7,102.07 153 | 2014/8/8,101.87 154 | 2014/8/11,102.1 155 | 2014/8/12,102.18 156 | 2014/8/13,102.52 157 | 2014/8/14,102.45 158 | 2014/8/15,102.25 159 | 2014/8/18,102.53 160 | 2014/8/19,102.81 161 | 2014/8/20,103.34 162 | 2014/8/21,103.77 163 | 2014/8/22,103.99 164 | 2014/8/25,103.98 165 | 2014/8/26,104.1 166 | 2014/8/27,104.02 167 | 2014/8/28,103.8 168 | 2014/8/29,104 169 | 2014/9/2,105.15 170 | 2014/9/3,104.85 171 | 2014/9/4,105.26 172 | 2014/9/5,104.91 173 | 2014/9/8,105.63 174 | 2014/9/9,106.29 175 | 2014/9/10,106.77 176 | 2014/9/11,106.9 177 | 2014/9/12,107.22 178 | 2014/9/15,107.19 179 | 2014/9/16,106.91 180 | 2014/9/17,107.58 181 | 2014/9/18,108.7 182 | 2014/9/19,108.93 183 | 2014/9/22,108.88 184 | 2014/9/23,108.86 185 | 2014/9/24,108.94 186 | 2014/9/25,108.67 187 | 2014/9/26,109.34 188 | 2014/9/29,109.37 189 | 2014/9/30,109.67 190 | 2014/10/1,109.31 191 | 2014/10/2,108.16 192 | 2014/10/3,109.71 193 | 2014/10/6,109.13 194 | 2014/10/7,108.35 195 | 2014/10/8,108.35 196 | 2014/10/9,108.03 197 | 2014/10/10,107.89 198 | 2014/10/14,107.11 199 | 2014/10/15,106.1 200 | 2014/10/16,105.98 201 | 2014/10/17,106.72 202 | 2014/10/20,106.89 203 | 2014/10/21,106.75 204 | 2014/10/22,107.36 205 | 2014/10/23,108.15 206 | 2014/10/24,108.03 207 | 2014/10/27,107.73 208 | 2014/10/28,108 209 | 2014/10/29,108.12 210 | 2014/10/30,108.99 211 | 2014/10/31,112.08 212 | 2014/11/3,113.93 213 | 2014/11/4,113.4 214 | 2014/11/5,114.63 215 | 2014/11/6,114.88 216 | 2014/11/7,114.74 217 | 2014/11/10,114.78 218 | 2014/11/12,115.43 219 | 2014/11/13,115.64 220 | 2014/11/14,116.53 221 | 2014/11/17,116.45 222 | 2014/11/18,116.76 223 | 2014/11/19,117.7 224 | 2014/11/20,118.14 225 | 2014/11/21,117.74 226 | 2014/11/24,118.4 227 | 2014/11/25,118 228 | 2014/11/26,117.61 229 | 2014/11/27,117.72 230 | 2014/11/28,118.71 231 | 2014/12/1,118.15 232 | 2014/12/2,119.11 233 | 2014/12/3,119.82 234 | 2014/12/4,119.67 235 | 2014/12/5,121.39 236 | 2014/12/8,120.9 237 | 2014/12/9,118.88 238 | 2014/12/10,118.51 239 | 2014/12/11,119.4 240 | 2014/12/12,118.23 241 | 2014/12/15,117.76 242 | 2014/12/16,117.31 243 | 2014/12/17,117.67 244 | 2014/12/18,118.84 245 | 2014/12/19,119.58 246 | 2014/12/22,119.85 247 | 2014/12/23,120.69 248 | 2014/12/24,120.46 249 | 2014/12/29,120.58 250 | 2014/12/30,119.36 251 | 2014/12/31,119.87 252 | 2015/1/2,120.21 253 | 2015/1/5,119.65 254 | 2015/1/6,118.22 255 | 2015/1/7,119.53 256 | 2015/1/8,119.52 257 | 2015/1/9,118.66 258 | 2015/1/12,118.35 259 | 2015/1/13,118.18 260 | 2015/1/14,116.78 261 | 2015/1/15,116.98 262 | 2015/1/16,117.51 263 | 2015/1/19,117.54 264 | 2015/1/20,118.48 265 | 2015/1/21,117.85 266 | 2015/1/22,117.93 267 | 2015/1/23,117.79 268 | 2015/1/26,118.43 269 | 2015/1/27,117.57 270 | 2015/1/28,117.8 271 | 2015/1/29,118.28 272 | 2015/1/30,117.42 273 | 2015/2/2,117.33 274 | 2015/2/3,117.51 275 | 2015/2/4,117.62 276 | 2015/2/5,117.41 277 | 2015/2/6,119.15 278 | 2015/2/9,118.67 279 | 2015/2/10,119.31 280 | 2015/2/11,120.33 281 | 2015/2/12,118.69 282 | 2015/2/13,118.68 283 | 2015/2/17,119.03 284 | 2015/2/18,119.19 285 | 2015/2/19,118.8 286 | 2015/2/20,118.65 287 | 2015/2/23,118.9 288 | 2015/2/24,119.12 289 | 2015/2/25,118.84 290 | 2015/2/26,119.41 291 | 2015/2/27,119.69 292 | 2015/3/2,120.07 293 | 2015/3/3,119.5 294 | 2015/3/4,119.73 295 | 2015/3/5,120.25 296 | 2015/3/6,120.96 297 | 2015/3/9,121.13 298 | 2015/3/10,121.24 299 | 2015/3/11,121.56 300 | 2015/3/12,121.33 301 | 2015/3/13,121.13 302 | 2015/3/16,121.34 303 | 2015/3/17,121.26 304 | 2015/3/18,120.94 305 | 2015/3/19,120.91 306 | 2015/3/20,120.3 307 | 2015/3/23,119.77 308 | 2015/3/24,119.95 309 | 2015/3/25,119.4 310 | 2015/3/26,119 311 | 2015/3/27,119.13 312 | 2015/3/30,120.16 313 | 2015/3/31,119.99 314 | 2015/4/1,119.66 315 | 2015/4/2,119.74 316 | 2015/4/6,119.04 317 | 2015/4/7,120.42 318 | 2015/4/8,119.92 319 | 2015/4/9,120.27 320 | 2015/4/10,120.3 321 | 2015/4/13,120.36 322 | 2015/4/14,119.29 323 | 2015/4/15,119.26 324 | 2015/4/16,119.2 325 | 2015/4/17,119.08 326 | 2015/4/20,119.3 327 | 2015/4/21,119.4 328 | 2015/4/22,119.86 329 | 2015/4/23,119.67 330 | 2015/4/24,118.92 331 | 2015/4/27,119.14 332 | 2015/4/28,118.78 333 | 2015/4/29,118.83 334 | 2015/4/30,119.87 335 | 2015/5/1,120.24 336 | 2015/5/4,120.27 337 | 2015/5/5,119.92 338 | 2015/5/6,119.37 339 | 2015/5/7,119.71 340 | 2015/5/8,119.8 341 | 2015/5/11,120.09 342 | 2015/5/12,119.75 343 | 2015/5/13,119.03 344 | 2015/5/14,119.2 345 | 2015/5/15,119.38 346 | 2015/5/19,120.54 347 | 2015/5/20,121.27 348 | 2015/5/21,121.04 349 | 2015/5/22,121.42 350 | 2015/5/25,121.46 351 | 2015/5/26,123.07 352 | 2015/5/27,123.74 353 | 2015/5/28,124.15 354 | 2015/5/29,124.03 355 | 2015/6/1,124.63 356 | 2015/6/2,124.23 357 | 2015/6/3,124.11 358 | 2015/6/4,124.52 359 | 2015/6/5,125.59 360 | 2015/6/8,125.09 361 | 2015/6/9,124.16 362 | 2015/6/10,122.72 363 | 2015/6/11,123.63 364 | 2015/6/12,123.25 365 | 2015/6/15,123.39 366 | 2015/6/16,123.4 367 | 2015/6/17,124.25 368 | 2015/6/18,122.86 369 | 2015/6/19,122.67 370 | 2015/6/22,123.27 371 | 2015/6/23,123.72 372 | 2015/6/24,124.24 373 | 2015/6/25,123.64 374 | 2015/6/26,123.92 375 | 2015/6/29,122.47 376 | 2015/6/30,122.17 377 | 2015/7/2,123.2 378 | 2015/7/3,122.64 379 | 2015/7/6,122.58 380 | 2015/7/7,122.15 381 | 2015/7/8,120.59 382 | 2015/7/9,121.23 383 | 2015/7/10,122.73 384 | 2015/7/13,123.3 385 | 2015/7/14,123.41 386 | 2015/7/15,123.92 387 | 2015/7/16,124.06 388 | 2015/7/17,124.03 389 | 2015/7/20,124.23 390 | 2015/7/21,123.91 391 | 2015/7/22,124.06 392 | 2015/7/23,123.86 393 | 2015/7/24,123.79 394 | 2015/7/27,123.19 395 | 2015/7/28,123.53 396 | 2015/7/29,123.85 397 | 2015/7/30,124.41 398 | 2015/7/31,123.9 399 | 2015/8/4,124.05 400 | 2015/8/5,124.84 401 | 2015/8/6,124.55 402 | 2015/8/7,124.26 403 | 2015/8/10,124.58 404 | 2015/8/11,124.86 405 | 2015/8/12,123.91 406 | 2015/8/13,124.32 407 | 2015/8/14,124.32 408 | 2015/8/17,124.32 409 | 2015/8/18,124.39 410 | 2015/8/19,124.08 411 | 2015/8/20,123.51 412 | 2015/8/21,122.09 413 | 2015/8/24,118.72 414 | 2015/8/25,119.89 415 | 2015/8/26,119.1 416 | 2015/8/27,120.96 417 | 2015/8/28,121.29 418 | 2015/8/31,121.31 419 | 2015/9/1,119.92 420 | 2015/9/2,120.03 421 | 2015/9/3,120.21 422 | 2015/9/4,119.04 423 | 2015/9/8,119.74 424 | 2015/9/9,120.98 425 | 2015/9/10,120.72 426 | 2015/9/11,120.69 427 | 2015/9/14,119.87 428 | 2015/9/15,120.35 429 | 2015/9/16,120.57 430 | 2015/9/17,120.86 431 | 2015/9/18,119.84 432 | 2015/9/21,120.45 433 | 2015/9/22,120.05 434 | 2015/9/23,120.06 435 | 2015/9/24,119.53 436 | 2015/9/25,120.7 437 | 2015/9/28,119.83 438 | 2015/9/29,119.76 439 | 2015/9/30,119.8 440 | 2015/10/1,119.62 441 | 2015/10/2,119.37 442 | 2015/10/5,120.38 443 | 2015/10/6,120.22 444 | 2015/10/7,119.93 445 | 2015/10/8,119.98 446 | 2015/10/9,120.32 447 | 2015/10/13,119.8 448 | 2015/10/14,119.21 449 | 2015/10/15,118.28 450 | 2015/10/16,119.64 451 | 2015/10/19,119.47 452 | 2015/10/20,119.8 453 | 2015/10/21,119.89 454 | 2015/10/22,120.52 455 | 2015/10/23,121.18 456 | 2015/10/26,120.83 457 | 2015/10/27,120.26 458 | 2015/10/28,120.62 459 | 2015/10/29,121.16 460 | 2015/10/30,120.69 461 | 2015/11/2,120.69 462 | 2015/11/3,121.24 463 | 2015/11/4,121.55 464 | 2015/11/5,121.69 465 | 2015/11/6,123.22 466 | 2015/11/9,123.03 467 | 2015/11/10,123.22 468 | 2015/11/12,122.87 469 | 2015/11/13,122.88 470 | 2015/11/16,123.07 471 | 2015/11/17,123.48 472 | 2015/11/18,123.52 473 | 2015/11/19,122.73 474 | 2015/11/20,122.82 475 | 2015/11/23,122.99 476 | 2015/11/24,122.43 477 | 2015/11/25,122.7 478 | 2015/11/26,122.58 479 | 2015/11/27,122.79 480 | 2015/11/30,123.23 481 | 2015/12/1,122.9 482 | 2015/12/2,123.47 483 | 2015/12/3,123.11 484 | 2015/12/4,123.07 485 | 2015/12/7,123.36 486 | 2015/12/8,123.01 487 | 2015/12/9,121.82 488 | 2015/12/10,121.42 489 | 2015/12/11,120.99 490 | 2015/12/14,120.57 491 | 2015/12/15,121.7 492 | 2015/12/16,121.84 493 | 2015/12/17,122.76 494 | 2015/12/18,121.24 495 | 2015/12/21,121.02 496 | 2015/12/22,120.91 497 | 2015/12/23,120.94 498 | 2015/12/24,120.29 499 | 2015/12/29,120.43 500 | 2015/12/30,120.63 501 | 2015/12/31,120.24 502 | 2016/1/4,119.29 503 | 2016/1/5,118.99 504 | 2016/1/6,118.55 505 | 2016/1/7,117.96 506 | 2016/1/8,117.73 507 | 2016/1/11,117.49 508 | 2016/1/12,117.82 509 | 2016/1/13,118.03 510 | 2016/1/14,118 511 | 2016/1/15,116.78 512 | 2016/1/18,117.37 513 | 2016/1/19,117.71 514 | 2016/1/20,116.43 515 | 2016/1/21,117.61 516 | 2016/1/22,118.42 517 | 2016/1/25,118.57 518 | 2016/1/26,118.47 519 | 2016/1/27,118.91 520 | 2016/1/28,118.66 521 | 2016/1/29,121.07 522 | 2016/2/1,121.05 523 | 2016/2/2,120.31 524 | 2016/2/3,117.94 525 | 2016/2/4,116.72 526 | 2016/2/5,117 527 | 2016/2/8,115.72 528 | 2016/2/9,114.88 529 | 2016/2/10,114.02 530 | 2016/2/11,111.71 531 | 2016/2/12,112.94 532 | 2016/2/16,113.89 533 | 2016/2/17,114.13 534 | 2016/2/18,113.68 535 | 2016/2/19,112.48 536 | 2016/2/22,113.1 537 | 2016/2/23,112.22 538 | 2016/2/24,111.38 539 | 2016/2/25,112.66 540 | 2016/2/26,113.74 541 | 2016/2/29,112.88 542 | 2016/3/1,113.91 543 | 2016/3/2,113.85 544 | 2016/3/3,113.52 545 | 2016/3/4,113.89 546 | 2016/3/7,113.59 547 | 2016/3/8,112.61 548 | 2016/3/9,113.03 549 | 2016/3/10,113.14 550 | 2016/3/11,113.63 551 | 2016/3/14,113.62 552 | 2016/3/15,112.83 553 | 2016/3/16,113.72 554 | 2016/3/17,111.26 555 | 2016/3/18,111.43 556 | 2016/3/21,111.61 557 | 2016/3/22,111.83 558 | 2016/3/23,112.65 559 | 2016/3/24,112.64 560 | 2016/3/28,113.26 561 | 2016/3/29,113.3 562 | 2016/3/30,112.62 563 | 2016/3/31,112.4 564 | 2016/4/1,112.09 565 | 2016/4/4,111.23 566 | 2016/4/5,110.12 567 | 2016/4/6,109.61 568 | 2016/4/7,107.98 569 | 2016/4/8,108.38 570 | 2016/4/11,107.97 571 | 2016/4/12,108.56 572 | 2016/4/13,109.24 573 | 2016/4/14,109.15 574 | 2016/4/15,108.78 575 | 2016/4/18,108.88 576 | 2016/4/19,109.2 577 | 2016/4/20,109.51 578 | 2016/4/21,109.38 579 | 2016/4/22,111.47 580 | 2016/4/25,111.03 581 | 2016/4/26,111.23 582 | 2016/4/27,111.22 583 | 2016/4/28,108.51 584 | 2016/4/29,106.89 585 | 2016/5/2,106.52 586 | 2016/5/3,106.34 587 | 2016/5/4,107.1 588 | 2016/5/5,107.29 589 | 2016/5/6,106.7 590 | 2016/5/9,108.37 591 | 2016/5/10,109.27 592 | 2016/5/11,108.5 593 | 2016/5/12,108.78 594 | 2016/5/13,109.11 595 | 2016/5/16,108.93 596 | 2016/5/17,109.01 597 | 2016/5/18,109.65 598 | 2016/5/19,109.85 599 | 2016/5/20,110.57 600 | 2016/5/24,110.05 601 | 2016/5/25,110.28 602 | 2016/5/26,109.73 603 | 2016/5/27,109.82 604 | 2016/5/30,111.06 605 | 2016/5/31,110.74 606 | 2016/6/1,109.55 607 | 2016/6/2,108.73 608 | 2016/6/3,106.92 609 | 2016/6/6,107.31 610 | 2016/6/7,107.29 611 | 2016/6/8,106.68 612 | 2016/6/9,106.54 613 | 2016/6/10,107.03 614 | 2016/6/13,106.07 615 | 2016/6/14,106.07 616 | 2016/6/15,105.85 617 | 2016/6/16,104.08 618 | 2016/6/17,104.19 619 | 2016/6/20,104.29 620 | 2016/6/21,104.55 621 | 2016/6/22,104.57 622 | 2016/6/23,105.91 623 | 2016/6/24,102.31 624 | 2016/6/27,101.7 625 | 2016/6/28,102.75 626 | 2016/6/29,102.7 627 | 2016/6/30,102.76 628 | 2016/7/4,102.51 629 | 2016/7/5,101.56 630 | 2016/7/6,101.13 631 | 2016/7/7,100.73 632 | 2016/7/8,100.64 633 | 2016/7/11,102.63 634 | 2016/7/12,104.71 635 | 2016/7/13,104.14 636 | 2016/7/14,105.43 637 | 2016/7/15,105.66 638 | 2016/7/18,105.99 639 | 2016/7/19,106.1 640 | 2016/7/20,106.62 641 | 2016/7/21,105.98 642 | 2016/7/22,106.27 643 | 2016/7/25,106.05 644 | 2016/7/26,104.83 645 | 2016/7/27,105.68 646 | 2016/7/28,104.86 647 | 2016/7/29,102.36 648 | 2016/8/2,100.84 649 | 2016/8/3,101.32 650 | 2016/8/4,101.05 651 | 2016/8/5,101.78 652 | 2016/8/8,102.44 653 | 2016/8/9,101.92 654 | 2016/8/10,101.32 655 | 2016/8/11,101.46 656 | 2016/8/12,101.05 657 | 2016/8/15,101.03 658 | 2016/8/16,100.25 659 | 2016/8/17,100.27 660 | 2016/8/18,100.04 661 | 2016/8/19,100.22 662 | 2016/8/22,100.25 663 | 2016/8/23,100.25 664 | 2016/8/24,100.54 665 | 2016/8/25,100.6 666 | 2016/8/26,101.23 667 | 2016/8/29,102.11 668 | 2016/8/30,102.96 669 | 2016/8/31,103.42 670 | 2016/9/1,103.2 671 | 2016/9/2,104.16 672 | 2016/9/6,102.25 673 | 2016/9/7,101.7 674 | 2016/9/8,102.29 675 | 2016/9/9,102.87 676 | 2016/9/12,102 677 | 2016/9/13,102.15 678 | 2016/9/14,102.32 679 | 2016/9/15,102.22 680 | 2016/9/16,102.35 681 | 2016/9/19,101.86 682 | 2016/9/20,101.68 683 | 2016/9/21,100.66 684 | 2016/9/22,100.84 685 | 2016/9/23,101.04 686 | 2016/9/26,100.36 687 | 2016/9/27,100.36 688 | 2016/9/28,100.55 689 | 2016/9/29,101.48 690 | 2016/9/30,101.21 691 | 2016/10/3,101.52 692 | 2016/10/4,102.65 693 | 2016/10/5,103.52 694 | 2016/10/6,104.02 695 | 2016/10/7,103.45 696 | 2016/10/11,103.35 697 | 2016/10/12,104.46 698 | 2016/10/13,103.6 699 | 2016/10/14,104.09 700 | 2016/10/17,103.94 701 | 2016/10/18,103.84 702 | 2016/10/19,103.29 703 | 2016/10/20,103.92 704 | 2016/10/21,103.93 705 | 2016/10/24,104.19 706 | 2016/10/25,104.25 707 | 2016/10/26,104.46 708 | 2016/10/27,105.15 709 | 2016/10/28,105.39 710 | 2016/10/31,105.04 711 | 2016/11/1,104.61 712 | 2016/11/2,103.24 713 | 2016/11/3,103.13 714 | 2016/11/4,103.01 715 | 2016/11/7,104.64 716 | 2016/11/8,105.02 717 | 2016/11/9,104.83 718 | 2016/11/10,106.61 719 | 2016/11/14,108.31 720 | 2016/11/15,108.96 721 | 2016/11/16,109.16 722 | 2016/11/17,109.62 723 | 2016/11/18,110.54 724 | 2016/11/21,111.14 725 | 2016/11/22,111.02 726 | 2016/11/23,112.63 727 | 2016/11/24,113.34 728 | 2016/11/25,113.18 729 | 2016/11/28,112.33 730 | 2016/11/29,112.8 731 | 2016/11/30,114.36 732 | 2016/12/1,114.33 733 | 2016/12/2,113.76 734 | 2016/12/5,114.12 735 | 2016/12/6,114 736 | 2016/12/7,113.46 737 | 2016/12/8,114.17 738 | 2016/12/9,115.17 739 | 2016/12/12,115.36 740 | 2016/12/13,115.29 741 | 2016/12/14,115.11 742 | 2016/12/15,118.35 743 | 2016/12/16,117.72 744 | 2016/12/19,116.6 745 | 2016/12/20,117.87 746 | 2016/12/21,117.76 747 | 2016/12/22,117.52 748 | 2016/12/23,117.19 749 | 2016/12/28,117.67 750 | 2016/12/29,116.38 751 | 2016/12/30,116.76 752 | 2017/1/3,117.67 753 | 2017/1/4,117.43 754 | 2017/1/5,115.42 755 | 2017/1/6,116.85 756 | 2017/1/9,116.08 757 | 2017/1/10,115.76 758 | 2017/1/11,116.27 759 | 2017/1/12,113.88 760 | 2017/1/13,115.02 761 | 2017/1/16,114.06 762 | 2017/1/17,112.98 763 | 2017/1/18,113.4 764 | 2017/1/19,115.3 765 | 2017/1/20,115.09 766 | 2017/1/23,112.91 767 | 2017/1/24,113.67 768 | 2017/1/25,113.6 769 | 2017/1/26,114.75 770 | 2017/1/27,115.18 771 | 2017/1/30,113.85 772 | 2017/1/31,112.72 773 | 2017/2/1,113.32 774 | 2017/2/2,112.43 775 | 2017/2/3,112.39 776 | 2017/2/6,112.3 777 | 2017/2/7,112.16 778 | 2017/2/8,111.78 779 | 2017/2/9,113.28 780 | 2017/2/10,113.19 781 | 2017/2/13,113.76 782 | 2017/2/14,114.35 783 | 2017/2/15,114.17 784 | 2017/2/16,113.35 785 | 2017/2/17,112.87 786 | 2017/2/21,113.45 787 | 2017/2/22,113.49 788 | 2017/2/23,112.72 789 | 2017/2/24,112.29 790 | 2017/2/27,111.97 791 | 2017/2/28,112.08 792 | 2017/3/1,113.68 793 | 2017/3/2,114.49 794 | 2017/3/3,114.59 795 | 2017/3/6,113.93 796 | 2017/3/7,113.96 797 | 2017/3/8,114.54 798 | 2017/3/9,114.74 799 | 2017/3/10,115.02 800 | 2017/3/13,114.59 801 | 2017/3/14,114.58 802 | 2017/3/15,114.67 803 | 2017/3/16,113.04 804 | 2017/3/17,112.63 805 | 2017/3/20,112.62 806 | 2017/3/21,111.93 807 | 2017/3/22,111.04 808 | 2017/3/23,111.11 809 | 2017/3/24,111.07 810 | 2017/3/27,110.48 811 | 2017/3/28,110.53 812 | 2017/3/29,111.06 813 | 2017/3/30,111.4 814 | 2017/3/31,111.39 815 | 2017/4/3,111.02 816 | 2017/4/4,110.78 817 | 2017/4/5,111.2 818 | 2017/4/6,111 819 | 2017/4/7,110.81 820 | 2017/4/10,110.95 821 | 2017/4/11,109.75 822 | 2017/4/12,109.57 823 | 2017/4/13,109.27 824 | 2017/4/17,108.47 825 | 2017/4/18,108.44 826 | 2017/4/19,109.06 827 | 2017/4/20,109.33 828 | 2017/4/21,109.07 829 | 2017/4/24,109.71 830 | 2017/4/25,110.87 831 | 2017/4/26,111.5 832 | 2017/4/27,111.11 833 | 2017/4/28,111.46 834 | 2017/5/1,111.69 835 | 2017/5/2,112.09 836 | 2017/5/3,112.41 837 | 2017/5/4,112.65 838 | 2017/5/5,112.58 839 | 2017/5/8,112.89 840 | 2017/5/9,114.11 841 | 2017/5/10,114.03 842 | 2017/5/11,113.85 843 | 2017/5/12,113.43 844 | 2017/5/15,113.58 845 | 2017/5/16,113.21 846 | 2017/5/17,111.41 847 | 2017/5/18,111.11 848 | 2017/5/19,111.38 849 | 2017/5/23,111.4 850 | 2017/5/24,111.89 851 | 2017/5/25,111.83 852 | 2017/5/26,111.21 853 | 2017/5/29,111.31 854 | 2017/5/30,110.86 855 | 2017/5/31,110.75 856 | 2017/6/1,111.29 857 | 2017/6/2,110.6 858 | 2017/6/5,110.52 859 | 2017/6/6,109.44 860 | 2017/6/7,109.51 861 | 2017/6/8,110.14 862 | 2017/6/9,110.54 863 | 2017/6/12,109.87 864 | 2017/6/13,110.04 865 | 2017/6/14,109.35 866 | 2017/6/15,110.69 867 | 2017/6/16,110.91 868 | 2017/6/19,111.37 869 | 2017/6/20,111.49 870 | 2017/6/21,111.47 871 | 2017/6/22,111.27 872 | 2017/6/23,111.22 873 | 2017/6/26,111.62 874 | 2017/6/27,112.14 875 | 2017/6/28,112.2 876 | 2017/6/29,112.3 877 | 2017/6/30,112.26 878 | 2017/7/4,113.22 879 | 2017/7/5,113.28 880 | 2017/7/6,113.26 881 | 2017/7/7,113.94 882 | 2017/7/10,114.15 883 | 2017/7/11,114.13 884 | 2017/7/12,113.22 885 | 2017/7/13,113.27 886 | 2017/7/14,112.54 887 | 2017/7/17,112.61 888 | 2017/7/18,111.95 889 | 2017/7/19,111.76 890 | 2017/7/20,111.97 891 | 2017/7/21,111.15 892 | 2017/7/24,111.02 893 | 2017/7/25,111.57 894 | 2017/7/26,111.85 895 | 2017/7/27,111.39 896 | 2017/7/28,110.84 897 | 2017/7/31,110.39 898 | 2017/8/1,110.26 899 | 2017/8/2,110.56 900 | 2017/8/3,110.24 901 | 2017/8/4,110.76 902 | 2017/8/8,110.48 903 | 2017/8/9,109.9 904 | 2017/8/10,109.39 905 | 2017/8/11,109.07 906 | 2017/8/14,109.62 907 | 2017/8/15,110.53 908 | 2017/8/16,110.62 909 | 2017/8/17,109.88 910 | 2017/8/18,109.06 911 | 2017/8/21,108.87 912 | 2017/8/22,109.43 913 | 2017/8/23,109.06 914 | 2017/8/24,109.33 915 | 2017/8/25,109.39 916 | 2017/8/28,109.2 917 | 2017/8/29,109.02 918 | 2017/8/30,110.28 919 | 2017/8/31,110.16 920 | 2017/9/1,110.13 921 | 2017/9/5,108.9 922 | 2017/9/6,109.01 923 | 2017/9/7,108.56 924 | 2017/9/8,107.74 925 | 2017/9/11,109.06 926 | 2017/9/12,110.04 927 | 2017/9/13,110.49 928 | 2017/9/14,110.59 929 | 2017/9/15,110.95 930 | 2017/9/18,111.46 931 | 2017/9/19,111.51 932 | 2017/9/20,111.57 933 | 2017/9/21,112.38 934 | 2017/9/22,112.07 935 | 2017/9/25,111.89 936 | 2017/9/26,112.15 937 | 2017/9/27,112.84 938 | 2017/9/28,112.57 939 | 2017/9/29,112.53 940 | 2017/10/2,112.66 941 | 2017/10/3,112.92 942 | 2017/10/4,112.73 943 | 2017/10/5,112.74 944 | 2017/10/6,112.85 945 | 2017/10/10,112.22 946 | 2017/10/11,112.29 947 | 2017/10/12,112.26 948 | 2017/10/13,111.89 949 | 2017/10/16,111.87 950 | 2017/10/17,112.34 951 | 2017/10/18,112.89 952 | 2017/10/19,112.52 953 | 2017/10/20,113.42 954 | 2017/10/23,113.71 955 | 2017/10/24,113.9 956 | 2017/10/25,113.82 957 | 2017/10/26,113.85 958 | 2017/10/27,113.93 959 | 2017/10/30,113.3 960 | 2017/10/31,113.59 961 | 2017/11/1,114.03 962 | 2017/11/2,113.97 963 | 2017/11/3,114.17 964 | 2017/11/6,113.91 965 | 2017/11/7,114.05 966 | 2017/11/8,113.65 967 | 2017/11/9,113.32 968 | 2017/11/10,113.44 969 | 2017/11/14,113.48 970 | 2017/11/15,112.94 971 | 2017/11/16,112.99 972 | 2017/11/17,112.23 973 | 2017/11/20,112.42 974 | 2017/11/21,112.38 975 | 2017/11/22,111.56 976 | 2017/11/23,111.24 977 | 2017/11/24,111.47 978 | 2017/11/27,111.03 979 | 2017/11/28,111.27 980 | 2017/11/29,111.86 981 | 2017/11/30,112.36 982 | 2017/12/1,112.25 983 | 2017/12/4,112.74 984 | 2017/12/5,112.71 985 | 2017/12/6,112.2 986 | 2017/12/7,112.76 987 | 2017/12/8,113.5 988 | 2017/12/11,113.45 989 | 2017/12/12,113.6 990 | 2017/12/13,113.03 991 | 2017/12/14,112.52 992 | 2017/12/15,112.58 993 | 2017/12/18,112.46 994 | 2017/12/19,112.94 995 | 2017/12/20,113.35 996 | 2017/12/21,113.39 997 | 2017/12/22,113.41 998 | 2017/12/27,113.27 999 | 2017/12/28,112.9 1000 | 2017/12/29,112.61 -------------------------------------------------------------------------------- /python/electricity.csv: -------------------------------------------------------------------------------- 1 | ,使用電力量 2 | 1989年1月,51644033 3 | 1989年2月,47947215 4 | 1989年3月,48573850 5 | 1989年4月,48788188 6 | 1989年5月,46276002 7 | 1989年6月,46613542 8 | 1989年7月,51225641 9 | 1989年8月,55956119 10 | 1989年9月,57441707 11 | 1989年10月,50362760 12 | 1989年11月,48737690 13 | 1989年12月,50427107 14 | 1990年1月,54942825 15 | 1990年2月,52100709 16 | 1990年3月,50424779 17 | 1990年4月,50132296 18 | 1990年5月,50340032 19 | 1990年6月,50330967 20 | 1990年7月,56756870 21 | 1990年8月,63496026 22 | 1990年9月,62249233 23 | 1990年10月,53737227 24 | 1990年11月,51317422 25 | 1990年12月,52515810 26 | 1991年1月,58027569 27 | 1991年2月,55218641 28 | 1991年3月,54811116 29 | 1991年4月,53373762 30 | 1991年5月,52557861 31 | 1991年6月,53224382 32 | 1991年7月,58971993 33 | 1991年8月,63689467 34 | 1991年9月,61657477 35 | 1991年10月,55074008 36 | 1991年11月,54461314 37 | 1991年12月,53093799 38 | 1992年1月,60124949 39 | 1992年2月,57490912 40 | 1992年3月,55517101 41 | 1992年4月,54977277 42 | 1992年5月,52933077 43 | 1992年6月,52484321 44 | 1992年7月,57161608 45 | 1992年8月,64752834 46 | 1992年9月,62722993 47 | 1992年10月,55322059 48 | 1992年11月,54577977 49 | 1992年12月,54543020 50 | 1993年1月,61029094 51 | 1993年2月,57912557 52 | 1993年3月,57293633 53 | 1993年4月,57642485 54 | 1993年5月,53836193 55 | 1993年6月,54118729 56 | 1993年7月,57703885 57 | 1993年8月,60296876 58 | 1993年9月,60874490 59 | 1993年10月,55327358 60 | 1993年11月,53844976 61 | 1993年12月,56350584 62 | 1994年1月,61845199 63 | 1994年2月,60037350 64 | 1994年3月,58699745 65 | 1994年4月,58388440 66 | 1994年5月,53652622 67 | 1994年6月,56256378 68 | 1994年7月,65445176 69 | 1994年8月,73563599 70 | 1994年9月,70188434 71 | 1994年10月,59579368 72 | 1994年11月,56285859 73 | 1994年12月,58691715 74 | 1995年1月,64378422 75 | 1995年2月,62161788 76 | 1995年3月,61505191 77 | 1995年4月,60842461 78 | 1995年5月,56117630 79 | 1995年6月,56690833 80 | 1995年7月,62741709 81 | 1995年8月,72962417 82 | 1995年9月,70445972 83 | 1995年10月,58954455 84 | 1995年11月,58436487 85 | 1995年12月,61681846 86 | 1996年1月,67643571 87 | 1996年2月,65796939 88 | 1996年3月,64660970 89 | 1996年4月,61941388 90 | 1996年5月,59698809 91 | 1996年6月,59522560 92 | 1996年7月,65299634 93 | 1996年8月,74780223 94 | 1996年9月,67881013 95 | 1996年10月,60902900 96 | 1996年11月,61479896 97 | 1996年12月,62712358 98 | 1997年1月,69428826 99 | 1997年2月,67265550 100 | 1997年3月,63688665 101 | 1997年4月,62251901 102 | 1997年5月,61225978 103 | 1997年6月,61177570 104 | 1997年7月,69920714 105 | 1997年8月,74861924 106 | 1997年9月,71984824 107 | 1997年10月,63584224 108 | 1997年11月,61819656 109 | 1997年12月,62353308 110 | 1998年1月,70357820 111 | 1998年2月,68205507 112 | 1998年3月,63707469 113 | 1998年4月,64285698 114 | 1998年5月,61529281 115 | 1998年6月,61533785 116 | 1998年7月,70324434 117 | 1998年8月,75068681 118 | 1998年9月,73124794 119 | 1998年10月,65880323 120 | 1998年11月,61953944 121 | 1998年12月,63164065 122 | 1999年1月,69603824 123 | 1999年2月,67229277 124 | 1999年3月,65273260 125 | 1999年4月,65106459 126 | 1999年5月,60410066 127 | 1999年6月,62278457 128 | 1999年7月,68079935 129 | 1999年8月,76503243 130 | 1999年9月,77352105 131 | 1999年10月,68478774 132 | 1999年11月,62349543 133 | 1999年12月,65008190 134 | 2000年1月,71485043 135 | 2000年2月,69785582 136 | 2000年3月,70082917 137 | 2000年4月,66252391 138 | 2000年5月,62015534 139 | 2000年6月,64571155 140 | 2000年7月,72722538 141 | 2000年8月,80076179 142 | 2000年9月,79169371 143 | 2000年10月,66262272 144 | 2000年11月,65079938 145 | 2000年12月,66992441 146 | 2001年1月,74219553 147 | 2001年2月,72250421 148 | 2001年3月,68311631 149 | 2001年4月,65090968 150 | 2001年5月,62944010 151 | 2001年6月,64684425 152 | 2001年7月,73677087 153 | 2001年8月,81218159 154 | 2001年9月,72709080 155 | 2001年10月,64879432 156 | 2001年11月,63948024 157 | 2001年12月,66694405 158 | 2002年1月,73248834 159 | 2002年2月,69604930 160 | 2002年3月,65400192 161 | 2002年4月,63257627 162 | 2002年5月,63382114 163 | 2002年6月,64219769 164 | 2002年7月,70649557 165 | 2002年8月,83372506 166 | 2002年9月,75577349 167 | 2002年10月,66224337 168 | 2002年11月,67257920 169 | 2002年12月,68103708 170 | 2003年1月,77523732 171 | 2003年2月,72328082 172 | 2003年3月,69577700 173 | 2003年4月,67170142 174 | 2003年5月,64453991 175 | 2003年6月,64221888 176 | 2003年7月,68922008 177 | 2003年8月,74574787 178 | 2003年9月,76035586 179 | 2003年10月,67908082 180 | 2003年11月,64819931 181 | 2003年12月,66412250 182 | 2004年1月,76151000 183 | 2004年2月,73542722 184 | 2004年3月,70092282 185 | 2004年4月,69004605 186 | 2004年5月,64815034 187 | 2004年6月,66692613 188 | 2004年7月,77542504 189 | 2004年8月,82155104 190 | 2004年9月,77925083 191 | 2004年10月,69488879 192 | 2004年11月,65568324 193 | 2004年12月,67361207 194 | 2005年1月,76395334 195 | 2005年2月,75250654 196 | 2005年3月,73228332 197 | 2005年4月,71095464 198 | 2005年5月,65122042 199 | 2005年6月,66502199 200 | 2005年7月,74766702 201 | 2005年8月,80646039 202 | 2005年9月,80287646 203 | 2005年10月,71068517 204 | 2005年11月,66955079 205 | 2005年12月,72662774 206 | 2006年1月,83207377 207 | 2006年2月,76621291 208 | 2006年3月,73623488 209 | 2006年4月,72448978 210 | 2006年5月,68040106 211 | 2006年6月,67986281 212 | 2006年7月,75230446 213 | 2006年8月,82075906 214 | 2006年9月,81040467 215 | 2006年10月,69947751 216 | 2006年11月,70000290 217 | 2006年12月,73084338 218 | 2007年1月,80207637 219 | 2007年2月,75683201 220 | 2007年3月,73677375 221 | 2007年4月,72243669 222 | 2007年5月,70027700 223 | 2007年6月,69981212 224 | 2007年7月,74508837 225 | 2007年8月,83907932 226 | 2007年9月,84446444 227 | 2007年10月,74244406 228 | 2007年11月,71100930 229 | 2007年12月,75215678 230 | 2008年1月,82930652 231 | 2008年2月,82770886 232 | 2008年3月,78165543 233 | 2008年4月,72045496 234 | 2008年5月,70625193 235 | 2008年6月,69875262 236 | 2008年7月,77204269 237 | 2008年8月,87188123 238 | 2008年9月,79185068 239 | 2008年10月,72681997 240 | 2008年11月,69694602 241 | 2008年12月,70771267 242 | 2009年1月,77835737 243 | 2009年2月,72733023 244 | 2009年3月,69094608 245 | 2009年4月,68388931 246 | 2009年5月,64538690 247 | 2009年6月,64361596 248 | 2009年7月,72294998 249 | 2009年8月,77794115 250 | 2009年9月,73767142 251 | 2009年10月,68140892 252 | 2009年11月,67292886 253 | 2009年12月,70482092 254 | 2010年1月,81431186 255 | 2010年2月,76725951 256 | 2010年3月,73297443 257 | 2010年4月,74205018 258 | 2010年5月,68866811 259 | 2010年6月,67600159 260 | 2010年7月,76928653 261 | 2010年8月,84928032 262 | 2010年9月,85722947 263 | 2010年10月,71432902 264 | 2010年11月,68515086 265 | 2010年12月,71868508 266 | 2011年1月,83849805 267 | 2011年2月,80256010 268 | 2011年3月,72243881 269 | 2011年4月,69352198 270 | 2011年5月,64365476 271 | 2011年6月,64174737 272 | 2011年7月,73103665 273 | 2011年8月,75311611 274 | 2011年9月,75925807 275 | 2011年10月,66907585 276 | 2011年11月,64822918 277 | 2011年12月,69349371 278 | 2012年1月,80768654 279 | 2012年2月,79107951 280 | 2012年3月,76618698 281 | 2012年4月,70316667 282 | 2012年5月,65498056 283 | 2012年6月,64042735 284 | 2012年7月,68488162 285 | 2012年8月,77592810 286 | 2012年9月,76392995 287 | 2012年10月,65957363 288 | 2012年11月,64373027 289 | 2012年12月,71526475 290 | 2013年1月,79810011 291 | 2013年2月,76120205 292 | 2013年3月,71471264 293 | 2013年4月,66133217 294 | 2013年5月,65084676 295 | 2013年6月,63866380 296 | 2013年7月,70205121 297 | 2013年8月,78532599 298 | 2013年9月,74333939 299 | 2013年10月,66360403 300 | 2013年11月,65371785 301 | 2013年12月,68767684 302 | 2014年1月,80416531 303 | 2014年2月,76451101 304 | 2014年3月,73017753 305 | 2014年4月,66467057 306 | 2014年5月,63280170 307 | 2014年6月,62804330 308 | 2014年7月,68011781 309 | 2014年8月,74770075 310 | 2014年9月,68281147 311 | 2014年10月,63780740 312 | 2014年11月,63088994 313 | 2014年12月,67878960 314 | 2015年1月,80182281 315 | 2015年2月,74191268 316 | 2015年3月,70261883 317 | 2015年4月,66550080 318 | 2015年5月,61452367 319 | 2015年6月,61013366 320 | 2015年7月,65926315 321 | 2015年8月,74633452 322 | 2015年9月,66270370 323 | 2015年10月,61240779 324 | 2015年11月,60716671 325 | 2015年12月,63604246 326 | 2016年1月,73205156 327 | 2016年2月,72899139 328 | 2016年3月,69545218 329 | -------------------------------------------------------------------------------- /python/pybayes_beta_distribution.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | #%% NumPyの読み込み 3 | import numpy as np 4 | # SciPyのstatsモジュールの読み込み 5 | import scipy.stats as st 6 | # MatplotlibのPyplotモジュールの読み込み 7 | import matplotlib.pyplot as plt 8 | #%% ベータ分布の確率密度関数 9 | q = np.linspace(0, 1, 250) 10 | value_a = np.array([0.5, 1.0, 2.0, 4.0]) 11 | value_b = np.array([0.5, 1.0, 2.0, 4.0]) 12 | rows = value_a.shape[0] 13 | cols = value_b.shape[0] 14 | fig, ax = plt.subplots(rows, cols, sharex='all', sharey='all', 15 | num=1, facecolor='w') 16 | ax[0, 0].set_xlim(0.0, 1.0) 17 | ax[0, 0].set_ylim(0.0, 4.5) 18 | for row_index in range(rows): 19 | a = value_a[row_index] 20 | ax[row_index, 0].set_ylabel('$\\alpha$ = {0:3.1f}'.format(a), 21 | fontsize=12) 22 | for column_index in range(cols): 23 | b = value_b[column_index] 24 | ax[row_index, column_index].plot(q, st.beta.pdf(q, a, b), 'k-') 25 | if row_index == 0: 26 | ax[0, column_index].set_title('$\\beta$ = {0:3.1f}'.format(b), 27 | fontsize=12) 28 | plt.tight_layout() 29 | plt.savefig('pybayes_fig_beta_distribution.png', dpi=300) 30 | plt.show() 31 | -------------------------------------------------------------------------------- /python/pybayes_beta_prior.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | #%% NumPyの読み込み 3 | import numpy as np 4 | # SciPyのstatsモジュールの読み込み 5 | import scipy.stats as st 6 | # MatplotlibのPyplotモジュールの読み込み 7 | import matplotlib.pyplot as plt 8 | # 日本語フォントの設定 9 | from matplotlib.font_manager import FontProperties 10 | import sys 11 | if sys.platform.startswith('win'): 12 | FontPath = 'C:\\Windows\\Fonts\\meiryo.ttc' 13 | elif sys.platform.startswith('darwin'): 14 | FontPath = '/System/Library/Fonts/ヒラギノ角ゴシック W4.ttc' 15 | elif sys.platform.startswith('linux'): 16 | FontPath = '/usr/share/fonts/truetype/takao-gothic/TakaoPGothic.ttf' 17 | else: 18 | print('このPythonコードが対応していないOSを使用しています.') 19 | sys.exit() 20 | jpfont = FontProperties(fname=FontPath) 21 | #%% ベルヌーイ分布の成功確率qの事前分布 22 | fig1 = plt.figure(num=1, facecolor='w') 23 | q = np.linspace(0, 1, 250) 24 | plt.plot(q, st.uniform.pdf(q), 'k-') 25 | plt.plot(q, st.beta.pdf(q, 4, 6), 'k--') 26 | plt.xlim(0, 1) 27 | plt.ylim(0, 2.8) 28 | plt.legend(['(A) 一様分布 (a = 1, b = 1)', 29 | '(B) ベータ分布 ($\\alpha$ = 4, $\\beta$ = 6)'], 30 | loc='best', frameon=False, prop=jpfont) 31 | plt.xlabel('成功確率 q', fontproperties=jpfont) 32 | plt.ylabel('確率密度', fontproperties=jpfont) 33 | plt.savefig('pybayes_fig_beta_prior.png', dpi=300) 34 | plt.show() 35 | -------------------------------------------------------------------------------- /python/pybayes_conjugate_bernoulli.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | #%% NumPyの読み込み 3 | import numpy as np 4 | # SciPyのstatsモジュールの読み込み 5 | import scipy.stats as st 6 | # SciPyのoptimizeモジュールの読み込み 7 | import scipy.optimize as opt 8 | # Pandasの読み込み 9 | import pandas as pd 10 | # MatplotlibのPyplotモジュールの読み込み 11 | import matplotlib.pyplot as plt 12 | # 日本語フォントの設定 13 | from matplotlib.font_manager import FontProperties 14 | import sys 15 | if sys.platform.startswith('win'): 16 | FontPath = 'C:\\Windows\\Fonts\\meiryo.ttc' 17 | elif sys.platform.startswith('darwin'): 18 | FontPath = '/System/Library/Fonts/ヒラギノ角ゴシック W4.ttc' 19 | elif sys.platform.startswith('linux'): 20 | FontPath = '/usr/share/fonts/truetype/takao-gothic/TakaoPGothic.ttf' 21 | else: 22 | print('このPythonコードが対応していないOSを使用しています.') 23 | sys.exit() 24 | jpfont = FontProperties(fname=FontPath) 25 | #%% ベルヌーイ分布の成功確率に関するベイズ推論 26 | # ベータ分布のHPD区間の計算 27 | def beta_hpdi(ci0, alpha, beta, prob): 28 | """ 29 | 入力 30 | ci0: HPD区間の初期値 31 | alpha: ベータ分布のパラメータ1 32 | beta: ベータ分布のパラメータ2 33 | prob: HPD区間の確率 (0 < prob < 1) 34 | 出力 35 | HPD区間 36 | """ 37 | def hpdi_conditions(v, a, b, p): 38 | """ 39 | 入力 40 | v: HPD区間 41 | a: ベータ分布のパラメータ1 42 | b: ベータ分布のパラメータ2 43 | p: HPD区間の確率 (0 < p < 1) 44 | 出力 45 | HPD区間の条件式の値 46 | """ 47 | eq1 = st.beta.cdf(v[1], a, b) - st.beta.cdf(v[0], a, b) - p 48 | eq2 = st.beta.pdf(v[1], a, b) - st.beta.pdf(v[0], a, b) 49 | return np.hstack((eq1, eq2)) 50 | return opt.root(hpdi_conditions, ci0, args=(alpha, beta, prob)).x 51 | # ベルヌーイ分布の成功確率の事後統計量の計算 52 | def bernoulli_stats(data, a0, b0, prob): 53 | """ 54 | 入力 55 | data: データ(取りうる値は0か1) 56 | a0: 事前分布のパラメータ1 57 | b0: 事前分布のパラメータ2 58 | prob: 区間確率 (0 < prob < 1) 59 | 出力 60 | results:事後統計量のデータフレーム 61 | a: 事後分布のパラメータ1 62 | b: 事後分布のパラメータ2 63 | """ 64 | n = data.size 65 | sum_data = data.sum() 66 | a = sum_data + a0 67 | b = n - sum_data + b0 68 | mean_pi = st.beta.mean(a, b) 69 | median_pi = st.beta.median(a, b) 70 | mode_pi = (a - 1.0) / (a + b - 2.0) 71 | sd_pi = st.beta.std(a, b) 72 | ci_pi = st.beta.interval(prob, a, b) 73 | hpdi_pi = beta_hpdi(ci_pi, a, b, prob) 74 | stats = np.hstack((mean_pi, median_pi, mode_pi, sd_pi, ci_pi, hpdi_pi)) 75 | stats = stats.reshape((1, 8)) 76 | stats_string = ['平均', '中央値', '最頻値', '標準偏差', '信用区間(下限)', 77 | '信用区間(上限)', 'HPD区間(下限)', 'HPD区間(上限)'] 78 | param_string = ['成功確率 q'] 79 | results = pd.DataFrame(stats, index=param_string, columns=stats_string) 80 | return results, a, b 81 | #%% ベルヌーイ分布からのデータの生成 82 | p = 0.25 83 | n = 50 84 | np.random.seed(99) 85 | data = st.bernoulli.rvs(p, size=n) 86 | #%% 事後統計量の計算 87 | a0 = 1.0 88 | b0 = 1.0 89 | prob = 0.95 90 | results, a, b = bernoulli_stats(data, a0, b0, prob) 91 | print(results.to_string(float_format='{:,.4f}'.format)) 92 | #%% 事後分布のグラフの作成 93 | fig1 = plt.figure(num=1, facecolor='w') 94 | q = np.linspace(0, 1, 250) 95 | plt.plot(q, st.beta.pdf(q, a, b), 'k-', label='事後分布') 96 | plt.plot(q, st.beta.pdf(q, a0, b0), 'k:', label='事前分布') 97 | plt.xlim(0, 1) 98 | plt.ylim(0, 7) 99 | plt.xlabel('成功確率 q', fontproperties=jpfont) 100 | plt.ylabel('確率密度', fontproperties=jpfont) 101 | plt.legend(loc='best', frameon=False, prop=jpfont) 102 | plt.savefig('pybayes_fig_bernoulli_posterior.png', dpi=300) 103 | plt.show() 104 | #%% 事前分布とデータの累積が事後分布の形状に与える影響の可視化 105 | np.random.seed(99) 106 | data = st.bernoulli.rvs(p, size=250) 107 | value_size = np.array([10, 50, 250]) 108 | value_a0 = np.array([1.0, 6.0]) 109 | value_b0 = np.array([1.0, 4.0]) 110 | styles = [':', '-.', '--', '-'] 111 | fig2, ax2 = plt.subplots(1, 2, sharey='all', sharex='all', 112 | num=2, figsize=(8, 4), facecolor='w') 113 | ax2[0].set_xlim(0, 1) 114 | ax2[0].set_ylim(0, 15.5) 115 | ax2[0].set_ylabel('確率密度', fontproperties=jpfont) 116 | for index in range(2): 117 | style_index = 0 118 | a0_i = value_a0[index] 119 | b0_i = value_b0[index] 120 | ax2[index].plot(q, st.beta.pdf(q, a0_i, b0_i), color='k', 121 | linestyle=styles[style_index], 122 | label='事前分布 Beta({0:<3.1f}, {1:<3.1f})' \ 123 | .format(a0_i, b0_i)) 124 | for n_j in value_size: 125 | style_index += 1 126 | sum_data = np.sum(data[:n_j]) 127 | a_j = sum_data + a0_i 128 | b_j = n_j - sum_data + b0_i 129 | ax2[index].plot(q, st.beta.pdf(q, a_j, b_j), color='k', 130 | linestyle=styles[style_index], 131 | label='事後分布 ( n = {0:<3d} )'.format(n_j)) 132 | ax2[index].set_xlabel('成功確率 q', fontproperties=jpfont) 133 | ax2[index].legend(loc='best', frameon=False, prop=jpfont) 134 | plt.tight_layout() 135 | plt.savefig('pybayes_fig_bernoulli_posterior_convergence.png', dpi=300) 136 | plt.show() 137 | -------------------------------------------------------------------------------- /python/pybayes_conjugate_gaussian.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | #%% NumPyの読み込み 3 | import numpy as np 4 | # SciPyのstatsモジュールの読み込み 5 | import scipy.stats as st 6 | # SciPyのoptimizeモジュールの読み込み 7 | import scipy.optimize as opt 8 | # Pandasの読み込み 9 | import pandas as pd 10 | # MatplotlibのPyplotモジュールの読み込み 11 | import matplotlib.pyplot as plt 12 | # 日本語フォントの設定 13 | from matplotlib.font_manager import FontProperties 14 | import sys 15 | if sys.platform.startswith('win'): 16 | FontPath = 'C:\\Windows\\Fonts\\meiryo.ttc' 17 | elif sys.platform.startswith('darwin'): 18 | FontPath = '/System/Library/Fonts/ヒラギノ角ゴシック W4.ttc' 19 | elif sys.platform.startswith('linux'): 20 | FontPath = '/usr/share/fonts/truetype/takao-gothic/TakaoPGothic.ttf' 21 | else: 22 | print('このPythonコードが対応していないOSを使用しています.') 23 | sys.exit() 24 | jpfont = FontProperties(fname=FontPath) 25 | #%% 正規分布の平均と分散に関するベイズ推論 26 | # 逆ガンマ分布のHPD区間の計算 27 | def invgamma_hpdi(ci0, alpha, beta, prob): 28 | """ 29 | 入力 30 | ci0: HPD区間の初期値 31 | alpha: 逆ガンマ分布の形状パラメータ 32 | beta: 逆ガンマ分布の尺度パラメータ 33 | prob: HPD区間の確率 (0 < prob < 1) 34 | 出力 35 | HPD区間 36 | """ 37 | def hpdi_conditions(v, a, b, p): 38 | """ 39 | 入力 40 | v: HPD区間 41 | a: 逆ガンマ分布の形状パラメータ 42 | b: 逆ガンマ分布の尺度パラメータ 43 | p: HPD区間の確率 (0 < p < 1) 44 | 出力 45 | HPD区間の条件式の値 46 | """ 47 | eq1 = st.invgamma.cdf(v[1], a, scale=b) \ 48 | - st.invgamma.cdf(v[0], a, scale=b) - p 49 | eq2 = st.invgamma.pdf(v[1], a, scale=b) \ 50 | - st.invgamma.pdf(v[0], a, scale=b) 51 | return np.hstack((eq1, eq2)) 52 | return opt.root(hpdi_conditions, ci0, args=(alpha, beta, prob)).x 53 | # 正規分布の平均と分散の事後統計量の計算 54 | def gaussian_stats(data, mu0, n0, nu0, lam0, prob): 55 | """ 56 | 入力 57 | data: データ 58 | mu0: 平均の条件付事前分布(正規分布)の平均 59 | n0: 平均の条件付事前分布(正規分布)の精度パラメータ 60 | nu0: 分散の事前分布(逆ガンマ分布)の形状パラメータ 61 | lam0: 分散の事前分布(逆ガンマ分布)の尺度パラメータ 62 | prob: 区間確率 (0 < prob < 1) 63 | 出力 64 | results: 事後統計量のデータフレーム 65 | mu_star: 平均の条件付事後分布(正規分布)の平均 66 | n_star: 平均の条件付事後分布(正規分布)の精度パラメータ 67 | nu_star: 分散の事後分布(逆ガンマ分布)の形状パラメータ 68 | lam_star: 分散の事後分布(逆ガンマ分布)の尺度パラメータ 69 | """ 70 | n = data.size 71 | mean_data = data.mean() 72 | ssd_data = n * data.var() 73 | n_star = n + n0 74 | mu_star = (n * mean_data + n0 * mu0) / n_star 75 | nu_star = n + nu0 76 | lam_star = ssd_data + n * n0 / n_star * (mu0 - mean_data)**2 + lam0 77 | tau_star = np.sqrt(lam_star / nu_star / n_star) 78 | sd_mu = st.t.std(nu_star, loc=mu_star, scale=tau_star) 79 | ci_mu = st.t.interval(prob, nu_star, loc=mu_star, scale=tau_star) 80 | mean_sigma2 = st.invgamma.mean(0.5*nu_star, scale=0.5*lam_star) 81 | mode_sigma2 = lam_star / (nu_star + 2.0) 82 | median_sigma2 = st.invgamma.median(0.5*nu_star, scale=0.5*lam_star) 83 | sd_sigma2 = st.invgamma.std(0.5*nu_star, scale=0.5*lam_star) 84 | ci_sigma2 = st.invgamma.interval(prob, 0.5*nu_star, scale=0.5*lam_star) 85 | hpdi_sigma2 = invgamma_hpdi(ci_sigma2, 0.5*nu_star, 0.5*lam_star, prob) 86 | stats_mu = np.hstack((mu_star, mu_star, mu_star, sd_mu, ci_mu, ci_mu)) 87 | stats_sigma2 = np.hstack((mean_sigma2, median_sigma2, mode_sigma2, 88 | sd_sigma2, ci_sigma2, hpdi_sigma2)) 89 | stats = np.vstack((stats_mu, stats_sigma2)) 90 | stats_string = ['平均', '中央値', '最頻値', '標準偏差', '信用区間(下限)', 91 | '信用区間(上限)', 'HPD区間(下限)', 'HPD区間(上限)'] 92 | param_string = ['平均 $\\mu$', '分散 $\\sigma^2$'] 93 | results = pd.DataFrame(stats, index=param_string, columns=stats_string) 94 | return results, mu_star, tau_star, nu_star, lam_star 95 | #%% 正規分布からのデータの生成 96 | mu = 1.0 97 | sigma = 2.0 98 | n = 50 99 | np.random.seed(99) 100 | data = st.norm.rvs(loc=mu, scale=sigma, size=n) 101 | #%% 事後統計量の計算 102 | mu0 = 0.0 103 | n0 = 0.2 104 | nu0 = 5.0 105 | lam0 = 7.0 106 | tau0 = np.sqrt(lam0 / nu0 / n0) 107 | prob = 0.95 108 | results, mu_star, tau_star, nu_star, lam_star \ 109 | = gaussian_stats(data, mu0, n0, nu0, lam0, prob) 110 | print(results.to_string(float_format='{:,.4f}'.format)) 111 | #%% 事後分布のグラフの作成 112 | fig, ax = plt.subplots(1, 2, num=1, figsize=(8, 4), facecolor='w') 113 | # 平均の周辺事後分布のグラフの作成 114 | x1 = np.linspace(-6, 6, 250) 115 | ax[0].plot(x1, st.t.pdf(x1, nu_star, loc=mu_star, scale=tau_star), 116 | 'k-', label='事後分布') 117 | ax[0].plot(x1, st.t.pdf(x1, nu0, loc=mu0, scale=tau0), 118 | 'k:', label='事前分布') 119 | ax[0].set_xlim(-6, 6) 120 | ax[0].set_ylim(0, 1.55) 121 | ax[0].set_xlabel('平均 $\\mu$', fontproperties=jpfont) 122 | ax[0].set_ylabel('確率密度', fontproperties=jpfont) 123 | ax[0].legend(loc='best', frameon=False, prop=jpfont) 124 | # 分散の周辺事後分布のグラフの作成 125 | x2 = np.linspace(0, 10, 250) 126 | ax[1].plot(x2, st.invgamma.pdf(x2, 0.5*nu_star, scale=0.5*lam_star), 127 | 'k-', label='事後分布') 128 | ax[1].plot(x2, st.invgamma.pdf(x2, 0.5*nu0, scale=0.5*lam0), 129 | 'k:', label='事前分布') 130 | ax[1].set_xlim(0, 10) 131 | ax[1].set_ylim(0, 0.65) 132 | ax[1].set_xlabel('分散 $\\sigma^2$', fontproperties=jpfont) 133 | ax[1].set_ylabel('確率密度', fontproperties=jpfont) 134 | ax[1].legend(loc='best', frameon=False, prop=jpfont) 135 | plt.tight_layout() 136 | plt.savefig('pybayes_fig_gaussian_posterior.png', dpi=300) 137 | plt.show() 138 | -------------------------------------------------------------------------------- /python/pybayes_conjugate_poisson.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | #%% NumPyの読み込み 3 | import numpy as np 4 | # SciPyのstatsモジュールの読み込み 5 | import scipy.stats as st 6 | # SciPyのoptimizeモジュールの読み込み 7 | import scipy.optimize as opt 8 | # Pandasの読み込み 9 | import pandas as pd 10 | # MatplotlibのPyplotモジュールの読み込み 11 | import matplotlib.pyplot as plt 12 | # 日本語フォントの設定 13 | from matplotlib.font_manager import FontProperties 14 | import sys 15 | if sys.platform.startswith('win'): 16 | FontPath = 'C:\\Windows\\Fonts\\meiryo.ttc' 17 | elif sys.platform.startswith('darwin'): 18 | FontPath = '/System/Library/Fonts/ヒラギノ角ゴシック W4.ttc' 19 | elif sys.platform.startswith('linux'): 20 | FontPath = '/usr/share/fonts/truetype/takao-gothic/TakaoPGothic.ttf' 21 | else: 22 | print('このPythonコードが対応していないOSを使用しています.') 23 | sys.exit() 24 | jpfont = FontProperties(fname=FontPath) 25 | #%% ポアソン分布に関するベイズ推論 26 | # ガンマ分布のHPD区間の計算 27 | def gamma_hpdi(ci0, alpha, theta, prob): 28 | """ 29 | 入力 30 | ci0: HPD区間の初期値 31 | alpha: ガンマ分布の形状パラメータ 32 | theta: ガンマ分布の尺度パラメータ 33 | prob: HPD区間の確率 (0 < prob < 1) 34 | 出力 35 | HPD区間 36 | """ 37 | def hpdi_conditions(v, a, t, p): 38 | """ 39 | 入力 40 | v: HPD区間 41 | a: ガンマ分布の形状パラメータ 42 | t: ガンマ分布の尺度パラメータ 43 | p: HPD区間の確率 (0 < p < 1) 44 | 出力 45 | HPD区間の条件式の値 46 | """ 47 | eq1 = st.gamma.cdf(v[1], a, scale=t) \ 48 | - st.gamma.cdf(v[0], a, scale=t) - p 49 | eq2 = st.gamma.pdf(v[1], a, scale=t) \ 50 | - st.gamma.pdf(v[0], a, scale=t) 51 | return np.hstack((eq1, eq2)) 52 | return opt.root(hpdi_conditions, ci0, args=(alpha, theta, prob)).x 53 | # ポアソン分布のパラメータの事後統計量の計算 54 | def poisson_stats(data, a0, b0, prob): 55 | """ 56 | 入力 57 | data: データ 58 | a0: 事前分布の形状パラメータ 59 | b0: 事前分布の尺度パラメータの逆数 60 | prob: 区間確率 (0 < prob < 1) 61 | 出力 62 | results: 事後統計量のデータフレーム 63 | a_star: 事後分布の形状パラメータ 64 | b_star: 事後分布の尺度パラメータの逆数 65 | """ 66 | n = data.size 67 | a_star = data.sum() + a0 68 | b_star = n + b0 69 | theta_star = 1.0 / b_star 70 | mean_lam = st.gamma.mean(a_star, scale=theta_star) 71 | median_lam = st.gamma.median(a_star, scale=theta_star) 72 | mode_lam = (a_star - 1.0) * theta_star 73 | sd_lam = st.gamma.std(a_star, scale=theta_star) 74 | ci_lam = st.gamma.interval(prob, a_star, scale=theta_star) 75 | hpdi_lam = gamma_hpdi(ci_lam, a_star, theta_star, prob) 76 | stats = np.hstack((mean_lam, median_lam, mode_lam, 77 | sd_lam, ci_lam, hpdi_lam)).reshape((1, 8)) 78 | stats_string = ['平均', '中央値', '最頻値', '標準偏差', '信用区間(下限)', 79 | '信用区間(上限)', 'HPD区間(下限)', 'HPD区間(上限)'] 80 | param_string = ['$\\lambda$'] 81 | results = pd.DataFrame(stats, index=param_string, columns=stats_string) 82 | return results, a_star, b_star 83 | #%% ポアソン分布からのデータの生成 84 | lam = 3.0 85 | n = 50 86 | np.random.seed(99) 87 | data = st.poisson.rvs(lam, size=n) 88 | #%% 事後統計量の計算 89 | a0 = 1.0 90 | b0 = 1.0 91 | prob = 0.95 92 | results, a_star, b_star = poisson_stats(data, a0, b0, prob) 93 | print(results.to_string(float_format='{:,.4f}'.format)) 94 | #%% 事後分布のグラフの作成 95 | fig = plt.figure(num=1, facecolor='w') 96 | x = np.linspace(0, 6, 250) 97 | plt.plot(x, st.gamma.pdf(x, a_star, scale=1.0/b_star), 'k-', 98 | label='事後分布') 99 | plt.plot(x, st.gamma.pdf(x, a0, scale=1.0/b0), 'k:', 100 | label='事前分布') 101 | plt.xlim(0, 6) 102 | plt.ylim(0, 1.75) 103 | plt.xlabel('$\\lambda$', fontproperties=jpfont) 104 | plt.ylabel('確率密度', fontproperties=jpfont) 105 | plt.legend(loc='best', frameon=False, prop=jpfont) 106 | plt.savefig('pybayes_fig_poisson_posterior.png', dpi=300) 107 | plt.show() 108 | -------------------------------------------------------------------------------- /python/pybayes_conjugate_regression.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | #%% NumPyの読み込み 3 | import numpy as np 4 | # SciPyのstatsモジュールの読み込み 5 | import scipy.stats as st 6 | # SciPyのoptimizeモジュールの読み込み 7 | import scipy.optimize as opt 8 | # SciPyのLinalgモジュールの読み込み 9 | import scipy.linalg as la 10 | # Pandasの読み込み 11 | import pandas as pd 12 | # MatplotlibのPyplotモジュールの読み込み 13 | import matplotlib.pyplot as plt 14 | # 日本語フォントの設定 15 | from matplotlib.font_manager import FontProperties 16 | import sys 17 | if sys.platform.startswith('win'): 18 | FontPath = 'C:\\Windows\\Fonts\\meiryo.ttc' 19 | elif sys.platform.startswith('darwin'): 20 | FontPath = '/System/Library/Fonts/ヒラギノ角ゴシック W4.ttc' 21 | elif sys.platform.startswith('linux'): 22 | FontPath = '/usr/share/fonts/truetype/takao-gothic/TakaoPGothic.ttf' 23 | else: 24 | print('このPythonコードが対応していないOSを使用しています.') 25 | sys.exit() 26 | jpfont = FontProperties(fname=FontPath) 27 | #%% 回帰モデルの係数と誤差項の分散に関するベイズ推論 28 | # 逆ガンマ分布のHPD区間の計算 29 | def invgamma_hpdi(hpdi0, alpha, beta, prob): 30 | """ 31 | 入力 32 | hpdi0: HPD区間の初期値 33 | alpha: 逆ガンマ分布の形状パラメータ 34 | beta: 逆ガンマ分布の尺度パラメータ 35 | prob: HPD区間の確率 (0 < prob < 1) 36 | 出力 37 | HPD区間 38 | """ 39 | def hpdi_conditions(v, a, b, p): 40 | """ 41 | 入力 42 | v: HPD区間 43 | a: 逆ガンマ分布の形状パラメータ 44 | b: 逆ガンマ分布の尺度パラメータ 45 | p: HPD区間の確率 (0 < p < 1) 46 | 出力 47 | HPD区間の条件式の値 48 | """ 49 | eq1 = st.invgamma.cdf(v[1], a, scale=b) \ 50 | - st.invgamma.cdf(v[0], a, scale=b) - p 51 | eq2 = st.invgamma.pdf(v[1], a, scale=b) \ 52 | - st.invgamma.pdf(v[0], a, scale=b) 53 | return np.hstack((eq1, eq2)) 54 | return opt.root(hpdi_conditions, hpdi0, args=(alpha, beta, prob)).x 55 | # 回帰モデルの係数と誤差項の分散の事後統計量の計算 56 | def regression_stats(y, X, b0, A0, nu0, lam0, prob): 57 | """ 58 | 入力 59 | y: 被説明変数 60 | X: 説明変数 61 | b0: 回帰係数の条件付事前分布(多変量正規分布)の平均 62 | A0: 回帰係数の条件付事前分布(多変量正規分布)の精度行列 63 | nu0: 誤差項の分散の事前分布(逆ガンマ分布)の形状パラメータ 64 | lam0: 誤差項の分散の事前分布(逆ガンマ分布)の尺度パラメータ 65 | prob: 区間確率 (0 < prob < 1) 66 | 出力 67 | results: 事後統計量のデータフレーム 68 | b_star: 回帰係数の条件付事後分布(多変量正規分布)の平均 69 | A_star: 回帰係数の条件付事後分布(多変量正規分布)の精度行列 70 | nu_star: 誤差項の分散の事後分布(逆ガンマ分布)の形状パラメータ 71 | lam_star: 誤差項の分散の事後分布(逆ガンマ分布)の尺度パラメータ 72 | """ 73 | XX = X.T.dot(X) 74 | Xy = X.T.dot(y) 75 | b_ols = la.solve(XX, Xy) 76 | A_star = XX + A0 77 | b_star = la.solve(A_star, Xy + A0.dot(b0)) 78 | C_star = la.inv(la.inv(XX) + la.inv(A0)) 79 | nu_star = y.size + nu0 80 | lam_star = np.square(y - X.dot(b_ols)).sum() \ 81 | + (b0 - b_ols).T.dot(C_star).dot(b0 - b_ols) + lam0 82 | h_star = np.sqrt(lam_star / nu_star * np.diag(la.inv(A_star))) 83 | sd_b = st.t.std(nu_star, loc=b_star, scale=h_star) 84 | ci_b = np.vstack(st.t.interval(prob, nu_star, loc=b_star, scale=h_star)) 85 | hpdi_b = ci_b 86 | stats_b = np.vstack((b_star, b_star, b_star, sd_b, ci_b, hpdi_b)).T 87 | mean_sigma2 = st.invgamma.mean(0.5*nu_star, scale=0.5*lam_star) 88 | median_sigma2 = st.invgamma.median(0.5*nu_star, scale=0.5*lam_star) 89 | mode_sigma2 = lam_star / (nu_star + 2.0) 90 | sd_sigma2 = st.invgamma.std(0.5*nu_star, scale=0.5*lam_star) 91 | ci_sigma2 = st.invgamma.interval(prob, 0.5*nu_star, scale=0.5*lam_star) 92 | hpdi_sigma2 = invgamma_hpdi(ci_sigma2, 0.5*nu_star, 0.5*lam_star, prob) 93 | stats_sigma2 = np.hstack((mean_sigma2, median_sigma2, mode_sigma2, 94 | sd_sigma2, ci_sigma2, hpdi_sigma2)) 95 | stats = np.vstack((stats_b, stats_sigma2)) 96 | stats_string = ['平均', '中央値', '最頻値', '標準偏差', '信用区間(下限)', 97 | '信用区間(上限)', 'HPD区間(下限)', 'HPD区間(上限)'] 98 | param_string = ['切片 $\\alpha$', '傾き $\\beta$', '分散 $\\sigma^2$'] 99 | results = pd.DataFrame(stats, index=param_string, columns=stats_string) 100 | return results, b_star, h_star, nu_star, lam_star 101 | #%% 回帰モデルからのデータの生成 102 | n = 50 103 | np.random.seed(99) 104 | u = st.norm.rvs(scale=0.7, size=n) 105 | x = st.uniform.rvs(loc=-np.sqrt(3.0), scale=2.0*np.sqrt(3.0), size=n) 106 | y = 1.0 + 2.0 * x + u 107 | X = np.stack((np.ones(n), x), axis=1) 108 | fig1 = plt.figure(num=1, facecolor='w') 109 | plt.scatter(x, y, color='0.5', marker='+', label='観測値') 110 | x_range = (-np.sqrt(3.0), np.sqrt(3.0)) 111 | y_range = (1.0 - 2.0*np.sqrt(3.0), 1.0 + 2.0*np.sqrt(3.0)) 112 | plt.plot(x_range, y_range, 'k-', label='回帰直線') 113 | plt.xlim(x_range) 114 | plt.ylim(y_range[0] - 2.0, y_range[1] + 2.0) 115 | plt.xlabel('x') 116 | plt.ylabel('y') 117 | plt.legend(loc='upper left', frameon=False, prop=jpfont) 118 | plt.savefig('pybayes_fig_regression_scatter.png', dpi=300) 119 | plt.show() 120 | #%% 事後統計量の計算 121 | b0 = np.zeros(2) 122 | A0 = 0.2 * np.eye(2) 123 | nu0 = 5.0 124 | lam0 = 7.0 125 | h0 = np.sqrt(np.diag(lam0 / nu0 * la.inv(A0))) 126 | prob = 0.95 127 | results, b_star, h, nu_star, lam_star = regression_stats(y, X, b0, A0, nu0, 128 | lam0, prob) 129 | print(results.to_string(float_format='{:,.4f}'.format)) 130 | #%% 事後分布のグラフの作成 131 | labels = ['切片 $\\alpha$', '傾き $\\beta$', '分散 $\\sigma^2$'] 132 | fig2, ax2 = plt.subplots(1, 3, sharey='all', sharex='all', 133 | num=2, figsize=(12, 4), facecolor='w') 134 | x = np.linspace(0, 3.2, 250) 135 | ax2[0].set_xlim(0, 3.2) 136 | ax2[0].set_ylim(0, 4) 137 | ax2[0].set_ylabel('確率密度', fontproperties=jpfont) 138 | for index in range(3): 139 | if index < 2: 140 | posterior = st.t.pdf(x, nu_star, loc=b_star[index], scale=h[index]) 141 | prior = st.t.pdf(x, nu0, loc=b0[index], scale=h0[index]) 142 | else: 143 | posterior = st.invgamma.pdf(x, 0.5*nu_star, scale=0.5*lam_star) 144 | prior = st.invgamma.pdf(x, 0.5*nu0, scale=0.5*lam0) 145 | ax2[index].plot(x, posterior, 'k-', label='事後分布') 146 | ax2[index].plot(x, prior, 'k:', label='事前分布') 147 | ax2[index].set_xlabel(labels[index], fontproperties=jpfont) 148 | ax2[index].legend(loc='best', frameon=False, prop=jpfont) 149 | plt.tight_layout() 150 | plt.savefig('pybayes_fig_regression_posterior.png', dpi=300) 151 | plt.show() 152 | -------------------------------------------------------------------------------- /python/pybayes_gaussian_distribution.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | #%% NumPyの読み込み 3 | import numpy as np 4 | # SciPyのstatsモジュールの読み込み 5 | import scipy.stats as st 6 | # MatplotlibのPyplotモジュールの読み込み 7 | import matplotlib.pyplot as plt 8 | # 日本語フォントの設定 9 | from matplotlib.font_manager import FontProperties 10 | import sys 11 | if sys.platform.startswith('win'): 12 | FontPath = 'C:\\Windows\\Fonts\\meiryo.ttc' 13 | elif sys.platform.startswith('darwin'): 14 | FontPath = '/System/Library/Fonts/ヒラギノ角ゴシック W4.ttc' 15 | elif sys.platform.startswith('linux'): 16 | FontPath = '/usr/share/fonts/truetype/takao-gothic/TakaoPGothic.ttf' 17 | else: 18 | print('このPythonコードが対応していないOSを使用しています.') 19 | sys.exit() 20 | jpfont = FontProperties(fname=FontPath) 21 | #%% 正規分布のグラフ 22 | value_mu = np.array([0.0, 2.0, -2.0]) 23 | value_sigma = np.array([1.0, 0.5, 2.0]) 24 | styles = ['-', '--', '-.'] 25 | x = np.linspace(-6, 6, 250) 26 | fig, ax = plt.subplots(1, 2, sharex='row', 27 | num=1, figsize=(8, 4), facecolor='w') 28 | ax[0].set_xlim(-6, 6) 29 | ax[0].set_ylabel('確率密度', fontproperties=jpfont) 30 | # 平均による分布の形状の変化 31 | for index in range(value_mu.size): 32 | mu_i = value_mu[index] 33 | plot_label = '$\\mu$ = {0:< 3.1f}'.format(mu_i) 34 | ax[0].plot(x, st.norm.pdf(x, loc=mu_i), color='k', 35 | linestyle=styles[index], label=plot_label) 36 | ax[0].set_ylim(0, 0.55) 37 | ax[0].set_xlabel('確率変数の値', fontproperties=jpfont) 38 | ax[0].legend(loc='upper right', frameon=False, prop=jpfont) 39 | # 分散による分布の形状の変化 40 | for index in range(value_mu.size): 41 | sigma_i = value_sigma[index] 42 | plot_label = '$\\sigma$ = {0:<3.1f}'.format(sigma_i) 43 | ax[1].plot(x, st.norm.pdf(x, scale=sigma_i), color='k', 44 | linestyle=styles[index], label=plot_label) 45 | ax[1].set_ylim(0, 0.9) 46 | ax[1].set_xlabel('確率変数の値', fontproperties=jpfont) 47 | ax[1].legend(loc='upper right', frameon=False, prop=jpfont) 48 | plt.tight_layout() 49 | plt.savefig('pybayes_fig_gaussian_distribution.png', dpi=300) 50 | plt.show() 51 | -------------------------------------------------------------------------------- /python/pybayes_gibbs_gaussian.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | #%% NumPyの読み込み 3 | import numpy as np 4 | # SciPyのstatsモジュールの読み込み 5 | import scipy.stats as st 6 | # Pandasの読み込み 7 | import pandas as pd 8 | # ArviZの読み込み 9 | import arviz as az 10 | # MatplotlibのPyplotモジュールの読み込み 11 | import matplotlib.pyplot as plt 12 | # tqdmからプログレスバーの関数を読み込む 13 | from tqdm import trange 14 | # 日本語フォントの設定 15 | from matplotlib.font_manager import FontProperties 16 | import sys 17 | if sys.platform.startswith('win'): 18 | FontPath = 'C:\\Windows\\Fonts\\meiryo.ttc' 19 | elif sys.platform.startswith('darwin'): 20 | FontPath = '/System/Library/Fonts/ヒラギノ角ゴシック W4.ttc' 21 | elif sys.platform.startswith('linux'): 22 | FontPath = '/usr/share/fonts/truetype/takao-gothic/TakaoPGothic.ttf' 23 | else: 24 | print('このPythonコードが対応していないOSを使用しています.') 25 | sys.exit() 26 | jpfont = FontProperties(fname=FontPath) 27 | #%% ギブズ・サンプラーによる正規分布の平均と分散に関するベイズ推論 28 | # 正規分布の平均と分散のギブズ・サンプラー 29 | def gibbs_gaussian(data, iterations, mu0, tau0, nu0, lam0): 30 | """ 31 | 入力 32 | data: データ 33 | iterations: 反復回数 34 | mu0: 平均の事前分布(正規分布)の平均 35 | tau0: 平均の事前分布(正規分布)の標準偏差 36 | nu0: 分散の事前分布(逆ガンマ分布)の形状パラメータ 37 | lam0: 分散の事前分布(逆ガンマ分布)の尺度パラメータ 38 | 出力 39 | runs: モンテカルロ標本 40 | """ 41 | n = data.size 42 | sum_data = data.sum() 43 | mean_data = sum_data / n 44 | variance_data = data.var() 45 | inv_tau02 = 1.0 / tau0**2 46 | mu0_tau02 = mu0 * inv_tau02 47 | a = 0.5 * (n + nu0) 48 | c = n * variance_data + lam0 49 | sigma2 = variance_data 50 | runs = np.empty((iterations, 2)) 51 | for idx in trange(iterations): 52 | variance_mu = 1.0 / (n / sigma2 + inv_tau02) 53 | mean_mu = variance_mu * (sum_data / sigma2 + mu0_tau02) 54 | mu = st.norm.rvs(loc=mean_mu, scale=np.sqrt(variance_mu)) 55 | b = 0.5 * (n * (mu - mean_data)**2 + c) 56 | sigma2 = st.invgamma.rvs(a, scale=b) 57 | runs[idx, 0] = mu 58 | runs[idx, 1] = sigma2 59 | return runs 60 | # モンテカルロ標本からの事後統計量の計算 61 | def mcmc_stats(runs, burnin, prob, batch): 62 | """ 63 | 入力 64 | runs: モンテカルロ標本 65 | burnin: バーンインの回数 66 | prob: 区間確率 (0 < prob < 1) 67 | batch: 乱数系列の分割数 68 | 出力 69 | 事後統計量のデータフレーム 70 | """ 71 | traces = runs[burnin:, :] 72 | n = traces.shape[0] // batch 73 | k = traces.shape[1] 74 | alpha = 100 * (1.0 - prob) 75 | post_mean = np.mean(traces, axis=0) 76 | post_median = np.median(traces, axis=0) 77 | post_sd = np.std(traces, axis=0) 78 | mc_err = [az.mcse(traces[:, i].reshape((n, batch), order='F')).item(0) \ 79 | for i in range(k)] 80 | ci_lower = np.percentile(traces, 0.5 * alpha, axis=0) 81 | ci_upper = np.percentile(traces, 100 - 0.5 * alpha, axis=0) 82 | hpdi = az.hdi(traces, prob) 83 | rhat = [az.rhat(traces[:, i].reshape((n, batch), order='F')).item(0) \ 84 | for i in range(k)] 85 | stats = np.vstack((post_mean, post_median, post_sd, mc_err, 86 | ci_lower, ci_upper, hpdi.T, rhat)).T 87 | stats_string = ['平均', '中央値', '標準偏差', '近似誤差', 88 | '信用区間(下限)', '信用区間(上限)', 89 | 'HPDI(下限)', 'HPDI(上限)', '$\\hat R$'] 90 | param_string = ['平均 $\\mu$', '分散 $\\sigma^2$'] 91 | return pd.DataFrame(stats, index=param_string, columns=stats_string) 92 | #%% 正規分布からのデータ生成 93 | mu = 1.0 94 | sigma = 2.0 95 | n = 50 96 | np.random.seed(99) 97 | data = st.norm.rvs(loc=mu, scale=sigma, size=n) 98 | #%% ギブズ・サンプラーの実行 99 | mu0 = 0.0 100 | tau0 = 1.0 101 | nu0 = 5.0 102 | lam0 = 7.0 103 | prob = 0.95 104 | burnin = 2000 105 | samplesize = 20000 106 | iterations = burnin + samplesize 107 | np.random.seed(123) 108 | runs = gibbs_gaussian(data, iterations, mu0, tau0, nu0, lam0) 109 | #%% 事後統計量の計算 110 | batch = 4 111 | results = mcmc_stats(runs, burnin, prob, batch) 112 | print(results.to_string(float_format='{:,.4f}'.format)) 113 | #%% 事後分布のグラフの作成 114 | fig, ax = plt.subplots(2, 2, num=1, figsize=(8, 3), facecolor='w') 115 | labels = ['$\\mu$', '$\\sigma^2$'] 116 | for index in range(2): 117 | mc_trace = runs[burnin:, index] 118 | if index == 0: 119 | x_min = mc_trace.min() - 0.2 * np.abs(mc_trace.min()) 120 | x_max = mc_trace.max() + 0.2 * np.abs(mc_trace.max()) 121 | x = np.linspace(x_min, x_max, 250) 122 | prior = st.norm.pdf(x, loc=mu0, scale=tau0) 123 | else: 124 | x_min = 0.0 125 | x_max = mc_trace.max() + 0.2 * np.abs(mc_trace.max()) 126 | x = np.linspace(x_min, x_max, 250) 127 | prior = st.invgamma.pdf(x, 0.5*nu0, scale=0.5*lam0) 128 | ax[index, 0].set_xlabel('乱数系列', fontproperties=jpfont) 129 | ax[index, 1].set_xlabel('周辺事後分布', fontproperties=jpfont) 130 | posterior = st.gaussian_kde(mc_trace).evaluate(x) 131 | ax[index, 0].plot(mc_trace, 'k-', linewidth=0.1) 132 | ax[index, 0].set_xlim(1, samplesize) 133 | ax[index, 0].set_ylabel(labels[index], fontproperties=jpfont) 134 | ax[index, 1].plot(x, posterior, 'k-', label='事後分布') 135 | ax[index, 1].plot(x, prior, 'k:', label='事前分布') 136 | ax[index, 1].set_xlim(x_min, x_max) 137 | ax[index, 1].set_ylim(0, 1.1*posterior.max()) 138 | ax[index, 1].set_ylabel('確率密度', fontproperties=jpfont) 139 | ax[index, 1].legend(loc='best', frameon=False, prop=jpfont) 140 | plt.tight_layout() 141 | plt.savefig('pybayes_fig_gibbs_gaussian.png', dpi=300) 142 | plt.show() 143 | -------------------------------------------------------------------------------- /python/pybayes_gibbs_regression.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | #%% NumPyの読み込み 3 | import numpy as np 4 | # SciPyのlinalgモジュールの読み込み 5 | import scipy.linalg as la 6 | # SciPyのstatsモジュールの読み込み 7 | import scipy.stats as st 8 | # Pandasの読み込み 9 | import pandas as pd 10 | # ArviZの読み込み 11 | import arviz as az 12 | # tqdmからプログレスバーの関数を読み込む 13 | from tqdm import trange 14 | # MatplotlibのPyplotモジュールの読み込み 15 | import matplotlib.pyplot as plt 16 | # 日本語フォントの設定 17 | from matplotlib.font_manager import FontProperties 18 | import sys 19 | if sys.platform.startswith('win'): 20 | FontPath = 'C:\\Windows\\Fonts\\meiryo.ttc' 21 | elif sys.platform.startswith('darwin'): 22 | FontPath = '/System/Library/Fonts/ヒラギノ角ゴシック W4.ttc' 23 | elif sys.platform.startswith('linux'): 24 | FontPath = '/usr/share/fonts/truetype/takao-gothic/TakaoPGothic.ttf' 25 | else: 26 | print('このPythonコードが対応していないOSを使用しています.') 27 | sys.exit() 28 | jpfont = FontProperties(fname=FontPath) 29 | #%% ギブズ・サンプラーによる回帰モデルのパラメータに関するベイズ推論 30 | # 回帰モデルの回帰係数と誤差項の分散のギブズ・サンプラー 31 | def gibbs_regression(y, X, iterations, b0, A0, nu0, lam0): 32 | """ 33 | 入力 34 | y: 被説明変数 35 | X: 説明変数 36 | iterations: 反復回数 37 | b0: 回帰係数の事前分布(多変量正規分布)の平均 38 | A0: 回帰係数の事前分布(多変量正規分布)の精度行列 39 | nu0: 誤差項の分散の事前分布(逆ガンマ分布)の形状パラメータ 40 | lam0: 誤差項の分散の事前分布(逆ガンマ分布)の尺度パラメータ 41 | 出力 42 | runs: モンテカルロ標本 43 | """ 44 | n, k = X.shape 45 | XX = X.T.dot(X) 46 | Xy = X.T.dot(y) 47 | b_ols = la.solve(XX, Xy) 48 | rss = np.square(y - X.dot(b_ols)).sum() 49 | lam_hat = rss + lam0 50 | nu_star = 0.5 * (n + nu0) 51 | A0b0 = A0.dot(b0) 52 | sigma2 = rss / (n - k) 53 | runs = np.empty((iterations, k + 1)) 54 | for idx in trange(iterations): 55 | cov_b = la.inv(XX / sigma2 + A0) 56 | mean_b = cov_b.dot(Xy / sigma2 + A0b0) 57 | b = st.multivariate_normal.rvs(mean=mean_b, cov=cov_b) 58 | diff = b - b_ols 59 | lam_star = 0.5 * (diff.T.dot(XX).dot(diff) + lam_hat) 60 | sigma2 = st.invgamma.rvs(nu_star, scale=lam_star) 61 | runs[idx, :-1] = b 62 | runs[idx, -1] = sigma2 63 | return runs 64 | # モンテカルロ標本からの事後統計量の計算 65 | def mcmc_stats(runs, burnin, prob, batch): 66 | """ 67 | 入力 68 | runs: モンテカルロ標本 69 | burnin: バーンインの回数 70 | prob: 区間確率 (0 < prob < 1) 71 | batch: 乱数系列の分割数 72 | 出力 73 | 事後統計量のデータフレーム 74 | """ 75 | traces = runs[burnin:, :] 76 | n = traces.shape[0] // batch 77 | k = traces.shape[1] 78 | alpha = 100 * (1.0 - prob) 79 | post_mean = np.mean(traces, axis=0) 80 | post_median = np.median(traces, axis=0) 81 | post_sd = np.std(traces, axis=0) 82 | mc_err = [az.mcse(traces[:, i].reshape((n, batch), order='F')).item(0) \ 83 | for i in range(k)] 84 | ci_lower = np.percentile(traces, 0.5 * alpha, axis=0) 85 | ci_upper = np.percentile(traces, 100 - 0.5 * alpha, axis=0) 86 | hpdi = az.hdi(traces, prob) 87 | rhat = [az.rhat(traces[:, i].reshape((n, batch), order='F')).item(0) \ 88 | for i in range(k)] 89 | stats = np.vstack((post_mean, post_median, post_sd, mc_err, 90 | ci_lower, ci_upper, hpdi.T, rhat)).T 91 | stats_string = ['平均', '中央値', '標準偏差', '近似誤差', 92 | '信用区間(下限)', '信用区間(上限)', 93 | 'HPDI(下限)', 'HPDI(上限)', '$\\hat R$'] 94 | param_string = ['$\\beta_{0: