(빅데이터의 다음 단계는) 예측 분석이다 - 에릭 시겔 저 (옮긴이 고한석, 이지스퍼블리싱)





Introduction


#. 테스코(Tesco, 영국 식료품 체인)

13개국에 진출해 있는 수많은 점포의 계산대에서 연간 1억 장의 맞춤식 할인쿠폰을 발행

소비자들이 어떤 할인쿠폰들을 사용할지 예측, 할인쿠폰 사용률 이전 방식 대비 3.6배 증가


#. FedEx

고객들이 경쟁업체로 넘어갈 위험성 예측의 정확성을 65%에서 90%로 높여 업계 선두 유지


#. Allstate

보험에 가입한 차량의 특성에 근거, 자동차 충돌 시 신체적 피해 경향을 예측, 개선하여 연간 4천만$ 보험지급금 절약


#. Citizens Bank

예측 기술을 통해 수표 사기에 의한 손실을 20% 줄임


#. HP

가짜 제품보증서에 의한 수리 및 교환 요청을 탐지하여 6,600만 $ 절감


#. 예측 효과(The Prediction Effect) : 예측은 굳이 매우 정확할 필요가 없다

기업들은 이미 Mass Marketing(불특정 다수를 대상으로 하는 마케팅) 이라는 일종의 숫자 게임을 하고 있다.

그렇기에 예측을 통해서 기업은 게임의 균형을 미묘하게, 그러나 의미 있는 수준 안에서 자기에게 유리한 쪽으로 기울어지게 할 수 있다.

어렴풋하게라도 볼 수 있는 것이 완전히 깜깜한 암흑 상태보다는 훨씬 우수한 결과를 낳는다.




Chapter 02 - 힘이 커질수록 책임도 커진다


#. Target 쇼핑몰 (대형 유통업체) - 임신 예측

쇼핑몰의 신생아 등록 할인판매 이벤트 : 자신의 임신 여부와 출산 예정일 기재 유도, 데이터 확보

cf) 내가 기차에서 노인 또는 임산부에게 자리를 양보한 경우, 임신이나 나이와 같은 민감한 개인 데이터를 유추하려고 노력한 것인가? 아니면 그저 그 사람이 필요로 하는 바를 제공하려고 노력한 것인가?

귀납(Induction, 구체적 사실들로부터 일반적 원칙을 논리적으로 이끌어내는 것)적 추론에 죄를 뒤집어 씌우는 것은 마치 사고를 불법화하는 것과 같다. 귀납적 추론이란 무언가를 파악해 내는 행위와 전혀 다를 바 없다.

** 연역(Deduction,일반적인 것으로부터 구체적인 것, 또는 원인으로부터 결과를 논리적으로 이끌어내는 것)


#. 그것이 위엄하다고 여겨지는 사실 그 자체가 바로 그것이 가진 힘

페이스북 사용자 약 1/4는 프라이버시에 대한 우려로 가짜 데이터를 입력함


#. 윤리적 딜레마

법 집행에 예측 분석을 활용하는 경우


어떤 한 사람과 일정한 특징을 공유하는 다른 사람들이 취한 행위들에 근거, 그 사람이 나쁜 행위를 예측하는 것은 부당한가?
vs
인간도 마찬가지로 경험으로부터 배우기 때문에 한 개인의 미래 범죄 가능성에 대해 인간이 예측하는 것 또한 본질적으로는 그 이전에 다른 사람들을 대상으로 관찰한 것에 근거한 것이 아닌가?


범죄 리스크 모델은 작은 수의 특징들만을 가지고 과거의 범죄자를 지극히 제한된 관점으로 축소시킴으로써 비인간화한다.
vs
하지만 애당초 교도소에 수감되는 것 자체가 인권의 제한이므로 예측 분석을 통해 전반적인 범죄율을 낮추며 교도소 관련 예산을 절약할 수 있다면?


의사결정을 형식화하고 계량화하게 되면, 의도와는 달리 소수에 대한 편견을 심어줄 수 있다.




Chapter 03 - 데이터 효과


#. 상관관계 != 인과관계

예측 분석을 적용함에 있어 일반적으로 인과관계에 대해 알 수 없지만, 굳이 신경쓸 필요도 없다.

많은 예측 분석 프로젝트는 미래를 예측하는 데 목적이 있는 것이지, 세상을 이해하고 무엇이 그렇게 작동하게 만드는지를 알아내는 것이 아니다.

그러니 그저 제대로 작동하기만 하면 된다. 예측은 해석보다 우위를 차지한다. 예측 분석은 해결책을 찾아 제시하는 것에 목표를 두고 수행한다.

예측 분석이 종종 다양한 사회과학적 통찰력을 제공해 주기도 하지만, 그러한 것들은 예측 분석의 부산물이지 주요한 목적은 아니다.




Chapter 04 - 학습하는 기계


#. 향상도 (Lift)

예측 모델의 성능을 비교하는 하나의 측정치(metric). 예측 승수(Predictive Multiplier)라고 할 수 있음. 모델을 적용하지 않았을 때와 비교해 어떤 특정한 모델을 적용했을 때 얼마나 더 많은 목표(target) 고객을 파악해 낼 수 있는지 알려줌.


#. 체이스 은행의 부동산 담보대출 조기상환 예측 시스템

CART 의사결정나무 방법을 활용, 각기 다른 특성을 가지는 부동산 담보대출 건들을 위해 특화된 모델을 수립.

건들을 각각의 조건에 따라 그룹별로 나눈 후 각 그룹마다 각기 다른 의사결정 나무를 생성함.

나무마다 서로 다른 상황을 대상으로 한 것이었기 때문에 나무들은 상당히 다양한 모습(고유한 변수들을 서로 다른 방식으로 포함)을 띠게 됨.

도입 첫해에 6억 $ 이익 추가 창출, 조기상환 대출 건 중 74% 정확히 인식

이후 JP모건 인수, 자산 기준 미국 최대의 은행으로 성장




Chapter 05 - 앙상블 효과


#. 넷플릭스 영화 추천 시스템

고객이 선택하는 영화의 70%는 온라인 추천 시스템에 의한 것으로 매우 중요한 역할을 하고 있음


#. Meta-learning (메타 학습)

학습한 것을 토대로 학습하는, 앙상블 모형의 근간.


#. 집단 지성 효과

여러 모델들은 각각 장점과 단점이 있다. 마치 사람들의 추측처럼 예측 모델들이 만들어낸 각각의 예측 점수들은 불완전하다. 어떤 것은 너무 높고 어떤 것은 너무 낮다.

그러나 모델들을 혼합, 각 점수의 평균을 내면 오류의 상당 부분을 제거할 수 있다.


#. Bagging (Bootstrap Aggregating, 자루 담기)

앙상블 모델에서 중요한 방법론 중 하나. 서로 다른 데이터 하위집합을 토대로 모델을 구축, 한 자루 가득 다양성을 지닌 모델들을 만들어 냄.


#. 앙상블 효과 (The Ensemble Effect)

예측 모델들이 하나의 앙상블로 합쳐지면서 각자의 한계를 보완하게 되어, 전체로서의 앙상블은 자신의 구성요소 모델들보다 더 정확하게 예측할 가능성이 높아짐.




Chapter 06 - 인간을 이긴 기계학습


#. IBM Watson

질문/답을 하나의 예측 분석 응용의 틀로 바라봄 --> 대답의 정확성을 예측.

방식 : '문서 및 DB' 등으로부터 잠재적 답안(데이터) 수집 --> '수천 개의 후보 답안' 추출 --> '예측 모델'을 적용해 가장 우수한 답을 골라냄.

질문 유형(퍼즐, 사지선다, 날짜, 숫자, 번역, 어원 등)에 따라 상이한 모델을 활용

왓슨에게 가장 우수한 결과는 '로지스틱 회귀분석(Logistic Regression)'에서 나왔음




Chapter 07 - 숫자를 통한 설득


#. Churn Modeling (이탈 모델링)

경험이 있는 경영자라면 누구나 현재의 고객을 유지하는 것이 비즈니스의 기본이자 가장 중요한 일이라고 말할 것임.

왜냐하면 새로운 고객을 확보하는 것보다 기존 고객을 그대로 머물도록 설득하는 것이 비용 측면에서 더 싸게 먹히기 때문.

고객 손실률을 조금이라도 줄이면 고객 기반이라는 풍선은 더 부풀어 팽창률이 늘어남.

즉 회사의 고객기반 성장률이 늘어나는 것으로, 고객기반 성장은 비즈니스의 기본임.


#. 예측의 역설

예상 이탈고객에게 계약을 갱신하고 혜택을 받으라는 접촉 = 약정기간이 끝나가니 이제 고객님은 자유롭게 갈아탈 수 있다는 사실을 상기시켜 준 것

결국, 고객의 이탈 가능성을 오히려 더 높게 만드는 행휘. 잠자는 사자의 코털을 건드리지 말자.

--> 따라서, 무엇을 예측해야 하는가라는 근원적인 질문에, 단순히 이탈 예측을 넘어 고객이 어떻게 반응할 것인지 2차적 예측이 필요함.

그러므로 우리는 무엇이 효과적일 것인가 뿐 아니라, 무엇이 역효과를 가져올 것인가를 고려해야 함.


* 물건을 구입한 사람들 중 우리가 접촉하지 않았더라도 우리 물건을 구입했을 사람은 누구인가? 원래부터 구입 의향이 있었던 것은 아닌가?


#. Uplift Model (향상 모델 = 설득 모델) ★

대상을 접촉하는 것이 좋은지 여부를 결정하는 것보다, 그를 접촉하는 것이 접촉하지 않는 것보다 과연 더 좋은지 여부를 결정하는 방법

경쟁하는 2개의 조치들로부터 발생한 결과들을 기록한 서로 다른 훈련용 데이터 집합들을 예측을 목적으로 모델링하는 것


무작위 A/B 통제 실험(테스트)의 개념과 예측 모델링 방법을 영리하게 결합한 것.

* 설득 가능성은 하나의(오직) 집단에 걸쳐 집합적으로 관찰될 수 있으나, 한 사람에 대해서는 절대로 성립할 수 없다.


'향상 점수'는 이러한 조치가 또 다른 조치와 비교할 때 우리가 원하는 결과를 발생시킬 가능성이 얼마나 더 많은가란 질문의 대답이다.

* Lift는 무작위 선별 대비 타게팅 선별 방식의 효과성 vs Uplift는 조치 대상 집단이 그렇지 않은 집단에 비해 얼마나 효과적인가


이를 통해 접촉에 의해 일어난 반응을 예측하는 것이 아닌, 고객을 접촉한 후의 구매를 예측한다.

ex) Uplift Trees(향상 나무)


확실한 고객과 접촉 불가 고객을 제외함으로써, 향상 모델링은 전체 타기팅 대상의 100%보다 적게 접촉하면서도 100%보다 많은 반응을 거둘 수 있는 힘을 갖게 해준다 - Kathleen Kane (Principal Decision Scientist of Fidelity Investments)

ex) 383p


세계 7위 규모 이통사 텔레노르 : 전통 이탈 분석 모델링 대비 마케팅 캠페인 ROI 11배 증가 + 고객 이탈률 36% 감소 + 비용 40% 감소


오바마 재선 : 일정한 수의 유권자들에 대해 선거운동 접촉을 미리 실험하고 반대로 통제집단을 선별하여 아무런 조치를 하지 않았다.
이후 두 집단을 대상으로 설문조사를 진행하여 이들이 결국 투표소에 갔을 때 오바마를 지지할 것인지 여부를 알아보았다.
이를 바탕으로 각 경합지역 주별로 설득 모델을 구축하였다. 변수는 인구사회학적 특징, 과거 투표 참가 이력, 잡지 구독 등 80가지 이상.




그 외


#. 분석 사례들 : 164 ~ 171p, 273 ~ 291p


#. 대응변수(Proxy Variable)
    수집 대상의 값을 직접 얻을 수 없지만, 간접적으로 알아볼 수 있도록 하는 변수.
    어떤 특정한 변수에 대해 직접적으로 획득이 곤란하거나 사용이 어려운경우, 혹은 반영이 제대로 이루어지지 않는 경우에 원래 변수 대신하여 사용되는 변수를 의미한다. 이렇게 대리 변수를 사용하는 경우 선택된 대리변수와 원래의 변수 사이에는 밀접한 상관관계가 있어야 한다.
    삶의 질이나 생활수준과 같은 수치화 하기 어려운 변수를 사용하고자 할때 이를 직접적으로 계산 하기에는 어려움이 따르므로, 1인당 GDP를 해당 변수 대신하여 사용하는 경우 등이 있다. (출처 : 위키피디아)


#. 예측이란, 미지의 사물에 대해서 불완전하게 추론하는 것


#. 많은 산업 분야에서 기업들이 비슷한 제품들을 제공하고 비슷한 테크놀로지를 사용하는 시대에 있어서 차별화의 마지막 남은 지점들 중 하나는 고효율의 비즈니스 프로세스이다 - 『분석으로 경쟁하라 (Competing on Analytics) - Thomas Davenport, Jeanne Harris』


#. 지식의 유일한 원천은 경험이다. - 알버트 아인슈타인



※ 이 포스팅은 저자 'Kirthi Raman'의 도서 <Mastering Python Data Visualization> 을 공부하며 정리한 글입니다. 



Chapter 05. Financial and Statistical Models (금융과 통계 모형)


( 이전 포스팅에 이어서 .. )

확률론적 모형 (Stochastic Model)

지금까지는 임의성(Randomness)을 고려하지 않은 결정론적 모형을 살펴보았다. 지금부터는 임의성을 고려한 모형을 생각해보자.


#. 몬테카를로 시뮬레이션 (Monte Carlo Simulation)

확률 시뮬레이션으로도 불리며, 어느 예측 모형에든 위험성이나 불확실성의 영향을 활용하는 방법(기술)이다.

예측 모형에는 임의성에 대한 가정들이 포함되어 있다. 이는 포트폴리오상의 투자 수익률, 또는 작업 수행 시간에 대한 가정일 수 있다.

이렇게 임의성에 대해 모형을 세우고 미래에 투영함으로써 기대값(Expected Value)을 예측하는 것이다.


몬테카를로 시뮬레이션은 난수(Random Value)들을 입력하여 결정론적(Deterministic) 모형을 반복적(보통 100,000 ~ 수백 만 회 이상)으로 평가하는 방법이다.

모형이 복잡하고, 비선형적(Non-linear)이며 불확실한 모수(Parameter)가 하나 이상 포함하는 경우에 자주 사용된다.


결정론적 모형과의 차이점을 살펴보자. 결정론적 모형은 일관된 결과를 도출하지만, 

확률론적 모형은 확률밀도함수에서 비롯되며 도출되는 결과 또한 확률적이다.

위의 그림을 설명하면 이렇다. 우선 랜덤 입력 x1~x3에 대한 모형의 함수 f(x1,x2,x3)을 설정한 후, 여러개의 무작위 집합 {x1, x2, x3}을 생성한다.

각 입력값을 모형에 적용한 후, 평가하는 과정을 모든 값(가령 1만 개면 1만 개 까지)에 적용한다.

결과값들을 분석하고, 마지막으로 가장 가능성이 높은 것을 고른다. 몬테카를로 시뮬레이션은 난수 생성에 매우 크게 의존한다.


예를 들어, A 라는 농구 팀이 이길 확률을 알고 싶다면, 농구라는 상황에 대한 확률론적 가정 아래 수 많은 무작위 입력값들을 생성하는 몬테카를로 시뮬레이션을 통해 추정해볼 수 있겠다.

이와 같이 몬테카를로 시뮬레이션은 대다수의 현실 상황에 적용하여 문제를 해결할 수 있습니다.



#. 몬테카를로 시뮤레이션 예시 1 - 재고 관리 모형 (An Inventory Model for Monte Carlo Simulation)

한 과일 소매 판매상은 과일을 팔고 매일 주문한다. 

매 단위의 매출 당 $0.6의 이익이 발생하고, 그 날 안에 팔리지 않으면 단위당 $0.4의 손실이 발생한다.

수요 D는 [80, 140] 범위에서 균등하게 분포한다고 가정하자.

이 때, 소매상의 수익을 최대로 하기 위해서는 얼마나 주문해야 좋을까?


수익을 P, 판매량을 s, 수요를 d라고 한다면 다음과 같이 수식을 세울 수 있다.

* 만약 수요가 재고보다 많으면 수요량 만큼만 판매되며, 수요량이 재고에 못미치면 폐기된다는 전제를 하고 있는 것 같습니다.

* 즉, 의사결정의 주체인 소매상은 주문량을 결정할 수 있지만 수요량은 임의성(Randomness)이 존재함을 적용한 것입니다.


이를 바탕으로 파이썬을 통해 다음과 같이 시뮬레이션하면, 최대 기대 수익과 최적의 주문량을 구할 수 있다.

(제가 임의로 수정한 것으로, 책의 예제 코드와 다소 상이할 수 있습니다.)


import numpy as np

import matplotlib.pyplot as plt


# 수익식

def generateProfit(d):

    global s

    if d >= s:

        return 0.6*s

    else: 

        return 0.6*d - 0.4*(s-d)

    

# 시뮬레이션 시작

x = []

y = []


# 주문량 10 ~ 200 까지 시행

for s in range(10, 200):

    profit = []

    

    # n = 1,000 회 시뮬레이션 시행 // 횟수가 많을 수록 정밀해지나 거의 비슷하다.

    for i in range(1, 1000):

        

        # 균등분포(Uniform distribution)으로 정수의 수요량 난수를 생성한다.

        d = np.random.randint(low = 80, high = 140)

        # 이 수요량 난수 d에 대한 수익 계산

        profit.append(generateProfit(d))

        

    # x 축을 따라 그려질 s(주문량) 저장

    x.append(s)

    

    # y 축을 따라 그려질 평균 수익 저장

    y.append(np.mean(profit))

    

plt.grid(True)

plt.xlabel('Volume of Orders')

plt.ylabel('Average Profits')

plt.plot(x,y)


print 'Max Average Profit:', max(y)

print 'Optimal Volume of Orders:', x[y.index(max(y))]


Max Average Profit: 58.8266266266

Optimal Volume of Orders: 112



실제 계산을 통해서 시뮬레이션이 얼마나 합리적인지 확인해보자.


시뮬레이션 결과는 112로, 실제 계산값인 116과 매우 흡사하다. 난수 개수를 늘리면 더더욱 실제 계산값과 가까워진다.

* 더 복잡한 상황들과 가정을 적용했을 때, 계산보다 시뮬레이션이 용이할 수 있습니다.



#. 몬테카를로 시뮬레이션 예시 3 - 농구 게임 (A Basketball Game Model for Monte Carlo Simulation)

Khan Academy에서 Lebron James의 질문을 해결해보자.

" 3점을 뒤지고 있는 상태에서 단 30초가 남았을 때, 어려운 3점 슛을 시도하는 것이 나은가 아니면 쉬운 2점 슛과 추가 점유를 시도하는 것이 나은가? "


여기에 필요한 몇 가지 파라미터들을 다음과 같이 (쉽게 풀이하기 위해 간단히) 정의한다.

우리팀 : threePtPercent , twoPtPercent

상대팀 : oppTwoPtPercent , oppFtPercent (프리드로우 전력 퍼센티지)


상대 팀의 프리드로우 퍼센티지(oppFtPercent)가 높을 수록, 3포인트 슛이 유리하다.

반대로 oppFtPercent 값이 낮아지면? 이를 시뮬레이션해보자.


import numpy as np

import matplotlib.pyplot as plt


colors = [(31, 119, 180), (174, 199, 232), (255, 127,  14), 

          (255, 187, 120), (44, 160, 44), (214,  39,  40), (148,103,189),

          (152, 223, 138), (255,152,150), (197, 176, 213), (140, 86, 75),

          (196, 156, 148), (227,119,194), (247, 182, 210), (127,127,127),

          (199, 199, 199),(188,189, 34),(219, 219, 141), (23, 190,207),

          (158, 218, 229),(217,217,217)]


# RGB 값들을 matplotlib이 받을 수 있는 [0, 1] 범위로 스케일

for i in range(len(colors)) :

    r, g, b = colors[i]

    colors[i] = (r / 255., g / 255., b / 255.)


# 3점 시도

def attemptThree() :

    if np.random.randint(0, high=100) < threePtPercent :

        if np.random.randint(0, high=100) < overtimePercent :

            return True # 게임 승리

        return False    # 3점에 실패하거나 시간 초과로 게임 패배


# 2점 시도

def attemptTwo() :

    havePossession = True

    pointsDown = 3

    timeLeft = 30

    while (timeLeft > 0) :

            

        # 점유권을 가지고 있다면?

        if (havePossession) :

            # 우리가 3점 이상 뒤지고 있다면, 2점을 빠르게

            # 우리가 2점 이하로 뒤지고 있다면, 우리는 먼저 시간을 끌어야

            if (pointsDown >= 3) :

                timeLeft -= timeToShoot2

            else :

                timeLeft = 0

                

        # 슈팅을 해야 할까?

        if (np.random.randint(0, high=100) < twoPtPercent) :

            pointsDown -= 2

            havePossession = False

        else :

            # 상대팀이 리바운드를 한다면? 우리는 점유권을 잃는다

            # 그러나 우리가 시간을 끌게 되면, 이것은 문제가 되지 않는다.

            if (np.random.randint(0, high=100) >= offenseReboundPercent) :

                havePossession = False

            else : # 우리가 점유권을 갖지 않는 경우

                if (pointsDown > 0) : # 점유권을 되찾기 위해 파울

                    # 파울을 위한 시간

                    timeLeft -= timeToFoul

                    # 상대 팀이 두 개의 프리드로우 획득

                    if (np.random.randint(0, high=100) < oppFtPercent) :

                        pointsDown += 1

                    if (np.random.randint(0, high=100) < oppFtPercent) :

                        pointsDown += 1

                        havePossession = True

                else : 

                    if (np.random.randint(0, high=100) >= ftReboundPercent) :

                        havePossession = True

                    else :

                        # 동점 또는 이기고 있어 파울을 원하지 않음.

                        # 상대팀이 시간 끄는 것을 가정

                        if (np.random.randint(0, high=100) < oppTwoPtPercent) : 

                            pointsDown += 2 # 상대팀이 2점 기록

                        timeLeft = 0

        if (pointsDown > 0) :

            return False

        else :

            if (pointsDown < 0) :

                return True

            else :

                if (np.random.randint(0, high=100) < overtimePercent) :

                    return True

                else : 

                    return False

    

# 시각화

plt.figure(figsize=(14,14))

names=['Lebron James', 'Kyrie Irving', 'Steph Curry', 'Kyle Krover', 'Dirk Nowitzki']

threePercents = [35.4, 46.8, 44.3, 49.2, 38.0]

twoPercents =   [53.6, 49.1, 52.8, 47.0, 48.6]

colind=0


for i in range(5) : # 각각 수행할 수 있음

    x=[]

    y1=[]

    y2=[]

    trials = 400 # 시뮬레이션 실행 시도 수

    threePtPercent = threePercents[i]   # 3점 슛 만들 기회 %

    twoPtPercent = twoPercents[i]       # 2점 슛 만들 기회 %

    oppTwoPtPercent = 40                # 상대팀이 2점 슛 만들 기회 %

    oppFtPercent = 70                      # 상대팀의 프리드로우 %

    timeToShoot2 = 5                       # 2점 슛을 위해 경과된 초

    timeToFoul = 5                          # 상대팀을 파울하는 데 경과된 초

    offenseReboundPercent = 25        # 공격 리바운드 %

    ftReboundPercent = 15                # FT를 놓친 후 공격 리바운드 %

    overtimePercent = 50                  # 연장선에서 우승 확률 %

    

    winsTakingThree = 0

    lossTakingThree = 0

    winsTakingTwo = 0

    lossTakingTwo = 0

    curTrial = 1

    

    while curTrial < trials :

        # 3점 획득 시도 실행

        if (attemptThree()) :

            winsTakingThree += 1

        else :

            lossTakingThree += 1

        

        # 2점 획득 시도 실행

        if attemptTwo() == True :

            winsTakingTwo += 1

        else :

            lossTakingTwo += 1

        

        x.append(curTrial)

        y1.append(winsTakingThree)

        y2.append(winsTakingTwo)

        curTrial += 1

    

    plt.plot(x, y1, color=colors[colind], label=names[i]+" Wins Taking Three Point", linewidth=2)

    plt.plot(x, y2, color=colors[20], label=names[i]+" Wins Taking Two Point", linewidth=1.2)

    colind += 2

    

legend = plt.legend(loc='upper left', shadow=True,)

for legobj in legend.legendHandles :

    legobj.set_linewidth(2.6)

    

plt.show()



모든 경우에서 상대 팀의 프리드로우 비율이 높기 때문에(70%), 모든 선수들에 대해 몬테카를로 시뮬레이션은 3점 득점을 제안하고 있다.



#. 변동성 그래프 (The Volatility Plot)

표준편차는 평균 주위에서의 변화량 또는 흩어짐 정도를 측정하는 통계 용어로 변동성의 척도이다.

이처럼 정의에 의해, 흩어짐의 정도란 실제 값과 평균 값 사이의 차이이다.

가까운 값들을 바탕으로 변동성을 그래프로 살펴보기 위해 주어진 시작 일로부터 어떻게 볼 수 있는지,

어떻게 특정 주식에 대해 수행하는지 예제(IBM, 2005.10.01. ~)로 살펴보자.


import pandas_datareader as stockdata

import numpy as np


ibmquotes = stockdata.DataReader(name='IBM', data_source='yahoo', start='2005-10-01')


ibmquotes['Volatility'] = np.log(ibmquotes['Close'] / ibmquotes['Close'].shift(1))


ibmquotes[['Close', 'Volatility']].plot(figsize=(12,10),subplots=True)



주가 변동성은 다양한 특징적 피크점을 가질 수 있는 가격의 변동이다.

지수(exponential) 함수는 시간에 따른 성장을 보여주고,

로그(log, 지수의 역) 함수는 성장에 이르기 위한 시간을 측정할 수 있게 한다.





※ 이 포스팅은 저자 'Kirthi Raman'의 도서 <Mastering Python Data Visualization> 을 공부하며 정리한 글입니다. 



Chapter 05. Financial and Statistical Models (금융과 통계 모형)


금융과 경제 모형들은 확률과 통계를 사용하며 데이터의 단순화와 추상화를 돕는다.

모형에 대해서 논하기 전에, 데이터를 살피는 것은 항상 중요하다는 사실을 잊지 말자.
즉, 데이터 분석의 첫 단계에서는 반드시 데이터를 시각화 해보는 일이 필요하다.
불량 데이터, 아웃라이어, 결측치 등과 같은 문제들은 데이터 시각화를 통해 쉽게 검출할 수 있기 때문이다.
이들은 가능하면 모두 정정하거나 삭제해야 마땅하나, 주식 시장과 같이 특별한 경우에는 아웃라이어가 큰 의미를 지닌 경우도 있다는 점에 유의하자.

이 장에서는 몇 가지 모형의 예제들을 살펴볼 것이다. 이 외에도 유용한 애플리케이션이 많이 존재한다.

그 전에, 기본적인 금융 문제를 파이썬으로 시각화하여 해결하는 방법을 간단한 예시를 통해 알아보자.

결정론적 모형 (Deterministic Model)

투자의 궁극적 목적은 수익을 내는 것이며, 투자의 손익은 가격의 변동과 보유한 자산 수에 달려 있다.


#. 총 수익률

- 시간(현재 시점) t에 투자 양을 Pt라고 가정하면, 총 수익률 Rt를 다음과 같이 간단하게 표현할 수 있다.

   즉, Pt = 10, P_t+1 = 10 이라면, R_t+1 = 0.06 = 6% 이다.


- 더 나아가, 최근 k년 동안의 수익률은 다음 식과 같이 1년 수익률(t-k부터 t까지)의 곱이다.


- Rt에 해당하는 인플레이션을 Ft라 정의하면, 위 식을 다음과 같이 정리할 수 있다.

   즉, 인플레이션을 고려하지 않으면(Ft = 0) 직전 식과 같아진다.


- 또한, 배당금과 같은 추가적인 수익이 있다면 다음과 같이 수익률을 정리할 수 있다.


#. 파이썬으로 위 수식을 적용해 문제를 풀어보자.

- 2010년 초기에 $10,000를 투자했고 수익률이 6%라면, 몇 년이 지나야 투자금액의 2배($20,000)가 될까?

(단, 인플레이션과 다른 수익은 고려하지 않는다. --> Ft = Dt = 0)

- 저는 2배가 되는 시점을 시각적으로 쉽게 찾기 위해, 'y = 20,000' 직선을 추가하여 교차하는 지점을 확인해봤습니다.

(참고로, 책에서는 y = 2x 그래프? 를 그리라고 했습니다.)

import matplotlib.pyplot as plt


principle_value = 10000 # 투자 금액

grossReturn = 1.06       # Rt


return_amt = []

x = []

year = 2010

return_amt.append(principle_value)

x.append(year)


for i in range(1,15):

    return_amt.append(return_amt[i-1] * grossReturn)

    print 'Year-', i, ' Returned:', return_amt[i]

    

    year += 1

    x.append(year)

    

# 눈금이 보이도록

plt.grid()


# return값들의 커브 그리기

plt.plot(x, return_amt, color='r')

plt.plot(x, [20000]*len(x), color='b')


   약 2022년 즈음에 목표 수익($20,000)을 달성할 수 있을 것으로 기대할 수 있다.


#. 모기지론의 적용

- 금융기관에서 $350,000를 연 5% 이자율로 30년 만기 원리금균등상환으로 대출받았을 때, 월 상환금은 다음과 같이 계산될 수 있습니다.

(책의 내용과 조금 다를 수 있습니다. 읽으면서 제가 다시 정리한 것으로, 오류 발견 시 댓글로 알려주시면 감사하겠습니다!)


   P : 원금, r : 이자율(%), 기간 : t(월)


- 1,878$를 360개월동안 납입하면 총 납입원금은 $676,080가 됩니다. 즉, $350,000를 빌렸지만 실질적으로 빌린 돈이 2배가 되는 셈이지요.

- 이는 원금에 이자가 복리로 붙기 때문인데, 월 상환금을 높이면 총 납입원금도 줄고 조기 상환도 가능합니다.

- 문제를 파이썬으로 시각화 해보면, 상환금을 100$ 올릴 때마다 얼마가 절약되며 얼만큼 조기에 상환이 가능한지 쉽게 확인할 수 있습니다.

(예제 코드는 책의 출판사 사이트에서 받으실 수 있습니다.)



- 산점도(Scatter Plot)와 버블차트를 조합, 대출금과 추가상환액에 따라 절약되는 금액을 다음과 같이 파이썬으로 시각화 할 수 있다.




( .. 다음 포스팅에 계속 .. )



+ Recent posts