Excelでモンテカルロシミュレーション:アドインあり・なしの3つの方法
Excelモデルでモンテカルロシミュレーションを実行する方法は3つあります。RAND()の数式とデータテーブルを使う方法、アドインを使う方法、Excelの外でモデルを実行するツールを使う方法です。いずれも、不確かな入力を範囲から引いてモデルを何千回も再計算し、結果を確率として読み取ります。予算を超える確率、80%の信頼水準で下回るコスト、最も影響の大きい入力がわかります。
1つの数値ではなくシミュレーションを使う理由
スプレッドシートは、入力の組1つに答えを1つ返します。入力が見積もりだと、その答えはどこまでずれうるかを隠し、しかもたいていは楽観的です。最も可能性の高いコストを足し合わせても、コストは下回るより超過しやすいという事実が反映されないためです。当サイトのプロジェクトコストの例題では、最も可能性の高いコストの合計である基準見積もりを、シミュレーション結果の94.2%が上回ります。最良・基準・最悪の3ケースを並べても解決しません。答えが3つ出るだけで、それぞれの起こりやすさはわからないからです。
1. Excelのみ、アドインなし:RAND()とデータテーブル
Excelにシミュレーションのコマンドはありませんが、関数だけで小さなモデルなら足ります。
- 不確かな入力を、それぞれ乱数に置き換えます。
RAND()は0〜1の一様乱数を返します。逆分布関数で、それを目的の範囲の値に変換します(数式は下の表)。 - 計算を繰り返します。1列に試行番号1〜5,000を入れ、その右の列の、最初の番号より1行上のセルに出力セルへの参照を入れます。その行から下の2列を選び、「データ」›「What-If分析」›「データテーブル」(英語版:Data › What-If Analysis › Data Table)を選んで、「列の入力セル」には同じシートの空いているセルを指定します。行ごとにモデルが再計算されるので、行ごとに新しい乱数が引かれます。
- 列を集計します。
AVERAGE、PERCENTILE.INC、COUNTIF(試行回数で割る)で、平均、P80、目標を超える確率を求めます。分布の形はヒストグラムで確かめます。
| 入力 | 数式 |
|---|---|
| 正規分布(平均、標準偏差) | =NORM.INV(RAND(), mean, sd) |
| PERT(最小、最頻、最大) | =BETA.INV(RAND(), 1+4*(ml-min)/(max-min), 1+4*(max-ml)/(max-min), min, max) |
| 三角分布(最小、最頻、最大)。乱数はUに入れる | =IF(U<(ml-min)/(max-min), min+SQRT(U*(max-min)*(ml-min)), max-SQRT((1-U)*(max-min)*(max-ml))) |
| リスクイベント(確率p、コストc) | =IF(RAND()<p, c, 0) |
この方法でも動きますし、学ぶにも向いています。ただ、実際のモデルでは限界が見えてきます。
- データテーブルは試行のたびにモデル全体を再計算するので、大きなモデルでは遅くなります。計算方法を「データテーブル以外自動」にしておくと、合間もファイルを操作できます。
RAND()は再計算のたびに乱数を引き直すので、値として貼り付けない限り、ファイルを再計算するたびに結果が変わります。- 相関のある入力も、感度分析も、レポートも、数式やグラフを自分で用意することになります。
2. Excelアドイン
@RISK、Crystal Ball、Analytic Solver、ModelRiskなどのアドインは、Excelに分布関数(たとえばセルに入力するPERT関数)を加え、試行を実行し、グラフ、感度分析、レポートを作成します。Excelの中で動くため、ユーザーごとにExcelとアドインのインストールが必要で、多くの会社ではIT部門への申請が要ります。
3. Excelの外でモデルを実行するツール
3つ目は、独自の計算エンジンを持ち、.xlsxファイルを読み込んで試行を自分で実行するツールです。xellstormはこの方式で、ブラウザー上で動きます。
- お手元のExcelファイルをそのまま開きます。ブラウザーのタブ内で計算し、アップロードはしません。互換性チェックでは、数式をExcelが保存した値と突き合わせ、エンジンが計算できないセルを警告します。
- モデルマップ上で不確かな入力をクリックして範囲を与え、追跡したい結果もクリックして選びます。ファイルがすでに
NORM.INV(RAND(), …)や、@RISK、ModelRisk、Analytic Solverの一般的な分布関数を使っている場合は、対応する数式がそのまま入力になり、パラメーターはお手元のセルにリンクしたままです。上のPERT用のBETA.INVの数式も変換されます。算術式で書いた形状引数もリンクされたままで、実行のたびに先に評価されます(ExcelでのPERT分布を参照)。 - 実行にはシードを使うので、同じモデルなら毎回同じ数値になります。ほとんどのExcelファイルでは、試行で変わるセルだけを再計算します。
3つの方法の比較
| Excelのみ | Excelアドイン | xellstorm | |
|---|---|---|---|
| インストール | 不要 | Excelにアドインを導入 | 不要:ブラウザー上で動作 |
| 分布 | 数式で自作 | 多数(関数として) | 48種類(独自のテーブルを含む) |
| 試行の繰り返し | データテーブル(モデル全体を再計算) | 組み込み | 組み込み。ほとんどのファイルで、変わる部分だけを再計算 |
| 次回も同じ数値 | 不可(値として貼り付けない限り) | 固定シードなら可 | シードがあれば、CPUコア数に関係なく可 |
| 相関、感度、レポート | 自作の数式とグラフ | 組み込み | 組み込み |
結果の読み方
- 平均
- シミュレーション結果すべての平均。入力が偏っていると、最も可能性の高い入力から求めた結果とは異なります。
- パーセンタイル(P10、P50、P80、P90)
- 結果の10%、50%、80%、90%がその値以下に収まる値。P50は中央値で、P80とP90は予算によく使われる水準です(Pレベルの詳細)。
- 目標の確率
- 条件を満たす結果の割合。たとえば、総コストが予算を超える場合です。
- S字カーブ
- 結果ごとの累積確率を描いた曲線。どのパーセンタイルも、ある値を下回る確率も読み取れます。
- トルネード図
- 各入力を低いパーセンタイルから高いパーセンタイルまで動かしたとき(ほかは中央値に固定)、結果がどれだけ動くかを示します。棒が最も長い入力が、最も影響の大きい入力です(トルネード図)。
- CVaR(最悪5%の平均)
- 最悪5%の結果の平均。悪いケースが起きる頻度だけでなく、どれほど悪いかを示します(最悪側から予備費の規模を決める)。
試行は何回必要?
報告する数値が動かなくなる程度です。シミュレーションで求めた平均のサンプリングノイズは、試行回数の平方根に反比例して小さくなり、試行回数を4倍にすると半分になります。まずは数千回が一般的で、P95のような裾のパーセンタイルには、平均より多くの試行が必要です。xellstormは、平均とパーセンタイルが選んだ許容誤差内に収まるまで実行できます。
よくある質問
モンテカルロシミュレーションはシナリオ分析と同じですか?
いいえ。シナリオ分析は、最良・基準・最悪のように選んだ少数のケースを計算するだけで、それぞれの起こりやすさはわかりません。シミュレーションは、範囲から何千もの組み合わせを引き、各結果の起こりやすさを示します。
見積もりには、どの分布を使えばよいですか?
最小・最頻・最大で示す専門家の見積もりには、PERT分布か三角分布。ゼロを下回らず、右に長い裾を持つ量には、対数正規分布。起きるか起きないかのイベントには、確率と、発生時のコスト。データがあれば、それに分布を当てはめます。
Excelファイルを書き換える必要はありますか?
xellstormでは不要です。分布はExcelファイルの中ではなく外に保存され、「最小 / 最頻 / 最大」の列のように、すでにあるセルから数値を読み取れます。数式は書いたままです。Excelのみやアドインの場合、範囲は数式やアドイン独自の定義として、ファイル自体に保存されます。
ExcelでPERT分布を作るには?
ExcelにPERT関数はありませんが、PERT分布は最小から最大の範囲に合わせて伸縮したベータ分布なので、BETA.INVで乱数を引けます。=BETA.INV(RAND(), 1+4*(ml-min)/(max-min), 1+4*(max-ml)/(max-min), min, max)のように書き、最小、最頻(ml)、最大はセル参照に置き換えます。平均は(最小 + 4 × 最頻 + 最大)/ 6です。ExcelでのPERT分布では、三角分布と比べています。
アドインなしで、Excelでモンテカルロシミュレーションはできますか?
はい。不確かな入力を=NORM.INV(RAND(), mean, sd)のような数式で引き、データテーブルでモデルを繰り返し、AVERAGE、PERCENTILE.INC、COUNTIFで結果を集計します。あるいは、Excelファイルをxellstormで開いてください。ブラウザー上で試行を実行するので、アドインもExcelも不要です。
関連ページ
- ガイド
ExcelでPERT分布を使う:数式・平均・使いどころ
PERT分布は、最小から最大までのベータ分布で、平均は(最小+4×最頻+最大)/ 6です。ExcelのBETA.INV数式と、三角分布との違いも解説します。 - ガイド
P50・P80・P90の意味と、予算を組む水準の選び方
P80は、シミュレーション結果の80%がそれ以下に収まるコストです。建築プロジェクトのコスト項目6つのP80を足し合わせると2,843になりますが、実際に合計のP80を求めると2,756です(USD千)。 - ガイド
トルネード図と感度分析の解説
トルネード図は、各入力を1つずつ動かします(xellstormでは既定でP10からP90)。建築の見積もりでは、1つのリスクがコストを150(USD千単位)動かします。 - プロジェクトのコストとスケジュール
建築工事にコンティンジェンシー(予備費)はどれくらい必要か?
例題:建築工事の見積もりでは、シミュレーション結果の94.2%が、最も可能性の高いコストの合計を超えます。建築工事のコンティンジェンシー(予備費)をモンテカルロシミュレーションで見積もります。
xellstormは、Excelモデル向けのブラウザー型モンテカルロシミュレーションツールです。アドインは不要で、Excelファイルがパソコンの外に出ることはありません。