xellstorm
KO
앱 열기

@RISK, ModelRisk, Analytic Solver 모델 옮기기

가이드 · 2026년 10월 업데이트

xellstorm은 @RISK, ModelRisk, Analytic Solver용으로 만든 엑셀 파일을 애드인 없이 열고, 이들의 분포 함수 164개를 읽어 수식마다 입력으로 바꿉니다. 입력의 파라미터는 내 셀에 연결된 채로 남습니다. 실행 전에 변환한 항목과, 남겨 둔 모든 수식을 이유와 함께 보여 줍니다.

분포 함수 164개는 @RISK 53개, ModelRisk 62개, Analytic Solver 49개입니다. 백분위수로 분포를 지정하는 형식 65개와 절단, 출력 표식, 상관관계 행렬, 다중 시뮬레이션 표도 읽습니다.

@RISK용 엑셀 파일에서 가져오기가 찾아내는 것

예제는 프로젝트 예비비 예제의 건축 견적을 @RISK용 모델에서 흔히 쓰는 방식으로 다시 쓴 것입니다. 비용 항목은 각각 자기 행의 셀을 인수로 받는 =RiskPert(min, most likely, max, RiskName(label))이고, 리스크 이벤트는 확률에 RiskBernoulli를 씁니다. 총비용과 초과분에는 RiskOutput 표식을 달았고, 구조와 MEP는 RiskCorrmat으로 상관관계를 지정했으며, 예산 세 개는 RiskSimtable 하나에 담았습니다. 한 셀은 총비용의 RiskMean을 보고합니다. 두 번째 시트 “Demonstrations”에는 별도의 수식 다섯 개가 있습니다. 변환되는 산술식 두 개와 변환되지 않는 수식 세 개입니다. 파일은 스크립트로 만들었습니다. xellstorm이 읽는 데 @RISK는 필요 없고, 파일을 열어 보는 사용자도 마찬가지입니다.

앱에서는 Distributions 단계의 Import from workbook이 찾은 수식을 목록으로 보여 줍니다(명령줄에서 xellstorm import를 실행해도 같은 목록이 나옵니다). 이 엑셀 파일에서는 입력 12개를 변환합니다. 비용 항목 6개, 리스크 이벤트 4개, 산술 시연 2개입니다. 비용 항목과 리스크 이벤트는 파라미터가 셀에 연결된 채로 남으므로, 엑셀 파일에서 최소값이나 확률을 고치면 다음 실행에 반영됩니다. RiskName(A3)은 각 입력에 그 행의 텍스트를 이름으로 붙입니다. 변환되는 두 시연 수식은 정규 분포 추출값에 계수를 곱한 식과, 평균을 다른 셀에서 계산하는 식입니다. 둘 다 추정치의 출력에는 쓰이지 않습니다.

엑셀 파일에서 가져오기가 변환하는 것(연결된 셀은 괄호 안, 그 셀의 값과 함께)
셀엑셀 파일의 수식변환 결과
E3=RiskPert(B3,C3,D3,RiskName(A3))부지 공사: 최소 B3(100), 최빈 C3(120), 최대 D3(170)의 PERT
E4=RiskPert(B4,C4,D4,RiskName(A4))기초: 최소 B4(300), 최빈 C4(340), 최대 D4(460)의 PERT
E5=RiskPert(B5,C5,D5,RiskName(A5),RiskCorrmat(Correlation,1))구조: 최소 B5(760), 최빈 C5(820), 최대 D5(1,010)의 PERT
E6=RiskPert(B6,C6,D6,RiskName(A6),RiskCorrmat(Correlation,2))MEP: 최소 B6(540), 최빈 C6(610), 최대 D6(780)의 PERT
E7=RiskPert(B7,C7,D7,RiskName(A7))마감 공사: 최소 B7(400), 최빈 C7(450), 최대 D7(560)의 PERT
E8=RiskPert(B8,C8,D8,RiskName(A8))장비: 최소 B8(260), 최빈 C8(280), 최대 D8(330)의 PERT
D11=RiskBernoulli(B11,RiskName(A11))지반 조건: 확률 B11(0.25)의 베르누이
D12=RiskBernoulli(B12,RiskName(A12))설계 변경: 확률 B12(0.35)의 베르누이
D13=RiskBernoulli(B13,RiskName(A13))공급업체 지연: 확률 B13(0.2)의 베르누이
D14=RiskBernoulli(B14,RiskName(A14))악천후: 확률 B14(0.3)의 베르누이
Demonstrations!B3=RiskNormal(100,10)*1.1평균 100, 표준편차 10의 정규 분포, 추출값에 곱하는 값 1.1. 시연용이며 추정치에는 사용하지 않음
Demonstrations!B4=RiskNormal(Estimate!C3*1.1,10)평균 Estimate!C3*1.1(132), 표준편차 10의 정규 분포. 시연용이며 추정치에는 사용하지 않음

가져오기는 모델의 나머지도 읽습니다.

변환되지 않는 수식도 목록에 나옵니다. 두 번째 시트의 3개에는 모두 가져오기가 밝힌 이유가 붙고, 해결 방법도 각각 있습니다.

가져오기가 변환하지 않는 항목, 이유와 함께(엑셀 파일의 “Demonstrations” 시트)
수식제시된 이유대처 방법
=RiskBinomial(1,0.3)*RiskTriang(20,40,80)한 수식에 분포가 여러 개 있으면 변환하지 않습니다. 분포마다 입력 셀을 따로 두어야 합니다나누어 쓰면 됩니다. 리스크 발생 여부는 =RiskBernoulli(0.3) 셀 하나에, 영향은 =RiskTriang(20,40,80) 셀 하나에 두고, 세 번째 셀에서 둘을 곱합니다. 추정치의 리스크 이벤트도 이렇게 만들었습니다.
=RISKCOMPOUND(RiskPoisson(3),RiskLognorm(10,3))RISKCOMPOUND에는 정확히 대응하는 xellstorm 기능이 없습니다xellstorm에는 복합 분포가 없습니다. 개수와 크기를 각각 별도의 셀에서 모델링하거나, 그 셀을 모델에서 뺍니다.
=RISKPERTALT(10%,90,"m.likely",100,90%,130)RISKPERTALT에는 정확히 대응하는 xellstorm 기능이 없습니다PERT의 최소, 최빈, 최대를 입력하거나(RiskPert), 변환되는 RiskTrigen에 백분위수를 줍니다.

변환한 모델 실행

가져온 설정으로 5,000회 시행을 실행하면 평균 총비용은 2,784.7(천 달러 단위)입니다. 같은 분포의 이론 평균, 즉 PERT 평균 (최소 + 4 × 최빈 + 최대) / 6에 각 리스크의 확률 × 영향을 더한 값은 2,784.7이고, 시뮬레이션 평균의 표준오차는 1.7입니다. 구조와 MEP의 순위 상관은 0.60에 도달합니다. RiskSimtable의 예산 세 개를 기준 실행과 시나리오 둘로 실행한 결과입니다.

가져온 모델의 실행: 총비용이 RiskSimtable의 각 예산을 넘을 확률(5,000회 시행, 천 달러 단위)
실행예산초과 확률
기준 실행(Simulation 1)2,90017.7%
Simulation 23,0005.2%
Simulation 33,1000.7%

예산이 클수록 초과하는 일이 줄고, 시나리오는 기준 실행과 같은 난수를 쓰므로 행 사이의 차이는 표본 추출이 아니라 예산 때문에 생깁니다.

결과가 애드인과 일치할까요?

모델은 같지만 난수는 다릅니다. 가져오기 규칙은 함수마다 그 함수가 뜻하는 분포를 대응시키고, 파라미터는 벤더 문서대로 옮기며, 같은 분포의 scipy 구현과 대조해 검증합니다. 테스트 데이터를 만드는 스크립트는 각 대응의 평균도 벤더가 문서화한 공식과 대조합니다. 따라서 엑셀 파일의 분포가 모두 변환되면 평균과 백분위수는 표본 추출 잡음만큼만 애드인과 다르고, 시행을 늘릴수록 이 잡음은 줄어듭니다. 위에 나온 표준오차가 평균에서 예상되는 잡음의 크기입니다.

상관관계는 @RISK와 Analytic Solver가 정의하는 대로 순위 상관이며, xellstorm은 지정한 순위 상관에 도달합니다. 그 값을 맞추려고 추출값을 짝짓는 방식은 도구마다 달라서, 상관관계를 지정한 모델은 분포의 꼬리에서 표본 추출 잡음만으로 설명되는 것보다 조금 더 다를 수 있습니다. 엑셀 파일 자체는 바뀌지 않습니다. xellstorm은 파일을 읽기만 하며, 모델은 애드인에서도 그대로 열립니다.

변환되는 항목

변환되지 않는 항목

한 셀에 분포가 여러 개 있는 경우, 다른 함수 안이나 분모에 분포가 들어 있는 경우, 분포를 직접 나누는 경우, 연산 순서를 바꿔야 하는 연쇄식은 변환되지 않습니다. 예를 들어 (RiskNormal(0,1)+5)*2, RiskNormal(0,1)*2*3 같은 수식은 이유와 함께 남겨 둡니다. RiskNormal(0,1)*(1/C1) 수식은 C1의 값이 유한한 양수이면 변환됩니다. 곱하기 전에 역수를 수식에서 직접 계산하기 때문입니다. 계산 결과가 0 이하가 되는 곱셈 계수, 함수를 호출하거나 난수 셀에 의존하는 인수, 정확히 대응하는 분포가 없는 함수(복합 분포, 시계열 함수, RiskPertAlt 등 형상 파라미터가 두 개인 백분위수 형식), ModelRisk의 U 인수와 코퓰라, 표에 없는 속성도 지원하지 않습니다. 지원하지 않는 애드인 수식은 엔진이 계산할 수 없으며, 호환성 검사가 해당 수식을 알려 줍니다.

지원 함수

표는 가져오기 기능의 규칙 목록에서 그대로 생성하므로, 실제로 변환하는 함수와 정확히 같습니다. “백분위수”는 백분위수로 분포를 지정하는 형식을, †는 숫자만 있을 때 변환되는 함수를 나타냅니다. 각 분포 아래에는 xellstorm 스펙에서 쓰는 이름이 있습니다.

가져오기가 변환하는 분포 함수, 분포별(†: 숫자만 해당, 파라미터를 인수로 계산)
분포 (xellstorm 이름)@RISKModelRiskAnalytic Solver
베르누이
bern
RiskBernoulliVoseBernoulliPsiBernoulli
베타
beta
RiskBeta
RiskBetaGeneral
RiskBetaSubj†
VoseBeta
VoseBeta4
VoseBetaSubj†
PsiBeta
PsiBetaGen
PsiBetaSubj†
이항
binom
RiskBinomialVoseBinomialPsiBinomial
Burr XII
burr12
RiskBurr12——
코시
cauchy
RiskCauchy
백분위수:
RiskCauchyAlt
RiskCauchyAltD
VoseCauchy—
카이제곱
chi2
RiskChiSq
백분위수:
RiskChiSqAlt
RiskChiSqAltD
VoseChiSqPsiChiSquare
백분위수:
PsiChiSquareAlt
카이, 맥스웰
chi
—VoseChi
VoseMaxwell
—
누적
cumul
RiskCumul
RiskCumulD†
VoseCumulA
VoseCumulD†
VoseOgive†
PsiCumul
Dagum(Burr III)
burr
RiskDagumVoseDagumPsiDagum
이산
custom
RiskDiscrete
RiskDUniform
VoseDiscrete
VoseDUniform
PsiDiscrete
PsiDisUniform
지수
expon
RiskExpon
백분위수:
RiskExponAlt
RiskExponAltD
VoseExpon
VoseExponential
PsiExponential
백분위수:
PsiExponentialAlt
극값(최대, 검벨)
gumbel_r
RiskExtValue
백분위수:
RiskExtValueAlt
RiskExtValueAltD
VoseExtValueMaxPsiMaxExtreme
백분위수:
PsiMaxExtremeAlt
극값(최소)
gumbel_l
RiskExtValueMin
백분위수:
RiskExtValueMinAlt
RiskExtValueMinAltD
—PsiMinExtreme
백분위수:
PsiMinExtremeAlt
F
f
RiskFVoseFPsiFDist
피로 수명(Birnbaum–Saunders)
fatiguelife
RiskFatigueLife
백분위수:
RiskFatigueLifeAlt
RiskFatigueLifeAltD
VoseFatiguePsiFatigueLife
백분위수:
PsiFatigueLifeAlt
프레셰
invweibull
RiskFrechet
백분위수:
RiskFrechetAlt
RiskFrechetAltD
—PsiFrechet
백분위수:
PsiFrechetAlt
감마, 얼랑
gamma
RiskGamma
RiskErlang
백분위수:
RiskGammaAlt
RiskGammaAltD
VoseGamma
VoseErlang
PsiGamma
PsiErlang
백분위수:
PsiGammaAlt
일반(상대 가중치)
general
RiskGeneralVoseRelative—
일반화 파레토
genpareto
—VoseGPD—
히스토그램
histogram
RiskHistogrmVoseHistogramPsiHistogram
쌍곡 시컨트
hypsecant
RiskHypSecant
백분위수:
RiskHypSecantAlt
RiskHypSecantAltD
VoseHSPsiHypSecant
초기하
hypergeom
RiskHypergeoVoseHypergeoPsiHyperGeo
정수 균등
randint
RiskIntUniformVoseIntUniform
VoseStepUniform†
PsiIntUniform
역가우스
invgauss
RiskInvgauss
백분위수:
RiskInvgaussAlt
RiskInvgaussAltD
VoseInvGaussPsiInvNormal
Johnson SB
johnsonsb
RiskJohnsonSBVoseJohnsonBPsiJohnsonSB
Johnson SU
johnsonsu
RiskJohnsonSUVoseJohnsonUPsiJohnsonSU
쿠마라스와미
kumaraswamy
RiskKumaraswamyVoseKumaraswamy
VoseKumaraswamy4
PsiKumaraswamy
라플라스
laplace
RiskLaplace
백분위수:
RiskLaplaceAlt
RiskLaplaceAltD
VoseLaplace—
레비
levy
RiskLevy
백분위수:
RiskLevyAlt
RiskLevyAltD
VoseLevyPsiLevy
백분위수:
PsiLevyAlt
로그 로지스틱
fisk
RiskLogLogistic
백분위수:
RiskLogLogisticAlt
RiskLogLogisticAltD
VoseLogLogisticPsiLogLogistic
백분위수:
PsiLogLogisticAlt
로지스틱
logistic
RiskLogistic
백분위수:
RiskLogisticAlt
RiskLogisticAltD
VoseLogisticPsiLogistic
백분위수:
PsiLogisticAlt
로그정규
lognorm
RiskLognorm
RiskLognorm2
백분위수:
RiskLognormAlt
RiskLognormAltD
VoseLognormal
VoseLognormalE
PsiLogNormal
PsiLognorm
PsiLognorm2
백분위수:
PsiLogNormalAlt
음이항, 기하
nbinom
RiskGeomet
RiskNegbin
VoseGeometric
VoseNegBin
VoseNegBinom
VosePolya†
PsiGeometric
PsiNegBinomial
정규
norm
RiskNormal
RiskErf†
백분위수:
RiskNormalAlt
RiskNormalAltD
VoseNormal
VoseErf†
PsiNormal
PsiErf†
백분위수:
PsiNormalAlt
파레토
pareto
RiskPareto
백분위수:
RiskParetoAlt
RiskParetoAltD
VoseParetoPsiPareto
백분위수:
PsiParetoAlt
파레토 II(Lomax)
lomax
RiskPareto2
백분위수:
RiskPareto2Alt
RiskPareto2AltD
VosePareto2PsiPareto2
백분위수:
PsiPareto2Alt
피어슨 V(역감마)
invgamma
RiskPearson5
백분위수:
RiskPearson5Alt
RiskPearson5AltD
VosePearson5PsiPearson5
백분위수:
PsiPearson5Alt
피어슨 VI(베타 프라임)
betaprime
RiskPearson6VosePearson6PsiPearson6
PERT
pert
RiskPertVosePERT
VoseModPERT
PsiPert
푸아송
poiss
RiskPoissonVosePoissonPsiPoisson
레일리
rayleigh
RiskRayleigh
백분위수:
RiskRayleighAlt
RiskRayleighAltD
VoseRayleighPsiRayleigh
백분위수:
PsiRayleighAlt
역수(로그 균등)
loguniform
RiskReciprocalVoseReciprocalPsiReciprocal
스튜던트 t
t
RiskStudent
백분위수:
RiskStudentAlt
RiskStudentAltD
VoseStudent
VoseStudent3†
PsiStudent
백분위수:
PsiStudentAlt
삼각
triang
RiskTriangVoseTrianglePsiTriangular
백분위수 기반 삼각(Trigen)
trigen
RiskTrigen
백분위수:
RiskTriangAlt
VoseTriangleAltPsiTriangGen
균등
unif
RiskUniform
백분위수:
RiskUniformAlt
RiskUniformAltD
VoseUniformPsiUniform
와이블
weibull_min
RiskWeibull
백분위수:
RiskWeibullAlt
RiskWeibullAltD
VoseWeibull
VoseWeibull3
PsiWeibull
백분위수:
PsiWeibullAlt
가져오기가 변환하는 엑셀 자체 샘플링 수식(†: 숫자만 해당)
수식xellstorm
=NORM.INV(RAND(), mean, sd)norm (loc, scale)
=NORMINV(RAND(), mean, sd)norm (loc, scale)
=mean + sd*NORM.S.INV(RAND())norm (loc, scale)
=LOGNORM.INV(RAND(), mu, sigma)lognorm (mu, sigma)
=LOGINV(RAND(), mu, sigma)lognorm (mu, sigma)
=GAMMA.INV(RAND(), alpha, beta)gamma (a, scale)
=GAMMAINV(RAND(), alpha, beta)gamma (a, scale)
=BETA.INV(RAND(), alpha, beta)beta (a, b)
=BETA.INV(RAND(), alpha, beta, A, B)beta (a, b, min, max)
=BETAINV(RAND(), alpha, beta, A, B)beta (a, b, min, max)
=BINOM.INV(n, p, RAND())binom (n, p)
=CRITBINOM(n, p, RAND())binom (n, p)
=RANDBETWEEN(a, b)randint (min, max)
=a + (b - a)*RAND()unif (min, max)
=a + s*RAND()unif (loc, scale)
=RAND()unif
=IF(RAND() < p, 1, 0)bern (p)
=IF(RAND() < p, x, y)†custom (x, prob)
가져오기가 읽는 속성 함수, 표식, 통계
함수애드인xellstorm에서의 변환 결과
RiskTruncate@RISK절단: truncate_min, truncate_max(이동 전에 적용)
RiskTruncate2@RISK절단: 이동된 값의 truncate_min, truncate_max(이동량만큼 되돌림)
RiskTruncateP@RISK절단: truncate_pmin, truncate_pmax(분포의 백분위수)
RiskShift@RISK이동: shift
RiskName@RISK이름: 입력 이름
RiskLock@RISK고정: 고정값(RiskLock(v) 또는 RiskStatic 값)
RiskCorrmat@RISK상관관계: 한 행렬에 속한 입력 사이의 순위 상관
RiskDepC@RISK상관관계: 쌍 이름이 같은 입력과의 순위 상관
RiskIndepC@RISK상관관계: 쌍 이름이 같은 입력과의 순위 상관
RiskSimtable@RISK시뮬레이션마다 값 하나: 기준 실행에서는 고정 셀, 이후 시뮬레이션마다 시나리오 하나
RiskOutput@RISK출력: 지정한 이름의 출력
VoseXBoundsModelRisk절단: truncate_min, truncate_max(이동 전에 적용)
VosePBoundsModelRisk절단: truncate_pmin, truncate_pmax(분포의 백분위수)
VoseShiftModelRisk이동: shift
VoseInputModelRisk이름: 입력 이름
VoseSimTableModelRisk시뮬레이션마다 값 하나: 기준 실행에서는 고정 셀, 이후 시뮬레이션마다 시나리오 하나
VoseOutputModelRisk출력: 지정한 이름의 출력
PsiTruncateAnalytic Solver절단, type 1(기본값): 이동 전의 truncate_min, truncate_max; -1: 이동된 값 기준; 3: truncate_pmin, truncate_pmax
PsiTruncatePAnalytic Solver절단: truncate_pmin, truncate_pmax(분포의 백분위수)
PsiShiftAnalytic Solver이동: shift
PsiNameAnalytic Solver이름: 입력 이름
PsiCorrMatrixAnalytic Solver상관관계: 한 행렬에 속한 입력 사이의 순위 상관
PsiCorrDepenAnalytic Solver상관관계: 쌍 이름이 같은 입력과의 순위 상관
PsiCorrIndepAnalytic Solver상관관계: 쌍 이름이 같은 입력과의 순위 상관
PsiSimParamAnalytic Solver시뮬레이션마다 값 하나: 기준 실행에서는 고정 셀, 이후 시뮬레이션마다 시나리오 하나
PsiOutputAnalytic Solver출력: 해당 셀 자체 또는 그 셀이 참조하는 셀들
PsiSimOutputAnalytic Solver출력: 해당 셀 자체 또는 그 셀이 참조하는 셀들
PsiMeanAnalytic Solver통계: 첫 번째 인수의 셀이 출력이 됨(출력을 다루는 모든 Psi 통계도 마찬가지)

자주 묻는 질문

@RISK, ModelRisk, Analytic Solver를 설치해야 하나요?

아니요. xellstorm은 .xlsx 파일에서 수식을 직접 읽고 브라우저에서 자체 엔진으로 모델을 계산하므로 엑셀도 애드인도 필요 없습니다. .xls나 .xlsb 파일은 먼저 .xlsx로 저장해야 합니다.

xellstorm이 엑셀 파일을 변경하나요?

아니요. 가져오기는 xellstorm 자체 설정에 입력을 만들 뿐, 내 컴퓨터에 있는 파일에는 쓰지 않습니다. 그래서 모델은 애드인에서도 그대로 열리고 실행됩니다.

상관관계 행렬은 어떻게 처리되나요?

같은 RiskCorrmat 또는 PsiCorrMatrix 범위를 공유하는 입력은 행렬의 순위 상관을 따르며, 값은 가져올 때 셀에서 읽습니다. RiskDepC와 PsiCorrDepen은 입력을 이름이 같은 입력과 짝짓습니다. 읽을 수 없는 쌍(정사각형이 아닌 행렬, 행렬 밖의 위치, 숫자가 없는 셀)은 가져오기 메모에 이름이 나오고, 변환되지 않은 입력은 이유와 함께 목록에 올라 쌍에서 빠집니다. 행렬이 유효한 상관관계 행렬이 아니면 xellstorm이 가장 가까운 유효한 행렬을 쓰고, 앱은 실행 전에 그 행렬을 보여 줍니다.

RiskSimtable은 무엇이 되나요?

기준 실행에서는 첫 번째 값이 그 셀의 값이 되고, 나머지 값은 각각 Simulation 2, Simulation 3 같은 이름의 시나리오가 됩니다. 시나리오는 기준 실행과 같은 난수를 쓰므로 시나리오 사이의 차이는 표의 값에서만 나옵니다.

@RISK, ModelRisk, Analytic Solver는 각 소유자의 상표입니다. xellstorm은 이들과 제휴 관계가 없으며, 함수 이름은 xellstorm이 무엇을 읽는지 설명하려고 적었을 뿐입니다.

관련 글

xellstorm은 엑셀 모델을 브라우저에서 몬테카를로 시뮬레이션하는 도구입니다. 애드인은 필요 없고, 엑셀 파일은 내 컴퓨터 밖으로 나가지 않습니다.