박스-칵스 변환

박스-칵스 변환

Box cox transformation


🚧 이 포스트는 아직 이관 작업이 완료되지 않았습니다 🚧

$x > 0$ 에 대해 $g(x) := \begin{cases} \displaystyle {{ x^{\lambda} - 1 } \over { \lambda }} & , \lambda \ne 0 \\ \log x & , \lambda = 0 \end{cases}$ 를 박스-칵스 변환이라 한다.

$g$ 는 원래 멱변환Power Transformation이라 불리나, 박스와 칵스에 의해 소개되어 박스-칵스 변환이라고 부르기도 한다. 박스-칵스 변환의 주된 용도는 데이터를 정규분포에 가깝게 만들거나 데이터의 분산을 안정화하는 것으로, 정규성을 가정하는 분석법이나 정상성을 요구하는 분석법을 사용하기에 앞서 데이터의 전처리에 유용하게 쓸 수 있다.멱변환을 취하기 위해서는 데이터가 모두 양수여야한다는 조건이 필요하지만, 보통은 그냥 데이터의 최소값이 양수가 되도록 어떤 값을 더해서 밀어Shift주는 식으로 해결한다. 이 방법이 적절치 못하거나 마음에 들지 않는다면 실수 전체에 대해 일반화된 여-존슨 변환 Yeo-Johnson Transformation 을 고려해볼 수 있다.

수식적으로는 $\displaystyle \lim_{\lambda \to 0} {{ x^{\lambda} - 1 } \over { \lambda }} = \log x$ 이므로 사실 편하게 적자면 $\displaystyle g(x) = {{ x^{\lambda} - 1 } \over { \lambda }}$ 정도만 되어도 알아보는데에는 큰 문제가 없다. 또 $g$ 는 $\lambda$ 에도 종속되어 있으므로 우리가 가진 것은 함수의 패밀리 $\left\{ g_{\lambda} : \lambda \in \mathbb{R} \right\}$ 이다. $g_{\lambda}$ 는 $\lambda$ 에 따라 유연하게 꼴을 바뀌고, 분석자는 목적에 맞게 $\lambda$ 를 제대로 결정할 수 있어야할 것이다.

이때 특히 주목할만한 $\lambda$ 로 $0,1,2$ 가 있다. $g_{0} (x) = \log(x)$ 는 가장 즐겨쓰이는 변환이며, $\displaystyle g_{2} (x) = {{\sqrt{x} - 1} \over {2}}$ 또한 $\displaystyle h(x) = {{x - 1} \over {2}}$ 이 선형변환이므로 $\displaystyle g_{2} (x) \approx \sqrt{x}$ 가 발견됨을 알 수 있다. 변환에 즐겨 쓰이는 루트 $\sqrt{}$ 와 로그 $\log$ 가 박스-칵스 변환에 의해 커버된다는 사실은 이론적으로 흥미로운 동시에 실용적으로 당연해야할 일이다.

$\lambda = 1$ 인 경우 $g(x) = x - 1$ 으로써, 사실상 항등 변환이 된다. 보통의 경우 데이터에서 값이 $1$ 정도 빠지는 것은 변환이라고 부를수도 없기 때문이다. 주어진 데이터에 대해 적절한 $\lambda$ 가 $1$ 이라고 구해졌다면 이것은 ‘변환이 필요없다’라는 뜻으로 받아들여도 무방하다.같은 센스로 시계열 분석을 생각해보면 박스-칵스 변환의 $\lambda$ 의 신뢰구간을 구하는 것은 곧 데이터의 분산이 일정한지를 검정하는 것으로 볼 수 있다. $\lambda$ 의 신뢰구간에 $1$ 이 포함되면 데이터를 변환하나 안 하나 차이가 없는 것이다. 변환을 할 필요가 없다는 것은 다시 말해 분산이 이미 일정하다는 것이다.

데이터 $\left\{ x_{t} \right\}$ 가 주어져 있다고 하자.

$H_{0}$ : $\lambda = 1$ 즉, 데이터 $\left\{ y_{t} \right\}$ 는 정상성을 갖는다.

$H_{1}$ : $\lambda \ne 1$ 즉, 데이터 $\left\{ y_{t} \right\}$ 는 정상성을 가지지 않는다.

주의해야할 것은 이러한 진단이 분산에 대해서만 일어난다는 것이다. 평균에 대해서는 신경쓰지 않기 때문에 이에 대한 별도의 테스트가 필요하다.R 에서는 TSA 패키지의 BoxCox.ar() 함수를 통해 쉽게 가설 검정을 할 수 있다.

내장데이터 UKgas를 불러와보자.

ukgas.png boxcoxukgas.png UKgas는 영국에서 가스의 소비량을 분기별로 기록한 데이터로써, 보다시피 해가 가면서 변동이 더욱 심해지는 것을 알 수 있다. 한편 가설검정 결과 신뢰구간에 $0$ 이 포함되어 있고, 이에 따라 박스-칵스 변환은 곧 로그변환이 된다.

logukgas.png boxcoxlogukgas.png 로그를 취하면 실제로 분산이 상당히 안정되는 것을 볼 수 있다. 확인을 위해 한번 더 가설검정을 해보면 신뢰구간에 $1$ 이 포함되어있다. 이는 신뢰수준 $95%$ 에서 더 이상 변환이 필요하지 않다는 뜻으로 받아들일 수 있다. 하지만 그래프에서 나타나듯이 완전히 분산이 안정된 것은 아니며, $2$ 역시 신뢰구간에 포함되어 있으므로 한 번 더 변환을 취하는 근거로 받아들여도 무방하다. 적어도 이러한 상황에서의 선택은 신뢰수준에 달려 있으며, 신뢰수준이 $95 %$ 라면 분석자가 선택하기 나름이다.

UKgas
win.graph(3.5,3.5); plot(UKgas,main='UKgas')
win.graph(3.5,3.5); BoxCox.ar(UKgas)
win.graph(3.5,3.5); plot(log(UKgas),main='log(UKgas)')
win.graph(3.5,3.5); BoxCox.ar(log(UKgas))
댓글