통계학

Quantile normalization

생물정보학에서 자주 사용되는 정규화 방법 중 하나인 quantile normalization이다. Quantile normalization은 비교하려는 샘플들의 분포를 완전히 동일하게 만들고 싶을 때, 또는 기준이 되는 분포(reference distribution)가 있는 경우 샘플들의 분포를 모두 기준 분포와 동일하게 만들고 싶을 때 사용할 수 있다.

복잡한 방식을 사용하는 과정이 아닌지라 쉽게 이해하고 쉽게 써먹을 수 있다.

 

알고리즘

  1. 샘플 내 값을 오름차순 정렬
  2. 아래 과정을 모든 n에 대하여 반복
    1. (기준 분포가 있을 떄)
      1. 모든 샘플의 n 번째 값들을 기준 분포의 n 번째 분위수로 대체
    2. (기준 분포가 없을 때)
      1. 각 샘플의 n 번째 값들을 평균(또는 중간값)
      2. 각 샘플의 n 번째 값들을 모두 2-1.의 값으로 대체
  3. 정렬된 데이터를 원래 데이터의 순서대로 복구

 

이해가 어렵다면 바로 아래 “예시”로 넘어가도 된다.

“값들을 순서대로 나열했을 때 n 번째 값”이 바로 통계학에서의. n 번째 분위수(n-th quantile)의 개념에 해당하고, 각 샘플 분포의 n 번째 분위수를 동일하게 조정해주는 작업이므로 quantile normalization이라는 이름이 붙었다.

딱히 알고리즘이랄 것도 없다. 1.에서 정렬 시 오름차순 대신 내림차순을 써도 아무 상관이 없다. 기준 분포가 없을 때 2-1.에서 평균, 중간값 대신 가중평균 등 자신에게 적합한 대푯값을 사용해도 된다.

 

예시

1. 이해를 위한 간단한 예시

다음 테이블과 같은 세 샘플(A, B, C)의 데이터가 있다고 하자. A, B, C의 분포가 동일해지도록 median quantile normalization해보자. 셀 색상은 원래 데이터의 순서를 표시하기 위해 넣어보았다.

qn_whole

  1. 열 별로 값을 정렬한다.
  2. 정렬된 데이터에서 행 별로 중간값을 계산한다.
  3. 각 행의 값을 2.에서 계산한 중간값으로 바꾼다.
  4. 정렬을 해제하여 기존 데이터와 같은 순서로 돌려준다

 

2. 규모가 좀 더 큰 예시

서로 다른 샘플에 어떤 실험을 한 결과 데이터가 세 세트(A, B, C) 있다고 하자. 세 샘플을 용이하게 비교하기 위해 샘플의 분포를 quantile normalize하여 동일하게 만들어보자.

 

기준 분포가 있을 때

표준정규분포를 기준 분포로 삼는다고 하자.

정규화 전 각 샘플의 분포는 아래와 같다.

A  B   C
0   3.570614    5.015660    6.526778
1   5.965098    1.258324    2.285988
2   3.767857    0.974910    4.374467
3   3.538398    3.362349    1.779624
4   5.178286    1.575602    3.065568
5   3.578033    3.434900    5.086503
6   5.330161    3.431059    3.573926
7   5.002079    4.885904    2.318780
8   5.694074    4.000688    4.615286
9   6.026262    -0.499165   1.999979
before

 

표준정규분포의 101-quantile을 사용하여 quantile normalization하면,

A  B   C
0   -1.000990   1.410420    1.410420
1   0.960838    -1.180947   -1.000990
2   -0.922178   -1.346263   0.162024
3   -1.086568   0.162024    -1.232341
4   0.162024    -0.848716   -0.476577
5   -0.960838   0.263612    0.620918
6   0.289397    0.238000    -0.187224
7   -0.012409   1.232341    -0.922178
8   0.651302    0.682300    0.368003
9   1.042824    -2.330079   -1.132497
after_ref

모든 샘플의 분포가 표준정규분포와 일치하는 것을 확인할 수 있다.

 

기준 분포가 없을 때

기준 분포가 없이 median을 사용하여 정규화하면,

A  B   C
0   -1.000990   1.410420    1.410420
1   0.960838    -1.180947   -1.000990
2   -0.922178   -1.346263   0.162024
3   -1.086568   0.162024    -1.232341
4   0.162024    -0.848716   -0.476577
5   -0.960838   0.263612    0.620918
6   0.289397    0.238000    -0.187224
7   -0.012409   1.232341    -0.922178
8   0.651302    0.682300    0.368003
9   1.042824    -2.330079   -1.132497
after

역시 마찬가지로 모든 샘플의 분포를 동일하게 만들 수 있다.

 

참고

이 코드를 돌리면 예시 2-2를 직접 해볼 수 있다.

Sequence Motif 등장 확률

전체 n ntd로 이루어진 target RNA 한 가닥이 있다고 하자. 이 RNA는 완전히 랜덤하게 만들어진 가닥이라고 가정한다. 즉, 각 위치에 A, U, G, C가 같은 확률로 존재할 수 있다.

이제 k-mer sequence motif가 하나 있다고 하자. 이 sequence motif는 특정되어 있다.

이 때 Target RNA 가닥에서 이 motif가 한 번이라도 등장할 확률은 얼마일까?

우연한 기회에 이 문제에 대해 생각해보게 되어 여사건의 확률 등의 방법을 생각해보다 이런 방법으로는 쉽게 풀리지 않는다는걸 알게 되었다.

검색을 해봐도 정확한 해답을 제시하는 사람은 많지 않았다 (너무 쉬운 문제여서 인지?). 여기서는 확률의 inclusion-exclusion principle을 이용한 해답을 소개하려 한다.

 

마주서기 문제

본 문제와 비슷하지만 비교적 단순한 문제를 먼저 살펴보자.

n쌍의 부부가 있다. 한 쪽에는 남편끼리, 다른 쪽에는 부인끼리 늘어 설 때, 적어도 한 쌍의 부부가 서로 마주보고 설 확률은 얼마일까?

이 문제 역시 여사건의 확률을 이용해서 풀기는 쉽지 않다 (재귀함수를 만들게 된다). 대신 inclusion-exclusion principle을 사용해서 풀어보자.

사건 A_i를 “i번째 부부가 서로 마주보고 서는 사건”이라고 하자. 그러면

\begin{array}{lcl} &&P(A_i) = \dfrac{(n-1)!}{n!} \text{, } i=1, ..., n \\ &&P(A_i \cap A_j) = \dfrac{(n-2)!}{n!} \text{, } i < j \\ && ... \\ &&P(A_1 \cap A_2 \cap ... \cap A_n) = \dfrac{1}{n!} \end{array}

이므로

\begin{array}{lcl} P(\cup_{i=1}^{n} A_i) &=& \sum_{i=1}^{n}P(A_i) - \sum_{i<j}P(A_i \cap A_j) \\ & & + ... + (-1)^{n+1}\sum_{i<j<...<l}P(A_i \cap A_j \cap ... \cap A_l) \\ &=& \sum_{i=1}^{n} (-1)^{i+1} \dfrac{1}{i!} \end{array}

이다.

 

본 문제

사건 A_i \text{, } i=1, ..., m를 “i번째 위치에 motif가 등장하는 사건”이라고 하자. 단 mnk로 나눈 몫이다. 그러면

\begin{array}{lcl} &&P(A_i) = \dfrac{4^{n-k}}{4^n} \text{, } i \leq n-(k-1) \\ &&P(A_i \cap A_j) = \dfrac{4^{n-2k}}{4^n} \text{, } i<j \text{ and } i, j \leq n-2(k-1) \\ &&P(A_i \cap A_j \cap A_k) = \dfrac{4^{n-3k}}{4^n} \text{, } i<j<k\text{ and } i, j, k \leq n-3(k-1) \\ &&... \\ &&P(A_1 \cap A_2 \cap ... \cap A_m) = \dfrac{4^{n-mk}}{4^n} \end{array}

이므로 마주서기 문제에서와 같은 방법으로

P(\cup_{i=1}^{m} A_i) = \sum_{i=1}^{m} (-1)^{i+1} \binom{n-i(k-1)}{i} 4^{-ki}

임을 알 수 있다.

 

이 방법으로 1~500 ntd의 random target sequence에 3, 4, 7-mer fixed motif가 존재할 확률을 그래프로 나타내보면 다음과 같다.

Thu Oct 25 00:15:46 2018

 


참고

 

 

Batch Normalization 이해하기

현대적인 딥러닝 모델을 디자인할 거의 항상 빠지지 않고 쓰이는 테크닉들이 있다. 하나는 recurrent 구조 (LSTM, Attention)이고 다른 하나는 batch normalization (BatchNorm)이다. LSTM과 attention 대해서는 recurrent neural net 다루면서 자세히 살펴보도록 하고 이번 글에서는 학습 과정에서 뉴럴넷을 안정시켜주는 표준화 기법 하나인 batch normalization 대해 다뤄보겠다.

 

  • 기존 방법의 문제점
  • BatchNorm
    • 알고리즘
    • 테스트할 때
    • BN layer
  • TensorFlow 구현

 

기존 방법의 문제점

BatchNorm이 어떤 의미를 가지는지를 알기 위해서는 BatchNorm이 고안되기 이전의 딥러닝 모형 초기화 및 학습 과정 표준화 과정을 둘러볼 필요가 있다.

뉴럴넷이 안정적으로 잘 학습되기 위해서는 입력층에 넣을 인풋과 각 층의 weight를 표준화할 필요가 있다. BatchNorm이 고안되기 전에는 두 가지 방법을 주로 사용했는데, 이전 포스트[1, 2]에서 각각의 방법을 간단히 다룬 바 있다. 간단히 복기하자면 이렇다: (1) 인풋은 centering scaling하고 (2) 인풋 뉴런 n개인 층의 weight \div \sqrt{n/2}로 표준화한다. 단순한 방법이지만 표준화하지 않은 입력, 가중치값을 사용했을 때에 비해 더 빨리, 더 좋은 성능으로 수렴하는 것을 경험적으로 확인할 수 있다.

여기서 중요한 문제가 발생한다. 입력층에 넣는 인풋은 표준화할 수 있다. 뉴럴넷에 넣기 전에 우리가 원하는 방식으로 원하는 만큼 preprocessing을 하면 된다. 그 결과 입력층의 input distribution은 항상 비슷한 형태로 유지가 되고 안정적으로 가중치 학습을 진행할 수 있다.

e18489e185b3e1848fe185a6e1848ee185b53.png

그러나 은닉층은 인풋의 분포가 학습이 진행됨에 따라 계속 변한다. 은닉층은 이전 레이어의 activation f(XW)을 입력으로 받는다. 학습 과정에서 가중치 W의 값이 W^\prime로 업데이트되면 이전 레이어의 activation 또한 f(XW^\prime)로 바뀌게 된다. 은닉층의 입장에서는 인풋 값의 분포가 계속 널뛰는 것이나 마찬가지이다. 입력 분포의 형태가 유지되지 않으므로 학습도 잘 진행되지 않는다. 그라디언트 값이 큰 학습 초기일수록 문제가 더 심각해진다.

스케치

 

Batch Normalization

알고리즘

바로 위에서 언급한 문제를 internal covariate shift라고 한다. 그대로 입력층보다 깊은, 내부에 있는(internal) 층의 입력값, 공변량(covariate) 고정된 분포를 갖지 않고 이리저리 움직인다(shift) 의미이다. BatchNorm 바로 internal covariate shift 해결하는 테크닉이다.

[1]

은닉층의 입력도 표준화한다면 안정적으로 깊은 레이어의 가중치도 학습시킬 수 있을 것이다. “은닉층의 입력을 표준화한다는 것은 곧이전 층의 출력(raw activation)을 표준화한다는 의미와 같다.

딥러닝은 거의 항상 전체 샘플을 mini batch로 나누어 학습하고 가중치를 업데이트하므로 이전 층의 raw activation을 표준화할때도 각 batch마다 따로 표준화하면 된다.

스케치

이와 같이 각각의 minibatch 평균 \mu_{\mathcal{B}} = \frac{1}{m} \sum_i {x_iw_i} 표준편차 \sigma_{\mathcal{B}} = \frac{1}{m} \sum_i {(x_iw_i - \mu_{\mathcal{B}})^2} 표준화한 activation a_s = f(\frac{XW_1 - \mu_{\mathcal{B}}}{\sigma_{\mathcal{B}}}) 은닉층 B 입력으로 사용하면 은닉층 B 입력은 고정된 분포를 따른다.

쉬워도 너무 쉽다. 이렇게만 하면 될 것 같지만..

[1 문제점]

문제가 가지 있다. 이렇게 은닉층의 입력을 표준화하면 gradient update 과정에서 bias(편향)값이 무시된다. [1]만을 사용해서 표준화한다고 그라디언트 업데이트 과정을 자세히 살펴보자. Raw activation a_r = wx + b라고 E(a_r) = \frac{1}{n} \sum_i a_{r_{i}}이므로

  1. 그라디언트를 계산한다.
    • \Delta b \propto - {\partial L}/{\partial b},  where L is a loss function.
  2. 편향(과 가중치)을 업데이트한다.
    • b \gets b + \Delta b
  3. 편향을 업데이트한 이후의 raw activation:
    • a_r ^\prime = wx + (b + \Delta b)
  4. [1] 이용해서 센터링만 raw activation:
    • \begin{array}{lcl} a_{r_{centered}} ^\prime &=& a_r ^\prime - E(a_r ^\prime) \\ &=& \{(wx + b) + \Delta b\} - \{ E[wx + b] + \Delta b \} \\ &=& (wx + b) - E[wx + b] \end{array}

Bias b 업데이트 \Delta b 완벽하게 캔슬되었다. 초기 편향값에서 이상 업데이트가 되지 않는 것이다. 종류의 파라미터 w, b 사용했는데 파라미터 w 가지만 사용하는 단순한 모형으로 irreversible하게 변환된 것이다.

이 때문에 b 대신 편향의 역할을 할 파라미터를 추가해야한다. 이 파라미터는 그라디언트 업데이트 과정에서 무시되어서는 안된다.

다른 문제도 있다. raw activation 분포를 고정시키는 것은 좋지만 항상 N(0, 1) 고정시킬 필요는 없다. 적절하게 scaling, shifting activation \gamma \cdot \frac{a_r - \mu_{\mathcal{B}}}{\sigma_{\mathcal{B}}} + \beta 사용하는 것이 학습에 도움될 수도 있다.

형태의 activation 사용할 경우 필요하다면 표준화를 되돌릴 수도 있다. \gamma = \sigma_{\mathcal{B}}, \beta = \mu_{\mathcal{B}} \gamma \cdot \frac{a_r - \mu_{\mathcal{B}}}{\sigma_{\mathcal{B}}} + \beta = a_r이기 때문이다.

[2]

위의 문제를 극복하기 위해 표준화한 scaling shifting raw activation, 즉

a_{BN} = \gamma \cdot \frac{XW_1 - \mu_{\mathcal{B}}}{\sigma_{\mathcal{B}}} + \beta

activation function f 입력으로 사용한다. 은닉층 B 입력으로는 f(a_{BN}) 사용한다. 방법을 BatchNorm이라고 한다. \gamma, \beta 파라미터로 학습 과정에서 업데이트되는 값이다.

BatchNorm 장점이 꽤나 많은데

  • bias 업데이트를 무시하지 않는다. \beta bias처럼 행동한다. \beta 업데이트는 표준화해도 캔슬되지 않는다.
  • 은닉층마다 적절한 input distribution 가질 있다. scaling factor \gamma shifting factor \beta 사용해서 적절한 모양으로 입력분포를 조정할 있다.
  • 필요한 경우 표준화를 하지 않을 수도 있다. 위에서 언급한 \gamma = \sigma_{\mathcal{B}}, \beta = \mu_{\mathcal{B}} 경우이다.
  • Activation 값을 적당한 크기로 유지하기 때문에 vanishing gradient 현상을 어느정도 막아준다. 덕분에 tanh, softmax같은 saturating nonlinearity 사용해도 문제가 생긴다.
  • batch-wise로 계산하기 때문에 컴퓨팅하기 용이하다.
  • 위의 장점들을 모두 가지면서, 동시에 층마다 입력 분포를 특정 형태로 안정시켜서 internal covariate shift 방지할 있다.
  • 입력 분포가 안정되므로 학습시 손실함수가 더 빨리, 더 좋은 값으로 수렴한다.
  • 초기 learning rate를 크게 설정해도 안정적으로 수렴한다고 한다.
  • Weak regularizer로도 작용한다고 한다.

이쯤 되면 거의 만능이다.

테스트

지금까지 다룬 내용은 모두 학습 과정에서 일어나는 일들이다. 학습 과정에서는 raw activation minibatch mean, stdev 표준화하면 됐었다. 그런데 학습을 마치고 테스트(또는 evaluation, inference) 때에는 minibatch mean, stdev 존재하지 않는다.

테스트 과정에서는 대신 전체 training data mean, stdev 사용해서 BatchNorm 한다. 전체 training data mean, stdev 번에 계산하기에는 메모리의 제약이 있으므로, minibatch statistic 평균낸 값을 대신 사용한다.

, n개의 minibatch 있을 ,

\hat{\mu} = \frac{1}{n} \sum_i {\mu_{\mathcal{B}}^{(i)}}
\hat{\sigma} = \frac{1}{n} \sum_i {\sigma_{\mathcal{B}}^{(i)}}

Minibatch statistic 따로 저장할 필요 없이 학습 과정에서 moving average \hat{\mu}, \hat{\sigma} 계산하면 된다. Exponential moving average 사용해도 좋다.

i번째 minibatch statistic 각각 \mu_{\mathcal{B}}^{(i)}, \sigma_{\mathcal{B}}^{(i)}라고 ,

\hat{\mu} \gets \alpha \hat{\mu} + (1-\alpha) \mu_{\mathcal{B}}^{(i)}
\hat{\sigma} \gets \alpha \hat{\sigma} + (1-\alpha) \sigma_{\mathcal{B}}^{(i)}

BatchNorm layer

ReLU activation 뉴럴넷의 레이어로 나타낼 있듯 BatchNorm 또한 레이어로 표현할 있다. BN layer raw activation activation function 사이에 위치한다. Convolutional layer에 BatchNorm을 적용하고 싶을 때에도 동일하게 raw feature map과 ReLU layer 사이에 BN layer를 추가하면 된다.

e18489e185b3e1848fe185a6e1848ee185b57.png

BN layer mini batch raw activations a_r 입력받아 아래와 같은 연산을 수행하여 다음 레이어(activation function f) 전달한다.

BN_{\gamma, \beta}(a_r) = \gamma \cdot \frac{a_r - \mu_{\mathcal{B}}}{\sigma_{\mathcal{B}}} + \beta

또한 테스트 사용하기 위해 학습 과정에서 minibatch statistic exponential moving average(또는 그냥 MA) minibatch마다 업데이트한다.

 

TensorFlow 구현

구글에서 고안한 방법답게 TensorFlow에 이 내용들이 친절히 함수로 구현되어 있다. tf.nn.batch_normalization, tf.contrib.slim.batch_norm를 쓰면 간단히 위 알고리즘을 모형 구축에 사용할 수 있다.

tf.nn.batch_normalization을 사용할 경우, minibatch statistic의 EMA를 계산하는 코드를 따로 작성해야 한다.

tf.contrib.slim.batch_norm를 사용할 경우 is_training 옵션을 True로 주면 자동으로 EMA를 계산해서 저장하고, False로 주면 저장된 EMA 값으로 activation을 표준화한다.

TF-Slim 레이어에도 쉽게 적용시킬 수 있다.

import tensorflow as tf
import tensorflow.contrib.slim as slim

bn_params = {"decay": .9,
             "updates_collections": None,
             "is_training": tf.placeholder(tf.bool)}
net = slim.fully_connected(input, 1024,
                           normalizer_fn=slim.batch_norm,
                           normalizer_params=bn_params)

Convolutional layer에도 마찬가지다.

net = slim.conv2d(input, 64, [5,5], padding="SAME",
                  normalizer_fn=slim.batch_norm,
                  normalizer_params=bn_params)

 

 

참고

Logistic, cross-entropy loss의 확률론적 의미

머신러닝을 공부하다보면 logistic을 참 많이 접하게 된다. 당장 로지스틱 회귀만 해도 그렇고, 딥러닝에서 자주 사용하는 saturating non-linearity 중 하나인 softmax function도 logistic function의 multi-class 버전이니 말이다.

Logistic(또는 softmax) function은 어떤 값들을 (0, 1) 사이의 값으로 squash하면서, 동시에 값들의 총 합이 1이 되도록 하는 성질이 있는데, 이 결과 logistic function의 함수값이 Kolmogorov의 확률의 정의에 부합하기 때문에 주로 값들을 확률화하는 함수로 쓰인다. 딥러닝에서 분류문제를 풀때 output layer의 activation function으로 자주 쓰이곤 하는 이유도 여기에 있다 (각 클래스의 ‘확률’ 값을 계산하기 위해).

그런데 하고많은, (0, 1)에 bounded되어있고 합이 1이 되는 함수들 중에서 굳이 logistic function을 사용하는 이유는 뭘까? 그건 바로 logistic function이 확률값에서부터 자연스럽게 유도되는, 내재적으로 확률의 성질을 가지는 함수이기 때문이다. 이 글은 logistic이 그냥 이유없이 확률처럼 생겨서 만들어지고 사용되는 함수가 아니라는 것을 증명해보는 지루한 글이다. Logistic function은 내재적으로 cross-entropy loss와 깊은 연관이 있는데, 이 로스를 줄이는 것이 왜 classification을 해결하는 과정이 되는지 역시 같은 맥락에서 함께 살펴볼 것이다.

 

Odds, Log odds, Logit, 그리고 Logistic

어떤 사건이 일어날 확률은 P(x) 외에도 다양한 방법으로 표현될 수 있다. Odds가 그 종류 중 하나다. 주로 질병통계학이나 도박과 같이 카테고리가 두 개(성공과 실패/발병과 비발병)인 분야에서 자주 사용하는 표현인데, 로지스틱 함수의 확률론적 의미는 바로 여기에서부터 시작한다.

발생 확률(또는 성공 확률)이 p인 어떤 사건 A의 Odds는 다음과 같이 나타낼 수 있다.

Odds(A) = \frac{p}{1-p}

즉, Odds는 성공 확률이 실패 확률에 비해 얼마나(몇 배나) 더 큰가?를 나타내는 척도라고 해석할 수 있다. Odds가 클수록 성공확률이 큰 것이다. Odds는 평범한(?) 확률값 p에 비해 성공확률값의 변화에 민감하다는 특징이 있다. 또한 질병통계학에서는 relative risk 등의 다른 표현에 비해 robust하기에 자주 사용한다.

Odds에 (자연)로그를 취한 것을 Log odds라고 한다.

\log{Odds(A)} = \log{\frac{p}{1-p}} = \log{p} - \log{(1-p)}

로그변환은 통계학에서 자주 사용하는 변환으로,

  • 함수의 증감 형태, convex/concave 형태를 유지시키고
  • 극점의 위치를 유지시키며
  • 곱(또는 나눗셈)으로 표현된 식을 선형조합의 꼴로 풀어쓸 수 있도록 해준다

는 장점이 있다. 즉, 계산은 용이하게 해주는데 함수의 특성은 그대로 유지하는 변환이라 할 수 있겠다. 로그변환의 이러한 성질에 의해 Log odds는 여전히 값이 클수록 성공확률이 큰 것을 의미하는 함수이다.

한 편, Logit function은 다음과 같은 꼴의 함수를 말한다. Logit function은 (0, 1)을 support로 가지며 (- \infty, + \infty) 값을 domain으로 가진다.

logit(x) = \log{\frac{x}{1-x}}

어디서 많이 본 꼴이다. 그렇다. Log odds는 성공확률 p에 대한 Logit function 함수값과 일치한다 (\log{Odds(A)} = logit(p)). 다시말해 Logit 함수는 log Odds의 성질을 가지는 함수이다.

Logistic function은 바로 이 Logit function의 역함수이다.

 

logistic(x) = \frac{1}{1+e^{-x}}

성공확률 p를 갖는 사건 A를 바탕으로 해석해보면 Logistic function은 성공확률 p 그 자체이다.

\frac{p}{1-p} = e^{\log{Odds(A)}},

p = e^{\log{Odds(A)}} -e^{\log{Odds(A)}}p,

(1+e^{\log{Odds(A)}})p = e^{\log{Odds(A)}},

\begin{array}{lcl}\therefore p &=& \frac{e^{\log{Odds(A)}}}{1+e^{\log{Odds(A)}}} \\ &=& \frac{1}{1+e^{-\log{Odds(A)}}} \end{array}

 

Binary classification과 Logistic function

두 개의 클래스(클래스 1, 2)를 분류하는 문제를 생각해보자. 우리가 분류에 사용할 데이터를 X,특정 샘플이 클래스 1, 2에 속한다고 판단하는 사건을 각각 Y_1, Y_2라고 하자.

Binary classification 문제는 데이터 X가 주어졌을 때 둘 중 어느 클래스에 속할지 그 확률 P(Y_i|X) (posterior probability)를 구하는 문제라고 할 수 있다. P(Y_1|X) >P(Y_2|X)일 때 우리는 Y_1이 옳은 클래스일 것이라고 예측을 하게 되고, P(Y_1|X) < P(Y_2|X)일 때 Y_2가 옳은 클래스일 것이라고 예측하게 된다.

Bayes’ rule에 의해서 posterior probability P(Y_i|X)는 likelihood P(X|Y_i)와 prior probability P(Y_i)의 곱에 비례한다. (분모인 prior predictive probability P(X)는 클래스에 관계 없이 X의 marginal probablity로 항상 같으므로 덜 중요하다)

P(Y_i|X) = \begin{cases}P(Y_1|X)=\frac{P(X|Y_1)P(Y_1)}{P(X)} =\frac{P(X|Y_1)P(Y_1)}{P(X|Y_1)P(Y_1) +P(X|Y_2)P(Y_2)}  \\ P(Y_2|X)=\frac{P(X|Y_2)P(Y_2)}{P(X)} =\frac{P(X|Y_2)P(Y_2)}{P(X|Y_1)P(Y_1) +P(X|Y_2)P(Y_2)} \end{cases}

따라서

P(Y_i|X) = \begin{cases}P(Y_1|X) \propto P(X|Y_1)P(Y_1)  \\ P(Y_2|X) \propto P(X|Y_2)P(Y_2) \end{cases}

여기서 a_i = \log{P(X|Y_i)P(Y_i)}를 정의하면 다음과 같이 각 클래스의 posterior probability를 표현할 수 있게 된다.

\begin{array}{lcl} P(Y_1|X) &=& \frac{e^{a_1}}{e^{a_1} + e^{a_2}} \\ &=& \frac{1}{1+e^{-(a_1-a_2)}} \end{array}

a = a_1 - a_2 = \log{ \frac{P(X|Y_1)P(Y_1)}{P(X|Y_2)P(Y_2)} }라고 하면 P(Y_1|X)a에 대한 로지스틱 함수값이 된다.

P(Y_1|X) =\frac{1}{1+e^{-a}} = logistic(a)

그런데 a는 위의 정의에 따라

\begin{array}{lcl} a &=& \log{ \frac{P(X|Y_1)P(Y_1)}{P(X|Y_2)P(Y_2)} } \\ &=& \log{ \frac{P(Y_1|X)}{P(Y_2|X)} } \\ &=& \log{ \frac{P(Y_1|X)}{1-P(Y_1|X)} } \\ &=& \log{Odds(Y_1|X)} \end{array}

즉, 데이터 X를 바탕으로 Y_1이 옳은 클래스라고 판단할 log odds이다.

위에서 사건 A의 logistic은 사건의 성공확률 p 그 자체라는 것을 보였으므로, 결론적으로 logistic(Y_1|X)는 사건 Y_1|X의 확률, 즉 내재적으로 P(Y_1|X) 그 자체이다 (바로 위의 증명과 완전히 일맥상통한다).

이때문에 우리는 확률분포에 대한 가정 없이도 (deterministic하게) logistic function을 각 클래스로 판단할 ‘확률값’으로 곧바로 사용할 수 있는 것이다.

Multi-class classification과 Softmax function

n 개의 클래스(클래스 1, 2, … n)를 분류하는 문제를 생각해보자. 우리가 분류에 사용할 데이터를 X,특정 샘플이 클래스 1, 2, … n에 속한다고 판단하는 사건을 각각 Y_1, Y_2, ..., Y_n라고 하자. Logistic function을 유도했을 때와 마찬가지로,

P(Y_i|X) = \begin{cases}P(Y_1|X)=\frac{P(X|Y_1)P(Y_1)}{P(X)} =\frac{P(X|Y_1)P(Y_1)}{\sum_{i=1}^{n} P(X|Y_i)P(Y_i)}  \\ P(Y_2|X)=\frac{P(X|Y_2)P(Y_2)}{P(X)} =\frac{P(X|Y_2)P(Y_2)}{\sum_{i=1}^{n} P(X|Y_i)P(Y_i)} \\ ... \\ P(Y_n|X)=\frac{P(X|Y_n)P(Y_n)}{P(X)} =\frac{P(X|Y_n)P(Y_n)}{\sum_{i=1}^{n} P(X|Y_i)P(Y_i)} \end{cases}

이고, a_i = \log{P(X|Y_i)P(Y_i)}를 정의하면 posterior probability는 다음과 같이 Softmax function의 꼴로 표현된다.

\begin{array}{lcl} P(Y_1|X) &=& \frac{e^{a_1}}{e^{a_1} + e^{a_2} + ... +e^{a_n}} \\ &=&\frac{e^{a_1}}{\sum_{i=1}^{n} e^{a_i}} \end{array}

이처럼 Logistic function을 multi-class 문제로 일반화시키면 Softmax function을 얻을 수 있다. 이때문에 Softmax function을 multi-class logistic function이라고 하기도 한다.

 

Cross-entropy loss와 MLE

i번째 관측치 벡터 (x_i)의 ground truth 클래스를 t_i, 분류기를 통해 판단한 클래스를 y_i라고 하면,

t_i|x_i, a {\sim}^{iid} Bernoulli(p_i),  where p_i = P(t_i=1|x_i) = P(Y_1|X) = y_i

라고 가정할 수 있다. 이 때 likelihood는 다음과 같이 적을 수 있다.

\begin{array}{lcl} L = \prod_{i=1}^{n} P(t_i|x_i, a) &=& \prod_{i=1}^{n} p_{i}^{t_i} (1-p_i)^{1-t_i} \\ &=& \prod_{i=1}^{n} y_{i}^{t_i} (1-y_i)^{1-t_i}  \end{array}

Maximum likelihood estimation(MLE)을 위해서 log likelihood \log{L}을 구하면

\log{L} = \sum_{i=1}^{n} \log{\{y_{i}^{t_i} (1-y_i)^{1-t_i}\}} = \sum_{i=1}^{n} \{ t_i \log{y_i} + (1-t_i) \log{(1-y_i)} \}

인데, 이 식에 negative(-)를 취하면 cross-entropy loss(CE)의 정의와 일치한다. 따라서

\hat{\theta}^{MLE} = argmax_{\theta}(\log{L}) = argmin_{\theta}(-\log{L}) =argmin_{\theta}(CE)

이므로, 위의 Bernoulli 분포 가정 하에서 cross-entropy loss를 minimize하는 것은 MLE와 동일한 과정이 된다. 이때문에 cross-entropy loss를 최소화하는 과정을 통해 올바른 클래스 t_i에 가까운 예측 확률값 y_i를 얻을 수 있게 된다.

 

참고

  • 이 글을 많이 참고했다. 이 글을 바탕으로 노테이션을 정리하고 수식 유도를 풀어 쓴 정도다.
  • Odds에 대해서는 이 글을 참고했다.
  • 이 글에서 영감(?)을 얻었다.

EFA로 내게 맞는 스마트폰 카메라 찾기

해를 거듭하면서 스마트폰 성능이 눈에 띄게 향상되고 있다. 특히나 아이폰에 탑재되는 A-시리즈 APU의 성능은 작년부터 PC를 위협해오더니 급기야 13인치 맥북 프로를 벤치마크 상에서 앞지르기에 이르렀다. 일정 가격 이상의 대부분의 스마트폰 성능이 상향 평준화 되어버린 지금, Kantar가 2014년 수행한 북미 시장에서의 설문조사를 보면 스마트폰 구매 선택은 성능 외적인 부분에서 주로 결정되는 것으로 보인다.

특히 카메라 성능은 고가의 스마트폰을 구입하는 데에 있어서 결정적인 역할을 하는 요인으로 생각된다. 2016년 이전에는 코빼기도 보이지 않던 DxOMark 카메라 벤치마크가 이제는 많은 리뷰에서 빠짐없이 등장하는 현상이 이를 뒷받침한다. 비록 DxOMark에서 다양한 성능 카테고리에 대해서 카메라를 테스트하기는 하지만, 벤치마크와 실제 사용자 경험은 차이가 있을 수 있다. 테스트 점수가 높다고해서 내게 만족스러운 카메라가 되는 것은 아니라는 의미이다.

어떤 카메라가 내게 맞는 카메라인지에 대해 대략의 답을 제공하기 위해 DxOMark 벤치마크 데이터에 대해 탐색적 요인 분석(exploratory factor analysis; EFA)을 해보았다.

분석을 시작하면서 답을 찾고자 한 질문들은 이렇다.

  1. 각 브랜드는 스마트폰 카메라를 제작할 때 어떤 성능요인(색감, 선명도, …)에 중점을 두는가
  2. 각 브랜드의 스마트폰 카메라는 시간에 따라 어떤 방향으로 발전해왔는가
  3. 어떤 스마트폰 브랜드끼리 서로 비슷한 사진을 찍어내는가

주로 애플과 삼성을 중점으로 분석을 진행했다. 이 외의 브랜드의 스마트폰 카메라 분석을 원한다면 다음 gist를 참조하시길. 분석과 코드를 정리해 두었다 [벤치마크 크롤러][노트북].

 

최근 데이터들의 3-factor EFA 결과

DxOMark는 2017년 9월에 새로운 테스트 프로토콜을 제시한 바 있다. 테스트 프로토콜에 따른 테스트 점수 변동이 있을 수 있으므로, 이전 프로토콜에서 만들어진 데이터(이 글에서는 “과거” 데이터라 호칭한다)와 새로운 프로토콜(“최근”)에서 만들어진 데이터를 따로 분석하기로 했다.

Varimax 방법으로 새 프로토콜에서 얻은 데이터들을 회전시킨 EFA 결과, 다음과 같은 factor loading을 얻을 수 있었다.

output_39_0

각 요인에 크게 연관되어 있는 manifest variable에 따라 요인을 해석해서 이름을 붙였다.
FA1: AF, texture, exposure&contrast 등에 강한 음의 상관관계가 있으므로 “Bad Focus”.
FA2: artifacts, noise 등에 강한 양의 상관관계가 있으므로 “Sharp, Clear”.
    FA3: flash, texture 등에 강한 양의 상관관계가 있으므로 “High Detail”.
즉, FA1 값이 클수록 포커스가 잘 안잡히는 카메라, FA2가 클 수록 선명하고 또렷한 카메라다.

현재 시점 (2017/12/29)에 DxOMark에 올라온 모든 최근 스마트폰 카메라의 점수를 요인 점수로 변환해서 그래프로 나타내 보았다.

output_43_0

같은 색 포인트는 같은 회사에서 제작된 스마트폰이다. 이 그래프에서 각 브랜드의 장단점을 파악할 수 있다. 예를들어 구글의 경우 Sharp, Clear 점수가 조금 떨어지지만 포커싱과 디테일이 매우 우수하다. 반면 애플은 포커싱이 비교적 안좋은 반면 Sharp, Clear과 디테일이 우수한 것을 볼 수 있다. 삼성과 구글의 지향점이 서로 비슷한 듯하다.

각 브랜드의 최근 카메라 제작 트렌드를 좀 더 자세히 들여다보기 위해 삼성과 애플 제품만 따로 나타내보았다.

output_42_0

애플 아이폰 모델이 최신형에 이르면서 포커싱보다는 Sharp, Clear과 디테일에 중점을 두고 발전하는 것을 확인할 수 있다. 삼성 또한 갤럭시 S6 엣지에서 갤럭시 노트 8에 이르면서 Sharp, Clear보다는 포커싱과 디테일에 중점을 두는 모양새를 볼 수 있다.

 

과거 데이터들의 3-factor EFA 결과

최근 데이터와 동일한 방법으로 분석을 진행했다. Varimax rotated factor loading은 아래와 같다.

output_51_0

최신 데이터와는 조금 다른 해석을 사용해서 요인에 이름을 붙였다.
FA1: AF, texture, noise 등에 강한 음의 상관관계가 있으므로 “Bad Focus”.
FA2: color, exposure&contrast 등에 강한 양의 상관관계가 있으므로 “Colorful”.
    FA3: noise, flash, exposure&contrast 등에 강한 양의 상관관계가 있으므로 “Clear”.
즉, FA1 값이 클수록 포커스가 잘 안잡히는 카메라, FA2가 클 수록 선명하고 또렷한 카메라다.

DxOMark에서 테스트한 과거 모든 스마트폰 카메라를 스캐터플롯으로 나타내어 보았다.

output_54_0

삼성과 애플 제품들만 모아보았다.

output_55_0

삼성 제품들과 애플 제품들이 서로 다른 클러스터로 구별된다.
삼성은 포커스와 색감, 선명성에서 개선을 이뤄낸 것이 보인다. 최신 기종에 이를수록 개선 폭은 작아지는 것이 확인된다.
애플은 반면에 과거 기종부터 우수한 색감을 보인다. 주로 선명성과, 특히 포커싱 개선에 노력을 들인 것으로 보인다.

 

나에게 맞는 스마트폰 카메라 찾기

Moment라는 스마트폰 카메라 전문 렌즈 제작 스타트업은 “항상 휴대하는 카메라가 가장 좋은 카메라”라고 한 바 있다. 스마트폰 카메라의 우수한 휴대성을 강조한 말이다. “이왕 항상 휴대하는 거, 수치상으로 가장 좋은 카메라 대신, 내가 지향하는 사진을 찍을 수 있게 하는 카메라를 선택하는게 어떨까?”라는 생각에서 시작해서 벤치마크 숫자만으로는 파악할 수 없는 잠재적인 요인들을 요인분석으로 파악해 보았다.

색감을 중요시하는 사람은 전통적으로 우수한 색감을 자랑해온 애플 아이폰, 또는 세대가 거듭함에 따라 비약적인 색감 개선을 이뤄낸 삼성 제품을 선택할 수 있을 것이다. 또, 디테일을 중요하게 생각하는 사람은 디테일(FA1) 1위 제품을 만들어낸 구글 제품을 선택할 수 있을 것이다.

단순 벤치마크보다는 누군가의 스마트폰 선택에 도움이 되는 정보이기를 바란다.

2017년 대선 지지율 예측 (2)

이전 포스팅에서는 시계열 분석을 이용해서 대선 후보들의 지지율 추세를 예측했었다. 대략적인 추세는 파악할 수 있었지만 각 후보의 지지율 시계열이 서로 독립이라는 둥, 외인변수를 고려하지 않는 둥 몇 가지 현실과는 다소 동떨어지는 가정을 해야했었다. 또한 이렇게 얻어낸 예측치는 너무나도 당연한 것이어서(…) 직관적인 예상을 수치적으로 뒷받침 해주는 – 현재 시점의 지지율 값이 과대평가 되었는지, 과소평가 되었는지 – 정도의 의미만을 가졌다.

이번에는 외인변수를 이용해 회귀분석으로 주요 세 후보의 지지율을 예측해보면서 2017 대선 관련 분석을 마무리하고자 한다. 몇 가지 외적인 변수와 지지율간의 관계를 함수(회귀모형)로 세우고 이 함수로 알려지지 않은 시점의 지지율을 예측하는 방식이다. 예상치 못한 사건으로 인한 변동을 반영하지 못하고 시간이 흐를수록 예측값이 단순히 앙상블 기댓값으로 수렴했던 시계열 분석의 단점을 보완할 수 있을 것이다.

자세한 회귀모형 검정 결과와 코드는 이 노트북에서 확인할 수 있다. 작은 사진은 클릭하면 커진다.

 

회귀모형 설정

외인 변수로 사용하려고 다음의 두세 가지 값을 읽어왔다.

  1. 각 후보 관련주 2개의 전 날 종가
  2. 검색어를 각 후보의 이름으로 넣었을 때, 전 날 구글 트렌드 트래픽
    • pytrends를 이용해서 긁어왔다.

변수들간의 관계 및 분포를 대략 파악하기 위해 스캐터 플롯 매트릭스를 그려보았다 (클릭하면 커짐).

독립변수(외인변수) 간 선형관계가 존재하면 독립변수의 제곱합 행렬(X'X)의 역행렬이 존재하지 않게 되어 회귀모형을 설정할 수 없게 된다. 따라서 독립변수 간 선형관계가 없도록 관련주 중 회귀모형에서의 유의성이 더 높은 것의 값만을 사용했다.

진단 상 문제가 없도록 이리저리 모형을 바꿔가며 설정한 결과 다음과 같이 각 후보의 회귀모형이 결정되었다. 기존에 있는 어떤 이론을 바탕으로 한 것이 아니고 그저 유효한 회귀모형을 만들겠다는 생각으로만 설정된 모형이기에 수식이 엉망이다. 수식에서 y는 지지율, t는 구글 트렌드, s_{1(or 2)}는 관련주1(혹은 2)의 종가이다. m은 문재인, a는 안철수, h는 홍준표를 의미한다.

  • 문재인: y_m = \hat{\beta_1}\cdot{\log{t_m}}, \hat{\beta_1} = 9.9620
  • 안철수: \log{y_{a}} = \hat{\beta_2}\cdot{\log{s_{a2}}} +\hat{\beta_3}\cdot{t_{a}} +\hat{\beta_4}\cdot{\sqrt{t_{a}}}, \hat{\beta_2} = 0.1704, \hat{\beta_3} = -0.0178, \hat{\beta_4} = 0.3904
  • 홍준표: y_h =\hat{\beta_5}\cdot{s_{h1}} +\hat{\beta_6}\cdot{t_h},\hat{\beta_5} = 0.0014, \hat{\beta_6} = 0.1603

Intercept를 포함했을 때 condition number1가 미친듯이 치솟는 현상이 나타나서 세 모형 모두 intercept를 포함시키지 않았다. 실제로도 관련주 종가, 구글 트렌드가 0 일 때 (즉, 해당 후보에 대한 사람들의 관심이 없다시피 할 때) 지지율이 0에 가까운 값을 가질 것으로 생각되므로 intercept를 포함시키지 않는 것이 타당해 보인다. 문재인 후보 회귀식의 경우 관련주 종가가 지지율 값에 유의한 영향을 미친다고 보기 어려워 구글 트렌드만으로 예측을 했다.

이렇게 설정한 회귀모형에서의 지지율과 실제 지지율의 값을 비교해보았다. 시계열 예측과는 달리 지지율의 업 앤 다운도 어느정도 적합값에 나타나는 것을 볼 수 있다..

아래 부분의 그래프는 실제 값과 모형 예측값의 차이다. 자기상관성이 크게 나타나는 점에서 좋은 모형이라고 하기는 어려워 보인다. 다만 예측하려는 값, 즉 여론조사로 집계한 지지율 자체에 관측오차가 있기에 회귀모형에서 얻은 지지율 값에도 오차가 있을 것이다.

 

지지율 예측

output_46_1

지지율 회귀분석 결과

위의 회귀모형으로 5월 4일의 관련주 종가, 구글 트렌드로 5월 5일의 지지율을 예측해보았다(•).

 

그 외..

  • 최근 며칠간의 실제값-모형값 차를 보았을 때 모형의 5월 5일 예측값이 안철수 후보에서는 과대추정, 홍준표 후보에서는 과소추정이 된 것이 아닌지 의심스럽다. 다른 외인변수를 더 찾아 넣으면 더 정확하게 개선할 수도 있을 듯한데.
  • 시계열분석의 단점을 보완할 수 있을 것이란 예상과는 달리, 자기상관성이 크게 나타나는 문제가 생긴다. 추가적인 보정을 통해 보완할 필요가 있다.
  • 문재인 후보, 홍준표 후보의 경우 관련주 종가가 지지율과 강한 음의 상관관계(\rho_m = -0.79, \rho_{h1} = -0.68)를 보이는 기괴한 모습을 보인다. 안철수 후보의 관련주 종가에서도 높았던 주가가 지지율 하락의 순간에 뒤따라 하락하는 모습을 보인다. 이게 바로 테마주의 허망함인가..하는 생각을 하게 만든다.

 


  1. 다중공선성(multicolinearity)을 감지하는 데에 사용되는 값이다. 독립변수가 아주 작은 값 변화했을 때 모형 함수값이 얼마나 크게 변하는지를 나타내는 민감도 척도이다. 

2017년 대선 지지율 예측

네이버에서 여론조사 데이터를 긁어오는 스크립트를 짜면서  ‘당선 가능성’이라는 것이 여론조사에 항목에 있다는 걸 알게 되었다. 여론조사가 말하는 ‘당선 가능성’은 그저 “어느 후보가 가장 당선 가능성이 높다고 생각하십니까?”라는 질문에 대한 시민들의 응답을 기록한 것이었다.

가장 잘 생긴 사람을 뽑는 대회와 다른 사람들이 가장 잘 생겼을 것이라고 생각할 사람을 뽑는 대회는 사뭇 다르다. 여론조사의 ‘당선 가능성’을 후자에 빗댄다면 통계적 예측을 통한 확률로서의 당선 가능성을 전자라 할 수 있을 것이다.

진짜 확률로서의 당선가능성을 뽑아낼 방법이 없을까 하는 물음에서 2017 대선후보 중 주요 후보 다섯 명(기호 순 문재인, 홍준표, 안철수, 유승민, 심상정)의 지지율 추세를 시계열(time series)로 보고 시계열 분석을 시작해봤다. 대중에게 여론조사가 공표될 수 없는 내일 이후 6일간의 기간동안 지지율 추세의 대략적인 지표가 될 수도 있으리라 본다.

분석에 사용한 데이터와 가정은 다음과 같다:

  1. 각 후보의 지지율 추세는 (독립적인) 확률과정이다.
    1. 실제 지지율과는 매우 동떨어진 가정이다. 한 후보의 지지율은 결국 비율이기 때문에 내재적으로 다른 후보의 지지율에 의존할 수밖에 없다.
  2. 외인 변수는 고려하지 않는다. 즉, 여기서 예측하는 지지율은 앞으로 큰 변동/사건이 일어나지 않는다고 할 때 가능한 지지율 추세이다.
  3. 지지율 시계열은 0차 이상의 차분을 통해 stationary process로 표현할 수 있다.
  4. 다섯 후보 모두의 지지율이 계속해서 집계되기 시작한 3월 28일자부터 5월 3일까지 공표된 여론조사 데이터를 사용했다. (5월 3일 새로 공표된 여론조사 반영하여 수정함)

 

ARIMA 모형 차수 설정

분석 과정에서 문제가 있지는 않았나 싶어 과정을 공개하고자 한다. 무시하고 바로 결과로 건너뛰어도 된다.

stationary process 검정 (Dickey-Füller test) 등 보다 자세한 과정 및 수정 내역은 이 노트북에서 확인할 수 있다. RNN을 이용하려했던 흔적도 찾을 수 있다.

output_6_0

지지율 시계열

output_11_0

1차 차분한 시계열

output_14_0

2차 차분한 시계열

Dikey-fuller 검정 결과 stationary process를 만족하는 최소 차분수 시계열을 바탕으로 각각 ARIMA 모형을 피팅했다. AR, MA 모형 차수를 설정하기 위해 아래와 같이 ACF(autocorrelation function)와 PACF(partial autocorrelation function)를 확인했다.

output_16_0

문재인 시계열 – 차분 안 함 – ACF, PACF

문재인 후보 시계열의 모형으로 ARMA(1,2)를 선택했다.

output_17_0

심상정, 유승민, 홍준표 시계열 – 1차 차분 – ACF, PACF

심상정, 유승민, 홍준표 후보 모형으로 ARIMA(1,1,1)을 선택했다.

output_18_0

안철수 시계열 – 2차 차분

안철수 후보 시계열의 모형으로 ARIMA(1,2,2)를 선택했다.

 

지지율 예측 결과

미래 시점의 예상 지지율 기댓값을 실선과 원으로 (-o-의 모양새), 95% 신뢰구간을 그림자로 나타냈다. 시계열만으로 예측하는 것이기에 95% 신뢰구간이 크게 나타나는 것에 유의. 시계열 분석은 미래를 확정적으로 예측하는 마법같은 도구가 아니다.

쉽게 표현하자면 실선으로 표시된 부분은 그나마 가장 가능성이 높아뵈는 시나리오 정도로 받아들이면 된다. 실제로는 어디에든 지지율 포인트가 찍힐 수 있다. 빈도주의 관점에서 본다면 평행우주(?)에서 100번 대선을 실시하면 95번 정도는 그림자 안에 지지율이 찍힐게다. 달리 말하자면 신뢰구간의 폭이 넓을수록 예측이 어렵다는 이야기가 된다.

output_24_0

대선 지지율 추세 예측

실제로 일어날 법한 지지율 추세가 나온다. 특히 안철수 후보의 지지율의 경우 넓은 지지율 변동폭을 반영해 높은 예측 불가능성(매우 넓은 신뢰구간)을 보여준다. 이 외에도 현재의 지지율 값이 과대평가된 값인지, 혹은 과소평가된 값인지를 시계열 기댓값 예측값으로 판단할 수 있다.

 


시계열 분석은 미래를 확정적으로 예측하는 방법이 아니다. 데이터에 대한 여러 가정을 세우고 그 모든 가정을 충족시킨다 할 때 현재까지의 추세를 바탕으로 가장 그럴듯한 예측치를 보여주는 것 뿐이다.

가정이 하나라도 크게 어긋난다면 그리 좋은 예측이 되지 못한다. 가정이 모두 충족되더라도 하나의 확실한 예측값을 보여주지는 못한다. 데이터 자체의 속성과 미래를 예측하고자 하는 데에 따르는 (때로는 거대한) 불확실성을 항상 염두에 두어야 한다는 이야기이다.

그러나 그리 세밀한 예측치가 아니더라도 충분할 때가 있다. 여론조사 공표가 금지되는 다음 일주일, 더 나아가 각 후보의 당선 가능성을 가늠하는 데에 지금까지의 추세를 반영한 시계열 예측이 한 번 참고해 볼 수준은 될 수 있을 게다.