目次
地方自治体 地産地消型再エネ循環モデル試算システム
構想・設計段階のシステムです。ご関心ある方はお気軽にお問合せください。
入力UI要件 & Excel互換性検証手順書
1. 入力UI要件:「自治体担当が迷わない」設計
1.1 入力順序(最短10分で完了)
Excel INPUTS_MASTER シートと同じ順序で、自治体担当者が自然に入力できる設計。
Step 1: 基本設定(シナリオ選択)
└─ シナリオ番号(1-3)
└─ シナリオ名
└─ 自治体コード(6桁)
└─ 事業期間(デフォルト: 20年)
Step 2: 設備ポートフォリオ(PORTFOLIO)【超重要】
└─ PV(公共施設)容量 kW
└─ PV(家庭)容量 kW
└─ PV(低圧事業者)容量 kW
└─ 蓄電池容量 kWh / 出力 kW
└─ EV台数 / V2H導入率
★ → 「余剰供給可能量(年1)」が自動計算表示
Step 3: 需要家プール(TIME_SLICE)
└─ 年間需要 MWh
└─ 自治体施設割合 %
└─ (オプション)月別・時間別配分
Step 4: 価格設定(PRICING)
└─ 余剰買取単価 円/kWh
└─ 需要家販売単価 円/kWh
└─ 市場調達単価 円/kWh
└─ 環境価値単価 円/kWh
Step 5: 補助金・ファイナンス(SUBSIDY/FINANCE)
└─ 補助対象比率 %
└─ 補助率 %
└─ 自治体CAPEX負担割合 %(0% = PPA)
└─ Debt比率 / 金利 / 返済期間
1.2 デフォルト値(自治体担当が変更不要な推奨値)
| カテゴリ | パラメータ | デフォルト値 | 根拠 |
|---|---|---|---|
| PV | 年間発電量 | 1,100 kWh/kW | 日本全国平均 |
| 劣化率 | 0.5%/年 | JIS規格準拠 | |
| 自家消費率 | 30% | 一般的住宅・事業所 | |
| 蓄電池 | 往復効率 | 90% | リチウムイオン標準 |
| DOD | 90% | メーカー推奨 | |
| CAPEX | 14万円/kWh | 2025年市況 | |
| EV | 車載容量 | 60 kWh/台 | 標準EV |
| V2H DOD | 50% | 走行確保 | |
| 稼働率 | 30% | 駐車時間考慮 | |
| 価格 | 余剰買取 | 12円/kWh | 非FIT相場 |
| 需要家販売 | 18円/kWh | 小売単価 | |
| 市場調達 | 15円/kWh | JEPX平均 | |
| 環境価値 | 3円/kWh | 非化石証書 | |
| 補助金 | 対象比率 | 80% | 重点対策加速化 |
| 補助率 | 50% | 同上 | |
| ファイナンス | Debt比率 | 70% | プロファイ標準 |
| 金利 | 2% | 地銀水準 | |
| 返済期間 | 15年 | 設備耐用年数 | |
| 税率 | 30% | 法人税等 | |
| 割引率 | 5% | WACC想定 |
1.3 バリデーションルール
必須チェック
// シナリオ
scenario_number: required, 1 <= x <= 3
name: required, max 100 chars
municipality_code: required, /^[0-9]{6}$/
// ポートフォリオ
pv_segments[].capacity_kw: >= 0
bess_energy_kwh: >= 0
ev_count: integer >= 0
// 需要
annual_load_kwh: > 0
// 価格
all prices: >= 0
範囲チェック
// 効率・率
pv_degradation_rate: 0 <= x <= 0.03
pv_self_consumption_rate: 0 <= x <= 1
bess_roundtrip_efficiency: 0.5 <= x <= 1
bess_dod: 0.1 <= x <= 1
ev_v2h_rate: 0 <= x <= 1
ev_availability: 0 <= x <= 1
ev_v2h_dod: 0.1 <= x <= 0.8
// ファイナンス
debt_ratio: 0 <= x <= 1
debt_rate: 0 <= x <= 0.2
debt_tenor_years: 1 <= x <= 30
tax_rate: 0 <= x <= 0.5
discount_rate: 0 <= x <= 0.2
project_horizon_years: 5 <= x <= 30
// 整合性
debt_tenor_years <= project_horizon_years
配分チェック
// 月別配分(12要素)
sum(pv_month_pct) == 1.0 (±0.01)
sum(load_month_pct) == 1.0 (±0.01)
// 時間別配分(24要素)
sum(pv_hour_pct) == 1.0 (±0.01)
sum(load_hour_pct) == 1.0 (±0.01)
1.4 警告文言(ユーザーへのアラート)
| 条件 | 警告レベル | 文言 |
|---|---|---|
| 販売単価 < 買取単価 | 🔴 Critical | 「販売単価が買取単価を下回っています(逆ザヤ)。収益性を確認してください。」 |
| IRR < 5% | 🟠 Warning | 「IRRが5%未満です。収益性の改善を検討してください。」 |
| NPV < 0 | 🔴 Critical | 「NPVがマイナスです。事業性を再検討してください。」 |
| 地産地消率 < 30% | 🟠 Warning | 「地産地消率が30%未満です。蓄電池/EVの増強を検討してください。」 |
| 余剰吸収率 < 50% | 🟠 Warning | 「余剰の50%以上が吸収できません。需要家の追加を検討してください。」 |
| BCP時間 < 4h | 🟠 Warning | 「BCP対応時間が4時間未満です。蓄電池の増強を検討してください。」 |
| 返済期間 > 事業期間 | 🔴 Error | 「返済期間が事業期間を超えています。」 |
| PV容量 = 0 | 🟡 Info | 「PV容量がゼロです。」 |
| 蓄電池 = 0 | 🟡 Info | 「蓄電池がありません。時間シフトが制限されます。」 |
2. Excel互換性検証手順
2.1 検証対象シート
| シート名 | 検証内容 |
|---|---|
| INPUTS_MASTER | 入力パラメータ読み取り |
| PORTFOLIO | PV/蓄電池/EV計算 |
| TIME_SLICE | 12×24需給マッチング |
| PRICING | 価格計算 |
| PL | 損益計算 |
| CF_IRR | キャッシュフロー・IRR・NPV |
| DASHBOARD | KPI集計 |
2.2 検証手順
Step 1: 入力値の完全一致確認
# Excel入力値をPythonに転記
test_inputs = {
"pv_public_kw": excel["PORTFOLIO"]["B3"],
"pv_household_kw": excel["PORTFOLIO"]["B4"],
...
}
# APIに送信
response = requests.post("/simulate", json=test_inputs)
# 入力エコーの一致確認
assert response["assumptions_echo"]["total_pv_kw"] == excel["PORTFOLIO"]["E10"]
Step 2: 時間スライス計算の検証
# Year 1 需給マッチング結果
excel_local_used = excel["TIME_SLICE"]["Summary"]["LocalUsed"]
api_local_used = response["dispatch_y1"]["annual_local_used_kwh"]
# 許容誤差: 1%
assert abs(excel_local_used - api_local_used) / excel_local_used < 0.01
Step 3: PL計算の検証
for year in range(1, 21):
excel_row = excel["PL"][f"Year{year}"]
api_row = response["pl"][year - 1]
# 収益
assert_close(excel_row["Revenue_Elec"], api_row["revenue_electricity_yen"], 0.01)
assert_close(excel_row["Revenue_Green"], api_row["revenue_green_value_yen"], 0.01)
# 費用
assert_close(excel_row["Cost_Buy"], api_row["cost_surplus_purchase_yen"], 0.01)
assert_close(excel_row["EBITDA"], api_row["ebitda_yen"], 0.01)
Step 4: IRR/NPV計算の検証
# Excel財務関数との一致
excel_irr = excel["CF_IRR"]["IRR"] # =IRR(CF_Range)
api_irr = response["kpis"]["equity_irr"]
# IRRは相対誤差1%以内
assert abs(excel_irr - api_irr) < 0.01
excel_npv = excel["CF_IRR"]["NPV"] # =NPV(rate, CF_Range) + CF0
api_npv = response["kpis"]["npv_yen"]
# NPVは絶対誤差1万円以内
assert abs(excel_npv - api_npv) < 10000
Step 5: KPIの検証
# ダッシュボードKPI
kpi_checks = [
("LocalSupplyRate", "local_supply_rate"),
("SurplusAbsorption", "surplus_absorption_rate"),
("CO2Reduction", "co2_reduction_tons"),
("BCPHours", "bcp_hours"),
("MunicipalSaving", "municipal_cost_saving_yen"),
]
for excel_key, api_key in kpi_checks:
excel_val = excel["DASHBOARD"][excel_key]
api_val = response["kpis"][api_key]
assert_close(excel_val, api_val, 0.02) # 2%許容
2.3 検証データセット
テストケース1: 標準シナリオ
{
"name": "標準シナリオ(S1相当)",
"portfolio": {
"pv_public_kw": 500,
"pv_household_kw": 2000,
"pv_business_kw": 500,
"bess_kwh": 1000
},
"expected_kpis": {
"local_supply_rate": 0.45,
"equity_irr": 0.12
}
}
テストケース2: 大規模蓄電池
{
"name": "最大地産地消(S2相当)",
"portfolio": {
"pv_public_kw": 500,
"pv_household_kw": 3000,
"pv_business_kw": 1000,
"bess_kwh": 5000
},
"expected_kpis": {
"local_supply_rate": 0.65,
"surplus_absorption_rate": 0.80
}
}
テストケース3: PPA(自治体負担ゼロ)
{
"name": "PPA(自治体CAPEX=0)",
"subsidy": {
"municipal_capex_share": 0.0
},
"expected": {
"municipal_cost_saving_yen": "> 0"
}
}
2.4 CI/CD検証パイプライン
# .github/workflows/excel_compatibility.yml
name: Excel Compatibility Test
on:
push:
paths:
- 'backend/engine/**'
pull_request:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: |
pip install numpy numpy-financial pytest openpyxl
- name: Run unit tests
run: |
cd backend/tests
pytest test_calculator.py -v
- name: Run Excel compatibility tests
run: |
cd backend/tests
pytest test_excel_compatibility.py -v --excel-path=../../reference/excel_template.xlsx
3. 3シナリオ比較機能
シナリオプリセット
| シナリオ | 名称 | 特徴 | 推奨ユースケース |
|---|---|---|---|
| S1 | 最小財政負担 | PPA中心・蓄電池少 | 予算制約が厳しい自治体 |
| S2 | 最大地産地消 | 蓄電池+EV最大化 | 脱炭素目標重視 |
| S3 | 収益最大 | 需要アンカー強化 | 事業性重視 |
比較API
POST /simulate/compare
{
"base_inputs": { ... },
"scenario_overrides": {
"s1_minimal_fiscal": {
"subsidy.municipal_capex_share": 0.0,
"portfolio.bess_kwh": 500
},
"s2_max_local": {
"portfolio.bess_kwh": 3000,
"portfolio.ev_count": 100
},
"s3_max_revenue": {
"offtaker.annual_load_kwh": 10000000,
"prices.green_value": 5.0
}
}
}
比較レスポンス
{
"scenarios": [
{ "id": 1, "name": "S1", "kpis": { ... } },
{ "id": 2, "name": "S2", "kpis": { ... } },
{ "id": 3, "name": "S3", "kpis": { ... } }
],
"comparison_summary": {
"best_irr_scenario": 3,
"best_local_rate_scenario": 2,
"best_npv_scenario": 3,
"recommendation": "財政負担を抑えつつ脱炭素を進める場合はS1、地産地消率を最大化する場合はS2を推奨"
}
}
4. レポート出力仕様
JSON形式(フロントエンド用)
{
"success": true,
"result_id": 12345,
"calculated_at": "2025-01-15T10:30:00Z",
"kpis": {
"local_supply_rate": 0.452,
"local_supply_rate_display": "45.2%",
"surplus_absorption_rate": 0.678,
"co2_reduction_tons": 423.5,
"co2_reduction_display": "423 t-CO₂/年",
"bcp_hours": 12.5,
"municipal_cost_saving_yen": 15000000,
"municipal_cost_saving_display": "1,500万円/年",
"equity_irr": 0.125,
"equity_irr_display": "12.5%",
"npv_yen": 350000000,
"npv_display": "3.5億円",
"payback_years": 6
},
"pl": [...],
"cf": [...],
"charts": {
"cumulative_cf": [
{"year": 0, "value": -100000000},
{"year": 1, "value": -80000000},
...
],
"energy_balance": [...]
}
}
重点対策加速化事業 様式互換出力
事業計画様式に自動転記可能な形式で出力。
出力ファイル: 事業計画_[自治体コード]_[日付].xlsx
シート構成:
├── 様式1_事業概要
├── 様式2_導入設備一覧
├── 様式3_収支計画
├── 様式4_CO2削減効果
└── 様式5_地域経済効果
5. 政策整合チェックリスト
システム出力が以下の政策要件を満たすことを確認:
- [ ] 地域脱炭素ロードマップ:2030年目標値との整合
- [ ] 重点対策加速化事業:補助要件との整合
- [ ] 第7次エネルギー基本計画:再エネ比率目標
- [ ] GX2040:脱炭素電源比率
URL参照:
- https://www.env.go.jp/content/000234868.pdf
- https://policies.env.go.jp/policy/roadmap/measures/
- https://www.enecho.meti.go.jp/category/others/basic_plan/pdf/20250218_01.pdf
- https://www.meti.go.jp/press/2024/02/20250218004/20250218004-1.pdf



コメント