몬테카를로 시뮬레이션
Contents
아주 기초적인 단계를 지나, 통계학과 기계학습을 공부하다 보면, ‘몬테카를로’라는 단어를 접하게 됩니다. 전공으로 이런 분야를 접하지 않고 마구잡이로 공부한 저로서는 이 이름은 도박으로 유명한 도시인데, 왜 여기서 튀어 나올까 하는 생각이 들었습니다.
처음에는 본격적으로 알아보지 않다고 있다가, 스터디에서 이 부분을 발표하게 되었습니다. 그 때 발표한 자료를 토대로 저 같이 비전공자에게 조금이나마 도움이 될까 싶어서 글로 정리하게 되었습니다.
위키를 찾아보니 다음과 같이 설명하고 이렇게 이름이 붙어진 이유는 이 방법을 쓴 사람들이 도박으로 유명한 카지노의 이름인 몬테칼로를 따와서 입니다.
몬테카를로 방법(Monte Carlo method)은 난수를 이용하여 함수의 값을 확률적으로 계산하는 알고리즘을 부르는 용어이다. 수학이나 물리학 등에 자주 사용되며, 계산하려는 값이 닫힌 형식으로 표현되지 않거나 복잡한 경우에 근사적으로 계산할 때 사용된다
이 글은 몬테카를로 시뮬레이션 방법을 소개하고, 그것을 사용해 시나리오를 생성하는 방법을 파이 값 추정 예시를 통해 소개하는 것입니다. 시나리오 분석 방법은 일반인들에게는 낯설지만 마케팅이나 재무, 회계에서의 예측에서 들리는 분석 방법으로 많이 사용되고 있습니다. 이 중에서도 몬테카를로 시뮬레이션 방법은 상당히 낯선 방법입니다.
이 방식이 어떤 식으로 작동하고, 어떤 원리로 작용하고, 어떻게 사용할 수 있는지를 파이 값을 구하는 예시를 가지고 알아보겠습니다. 덤으로 몬테카를로 시뮬레이션과 연계하여 시나리오 분석방법 또한 소개하겠습니다.
앞에서 살펴본 위키 설명에서 본 것처럼 몬테카를로 방법은 먼저 난수를 이용하여 특정 함수를 반복해 확률 값을 계산하는 방법입니다. 구체적으로 말하자면 난수(y)를 제시해 특정 함수에 따라 누적 정규분포에서 역(x)을 구하여 해당 정규분포를 따르는 값을 반복 생성합니다. 예를 들면 전화번호 뒷 자리 4개의 합은 0~36까지로 범위가 정해지고 전화번호부에서 임의의 전화번호 1000개를 가지고 뒷 4자리 수 합의 분포를 만들었다고 가정해 봅시다. 이 분포는 정규분포와 유사한 모양을 띄는 것을 확인할 수 있습니다. 왜냐하면 양 끝이 될 수 있는 경우의 수가 2가지(0000,9999) 밖에 없고 가운데 값인 18이 될 수 있는 경우의 수가 가장 많기 때문이다. 이 분포를 누적 분포로 보자면 1~100%까지 0~36의 범위로 이루어진 분포가 될 것입니다. 이 때 y%를 난수로 지정하면 누적 정규분포의 역을 구하는 함수를 통해 특정 x 값인 4자리 수의 합을 구할 수 있습니다. 이렇듯 난수를 이용해 함수를 반복하여 특정 값을 계산해내는 것을 몬테카를로 방법이라고 합니다. 또한, 난수에 따라 변하는 특정 값을 하나의 시나리오라고 합니다. 이 때 시나리오를 여러개 생성하여 시나리오들의 평균 값들로 최종적인 확률 값을 추정하는 것이 시나리오 분석 방법입니다. 이제 이 두 가지 방법을 함께 사용하여 파이 값을 찾아 봅시다. 파이 값을 추정하기 위해서는 무엇이 필요할까요? 바로 파이 값을 구하기 위한 시뮬레이션 공식이 필요합니다. 그렇다면 어떤 방식으로 파이 값을 찾을 수 있을까요? 먼저 반지름이 1인 원을 생각해보았을 때 원의 넓이는 pi1^2으로 pi가 됩니다. 이 때 부채꼴의 넓이는 원의 넓이의 1/4 값인 pi/4가 됩니다. 이제 길이가 1인 사각형 안에 부채꼴이 있다고 생각해보면 넓이가 1인 사각형 안에 넓이가 pi/4인 부채꼴이 내접한 모습이 머릿 속으로 충분히 그려지게 됩니다. 이런 상황에서 임의의 점 (x,y)를 0,1 사이의 범위에 찍는다고 가정해 볼 수 있습니다. 이 때 점은 부채꼴 안에 찍힐 경우와 부채꼴 밖에 찍힐 경우로 나누어 집니다. 만약 점이 부채꼴 안에 찍혔다고 가정하고 그 점이 무수히 많이 찍히게 된다고 하면 그 점들은 부채꼴의 넓이를 대표할 수 있게 됩니다. 마찬가지로 사각형의 경우를 생각해보면 부채꼴이 사각형 안에 내접해있기에 점이 부채꼴 안에 찍히든 밖에 찍히든 상관 없이 무수히 많은 점을 찍게 될 경우 그 점들은 사각형의 넓이를 대표표할 수 있습니다. 이제 다음과 같이 부채꼴과 사각형의 넓이를 비율로 생각해 볼 수 있습니다. 부채꼴의 넓이 pi/4 : 사각형의 넓이 1 = 부채꼴 안에 찍힌 임의의 점의 개수 k : 전체 점의 개수 n으로 서로 대응되는 비율식이 만들어질 수 있습니다. 이 등식을 전개하면 pi = 4k/n이 됩니다.
Pi = 4*k/n
이제 파이 값을 추정하는 공식을 얻었습니다. 그렇다면 이제 파이 값을 추정해 볼 수 있습니다. 임의의 점은 난수로 발생시키며, 그 점이 부채꼴 안에 있는지 없는지는 원점과 임의의 점 사이의 거리를 측정하여 그 거리 값이 1보다 작으면 원안에 있는 것으로 판별하고 그렇지 않으면 밖에 있는 점으로 판별합니다. 이렇게 1보다 작은 점들의 개수를 반복해 저장하고 그 개수와 4를 곱한 것에 전체 임의의 점의 개수로 나누어 주면 파이 값을 추정할 수 있습니다. 위의 과정을 함수로 만들면 다음과 같습니다. 파이 함수에 대해서는 http://analyticsstory.com/103 링크를 참고하고 if문을 ifelse문으로 바꾸었습니다.
|
|
이제 이 과정을 여러번 반복하는 시나리오를 만들어 여러 시나리오를 참고해 최종 파이 값을 추정해 볼 수 있습니다. 시나리오 생성 방법은 단순합니다. 점이 n개 있는 s개의 벡터를 만듭니다. 이제 이 벡터를 위의 함수레 적용하기 위해 “apply()” 어플라이 함수를 사용해 적용합니다. 파이 함수를 적용한 벡터는 s개의 파이 추정 값을 지닌 벡터로 변하게 됩니다. 이제 s개의 평균 값을 살펴보는 것으로 최종적인 파이 값을 추정할 수 있습니다.
|
|
Author Sunsick
LastMod 2021-07-17