ESS 경제성 분석 — 핵심 로직 정리

원본: ess_lng_economic_analysis.py / 대조 보고서: LNG_ESS_최종보고서_v8

1. 개념도 (보고서 구조 기준)

flowchart TD

    subgraph INPUT["📥 입력 데이터"]
        A1["연간 noESS 발전량"]
        A2["4계절 대표주차 ESS 시뮬레이션"]
        A3["10h 용량스윕<br/>(§3.2, App.D)"]
        A4["LCOS·탄소가격·RCP<br/>(§5.1, App.B·C)"]
    end

    subgraph S1["🔁 annualize_direct_scenario<br/>§4.4, 표 4-3"]
        B1["α = (G_ESS_rep − G_noESS_rep) / G_noESS_rep"]
        B2["ΔG_annual = Σ α × G_noESS_season"]
    end

    subgraph S1B["📐 scale_annual_effects<br/>§4.4 각주"]
        B3["10·15GW = 8GW × 피크절감비"]
    end

    subgraph S2["⚡ 물리효과 3종 산출"]
        C1["calculate_operating_cost_savings_krw<br/>§5.4 — 운영비 절감"]
        C2["calculate_carbon_reduction_tco2<br/>§5.4 — 탄소감축(표5-3)"]
        C3["lookup_peak_reduction<br/>§3.2 — 피크절감→정격환산"]
        C4["annual_discharge_twh<br/>§5.3 표5-2 — 연간방전량"]
    end

    subgraph S3["🧮 build_case_definitions<br/>§5.6 표5-4"]
        D1["LCOS 169/91원 × 탄소가격 하/상"]
        D2["Case A1·A2·B1·B2"]
    end

    subgraph S4["📅 연도별 보정계수<br/>§5.2 표5-1"]
        E1["physical_effect_factor s_y<br/>(2030:0.5 → 2038:1.0)"]
        E2["discount_factor d_y<br/>(할인율 4.5%)"]
    end

    subgraph S5["💰 calculate_economics<br/>§5.5·5.6, Appendix G"]
        F1["기본편익 = 운영편익+탄소편익"]
        F2["고정비편익 = 기본편익 + B_fixed,y<br/>(Δpmax×RCP_y×8760×s_y)"]
        F3["ESS비용 = 연간방전량×LCOS"]
        F4["PV = 값 × d_y"]
    end

    subgraph S6["📊 결과 & 검증"]
        G1["BCR = ΣB·d / ΣC·d<br/>Appendix A"]
        G2["NPV = Σ(B−C)·d<br/>표5-5"]
        G3["validate_against_report<br/>표4-3·5-5 대조"]
    end

    A1-->B1
    A2-->B1
    B1-->B2
    A3-->B3
    B2-.참조.->B3

    B2-->C1
    B3-->C1
    B2-->C2
    B3-->C2
    A3-->C3
    B2-->C4

    A4-->D1
    D1-->D2

    C1-->F1
    C2-->F1
    C3-->F2
    C4-->F3
    D2-->F1
    D2-->F3
    E1-->F1
    E1-->F2
    E1-->F3
    E2-->F4

    F1-->F4
    F2-->F4
    F3-->F4

    F4-->G1
    F4-->G2
    G1-->G3
    G2-->G3

    classDef input fill:#e8eef7,stroke:#4a6fa5,color:#1a2b3d;
    classDef process fill:#eaf7ee,stroke:#4a9d5f,color:#1a2b3d;
    classDef result fill:#fff3e0,stroke:#c98a1f,color:#1a2b3d;
    class A1,A2,A3,A4 input;
    class B1,B2,B3,C1,C2,C3,C4,D1,D2,E1,E2,F1,F2,F3,F4 process;
    class G1,G2,G3 result;

2. 함수 호출 계층도 (Call Graph)

flowchart TD
    MAIN["run_analysis()"]

    MAIN --> PRE1["read_generation_csv()<br/><i>전처리</i>"]
    MAIN --> PRE2["load_capacity_sweep()<br/>§3.2"]

    MAIN --> DIRECT["annualize_direct_scenario()<br/>mode=direct 시나리오별 반복"]
    DIRECT --> U1["generation_masks() · extract_week()<br/>aggregate_energy_mwh() · safe_divide()<br/><i>전처리 헬퍼</i>"]

    MAIN --> SCALE["scale_annual_effects()<br/>mode=scaled 시나리오별 반복"]
    SCALE --> LOOKUP["lookup_peak_reduction()"]

    MAIN --> ECONIN["load_economic_inputs()<br/>§5.1"]
    ECONIN --> U2["interpolate_series() · parse_year_token()<br/><i>전처리 헬퍼</i>"]

    MAIN --> CASES["build_case_definitions()<br/>§5.6"]

    MAIN --> EFFECTS["시나리오별 물리효과 계산"]
    EFFECTS --> OP["calculate_operating_cost_savings_krw()"]
    EFFECTS --> CARBON["calculate_carbon_reduction_tco2()"]
    EFFECTS --> DISCHARGE["annual_discharge_twh()"]

    MAIN --> ECON["calculate_economics()<br/>§5.5·5.6, Appendix G"]
    ECON --> PEF["physical_effect_factor() — 연도별 s_y"]
    ECON --> DF["discount_factor() — 연도별 d_y"]
    ECON -.입력값 사용.-> OP
    ECON -.입력값 사용.-> CARBON
    ECON -.입력값 사용.-> DISCHARGE
    ECON -.입력값 사용.-> CASES
    ECON -.입력값 사용.-> ECONIN

    MAIN --> VALID["validate_against_report()<br/>표4-3·5-5 대조"]
    MAIN --> OUT["export_results() / plot_*()<br/><i>출력·시각화, 비핵심</i>"]

    classDef core fill:#eaf7ee,stroke:#4a9d5f,color:#1a2b3d;
    classDef util fill:#f0f0f0,stroke:#999,color:#555;
    classDef entry fill:#e8eef7,stroke:#4a6fa5,color:#1a2b3d,font-weight:bold;

    class MAIN entry;
    class PRE1,U1,U2,OUT util;
    class PRE2,DIRECT,SCALE,LOOKUP,ECONIN,CASES,EFFECTS,OP,CARBON,DISCHARGE,ECON,PEF,DF,VALID core;

s_y : 물리효과 보정계수 physical_effect_factor

  • 이 분석은 원래 2038년 딱 한 해의 시뮬레이션 결과(운영비 절감, 탄소감축 등)만 갖고 있습니다.
  • 그런데 분석 대상 기간은 2030~2045년이라, 2038년 값을 다른 연도에도 써야 합니다.
  • 다만 2030년처럼 이른 시점에는 계통 상황(재생에너지 비중, ESS 성숙도 등)이 2038년만큼 여건이 갖춰지지 않았을 거라 보고, “2038년 효과를 100% 그대로 적용하면 과대평가”라는 문제의식에서 만든 가중치입니다.
  • “physical_effect_start_factor”: 0.5,