感度分析テーブル(1変数・2変数) は何をしますか?
使用するタイミング
戦略や財務モデルに単一の主要出力があり、その出力が1つまたは2つのドライバーの変動にどのように応答するかを示したい場合に使用します。典型的なドライバーは価格、数量、割引率、成長率、チャーン率、または単位コストです。このスキルは、Claudeアプリ内でダウンロード可能な.xlsxファイルをゼロから作成し(openpyxlとnumpyを使用)、ライブ計算式と再計算・検証パスを含みます。これはClaude for Excelアドインではありません。
構築するもの
既存のモデルに接続する単一の「Sensitivity」タブを作成します。モデルの入力セルと出力セルを参照し、1変数グリッドと2変数グリッドを配置し、結果ブロックにカラースケールを適用します。ソースモデルが別のシートにある場合、グリッドはシート間参照でリンクされ、ライブ状態を維持します。
構築ワークフロー
- 出力セル(例:NPVを保持する
Model!B40)と、それを駆動する1つまたは2つの入力セル(例:Model!B6割引率、Model!B7成長率)を特定します。 - 出力がそれらの入力に戻るライブ計算式チェーンであることを確認します。出力がハードコードされている場合は、停止してモデルを配線し直します。定数に対するデータテーブルは定数を返します。
- ベースケースを中心に入力範囲を選択します(例:ベース割引率10%、6%から14%を2%刻みでスイープ)。
- ネイティブExcelデータテーブル構造(コーナー式、入力軸、
{=TABLE(r,c)}配列)を構築します(仕様参照)。 - 同時に、コード計算フォールバックとして堅牢なバックアップも構築します。Pythonで全入力組み合わせにわたってモデルを再評価し、結果の値をラベル付き行列として書き込みます。
- 結果ブロックに3色スケールを適用し、両軸に入力セル名をラベル付けします。
- Checksブロックを追加します。
- ワークブックを実際のエンジン(ヘッドレスLibreOffice)で再計算します。
- ゼロの計算式エラー(#REF!、#DIV/0!、#VALUE!、#NAME?)を確認し、チェックが合格したことを確認して、.xlsxを提供します。
タブごとの仕様
Sensitivityタブ、1変数ブロック
レイアウト方向を選択します。入力が列方向にDOWNしている場合:
B3: 出力式、ライブ出力を参照:=Model!B40。これがコーナーセルです。A4:A10: スイープする入力値(青色の入力)、例:6%、8%、10%、12%、14%。B4:B10: データテーブルの結果列。A3:B10を選択し、データ > What-If分析 > データテーブル。行入力セルを空白のまま、列入力セルをModel!B6に設定します。Excelは{=TABLE(,Model!B6)}をB4:B10に書き込みます。- openpyxlは配列数式文字列
=TABLE(,Model!B6)をブロックに、=Model!B40をコーナーに書き込めますが、実際のエンジンでの再計算後にのみ値が入力されます。
同じブロックのコード計算フォールバック(コードで生成する場合に推奨)は、ラベル付き行列として下のA14から書き込みます:
A14: ラベル「割引率」。B14: 「NPV(計算値)」。A15:A21の各入力値について、PythonはModel!B6をその値に設定し、numpyでモデルロジックを再計算し、結果のNPVをプレーンな値としてB列に書き込みます。- 両方を維持します。ネイティブデータテーブルはライブであることを証明し、計算行列はユーザーがExcelを開く前でも数値が入力されていることを保証します。
Sensitivityタブ、2変数ブロック
- コーナーセル
E3:=Model!B40(ライブ出力)。 E4:E10: 左端を下る行入力値(最初のドライバー、例:成長率 0%、1%、... 6%)。F3:L3: 最上行を横切る列入力値(2番目のドライバー、例:割引率 6% ... 14%)。E3:L10を選択し、データ > What-If分析 > データテーブル。行入力セル =Model!B7(横方向のドライバー)、列入力セル =Model!B6(下方向のドライバー)。ExcelはF4:L10を{=TABLE(Model!B7,Model!B6)}で埋めます。- 方向に注意:最上行にリンクされたセルは行入力セルに、左列にリンクされたセルは列入力セルに入れます。入れ替えると結果が暗黙的に転置されます。
- コード計算フォールバック:両軸にわたるPythonの二重ループで、値行列をラベル付きブロックに書き込みます(軸ヘッダーはモデルから取得する場合は緑、リテラルスイープ値の場合は青)。
軸範囲の選択
- 各軸をベースケース値で中心に配置し、ベースが中央の行と中央の列に来るようにします。これにより中央セルのチェックが意味を持ちます。
- 奇数のステップ数(5、7、または9)を使用すると、単一の中央セルがベースケースと正確に一致し、2つのセルの間に落ちることを防げます。
- 各軸のステップサイズを均一に保ち(一定の増分)、グリッドがきれいなグラデーションとして読み取れ、カラースケールが解釈可能になるようにします。
- レートの場合、ベースの相対パーセントではなく絶対ポイント(8%、10%、12%)でスイープし、読者の混乱を避けます。
openpyxl構築ノート
- コーナーを実際の数式文字列として書きます:
ws["B3"] = "=Model!B40"。出力の現在の数値を貼り付けないでください。 - ネイティブデータテーブル配列の場合、openpyxlは
=TABLE(...)テキストを保存できますが、実際のエンジンが再計算してブロックを埋める必要があります。配列は再計算ステップが実行されるまでのプレースホルダーとして扱ってください。 - 計算フォールバックを書くときは、Pythonでデータ値を設定し(
ws.cell(row=r, column=c, value=float(npv)))、ライブブロックと視覚的に区別するためにヘッダーノート(例:「計算スナップショット」)を付けます。 openpyxl.formatting.rule.ColorScaleRuleを使用して結果ブロックにカラースケールを適用し、最小値から最大値までを中間点でマッピングします。
数式と書式の慣例
- 入力値(タイプ入力するスイープ軸値)には青色フォント。
- タブ内の数式には黒色フォント。
=Model!B40などのタブ間リンクには緑色フォント。- 数式が属する場所にハードコードは禁止。コーナーセルは
=Model!B40でなければならず、タイプされたベースケース番号を入れてはいけません。 - 行または列ごとに一貫した単一の数式。データテーブルブロック全体は単一の配列です。計算フォールバックはグリッド全体に適用される単一のPython式を使用します。
- 数値形式:レートは
0.0%、通貨出力は#,##0、比率は0.00。軸の値は、置き換える入力セルの単位に一致させます。
チェック
- コーナーセルがライブ出力と等しい:
=(B3=Model!B40)がTRUEを返す。 - 軸が入力セル名でラベル付けされている(各軸の上または横に、ドライバー名とそのセルアドレスを示すテキストラベル)。
- グリッドの中央がベースケースと一致する:ベースケースの行とベースケースの列にあるグリッドセルがモデルの現在の出力と等しい、
=(<center cell>=Model!B40)TRUE。 - 計算フォールバックについて、ベース入力におけるセルが、同じ入力におけるネイティブデータテーブルセルと等しい(丸め誤差の範囲内で)。
再計算と検証
openpyxlで保存し、ヘッドレス再計算(例:libreoffice --headless --convert-to xlsx)を実行して =TABLE(...) とシート間リンクを入力します。リロードしてすべてのセルを #REF!、#DIV/0!、#VALUE!、#NAME? についてスキャンします。3つのチェックがTRUEを返すことを確認します。エラーやFALSEが表示された場合、参照または範囲を修正してループし、クリーンになるまで繰り返した後、提供します。
収集する入力
- ソースモデルへのパスと正確な出力セルアドレス。
- スイープする1つまたは2つの入力セルアドレス。
- ベースケース値と、各軸の希望する範囲およびステップ。
- 軸と出力の単位および希望する数値形式。
例
仮想モデル:Model!B40 = プロジェクトNPV、Model!B6 割引率(ベース10%)と Model!B7 収益成長率(ベース3%)によって駆動。1変数ブロックは割引率を6%から14%まで2%刻みでスイープし、(例として)1,210 / 980 / 760 / 560 / 380(仮想単位)のNPVを生成。2変数ブロックは成長率0%から6%を割引率6%から14%と交差。成長率3%、割引率10%の中央セルは Model!B40 の760と等しく、ベースケースがグリッドの中央にあることを確認します。