⚠️ 1. リスクとは何か
リスクの定義
ビジネスにおけるリスクとは、「将来の不確実な出来事が発生し、目標達成に悪影響を及ぼす可能性」のことです。リスクを適切に数値化することで、客観的な判断と優先順位付けが可能になります。
📌 リスクの基本式
リスク値 = 発生確率 × 影響度(損失額)
【計算例】
・発生確率:30%
・影響度(損失額):1,000万円
・リスク値 = 0.30 × 1,000万円 = 300万円(期待損失)
この300万円の意味:
同じ状況を100回繰り返すと、約30回このリスクが発生し、平均して300万円の損失が発生する。
→ リスク対策に300万円以下のコストなら、対策する価値がある!
リスクの分類
リスクを体系的に特定するために、カテゴリ別に整理します。
| カテゴリ |
説明 |
具体例 |
| 戦略リスク |
事業戦略に関わるリスク |
競合参入、市場縮小、技術革新 |
| オペレーションリスク |
日常業務に関わるリスク |
設備故障、品質問題、人材不足 |
| 財務リスク |
財務・資金に関わるリスク |
為替変動、金利上昇、取引先倒産 |
| コンプライアンスリスク |
法令・規制に関わるリスク |
法令違反、情報漏洩、労務問題 |
| レピュテーションリスク |
企業評判に関わるリスク |
不祥事、SNS炎上、製品事故 |
💡 リスク対応の4つの基本戦略
① 回避(Avoid):リスクのある活動自体をやめる
② 軽減(Mitigate):発生確率や影響度を下げる
③ 移転(Transfer):保険などで第三者にリスクを移す
④ 受容(Accept):リスクをそのまま受け入れる
📊 2. リスクの定量化と優先順位付け
期待損失(Expected Loss)の計算
リスクを定量化する最も基本的な方法が期待損失の計算です。実際のプロジェクトを例に、Pythonで実装してみましょう。
Step 1:リスク一覧の作成と期待損失計算
※コードは横スクロールできます
# ============================================
# リスク分析:期待損失の計算
# ============================================
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 日本語フォント設定
plt.rcParams[‘font.sans-serif’] = [‘Arial Unicode MS’, ‘Yu Gothic’, ‘Hiragino Sans’]
plt.rcParams[‘axes.unicode_minus’] = False
# ——————————————–
# プロジェクトのリスク一覧を定義
# ——————————————–
risks = [
{“名称”: “大手競合の参入”, “カテゴリ”: “戦略”, “発生確率”: 0.40, “影響度”: 5000},
{“名称”: “サプライチェーン障害”, “カテゴリ”: “オペレーション”, “発生確率”: 0.20, “影響度”: 3000},
{“名称”: “キーパーソン退職”, “カテゴリ”: “オペレーション”, “発生確率”: 0.15, “影響度”: 1500},
{“名称”: “為替レート変動”, “カテゴリ”: “財務”, “発生確率”: 0.60, “影響度”: 800},
{“名称”: “情報漏洩”, “カテゴリ”: “コンプライアンス”, “発生確率”: 0.05, “影響度”: 10000},
{“名称”: “製品リコール”, “カテゴリ”: “オペレーション”, “発生確率”: 0.10, “影響度”: 4000},
{“名称”: “規制変更”, “カテゴリ”: “コンプライアンス”, “発生確率”: 0.30, “影響度”: 2000},
{“名称”: “システム障害”, “カテゴリ”: “オペレーション”, “発生確率”: 0.10, “影響度”: 1000},
{“名称”: “SNS炎上”, “カテゴリ”: “レピュテーション”, “発生確率”: 0.08, “影響度”: 6000},
{“名称”: “自然災害”, “カテゴリ”: “オペレーション”, “発生確率”: 0.05, “影響度”: 8000},
]
# DataFrameに変換
df = pd.DataFrame(risks)
# 期待損失(リスク値)を計算
df[“期待損失”] = df[“発生確率”] * df[“影響度”]
# 期待損失の降順でソート
df_sorted = df.sort_values(“期待損失”, ascending=False)
print(“【リスク一覧と期待損失(単位:万円)】”)
print(“=” * 70)
print(df_sorted[[“名称”, “発生確率”, “影響度”, “期待損失”]].to_string(index=False))
print()
print(f”合計期待損失: {df[‘期待損失’].sum():,.0f}万円”)
【リスク一覧と期待損失(単位:万円)】
======================================================================
名称 発生確率 影響度 期待損失
大手競合の参入 0.40 5000 2000.0
規制変更 0.30 2000 600.0
サプライチェーン障害 0.20 3000 600.0
情報漏洩 0.05 10000 500.0
為替レート変動 0.60 800 480.0
SNS炎上 0.08 6000 480.0
製品リコール 0.10 4000 400.0
自然災害 0.05 8000 400.0
キーパーソン退職 0.15 1500 225.0
システム障害 0.10 1000 100.0
合計期待損失: 5,785万円
Step 2:パレート分析で重要リスクを特定
# ——————————————–
# パレート分析:上位リスクで全体の何%か
# ——————————————–
total = df_sorted[“期待損失”].sum()
df_sorted[“累積期待損失”] = df_sorted[“期待損失”].cumsum()
df_sorted[“累積割合”] = df_sorted[“累積期待損失”] / total * 100
print(“【パレート分析】”)
print(“=” * 70)
for i, (_, row) in enumerate(df_sorted.iterrows(), 1):
print(f”{i}位: {row[‘名称’]}”)
print(f” 期待損失: {row[‘期待損失’]:,.0f}万円 → 累積: {row[‘累積割合’]:.1f}%”)
print()
print(“→ 上位3つのリスクで全体の約55%を占める!”)
【パレート分析】
======================================================================
1位: 大手競合の参入
期待損失: 2,000万円 → 累積: 34.6%
2位: 規制変更
期待損失: 600万円 → 累積: 44.9%
3位: サプライチェーン障害
期待損失: 600万円 → 累積: 55.3%
4位: 情報漏洩
期待損失: 500万円 → 累積: 63.9%
5位: 為替レート変動
期待損失: 480万円 → 累積: 72.2%
…
→ 上位3つのリスクで全体の約55%を占める!
📝 パレート分析の活用
80:20の法則(パレートの法則)
リソースが限られている場合、すべてのリスクに対策するのは非現実的。
上位20〜30%のリスクに集中することで、全体の70〜80%のリスクをカバーできる。
📈 3. リスクマトリックスの作成
リスクマトリックスとは
リスクマトリックスは、リスクを「発生確率」と「影響度」の2軸でマッピングし、視覚的に優先順位を把握するツールです。
💡 リスクマトリックスの4象限
① 高確率 × 高影響(赤ゾーン)
→ 最優先で対策が必要。発生確率と影響度の両方を下げる対策
② 高確率 × 低影響(黄ゾーン)
→ 発生頻度を下げる対策。プロセス改善、自動化など
③ 低確率 × 高影響(橙ゾーン)
→ 保険や予備費で対応。発生時の被害を最小化する計画
④ 低確率 × 低影響(緑ゾーン)
→ 監視のみ。積極的な対策は不要、受容も選択肢
Pythonでリスクマトリックスを可視化
# ——————————————–
# リスクマトリックスの可視化
# ——————————————–
fig, ax = plt.subplots(figsize=(12, 8))
# カテゴリ別の色
colors_map = {
“戦略”: “#ff6b6b”,
“オペレーション”: “#4ecdc4”,
“財務”: “#45b7d1”,
“コンプライアンス”: “#f9ca24”,
“レピュテーション”: “#a29bfe”
}
# 散布図(バブルサイズ = 期待損失)
for cat in df[“カテゴリ”].unique():
df_cat = df[df[“カテゴリ”] == cat]
ax.scatter(
df_cat[“発生確率”] * 100, # %表示
df_cat[“影響度”],
s=df_cat[“期待損失”] * 0.3, # バブルサイズ
alpha=0.6,
label=cat,
color=colors_map.get(cat, “#95a5a6″),
edgecolors=”black”,
linewidths=1.5
)
# ゾーン分けの境界線
ax.axvline(x=20, color=”gray”, linestyle=”–“, alpha=0.5)
ax.axhline(y=3000, color=”gray”, linestyle=”–“, alpha=0.5)
ax.set_xlabel(“発生確率(%)”, fontsize=12)
ax.set_ylabel(“影響度(万円)”, fontsize=12)
ax.set_title(“リスクマトリックス”, fontsize=14, fontweight=”bold”)
ax.legend(loc=”upper right”, fontsize=10)
ax.grid(alpha=0.3)
plt.tight_layout()
plt.show()
🛡️ 4. リスク対策の費用対効果
対策オプションの比較
リスクを特定・評価したら、次は対策を検討します。対策にはコストがかかるため、費用対効果(ROI)を計算して比較します。
🎯 具体例:大手競合参入リスクへの対策
【対象リスク】
・発生確率:40%
・影響度:5,000万円
・リスク値(期待損失):2,000万円
4つのオプションを比較
# ——————————————–
# リスク対策オプションの費用対効果分析
# ——————————————–
print(“【大手競合参入リスクへの対策オプション】”)
print(“=” * 70)
print(f”現状のリスク値: 0.40 × 5,000万円 = 2,000万円”)
print()
# オプション1: 回避
print(“━━━ オプション1: 回避(この市場から撤退)━━━”)
print(“・対策コスト: 0円”)
print(“・効果: リスク完全消滅(-2,000万円)”)
print(“・デメリット: 将来の収益機会も失う”)
print(“・判断: 市場の将来性を慎重に評価”)
print()
# オプション2: 軽減
print(“━━━ オプション2: 軽減(差別化戦略)━━━”)
print(“・対策内容: ブランド強化、顧客ロイヤリティ向上”)
print(“・対策コスト: 500万円”)
print(“・効果: 影響度 5,000万円 → 2,500万円(半減)”)
risk_after = 0.40 * 2500
saving = 2000 – risk_after – 500
roi = saving / 500 * 100
print(f”・新リスク値: 0.40 × 2,500万円 = {risk_after:,.0f}万円”)
print(f”・純削減効果: 2,000 – {risk_after:,.0f} – 500 = {saving:,.0f}万円”)
print(f”・ROI: {roi:.0f}%”)
print()
# オプション3: 移転
print(“━━━ オプション3: 移転(売上減少保険)━━━”)
print(“・対策内容: 保険加入(損失の80%をカバー)”)
print(“・対策コスト: 300万円/年(保険料)”)
print(“・効果: 実質影響度 5,000万円 → 1,000万円”)
risk_after2 = 0.40 * 1000
saving2 = 2000 – risk_after2 – 300
roi2 = saving2 / 300 * 100
print(f”・新リスク値: 0.40 × 1,000万円 = {risk_after2:,.0f}万円”)
print(f”・純削減効果: 2,000 – {risk_after2:,.0f} – 300 = {saving2:,.0f}万円”)
print(f”・ROI: {roi2:.0f}%”)
print()
# オプション4: 受容
print(“━━━ オプション4: 受容(何もしない)━━━”)
print(“・対策コスト: 0円”)
print(“・効果: なし”)
print(“・リスク値: 2,000万円のまま”)
print(“・判断: 他の対策のROIが低い場合の選択肢”)
print()
# 推奨
print(“【推奨】オプション3(保険)が最も費用対効果が高い”)
print(f” ROI {roi2:.0f}% で投資対効果が最大”)
【大手競合参入リスクへの対策オプション】
======================================================================
現状のリスク値: 0.40 × 5,000万円 = 2,000万円
━━━ オプション1: 回避(この市場から撤退)━━━
・対策コスト: 0円
・効果: リスク完全消滅(-2,000万円)
・デメリット: 将来の収益機会も失う
・判断: 市場の将来性を慎重に評価
━━━ オプション2: 軽減(差別化戦略)━━━
・対策内容: ブランド強化、顧客ロイヤリティ向上
・対策コスト: 500万円
・効果: 影響度 5,000万円 → 2,500万円(半減)
・新リスク値: 0.40 × 2,500万円 = 1,000万円
・純削減効果: 2,000 – 1,000 – 500 = 500万円
・ROI: 100%
━━━ オプション3: 移転(売上減少保険)━━━
・対策内容: 保険加入(損失の80%をカバー)
・対策コスト: 300万円/年(保険料)
・効果: 実質影響度 5,000万円 → 1,000万円
・新リスク値: 0.40 × 1,000万円 = 400万円
・純削減効果: 2,000 – 400 – 300 = 1,300万円
・ROI: 433%
━━━ オプション4: 受容(何もしない)━━━
・対策コスト: 0円
・効果: なし
・リスク値: 2,000万円のまま
・判断: 他の対策のROIが低い場合の選択肢
【推奨】オプション3(保険)が最も費用対効果が高い
ROI 433% で投資対効果が最大
📌 費用対効果(ROI)による判断基準
ROI = (リスク削減効果 − 対策コスト)÷ 対策コスト × 100%
・ROI > 200%:優先的に実施すべき
・ROI 100〜200%:実施を検討
・ROI 50〜100%:慎重に判断
・ROI < 50%:実施しない(受容を検討)
🎲 5. モンテカルロシミュレーション
不確実性を考慮した分析
複数のリスクが同時に発生する可能性や、各変数のばらつきを考慮するには、モンテカルロシミュレーションが有効です。乱数を使って何千回もシミュレーションし、結果の分布を分析します。
💡 モンテカルロシミュレーションとは
基本的な考え方:
1. 不確実な変数(売上、コストなど)に確率分布を設定
2. 乱数で各変数の値を生成
3. その組み合わせで結果(利益など)を計算
4. これを数千〜数万回繰り返す
5. 結果の分布から、平均・最悪ケース・損失確率などを把握
メリット:単一の予測値ではなく、「95%の確率で○○以内」という形で結果を示せる
Step 1:プロジェクト収益のシミュレーション
# ============================================
# モンテカルロシミュレーション:プロジェクト収益予測
# ============================================
np.random.seed(42) # 再現性のため
def project_simulation(n_simulations=10000):
“””
プロジェクト収益のモンテカルロシミュレーション
不確実な要素:
– 販売価格: 平均10,000円、標準偏差1,000円
– 販売数量: 平均5,000個、標準偏差800個
– 変動費率: 平均60%、標準偏差5%
– 固定費: 平均1,500万円、標準偏差200万円
“””
results = []
for _ in range(n_simulations):
# 各変数を正規分布から生成
price = np.random.normal(10000, 1000)
quantity = max(0, np.random.normal(5000, 800))
variable_cost_rate = np.random.normal(0.60, 0.05)
fixed_cost = np.random.normal(1500, 200)
# 売上(万円単位)
revenue = price * quantity / 10000
# 変動費
variable_cost = revenue * variable_cost_rate
# 利益
profit = revenue – variable_cost – fixed_cost
results.append({
‘revenue’: revenue,
‘profit’: profit
})
return pd.DataFrame(results)
# シミュレーション実行
df_sim = project_simulation(10000)
print(“【モンテカルロシミュレーション結果】”)
print(“=” * 60)
print(f”シミュレーション回数: 10,000回”)
print()
print(“利益の統計量:”)
print(f” 平均: {df_sim[‘profit’].mean():,.0f}万円”)
print(f” 中央値: {df_sim[‘profit’].median():,.0f}万円”)
print(f” 標準偏差: {df_sim[‘profit’].std():,.0f}万円”)
print(f” 最小値: {df_sim[‘profit’].min():,.0f}万円”)
print(f” 最大値: {df_sim[‘profit’].max():,.0f}万円”)
【モンテカルロシミュレーション結果】
============================================================
シミュレーション回数: 10,000回
利益の統計量:
平均: 485万円
中央値: 481万円
標準偏差: 357万円
最小値: -612万円
最大値: 1,687万円
Step 2:VaR(Value at Risk)の計算
# ——————————————–
# VaR(Value at Risk)の計算
# ——————————————–
# パーセンタイルでVaRを計算
var_90 = np.percentile(df_sim[‘profit’], 10) # 90% VaR(下位10%)
var_95 = np.percentile(df_sim[‘profit’], 5) # 95% VaR(下位5%)
var_99 = np.percentile(df_sim[‘profit’], 1) # 99% VaR(下位1%)
print(“【VaR(Value at Risk)分析】”)
print(“=” * 60)
print()
print(“VaR(最大損失額):”)
print(f” 90% VaR: {var_90:,.0f}万円”)
print(f” 95% VaR: {var_95:,.0f}万円”)
print(f” 99% VaR: {var_99:,.0f}万円”)
print()
# 損失確率
prob_loss = (df_sim[‘profit’] < 0).sum() / len(df_sim) * 100
prob_target = (df_sim['profit'] >= 500).sum() / len(df_sim) * 100
print(“リスク指標:”)
print(f” 損失(赤字)の確率: {prob_loss:.1f}%”)
print(f” 目標利益(500万円)達成確率: {prob_target:.1f}%”)
print()
print(“【解釈】”)
print(f”・95%の確率で、利益は{var_95:,.0f}万円以上”)
print(f”・逆に5%の確率で、{-var_95:,.0f}万円以上の損失”)
print(f”・リスク予備費として約{-var_95:,.0f}万円を確保すべき”)
【VaR(Value at Risk)分析】
============================================================
VaR(最大損失額):
90% VaR: 38万円
95% VaR: -99万円
99% VaR: -310万円
リスク指標:
損失(赤字)の確率: 8.6%
目標利益(500万円)達成確率: 47.3%
【解釈】
・95%の確率で、利益は-99万円以上
・逆に5%の確率で、99万円以上の損失
・リスク予備費として約99万円を確保すべき
Step 3:感度分析(どの変数が最も影響するか)
# ——————————————–
# 感度分析:どの変数が利益に最も影響するか
# ——————————————–
from scipy.stats import pearsonr
# 詳細なシミュレーション(変数も保存)
np.random.seed(42)
results_detailed = []
for _ in range(10000):
price = np.random.normal(10000, 1000)
quantity = max(0, np.random.normal(5000, 800))
variable_cost_rate = np.random.normal(0.60, 0.05)
fixed_cost = np.random.normal(1500, 200)
revenue = price * quantity / 10000
profit = revenue – revenue * variable_cost_rate – fixed_cost
results_detailed.append({
‘price’: price,
‘quantity’: quantity,
‘variable_cost_rate’: variable_cost_rate,
‘fixed_cost’: fixed_cost,
‘profit’: profit
})
df_detailed = pd.DataFrame(results_detailed)
# 各変数と利益の相関
print(“【感度分析:利益への影響度】”)
print(“=” * 60)
print()
print(“各変数と利益の相関係数:”)
variables = [‘price’, ‘quantity’, ‘variable_cost_rate’, ‘fixed_cost’]
var_names_jp = [‘販売価格’, ‘販売数量’, ‘変動費率’, ‘固定費’]
correlations = {}
for var, name in zip(variables, var_names_jp):
corr, _ = pearsonr(df_detailed[var], df_detailed[‘profit’])
correlations[name] = abs(corr)
sign = “+” if corr > 0 else “-”
print(f” {name}: {sign}{abs(corr):.3f}”)
print()
print(“【最も影響が大きい要素】(相関係数の絶対値順)”)
sorted_corr = sorted(correlations.items(), key=lambda x: x[1], reverse=True)
for i, (name, corr) in enumerate(sorted_corr, 1):
print(f” {i}位: {name} ({corr:.3f})”)
print()
print(“→ 販売数量と販売価格の管理が最も重要!”)
【感度分析:利益への影響度】
============================================================
各変数と利益の相関係数:
販売価格: +0.547
販売数量: +0.652
変動費率: -0.498
固定費: -0.204
【最も影響が大きい要素】(相関係数の絶対値順)
1位: 販売数量 (0.652)
2位: 販売価格 (0.547)
3位: 変動費率 (0.498)
4位: 固定費 (0.204)
→ 販売数量と販売価格の管理が最も重要!
Excelでモンテカルロシミュレーションを行う
Pythonを使わなくても、Excelで同様のシミュレーションが可能です。以下の手順で実装できます。
ステップ1:シートのレイアウト
|
A |
B |
C |
D |
E |
F |
G |
H |
| 1 |
No. |
販売価格 |
販売数量 |
変動費率 |
固定費 |
売上 |
変動費 |
利益 |
| 2 |
1 |
(数式) |
(数式) |
(数式) |
(数式) |
(数式) |
(数式) |
(数式) |
| 3〜1001 |
↓ 1,000行までコピー |
ステップ2:各セルに入力する数式
【2行目に入力する数式】
A2: 1(シミュレーション番号)
B2: =NORM.INV(RAND(), 10000, 1000)
→ 平均10,000円、標準偏差1,000円の正規分布から乱数生成
C2: =MAX(0, NORM.INV(RAND(), 5000, 800))
→ 平均5,000個、標準偏差800個(負の値は0に)
D2: =NORM.INV(RAND(), 0.6, 0.05)
→ 平均60%、標準偏差5%の変動費率
E2: =NORM.INV(RAND(), 1500, 200)
→ 平均1,500万円、標準偏差200万円の固定費
F2: =B2*C2/10000
→ 売上(万円単位)
G2: =F2*D2
→ 変動費
H2: =F2-G2-E2
→ 利益
【入力後】A2:H2を選択し、1001行目までコピー(Ctrl+Shift+End → Ctrl+D)
ステップ3:統計量の計算(別のセル領域に)
【J列に統計量を計算】
J1: 統計量 K1: 値
J2: 平均利益 K2: =AVERAGE(H2:H1001)
J3: 標準偏差 K3: =STDEV.S(H2:H1001)
J4: 最小値 K4: =MIN(H2:H1001)
J5: 最大値 K5: =MAX(H2:H1001)
J6: 90% VaR K6: =PERCENTILE(H2:H1001, 0.1)
J7: 95% VaR K7: =PERCENTILE(H2:H1001, 0.05)
J8: 99% VaR K8: =PERCENTILE(H2:H1001, 0.01)
J9: 損失確率 K9: =COUNTIF(H2:H1001,”<0")/COUNT(H2:H1001)
J10: 目標達成率 K10: =COUNTIF(H2:H1001,">=500″)/COUNT(H2:H1001)
ステップ4:ヒストグラムの作成
📊 利益分布の可視化
方法1:データ分析ツール
1. 「データ」タブ →「データ分析」→「ヒストグラム」
2. 入力範囲:H2:H1001
3. グラフ出力にチェック → OK
方法2:FREQUENCY関数(手動)
1. 階級(ビン)を設定:-500, -250, 0, 250, 500, 750, 1000…
2. =FREQUENCY(H2:H1001, ビン範囲)を配列数式で入力
3. 棒グラフを作成
⚠️ 結果を固定する方法
問題:F9キーや再計算で乱数が変わり、結果が変動する
解決策:
1. B2:H1001を選択
2. Ctrl+C(コピー)
3. 右クリック →「形式を選択して貼り付け」→「値」
4. これで数式が値に変換され、結果が固定される
注意:固定後は乱数が再生成されないので、別のシナリオを試す場合は数式を再入力するか、元のシートを保存しておく
📝 STEP 42 のまとめ
✅ このステップで学んだこと
- リスクの基本式:リスク値 = 発生確率 × 影響度
- リスクマトリックス:2軸でマッピングし、優先順位を可視化
- 4つの対策オプション:回避、軽減、移転、受容
- 費用対効果(ROI):対策の優先順位付けに活用
- モンテカルロシミュレーション:不確実性を考慮した分析
- VaR:最悪ケースの損失額を示す指標
- 感度分析:どの変数が最も影響するか特定
💡 リスク分析の実務プロセス
5つのステップでリスクを管理:
① 特定:リスクを洗い出す(ブレスト、チェックリスト)
② 評価:発生確率×影響度で定量化
③ 優先順位付け:期待損失でランキング、パレート分析
④ 対策立案:4オプションから選択、ROIで評価
⑤ 監視:定期的にレビュー・更新(四半期ごと)
次のSTEP 43では、「データから洞察を導く思考法」を学び、
So What?(だから何?)で本質を掴む技術を習得します!