# モンテカルロシミュレーション
## 定義
モンテカルロ(Monte Carlo, MC)シミュレーションは、決定論的モデル $y=f(x_1,x_2,\ldots,x_n)$ を、入力を乱数の集合として反復的に評価する手法である。乱数変数の反復抽出に依拠する確率論的計算アルゴリズムの一種であり、名称はモンテカルロのカジノの賭博テーブルに由来する。入力に大きな不確実性を伴う現象のモデル化に有用で、信頼性・可用性・物流予測、リスク分析、荷重-強度干渉分析、修理可能システムを含む乱数過程シミュレーション、確率論的設計、不確実性伝播、幾何公差設計など多様な応用を持つ。簡素なシミュレーションは表計算ソフトでも実行でき、より高度なモデリングにはPalisade @Risk・Minitab・Crystal Ballなどの専用ソフトウェアパッケージが使われる(Source: [[@2012__Wiley__Practical Reliability Engineering - Chapter 4 Monte Carlo Simulation]] §4.1-§4.2)。
## 分布からの標本抽出
モンテカルロシミュレーションを実行するには、任意の統計分布に従う乱数変数を生成する能力が必要になる。この基盤となるのが逆変換抽出法(inverse transform sampling method)であり、統計分布の累積分布関数(cdf)$F(x)$ が $[0,1]$ の範囲に収まることを利用して、一様乱数から任意の分布の標本を得る。閉形式のcdfを持たない正規分布・対数正規分布のような分布でも、Excelの統計逆関数(`NORMINV`、`LOGINV` 等)を使えば数値的に標本抽出できる。一様分布と三角分布は、故障そのものをモデル化する分布としてではなく、この乱数生成・工学近似の基礎として重要である(Source: [[@2012__Wiley__Practical Reliability Engineering - Chapter 4 Monte Carlo Simulation]] §4.3-§4.4)。
## 基本手順
モンテカルロシミュレーション研究は、問題の範囲に応じて変わりうるが、おおむね次の7ステップに分けられる: (1) 問題と目的の定義、(2) パラメトリックモデル $y=f(x_1,\ldots,x_q)$ の作成、(3) シミュレーションの設計(各入力の分布・試行回数 $m$ の決定)、(4) 乱数入力の生成、(5) 決定論的モデルの実行と結果の記録、(6) ステップ4・5を $i=1$ から $m$ まで反復、(7) 結果の統計解析。試行回数 $m$ は標準誤差の式 $Er(\mu)=Z_{\alpha/2}\sigma/\sqrt{m}$ で見積もれるが、出力の標準偏差$\sigma$は事前には未知であるという限界を持つ。効率化のため、純粋な乱数抽出より偏りの少ない層別抽出であるLatin Hypercube Sampling(LHS)が使われることが多い(Source: [[@2012__Wiley__Practical Reliability Engineering - Chapter 4 Monte Carlo Simulation]] §4.4.2, §4.5)。
## 適用範囲と限界
利点は手法としての単純さにある。解の形や解析的性質についての専門知識を要さず、分布が数学的な表現を持たなくてもよく、モデルの複雑さによらず常に機能する。また「What-if」シナリオや感度分析を通じて意思決定者に理解されやすい。一方、欠点としては複雑なモデルほど多数の試行を要する計算量の大きさ、誤差に厳密な上限がなく見積もりが難しい点(分散に基づく確率的な誤差限界は歪んだ分布では良い尺度にならない)、そしてすべてのパラメータの独立性を暗黙に仮定する点が挙げられる。パラメータ間に相関がある場合は事前に特定してシミュレーションに反映しないと、結果に偏りが生じうる(Source: [[@2012__Wiley__Practical Reliability Engineering - Chapter 4 Monte Carlo Simulation]] §4.6)。
## ソフトウェア信頼性への応用(Handbook ch.16 による整理)
*Handbook of Software Reliability Engineering*(1996)第16章「Software Reliability Simulation」(Tausworthe and Lyu、Jet Propulsion Laboratory / AT&T Bell Laboratories)は、モンテカルロ的な乱数生成をソフトウェア信頼性の**レートベース事象過程シミュレーション**に応用する。核となる原始操作 `occurs(x) = (random() < x)` は、一様乱数 `random()` を確率しきい値 `x` と比較する accept/reject 型の判定であり、PRE 第4章が入力パラメータの標本抽出に使う逆変換抽出法と同じ「一様乱数を確率的判定に変換する」という原理を共有する。ただし用途が異なる——PRE 第4章は静的な入力分布から1回限りの標本を抽出するのに対し、ch.16 はこの判定を微小時間区間 dt ごとに繰り返し、区間内に離散事象(ソフトウェア故障など)が発生する条件付き確率 β(t)dt(β(t) はレート関数/ハザード関数)を評価することで、時間軸上の確率的点過程を直接生成する(Source: [[@2012__Wiley__Practical Reliability Engineering - Chapter 4 Monte Carlo Simulation]] §4.3, [[@1996__McGrawHill__Handbook of Software Reliability Engineering - Chapter 16 Software Reliability Simulation]] §16.5.1-§16.5.2)。
ch.16 はこの原始操作の上に、単一事象・再帰事象(区間内の複数回発生)・二次事象(一次事象が別種の事象を誘発する、例: 修正が新たな障害を生む)・成長上限付き事象(有限個の障害という上限)という4種のシミュレーションアルゴリズムを積み上げ、最終的にこれらを統合した一般アルゴリズム `simulate()` を導出する。これは、ソフトウェア信頼性成長モデル(第3章のJelinski-Moranda・Goel-Okumoto・Musa-Okumoto・Duane・Littlewood-Verrallなど)をレート関数 β(t) として直接与えられる汎用計算基盤であり、Jet Propulsion Laboratory の Galileo 探査機 CDS ソフトウェアへの適用実験では、シミュレーションによる予測が実データおよび複数の解析モデルの予測より実データの変動傾向をよく再現したことが報告されている(Source: [[@1996__McGrawHill__Handbook of Software Reliability Engineering - Chapter 16 Software Reliability Simulation]] §16.5.7, §16.7)。
## 横断的知見
- 第5章(荷重-強度干渉)は「荷重・強度がともに正規分布に従う場合は閉形式解 $R=\Phi(SM)$ が得られるが、ワイブル分布・極値分布・対数正規分布など他の分布の組み合わせでは解析的に解けないことが多く、モンテカルロシミュレーションが実務上の標準的な解法になる」と述べるにとどまり、モンテカルロシミュレーションそのものの中身には立ち入らない。第4章はこの「モンテカルロに頼る」という記述の中身(逆変換抽出法によるワイブル分布・対数正規分布からの標本抽出、必要試行回数の見積もり、7ステップの実施手順)を具体的に示しており、両章を合わせて読むことで、第5章が閉形式解を持たない分布の組み合わせに対して提示する解法の技術的な実体が第4章にあることがわかる(Source: [[@2012__Wiley__Practical Reliability Engineering - Chapter 4 Monte Carlo Simulation]] §4.4, [[@2012__Wiley__Practical Reliability Engineering - Chapter 5 Load–Strength Interference]] §5.3.2, §5.4)。
- **PRE(ハードウェア・機械系信頼性の教科書)と Handbook ch.16(ソフトウェア信頼性)は、「モンテカルロ」という同じ語で異なる粒度の計算を指している**: PRE 第4章の7ステップ手順は、パラメトリックモデル $y=f(x_1,\ldots,x_q)$ に対して**入力変数の分布から標本を1回抽出し、モデルを1回評価する**という試行を $m$ 回繰り返し、出力の分布を統計的に要約する(値のモンテカルロ)。Handbook ch.16 のレートベースシミュレーションは、この「1回の試行」に相当する操作自体を時間軸上で無数に繰り返す——各微小時間ステップで乱数比較を行い、事象(故障)の発生・非発生を決める(過程のモンテカルロ)。前者は静的な不確実性伝播、後者は動的な確率過程の生成であり、両者を並べることで「モンテカルロ法」が指す計算の粒度がドメインによって異なることが明確になる。ch.16 自身は PRE のような入力分布サンプリングには言及せず、両者の関係は本ページの横断作業で初めて可視化された。(Source: [[@2012__Wiley__Practical Reliability Engineering - Chapter 4 Monte Carlo Simulation]] §4.4.2, [[@1996__McGrawHill__Handbook of Software Reliability Engineering - Chapter 16 Software Reliability Simulation]] §16.5.2, §16.5.7)
- **PRE 第4章が指摘する「モンテカルロの欠点(パラメータ独立性の暗黙の仮定)」は、Handbook ch.16 の二次事象シミュレーションが部分的に緩和する具体例を提供する**: PRE §4.6 は「モンテカルロは通常すべての入力パラメータの独立性を仮定しており、相関がある場合は事前に特定して反映する必要がある」と限界を述べるにとどまり、具体的な組み込み方法(コピュラ等)には触れない(本ページ既存の未解決の問い参照)。Handbook ch.16 §16.5.5 の二次事象アルゴリズムは、一次事象(例: コード生成)が確率 $p$ で二次事象(例: 欠陥生成)を誘発するという明示的な依存構造を `secondary_event` 配列と `p(j, events, t)` 関数で表現し、事象間の従属関係をシミュレーションに直接組み込む一つの技術的解法を示す。ただしこれは事象**間**の因果的従属であり、PRE が問題にする入力パラメータ**間**の統計的相関(コピュラで扱うような同時分布の形)とは性質が異なるため、PRE の未解決の問いに直接答えるものではないが、隣接する問題への異なるアプローチとして記録に値する。(Source: [[@2012__Wiley__Practical Reliability Engineering - Chapter 4 Monte Carlo Simulation]] §4.6, [[@1996__McGrawHill__Handbook of Software Reliability Engineering - Chapter 16 Software Reliability Simulation]] §16.5.5)
## 未解決の問い
- 第4章の試行回数見積もり式(4.3)は出力の標準偏差$\sigma$に依存し事前には未知であるという限界を持つが、第5章の荷重-強度干渉の実務(Example 5.2, 5.3)でこの限界がどう扱われるか(何回の試行を用いたか)は第5章の本文からは確認できていない。
- Latin Hypercube Samplingは第4章で紹介されるが、第13章(修理可能システムを含む乱数過程シミュレーション)でどのように使われるかは本章の範囲外であり未確認。
- 第4章§4.6は「相関を持つ入力パラメータは事前に特定してシミュレーションに反映すべき」と述べるが、具体的な相関の組み込み方(コピュラ等)は本章では扱われない。
## 関連
- ソース: [[@2012__Wiley__Practical Reliability Engineering - Chapter 4 Monte Carlo Simulation]] / [[@2012__Wiley__Practical Reliability Engineering - Chapter 5 Load–Strength Interference]] / [[@1996__McGrawHill__Handbook of Software Reliability Engineering - Chapter 16 Software Reliability Simulation]]
- 概念: [[荷重-強度干渉]] / [[ワイブル分布]] / [[ソフトウェア信頼性成長モデル]]
- 実体: [[Patrick D. T. O'Connor]] / [[Andre Kleyner]] / [[Robert C. Tausworthe]] / [[Michael R. Lyu]] / [[wiki/entities/Practical Reliability Engineering|Practical Reliability Engineering]] / [[wiki/entities/Handbook of Software Reliability Engineering|Handbook of Software Reliability Engineering]]
## 出典
- P. D. T. O'Connor and A. Kleyner, *Practical Reliability Engineering*, 5th ed., Wiley, 2012, Chapter 4, §4.1-§4.6.
- Robert C. Tausworthe and Michael R. Lyu, "Software Reliability Simulation", in Michael R. Lyu (ed.), *Handbook of Software Reliability Engineering*, IEEE Computer Society Press / McGraw-Hill, 1996, Chapter 16, §16.5.1-§16.5.7, §16.7.