}

ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [데이터 분석] 몬테 카를로 시뮬레이션(MC Simulation) [긴 버전]
    Data Science/데이터 분석, ML 2023. 8. 7. 22:37
    반응형

     

     

     

     


    1.  들어가는 글

    근의 공식을 기억하시나요?

    근의 공식은 이차방정식의 해를 구하는 공식을 말합니다.

    더보기

    식(1)과 같은 이차방정식이 있다고 할 때, 근의 공식은 식(2)처럼 생겼습니다.

    $$ \begin{align} &ax^{2} + bx + c = 0 \quad where \; a \neq 0 \tag{1} \\[15 pt] &x = \frac{-b \pm \sqrt{b^{2} -4ac}}{2a} \tag{2} \end{align} $$

     

    근의 공식처럼, 공식은 다양한 목적으로 쓰입니다.

    어떤 현상을 기술하기 위해서,

    또는 세상에 작용하는 법칙을 설명하기 위해서,

    또는 문제를 해결하는 방법을 기술하기 위해서,

     

    이렇게 문제를 해결하는 식이 있는 경우는 그래도 친절한 편이에요.

    식이 아무리 복잡하더라도, 해(Solution)을 얻을 수가 있으니까요.

    대부분의 문제는 하나의 식으로 해결책을 얻기 어려운 경우가 많습니다.

     

    만약 한국은행이 기준금리를 올리면, 물가는 어떻게 될까요? 그리고 환율은 어떻게 변할까요?

    편의점 매대에 있는 새우깡을 3배로 많이 깔아두면, 매출이 얼마나 오를까요?

    사람들은 얼만큼 불만이 쌓이면 민원을 넣을까요?

    한 회사는 광고에 얼마나 지출해야 매출이 오를까요? 그리고 위대한 기업의 적정한 광고비 지출은 어느 정도일까요?

     

    이럴 땐 어떤 공식을 사용할 수 있을까요? 아마 적당한 공식이 없을 거에요.

    하지만 확인하는 방법은 있습니다. 직접 해보면 되요.

    예를 들어 한국은행이 기준 금리를 올리거나, 편의점 매대에 새우깡을 3배로 많이 깔거나, 사람들에게 불만족스러운 서비스를 계속 제공하면 되요.

    그 뒤에 나오는 결과를 관찰하면 됩니다.

     

    물론 말도 안되는 일이죠.

    고작 궁금증 때문에 모험적인 선택을 할 수는 없습니다.

    그럴 때 사용하는 방법이 '시뮬레이션'입니다.

    몇 가지를 가정하고, 여러 시나리오에 따른 결과를 컴퓨터로 시뮬레이션 해보는 겁니다.

    대표적인 시뮬레이션 방법이 바로 몬테-카를로 시뮬레이션(Monte Carlo Simulation)입니다.

     

     

     

     


     

     

    2. 몬테 카를로 시뮬레이션이란?

    몬테 카를로는 모나코의 유명한 도박 도시 이름입니다. 

    도박하면 무작위성(Randomness)이 떠오르잖아요.

    특정한 패턴이 있으면 이미 해결방법도 나왔을테니, 도박이라 부르긴 어려울 거에요.

    몬테 카를로 시뮬레이션도 무작위성을 통해 결과물을 얻는 방법이에요.

    위키백과에서는 몬테카를로 방법을 '무작위 추출(repeated random sampling)을 이용하여 함수의 값을 수리적으로 근사하는 알고리즘 부르는 용어'라고 말합니다. 

     

    몬테카를로 방법 - 위키백과, 우리 모두의 백과사전

    위키백과, 우리 모두의 백과사전. 몬테카를로 방법(Monte Carlo method) 또는 몬테카를로 실험은 반복된 무작위 추출(repeated random sampling)을 이용하여 함수의 값을 수리적으로 근사하는 알고리즘을 부

    ko.wikipedia.org

     

    말이 조금 어려운데, 단순하게 보면 난수를 만들고, 적당한 계산을 하는 걸 말합니다.

    자신의 목적에 따라 어떤 난수를 만들지, 어떤 계산을 할지를 정하면 되요. 

    아이디어가 굉장히 단순한 만큼 활용될 수 있는 분야도 무궁무진합니다.

    이해만 잘 해두면 다양한 상황에 적용해볼 수 있어요.

     

     

     


     

     

    3. 원의 넓이를 구해봅니다. 

    몬테카를로를 활용하는 방법 중 쉬운 예시를 들어볼게요. 

    반지름이 1인 원의 넓이를 구하는 경우를 생각해보겠습니다.

    반지름이 1인 원의 방정식은 식(3)처럼 생겼습니다,

    $$ \begin{align} x^2 + y^2 = 1 \tag{3} \end{align} $$

     

    원의 넓이를 구하기 위해, 차근 차근 접근해보겠습니다.

     

     

    (1) 우선 원을 그려보겠습니다.

     

     

    (2) 여러 개의 점을 찍어보겠습니다.

    임의로 만들어진 점은 원의 내부와 외부에 고루 찍힐 겁니다.

    이걸 무수히 많이 반복할수록 원의 안과 밖은 점으로 가득 채워질겁니다.

    점을 한 10만개 정도 찬찬히 찍어볼게요.

    (3) 원 안에 찍힌 점의 개수를 세어봅니다. 

    원 안에 찍힌 점은 식(3)의 좌변($x^2 + y^2$)이 반지름인 $1$보다 작을 거에요.

    그러므로 식(4)를 만족하는 점의 개수를 찾으면 됩니다.

     

    $$ \begin{align} x^2 + y^2 \leqq 1 \tag{4} \end{align}$$

     

    총 10만개의 점에서 식(4)를 만족하는 점을 세어보면 약 35,077개입니다.

     

     

    (4) 이제 넓이를 구해봅니다.

    전체 점의 개수 100,000개 중에 35,077개는 원 안에 들어와 있습니다.

    원의 넓이는 전체 넓이에서 35.077%를 차지하고 있다고 볼 수 있어요.

    전체 넓이는 가로 3, 세로 3인 정사각형이니까 9입니다.

    즉 원의 넓이는 $9 * 0.35077 = 3.15693$입니다.

    원의 넓이를 구하는 공식에 대입할 경우 반지름이 1인 원의 넓이는 $\pi = 3.14159$입니다.

    약간의 오차가 있기는 하네요.

     

    해결하기 위한 방법은 크게 2가지가 있습니다.

    첫번째 방법은 난수를 더 많이 생성하면 됩니다.

    지금은 10만개를 찍었지만 100만개, 1,000만개 정도 찍어보면 더 정확하게 나올 거에요.

     

    두번째 방법은 앞서 했던 시도를 여러 번 해보는 겁니다.

    첫번째 시도에서는 점이 35,077개가 원 안에 찍혔다면,

    그 다음 시도에서는 점이 34,000개, 다음 시도에서는 35,100개, 또 다른 시도에서는, ...

    이런 식으로 여러 번 시도하면서 점이 원 안에 찍힌 갯수를 세어보면 됩니다.

    그리고 각각의 시도에서 구한 결과의 평균을 최종값으로 택하면 됩니다.

     

    난수는 100만개 정도 만들고 시도는 한 1,000번쯤 하는 게 두려울 일은 아니죠.

    어차피 사람 손으로 하는 것도 아닌데요 뭘.

     

     

     


     

     

    4.  마치며

    설계만 잘 하면 시뮬레이션은 참 유용해요.

    데이터 분석을 하는 입장에서 보면, 세상에는 데이터가 없어서 분석하기 어려운 경우도 있거든요. 

    그럴 때는 어떤 인사이트도 얻기가 어렵습니다.

    여러 방면의 지식을 토대로 결과를 짐작만 하는 거죠.

     

    이럴 때 시뮬레이션의 강력함이 드러납니다.

    현실에서 일어나기 어려운 일을 테스트해볼 수 있으니까요.

    실제로 몬테카를로 시뮬레이션은 맨해튼 계획에서도 활용되었다고 합니다.

    핵무기를 실전배치하기 전에, 파괴력 좀 궁금하다고 무작정 터뜨려 볼 수는 없으니까요.

     

    사회과학에서는 행위자 기반 모형(Agent Based Model)에서 활용됩니다. 

    특정한 행동을 하는 개인(Agent)을 랜덤으로 생성한 후에, 여러 상황을 주는 거죠.

    물가를 변동시키거나, 금리를 올리거나 하는 충격을 주는 방식으로요.

    경제에 충격이 가해지면 사람들의 행위가 달라지고,

    달라진 행위가 거시경제에 미치는 영향을 두고 보는 것이지요.

     

    응용하기에 따라 다양한 양상을 볼 수 있다는 점에서 굉장히 매력적인 기법이라는 점은 확실합니다.

     

     

    ※ 사용한 코드 ▼ 더보기 클릭

    더보기
    import matplotlib.pyplot as plt
    import random as rd
    
    # 배경 그리기
    plt.figure(figsize = (10, 10))
    ax = plt.gca()
    ax.cla()
    ax.set_xlim((-1.5, 1.5))
    ax.set_ylim((-1.5, 1.5))
    ax.axvline(x=0, color = 'black')
    ax.axhline(y=0, color = 'black')
    ax.grid(color = 'gray', alpha = 0.5, linestyle = '--')
    
    
    # 원 그리기
    circle = plt.Circle((0, 0), 1,facecolor="none" , edgecolor='blue', linewidth = 3)
    ax.add_patch(circle)
    
    # 점 찍기
    x = []
    y = []
    
    for i in range(100000) :
        x.append(rd.uniform(-1.5, 1.5))
        y.append(rd.uniform(-1.5, 1.5))
    
        
    _ranges = [100, 500, 1000, 5000, 10000, 50000, 100000]
    
    for _range in _ranges :
        ax.scatter(x[:_range], y[:_range], color = 'red')
        plt.savefig('figure'+ str(_range) + '.png')

     


     

    반응형

    댓글

Designed by Tistory.