민감도 테이블 (단일 및 이중 변수)은(는) 무엇을 하나요?
사용 시기
전략 또는 재무 모델에 단일 핵심 출력이 있고, 하나 또는 두 개의 구동 변수가 범위에 걸쳐 어떻게 반응하는지 보여주려 할 때 사용합니다. 일반적인 구동 변수는 가격, 볼륨, 할인율, 성장률, 이탈률, 또는 단위당 비용입니다. 이 스킬은 Claude 앱(openpyxl + numpy)에서 처음부터 다운로드 가능한 .xlsx를 빌드하며, 라이브 수식과 재계산 및 검증 과정을 포함합니다. Claude for Excel 애드인이 아닙니다.
빌드하는 내용
기존 모델에 연결되는 단일 Sensitivity 탭을 생성합니다. 모델의 입력 셀과 출력 셀을 참조하고, 단일 변수 및 이중 변수 그리드를 배치하며, 결과 블록에 색상 스케일을 적용합니다. 소스 모델이 다른 시트에 있는 경우, 그리드는 시트 간 참조로 연결되어 라이브 상태를 유지합니다.
빌드 워크플로우
- 출력 셀(예: NPV를 보유한
Model!B40)과 이를 구동하는 하나 또는 두 개의 입력 셀(예:Model!B6할인율,Model!B7성장률)을 식별합니다. - 출력이 해당 입력으로 다시 연결되는 라이브 수식 체인인지 확인합니다. 출력이 하드코딩된 경우 중단하고 먼저 모델을 연결하십시오. 상수에 대한 데이터 테이블은 상수를 반환합니다.
- 기본 사례를 기준으로 입력 범위를 선택합니다(예: 기본 할인율 10%, 6%에서 14%까지 2% 단위로 스위프).
- 네이티브 Excel 데이터 테이블 구조(코너 수식, 입력 축,
{=TABLE(r,c)}배열)를 빌드합니다(사양 참조). - 또한 코드로 계산된 그리드를 강력한 폴백(fallback)으로 추가로 빌드합니다: 모든 입력 조합에 대해 Python에서 모델을 재평가하고 결과 값을 레이블이 지정된 매트릭스로 기록합니다.
- 결과 블록에 3색조 색상 스케일을 적용하고 두 축에 입력 셀 이름을 레이블로 표시합니다.
- 검증 블록(Checks block)을 추가합니다.
- 실제 엔진(헤드리스 LibreOffice)에서 워크북을 재계산합니다.
- 수식 오류(#REF!, #DIV/0!, #VALUE!, #NAME?)가 없음을 확인하고, 검증을 통과했는지 확인한 후 .xlsx를 전달합니다.
탭별 사양
Sensitivity 탭, 단일 변수 블록
레이아웃 방향을 선택합니다. 입력이 열을 따라 아래로 실행되는 경우:
B3: 라이브 출력을 참조하는 출력 수식:=Model!B40. 이것이 코너 셀입니다.A4:A10: 스위프하는 입력 값(파란색 입력)(예: 6%, 8%, 10%, 12%, 14%).B4:B10: 데이터 테이블 결과 열.A3:B10을 선택한 다음 데이터 > 가상 분석 > 데이터 테이블로 이동하여 행 입력 셀은 비워두고 열 입력 셀을Model!B6으로 설정합니다. Excel은B4:B10에{=TABLE(,Model!B6)}를 기록합니다.- openpyxl은 배열 수식 문자열
=TABLE(,Model!B6)을 블록에 쓸 수 있고=Model!B40코너를 쓸 수 있지만, 값은 실제 엔진에서 재계산 후에만 채워집니다.
동일한 블록에 대한 코드 계산 폴백(코드로 생성할 때 권장)은 아래 A14부터 시작하는 레이블이 지정된 매트릭스에 기록됩니다:
A14: 레이블 "할인율".B14: "NPV (계산됨)".A15:A21의 각 입력 값에 대해 Python은Model!B6을 해당 값으로 설정하고, numpy에서 모델 로직을 재계산하고, 결과 NPV를 열 B에 일반 값으로 기록합니다.- 둘 다 유지: 네이티브 데이터 테이블은 라이브 상태임을 증명하고, 계산된 매트릭스는 사용자가 Excel을 열기 전에도 채워진 숫자를 보장합니다.
Sensitivity 탭, 이중 변수 블록
- 코너 셀
E3:=Model!B40(라이브 출력). E4:E10: 왼쪽 가장자리를 따라 아래로 내려가는 행 입력 값(첫 번째 구동 변수, 예: 성장률 0%, 1%, ... 6%).F3:L3: 맨 위 행을 가로지르는 열 입력 값(두 번째 구동 변수, 예: 할인율 6% ... 14%).E3:L10을 선택하고 데이터 > 가상 분석 > 데이터 테이블로 이동하여 행 입력 셀 =Model!B7(가로 구동 변수), 열 입력 셀 =Model!B6(세로 구동 변수)로 설정합니다. Excel은F4:L10을{=TABLE(Model!B7,Model!B6)}로 채웁니다.- 방향에 주의: 맨 위 행에 연결된 셀은 행 입력 셀에 들어가고, 왼쪽 열에 연결된 셀은 열 입력 셀에 들어갑니다. 바꾸면 결과가 조용히 전치됩니다.
- 코드 계산 폴백: 두 축에 대한 Python의 이중 루프로, 값 매트릭스를 레이블이 지정된 블록(모델에서 가져오는 경우 축 헤더는 녹색, 리터럴 스위프 값인 경우 파란색)에 기록합니다.
축 범위 선택
- 각 축을 기본 사례 값의 중앙에 맞추어 기본값이 중간 행과 중간 열에 위치하도록 하여 중심 셀 검증이 의미 있도록 합니다.
- 중간 셀이 두 셀 사이에 떨어지지 않고 기본 사례와 정확히 일치하도록 홀수 단계(5, 7, 9)를 사용합니다.
- 각 축의 단계 크기를 균일하게(일정한 증분) 유지하여 그리드가 깔끔한 그라데이션으로 읽히고 색상 스케일이 해석 가능하도록 합니다.
- 비율의 경우 독자의 혼란을 피하기 위해 기본값의 상대적 백분율이 아닌 절대 포인트(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?를 스캔합니다. 세 가지 검증이 TRUE를 반환하는지 확인합니다. 오류나 FALSE가 나타나면 참조나 범위를 수정하고 깨끗해질 때까지 반복한 다음 전달합니다.
수집할 입력
- 소스 모델의 경로와 정확한 출력 셀 주소.
- 스위프할 하나 또는 두 개의 입력 셀 주소.
- 기본 사례 값과 각 축에 대한 원하는 범위 및 단계.
- 축 및 출력에 대한 단위 및 선호하는 숫자 형식.
예시
가상 모델: Model!B40 = 프로젝트 NPV, Model!B6 할인율(기본 10%) 및 Model!B7 수익 성장률(기본 3%)에 의해 구동됨. 단일 변수 블록은 할인율 6%에서 14%까지 2%씩 스위프하여 가상 단위로 NPV(예: 1,210 / 980 / 760 / 560 / 380)를 제공합니다. 이중 변수 블록은 성장률 0%에서 6%를 할인율 6%에서 14%와 교차시킵니다. 성장률 3% 및 할인율 10%의 중심 셀은 Model!B40인 760과 같으며, 기본 사례가 그리드 중간에 있음을 확인합니다.