일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- 군집화
- 자연어 처리
- 밑바닥부터 시작하는 딥러닝
- 머신러닝
- rnn
- Django
- 회귀분석
- 오래간만에 글쓰네
- numpy
- 밑바닥부터 시작하는 딥러닝2
- 차원축소
- 구글 BERT의 정석
- 감성분석
- 텐서플로2와 머신러닝으로 시작하는 자연어처리
- Pandas
- student t분포
- 다층 퍼셉트론
- 히스토그램
- 기술통계학
- 기초통계
- F분포
- 파이썬 pandas
- 최소자승법
- 텍스트 분류
- 모두의 딥러닝
- 가설검정
- 코사인 유사도
- word2vec
- 은준아 화이팅
- 결정계수
- Today
- Total
데이터 한 그릇
4)시계열의 탐색적 자료 분석 본문
이번 장에서는 시계열을 위한 탐색적 자료 분석 논의를 두 부분으로 나누어 설명한다
- 시계열에 사용되는 데이터 응용 기법 (히스토그램, 도표 그리기, 그룹화 연산)
- 시계열 분석의 근본적인 시간 기법 강조 (이 기법은 시계열 데이터를 위해 특별히 개발되었으며, 데이터가 서로 시간 관계가 있는 상황에서만 의미가 있음)
1. 친숙한 방법
비시계열 데이터에 적용하는 방법과 동일한 탐색적 자료 분석 방법
쓸 수 있는 열, 각 열이 가지는 값의 범위, 가장 알맞은 측정 단위와 같은 것을 알고 싶을 것
또한 다음 아래와 같은 질문에 대한 답을 얻고 싶을 것
- 긴밀한 상관관계를 가지는 열이 있는가?
- 관심 대상 변수의 전체 평균과 분산은 무엇인가?
- 분석값의 범위는 무엇인가? 다른 논리적 단위나 기간에 따라 값이 달라지는가?
- 데이터가 일관성을 갖고 균등하게 측정이 됐나? 아니면 시간이 흐르면서 측정이나 동작 방식에 변화가 있었나?
이러한 궁금증을 해결하려면 히스토그램, 산점도, 요약 통계 같은 방법에 시간축을 함께 고려해야만 한다
이를 구현하려면 시간을 통계에 포함해야만 함
그룹화 연산
비시계열 데이터처럼 시계열 데이터에서도 그룹이 있어서 그룹화라는 개념을 적용할 수 있음
예를 들어서 비시계열 데이터에서는 연령, 성별, 이웃에 기반한 그룹 평균을 구할 수 있음
한편 시계열 분석에서는 월별 평균이나, 주별 중앙값과 같은 탐구적인 그룹화와 연산이 유용 (월별, 주별)
또한 시계열과 비시계열 그룹을 결합하는 것도 가능하다. 성별, 월별 평균 섭취 칼로리를 구하거나, 병원 환자 집단을 나이별로 주별 수면 중앙값을 구하는 예를 들어볼 수 있다
데이터를 그룹화하면 시간축을 다른 관계와 상호작용할 수 있도록 해주는 방법이 많다
1. 외부 요인으로 규칙의 변화가 예상된다면 변화 시점을 기준으로 서로 다른 시각에서 따로 분석해야 한다, 서로 다른 의미를 지니는 시각의 합리적인 경계를 발견하고자 한다면 탐색적 분석 사용
2. 하나의 계열로 표현된 데이터(ex, 전체 기부)를 여러 개의 병렬처리(ex, 개인 기부)로 나누면 더 명확해진다는 것을 발견할 수 있다.
1.1 도표 그리기
R내장 데이터 사용
유럽 4대 주요 주가지수 일일 종가를 기록 (데이터셋은 입회일만 포함)
데이터셋이 완변한 축에 속하기 때문에 누락된 값이나,ㄴ 시간대, 부정확한 측정에 대해 걱정할 필요가 없다 => 바로 탐색적 분석 가능
library(datasets)
data(EuStockMarkets)
head(EuStockMarkets)
가장 먼저 시간을 고려하지 않은 방식으로 시계열을 다루는 방식을 살펴본다
각 값을 개별 그래프로 그려보면 이해하기 쉽다
plot(EuStockMarkets)
단순한 plot() 함수만으로도 데이터를 서로 다른 시계열 그래프로 자동 분할할 수 있다
frequency(EuStockMarkets) #260
start(EuStockMarkets) #[1] 1991 130
end(EuStockMarkets)#[1] 1998 169
window(EuStockMarkets, start = 1997, end = 1998)
데이터의 연간 빈도를 알려주는 frequency 함수
일련의 데이터에서 처음과 마지막 시간을 알아내는 start 와 end 함수 사용 가능
데이터에서 시간의 한 부분 범위를 얻을 수 있는 window 함수
1.2 히스토그램
히스토그램을 그릴 때 시간축을 사용하면, 시간상 인접한 데이터 간의 차이를 구하고, 이 차이에 대한 히스토그램을 측정할 수 있다
히스토그램을 통해서 예상치 못한 관점에서 데이터를 바라볼 수 있다
어떠한 변형도 가하지 않은(NOT DIFF) 히스토그램은 매우 넓게 퍼져 있고 정규분포를 따르지 않는다, 이는 데이터의 내재된 추세를 반영한 결과
추세를 제거하기 위해 시간상 인접한 데이터의 차이를 구하면 데이터는 보다 정규분포를 따르는 형태로 변한다 (DIFF)
DIFF 그래프가 더 흥미로운 그래프라고 할 수 있다. 즉, 실제 측정치 자체가 아니라, 한 측정치가 다음 측정치로 변화한 정도가 흥미로운 점
시간상 인접한 데이터의 차이(차분 diff)에 대한 히스토그램으로 얻은 새로운 정보에 주목,
차분에 대한 히스토그램은 차이가 양수인 경우와 음수인 경우에 각각 시계열값이 거의 같은 양만큼 증가 하거나 감소했다는 사실을 보여준다
위의 주가 지수 그래프를 살펴봤듯이 모든 지표가 상승세를 보이기 때문에 히스토그램이 미세하게 양수쪽으로 치우쳐져 있음을 확인할 수 있다 (이를 통해 상승 추세 짐작 가능)
(데이터의 차분한 이후 히스토그램을 그려서 추세를 확인할 수 있다)
1.3 산점도
전통적인 산점도(scatter plot)은 비시계열 데이터뿐만 아니라 시계열 데이터에서도 매우 유용하게 쓰인다
산점도를 사용하면 두 가지를 결정할 수 있는데, 특정 시간에 대한 두 주식 관계와 두 주식의 시간에 따른 각각의 가격 변동이 갖는 연관성을 결정할 수 있다
다음 두 경우에 대한 도표를 그려보자
- 시간에 따른 서로 다른 두 주식의 가치
- R의 diff() 함수로 구한 두 주식의 일일 가치 변동
plot(EuStockMarkets[,'SMI'], EuStockMarkets[,"DAX"])
plot(diff(EuStockMarkets[,'SMI']), diff(EuStockMarkets[,"DAX"]))
두 주가지수에 대한 단순한 산점도는 강한 상관관계를 보여준다, 하지만 실제값 그 자체는 시간상 인접한 데이터의 차이보다 유익한 정보가 아니다
따라서 두 번째 도표로 "차분"에 대한 산점도를 그렸다. 매우 강한 상관관계가 있는 것처럼 보이지만 실제로는 보이는 만큼 상관관계가 강하지 않다
위 그래프의 명백한 상관관계가 흥미롭지만, 모집단을 대변할 수 있는 참상관관계(true correlation)라고 해도 주식거래로 수익을 낼 수 있는 상관관계는 아니다. 왜냐하면 주가의 상승이나 하락을 알 때 동일한 시점에 대한 값들의 상관관계를 취하기 때문이다
따라서 시간상 먼저 알게 된 한 주가의 변동으로 나중의 다른 주가의 변동을 예측해야한다
그러기 위해서, 산점도를 확인하기 전에 두 주가 중 하나를 1만큼 시간상 앞으로 당겨야 한다 (여전히 차분을 구하지만 그 중 하나에 lag 함수를 적용, R)
plot(lag(diff(EuStockMarkets[,'SMI']),1), diff(EuStockMarkets[,"DAX"]))
lag 함수를 이용해서 시점을 앞으로 당기자 두 축의 상관관계가 사라진 것을 확인할 수 있다
이 결과는 여러 가지 중요한 사실을 말해준다
- 비시계열 데이터와 동일한 탐색 기법을 시계열 데이터에서도 사용할 수 있지만, 시계열을 의식하지 않는다면 애플리케이션은 제대로 동작하지 않을 것, 동일한 기술을 형태가 다른 데이터에 활용할 방법을 고려해아함
- 시간에 따른 변화나 서로 다른 시점의 데이터 사이의 관계가 데이터의 동작 방식을 이해하는 데 유익한 정보인 경우가 많다
- 그림 3-4의 도표는 주식 투자자가 되기 어려운 이유를 보여줌, 기다리는 수동적인 투자라면 장기 상승 추세로 수익을 얻을 수도 있다, 하지만 적극적으로 미래를 예측하고자 노력하는 능동적인 투자자라면 수익을 얻는 것이 어렵다는 것을 잘 알고 있다
2. 시계열에 특화된 탐색법
시계열 데이터를 분석하는 여러가지 방법은 같은 계열에 속한 서로 다른 시간의 값들 간의 관계에 집중한다
이번 절에서는 시계열을 분류하는 데 사용하는 개념과 관련 기법을 다룬다
살펴볼 개념은 아래와 같다
- 정상성(Stationarity)
- 시계열이 정상성이 된다는 의미와 정상성에 대한 통계적 검사
- 자체상관(self correlation)
- 시계열 그 자체로 연관성이 있다는 의미와 이 연관성이 시계열의 내재된 역동성에 대해 보여주고자 하는 것
- 허위상관(spurious correlation)
- 상관관계가 허위가 된다는 의미와 허위상관을 마주칠 만한 상황
위 개념들을 적용한 기법은 다음과 같음
- 롤링 윈도와 확장 윈도 함수
- 자체상관함수(self correlation function)
- 자기상관함수(autocorelation function)
- 편자기상관함수(partial autocorelation function)
저자가 위의 순서대로 개념을 정리한 이유:
시계열을 다룰 때 처음으로 던져볼만한 질문은 시계열이 시스템의 안정성(stable)을 반영하는가 아니면 지속적인 변화를 반영하는가에 대한 것이다. 정상성은 안정성의 수준을 의미하며, 이를 평가하는 것도 중요하다.
일단 시계열의 안정성을 측정했다면 그다음 내부적인 역학의 존재를 결정해야한다(계절 변화), 즉 자체상관을 찾기 위한 노력.
이를 통해서 미래의 데이터 예측에 먼 과거 또는 최근의 데이터가 얼마나 밀접한 연관성을 가지는지와 같은 근본적인 질문에 답을 구해볼 수 있다
특정 행동역학을 발견했다는 생각이 들었을 때, 그 역학이 우리가 알고 싶은 인과관계에 어떠한 의미도 가지지 않는다면 결코 그 역학에 기반한 인과관계를 찾으려고 해선 안된다, 그런 이유로 상관관계가 곧 인과관계는 아니라는 허위상관을 찾아야 한다.
2.1 정상성 이해하기
많은 전통적인 시계열 모델은 정상화된 시계열에 의존한다
일반적으로 정상 시계열은 시간이 경과하더라도 꽤 안정적인 통계적 속성을 가지는데, 특히 평균과 분산에서 더욱 그렇다.
저자는 먼저 형식적으로 먼저 정상성에 대한 정의를 내림
직관적인 정의
데이터의 흐름이 정상이 아님을 보여주는 특징이 몇 가지가 존재한다
- 첫 번째로, 평균값이 일정하게 유지되기보다 시간에 따라 증가한다
- 두 번째, 연간 최고점과 최저점 사이의 간격이 증가하므로 분산이 시간에 따라 증가한다
- 셋 째, 강한 계절성이 보이면 정상성에 반대되는 사실이다
정상성의 정의와 증강된 디키-풀러 검정(Augmented Dickey-Fuller-Test)
다음과 같이 정상과정을 간단하게 정의할 수 있다
모든 시차 k에 대해 y_t, y_t+1 ......., y_t+k의 분포가 t에 의존적이지 않다면 이 과정은 정상
정상성의 통계적 검정은 단위근(unit root)의 존재 유무라는 질문으로 이어진다
단위근의 결여가 정상성을 증명하는 것은 아니지만, 단위근이 있는 선형 시계열은 비정상으로 볼 수 있다
(책에서 디키-풀러 검정에 대한 기술이 충분치 않기 때문에 다른 내용 추가)
디키풀러 검정 (Dickey-Fuller-Test(검정))
이 검정 방법은 단위근을 검정하는 하나의 방법이다.
아래와 같이 하나의 자기회귀모형이 있다고 하자
이때 시계열 이론에 따르면 |p| < 1 인 경우는 정상 과정(Stationary Process) 이며, p = 1 인 경우 단위근을 갖고, 비정상 과정(Non-Stationary Process) 이 된다 (중요한 지점은 p=1 일 때 단위근을 가진다는 점)
그렇다면 단위근의 존재를 파악해야하는 이유는 무엇인가?
단위근이 있으면 p추정치에 편향(bias) 가 생기며 다변량 시계열 분석 시 두 시계열에 실제로 관계가 없지만 관계가 있는 가짜 회귀 모형을 만들 수 있다
디키-풀러 검정은 귀무가설 H0 : p = 1, 대립가설 H1 : p < 1로 검정한다, 즉 귀무가설은 단위근이 존재하며 정상성이 없다고 주장하는 가설이며 대립가설은 단위근이 존재하지 않고 정상적인 데이터임을 이야기한다
만약 귀무가설을 채택한다면 단위근을 가지게 되고 따라서 비정상 과정으로 결론지을 수 있으며, 귀무가설을 기각한다면 대립가설을 채택하게 되고 따라서 정상 과정이라고 결론지을 수 있다
식을 통해서 살펴보면 위의 식에서 양번에 X_t-1을 해주면 다음과 같은 식이 나온다 (t시점과 t-1 시점을 빼면 차분을 뜻함)
=
=
=
이식을 이용하면 X_t가 단위근이 존재한다고 한다면 (본래는 pX_t-1 + W_t)
위의 식에서 diff X_t와 X_t-1 의 관계를 통해 단위근을 식별하는 것이라고 생각해보면, 만일 𝛅 < 0 이면, X_t-1이 증가할 때 diff X_t는 감소하게 되고 마찬가지로 X_t-1이 감소할 때, diff X_t는 증가하게 된다, 이럴 경우 시계열 X_t-1은 정상 과정이라는 것과 같다
시계열 X_t-1은 정상 과정이라는 것과 같다
augmented Dickey-Fuller Test(검정)
단순 dickey-fuller-test 의 경우 AR(1) 모형에서 단위근 검정이라고 한다면 Augmented Dickey-Fuller Test는 AR(p) 모형에서의 단위근 검정이다
앞의 단순 디키 풀러 검정처럼 단위근 귀무가설을 만들고 싶은데 (H0: p=1, H1:p<1) 위의 AR(p) 식으로는 어려워 보인다
(나도 이해 못하겠는 수식을 거쳐서) 결국엔 아래와 같은 검정을 만들게 된다
여기까지 디키-풀러 검정과 증강된 디키-풀러 검정을 살펴봤는데, 더 깊은 이해를 위해서 확률보행을 살펴보자
확률 보행(Random walk)의 예로부터 단위근에 대한 간단한 직관을 얻을 수 있다
시계열 데이터 X_t가 아래와 같은 모형을 따른다고 해보자
여기서 Z_t는 평균이 0이고 분산은 𝛅^2 인 백색 잡음(White Noise) 이며 X_0는 초기값으로 실수값으로 간주한다
또한 𝛍 = E(X_t - X_t-1) 이다
이때 예시의 첫 번째 식을 Random Walk 모형이라고 하고, 예시의두 번재 식을 Random Walk with Drift 모형이라고 한다
위의 모형이 Random Walk 라고 불리는 이유는 만약 백색잡음 Z_t 가 대칭 분포(ex. 정규분포) 인 경우에는 이전 데이터 값 X_t-1 가 주어졌다고 했을 때, 그 다음 데이터 값 X_t가 앞으로 가거나(높아지거나), 낮아질 확률이 반반으로써 이는 마치 랜덤으로 앞으로 또는 뒤로 걸어가는 것과 같아서 Random Walk로 불린다
이 Random Walk 모형을 자기 회귀 모형식으로 표현하면 AR(1) 이 되고 그 계수가 1인 것을 알 수 있으며 이는 정상성 조건인 자기 회귀 계수의 절대값이 1보다 작아야 한다는 조건)을 만족하지 않는다. (자기 회귀 계수 -> 단위근)
결국 계수가 1이기 때문에 Z_t만이 남아있고 X_t-1 이 있을 때, X_t 가 높아지거나 낮아질 확률은 50 : 50 이기 때문에(Z_t때문에) 제멋대로라고 할 수 있으며 따라서 정상적이지 못하다고 할 수 있다
지금까지 ADF(증간된 디키풀러검정) 까지 살펴봤는데, ADF검정은 시계열 학문에서 가장 널리 사용되는 정상성의 검정 방식이다
실전
지금까지 정상성이 무엇인지 그리고 검정 방법은 무엇인지 살펴봤는데, 왜 시계열 데이터의 정상성을 살펴볼까?
왜냐하면 이미 잘 알려진 강점을 지닌 전통적인 모델과 통계 모델을 포함한 수많은 모델이 정상과정을 가정하기 때문이다
(이런 모델들을 교재에서 6장에서 자세히 살펴볼 예정)
넓은 관점에서 보면 정상이 아닌 시계열 모델은 시계열의 평가 지표가 달라짐에 따라서 정확도가 달라진다
즉, 시계열의 평균을 추정하는 모델을 찾는데 비정상 평균과 분산을 사용하면 시간이 지날수록 모델의 편향과 오차가 달라지고 어느 순간부터는 모델의 가치에 의문이 생긴다 (당연한게 모든 시점에서 평균과 분산이 일정하지 않으니까)
몇 가지 간단한 변환으로도 시계열을 충분히 정상화할 수 있다. 널리 사용되는 변환의 두 종류는 로그와 재곱근.
이 둘은 특히 분산이 변화하는 경우에 사용한다.
이와 마찬가지로 추세는 차분을 구하여 제거하는 것이 가장 일반적.
예측 모델이 정상성만을 가정하는 것은 아니다. 이와는 대조적이지만 보편적인 또 다른 가정은 입력 변수 또는 예측된 변수의 분포에 대한 정규성이다
이 경우에는 정규성을 띠고 있지 않은 변수에 대해서 파이썬의 경우에는 scipy.stats, R의 경우 forecast 패키지를 사용하여 정규화 시켜야한다. (무조건적인 필수는 아님)
변화하기 전에 데이터간 거리의 의미를 생각해봐야한다, 또한 작업 종류에 상관없이 원본 데이터에서 가장 중요했던 정보가 변환 후에도 보존되는지 반드시 확인해봐야 한다
2.2 윈도 함수 적용
시계열 분석 초기에 사용될 가능성이 높은 가장 중요한 시계열 탐색 그래프 복습
롤링 윈도
시계열에 일반적으로 특화되어 사용되는 함수는 윈도 함수
이는 데이터를 압축(다운샘플링) 하거나 평활화를 하기 위해 데이터를 취합하는 어떠한 함수도 될 수 있다
#rnorm 함수로 정규분포를 따르는 난수를 100개 추출
x <- rnorm(n = 100, mean = 0, sd = 10) + 1:100
##rep 함수로 1/n 값을 n번 반복하는 배열을 만드는 함수를 생성
mn <- function(n) rep(1/n, n)
plot(x, type = 'l', lwd = 1)
##기본 R의 filter 함수로 롤링 평균을 계산, 각각 5개 50개 단위로 롤링
lines(filter(x, mn( 5)), col = 2, lwd = 3, lty = 2)
lines(filter(x, mn(50)), col = 3, lwd = 3, lty = 3)
filter() 함수는 linear transformation 에 기반하므로 선형결합하지 않은 함수를 원한다면 filter() 함수를 사용할 수 없다
이럴 때는 zoo 패키지의 rollapply() 함수를 사용하는 것이 유용하다
require(zoo)
##x를 zoo객체로 만들어서 각 데이터를 인덱싱
## rollapply 함수는 데이터, 윈도 크기, 적용 함수, 롤링 적용 정렬 방향,
## 윈도 크기만큼 데이터가 없어도 적용할 것인지 등에 대한 인수를 지정
f1 <- rollapply(zoo(x), 20, function(w) min(w), align = "left", partial = TRUE)
f2 <- rollapply(zoo(X), 20, function(w) min(w), align = "right", partial = TRUE)
plot(x, lwd = 1, type = "l")
lines(f1, col=2, lwd=3, lty =2)
lines(f2, col=3, lwd=3, lty =3)
2.3 자체상관의 파악과 이해
to be continue
'시계열 분석 > Practical TIme Series Analysis' 카테고리의 다른 글
4)시계열의 탐색적 자료 분석3 (1) | 2022.10.13 |
---|---|
4)시계열의 탐색적 자료 분석2 (0) | 2022.10.13 |
3)계절성 데이터, 시간대, 사전관찰의 방지 (0) | 2022.10.12 |
2)데이터 정리2 (0) | 2022.10.12 |
2) 데이터 정리 (1) | 2022.10.08 |