Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
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
Archives
Today
Total
관리 메뉴

고양이는 털털해

시계열 #1 본문

공부/시계열

시계열 #1

Attagungho 2021. 6. 16. 23:24

timeseries_1
예측의 개요, 예측 데이터 살펴보기

conda install -c r r-essentials

주피터 환경에서 r 실행
시계열참고도서
시계열 패키지 참고


예측의 개요

  • 예측이란?
    • 미래의 시점에서의 사건을 사전에 추측하는 것
  • 예측의 필요성
    • 불확실한 미래에 대한 합리적이고 효율적인 의사 결정을 지원하기 위하여 예측을 하고 예측을 참고하여 의사 결정을 한다.

예측의 과정 및 방법

  • 예측의 과정
    • 목표수립 -> (데이터 있는지 살펴보기) -> 정보수집 (수치정보, 판단정보) -> (수치 살펴보기) -> 예측실시 (수치, 판단정보 결합해서 예측) -> 예측평가 (문제 있으면 cycle 돌려서 수시로 예측)
  • 주관적 예측과 객관적 예측
    • 주관적 예측 : 전문가가 전문적 지식을 바탕으로 하는 예측. 수치 정보가 충분하지 않고 판단 정보가 축적된 경우 전문가의 판단을 바탕으로 하는 예측
    • 객관적 예측 : 수리 정보를 수집하여 수리 모형으로 시계열을 표현한 후 그 패턴이 미래에도 지속된다는 가정하에 수리 모형을 이용하여 하는 예측
    • 실제 예측은 주관적 예측과 객관적 예측을 결합한다. 이 과목에서 학습할 것은 객관적 예측
  • 예측 방법
    • 주관적 예측의 대표적인 방법 : 델파이 방법. 전문가 집단의 의견을 반복적으로 종합하여 합의에 의한 최상의 판단을 도출하는 방법.
      • 전문가 집단 구성 -> 예측하고자 하는 변수에 대한 설문을 만들고 전문가 집단에 배포 -> 구성원의 예측 결과를 수집 요약하여 다시 전문가 집단에 배포 -> 각 구성원은 이를 바탕으로 결과 수정 -> 일정 합의에 이르기까지 단계 반복
      • 문제점 : 1) 전문가가 느낌만으로 정확한 예측하기 어렵다. 2) 전문가 집단을 선정하기 어렵다. 3) 전문가가 성의 있게 응답했는지 확인하기 어렵다.
    • 객관적 예측방법 : 이론모형과 비이론모형
      • 이론모형은 해당 분야의 이론을 기반으로 하는 모형을 말한다. 단일방정식 모형과 연립방정식 모형이 있다.
        • 단일방정식 모형은 종속 변수 하나를 다른 여러개의 독립 변수로 설명하는 모형이다.
        • 연립방정식 모형은 다수의 단일방정식을 그룹으로 하는 모형이다. 변수 간 상호 관계를 표현할 수 있다. ex) 소비 = c(당기 소득, 과거소비), 소득 = f(소비, 기타요인)
      • 비이론모형은 이론적 근거는 없으나 변수간 관계, 패턴을 발견하여 이러한 관계가 지속될 것을 가정하고 예측하는 모형이다. 대표적 비이론모형으로 시계열모형이 있고 대표적인 시계열모형으로 ARIMA, VAR이 있다.
    • 시나리오 예측 : 미래에 발생할 수 있는 여러가지 상황을 고려하여 그 중 가능성이 높은 시나리오를 선정하여 시나리오 별 복수 예측을 하는 방식이다.

얘측모형의 작성과 평가

  • 예측모형의 작성
    • 1) 모형의 식별 : 모형 형태를 가정한다.
    • 2) 모형의 추정 : 미지의 모수를 도출한다.
    • 3) 모형의 진단 : 잔차가 얼마나 임의적인지 검토한다. 잔차가 랜덤이면 현재 가능한 최적의 예측이라 판단하고 마무리 한다.
  • 예측의 평가
    • 예측의 종류
      • 사전예측
      • 사후예측
      • 미래예측
    • 예측력 평가 : 예측값과 실제값을 비교하여 계산 ; RMSE 나 RMSPE가 작을 수록 우수한 모델 $$Root\ Mean\ Sqaure\ Error\ = \sqrt{\frac{1}{T}\sum_{t=1}^T{(Y_t - \hat{Y_t})^2}}$$ $$Root\ Mean\ Square\ Percent\ Error\ = \sqrt{\frac{1}{T}\sum_{t=1}^T{(\frac{Y_t-\hat{Y_t}}{Y_t})^2}} \times 100 $$

2강 예측데이터 - 시계열


시계열의 정의

  • 시계열 : 시간에 따라 관측된 자료 $\{Y_t : t = 1,2,3, \cdots \}$ , 관측 시점 사이의 간격 시차 t가 중요하다
    • 일정 간격으로 측정한 데이터로 경제, 물리, 경영, 인구, 통신공학, 사회 등 주제가 달라도 시간에 따라 측정했다면 모두 시계열이다.
  • 참고 개념

시계열 도표

  • 시게열 도표는 시간을 가로축으로 관측값을 세로축으로 하여 시간 경과에 따라 관측값이 변한 것을 그린 그림으로 시계열 자료 특징을 보기 쉽다.
In [2]:
# 필요 패키지 불러오기
library(zoo) # rollmean()
library(ggplot2) # ggplot()
library(dplyr) # select, filter
library(tidyr) # gather
library(repr) # plot size option
library(lubridate) # year
library(patchwork) # 그래프 이어붙이기
In [3]:
# 시계열 데이터 불러오기
samsung <- read.csv('samsung.csv')
head(samsung,2)
A data.frame: 2 × 2
DatePrice
<fct><int>
12018-03-0545200
22018-03-0647020
In [4]:
options(repr.plot.width=20, repr.plot.height=7)
ggplot(data=samsung, aes(x=Date, y=Price, group =1)) + 
  geom_line(color = 'red') + 
  theme(axis.text.x=element_blank())

시계열 변동 요인

  • 시계열정보는 주파수영역과, 시간영역의 정보가 있으며 시계열 분석을 통해 영역 정보를 찾아낸다.
    • 주파수영역 정보는 주기적으로 반복되는 정보이며, 시간영역 정보는 시간에 따라 전개되는 정보이다.
  • 시계열은 변동 주기에 따라 구분한다
    • 시계열 도표를 통해 시계열의 변동요인을 파악할 수 있다. 분기별 GDP
      • 추세변동요인 $(T_t)$ : 장기변동 10년 이상 주기
      • 순환변동요인 $(C_t)$ : 경기 순환 주기 2~5년 주기
      • 계절변동요인 $(S_t)$ : 1년 주기
      • 불규칙변동요인 $(I_t)$ : 주기불분명, 이동평균 계산 시 평활화 가능
    • 시계열 모형은 시게열 변동 요인들이 가법형, 승법형, 로그가법형 등으로 결합된다고 가정하고 있다. 시간에 따라 각 요인이 비례적으로 증가하는 경향이 크면 승법모형, 로그가법모형으로 모델을 식별하는 것이 바람직하다.
      • 가법모형 : $Y_t = T_t+C_t+S_t+I_t$
      • 승법모형 : $Y_t = T_t \cdot C_t \cdot S_t \cdot I_t$
      • 로그가법모형 : $ \ln Y_t = \ln T_t + \ln C_t + \ln S_t + \ln I_t$

변수변환과 달력조정

  • 일시적 변동이 아닌 근원적인 변동을 찾아보기 편하도록 함수를 이용하여 변환하거나 달력조정을 통해 표준화 하여 살펴본다.
  • 변수변환 : 시간에 따라 변동성이 커지면서 지수적으로 증가하는 경우 log 함수, 역변환, 제곱근 변환 등을 이용해 시계열을 선형화 한다.
    • 로그변환은 시게열을 선형화 하며 변동이 큰 것은 작게 하고 작은 것은 크게 하여 변동성을 일정화 하며 단위를 작은 범위로 바꾼다.
In [5]:
options(repr.plot.width=20, repr.plot.height=7)
p1 <- ggplot(data=samsung, aes(x=Date, y=Price, group=1)) + 
        geom_line(color='red') + 
        theme(axis.text.x=element_blank())

p2 <- samsung %>% 
        mutate(log_price = log(Price)) %>% 
        ggplot(aes(x=Date, y=log_price, group=1)) + 
            geom_line(color='blue') + 
            theme(axis.text.x=element_blank())
In [6]:
p1/ p2
  • 달력조정 : 요일구성 등 월 길이의 차이에 따라 시계열이 변동할 때 이를 조정하여 시계열을 표준화 한다.
  • 영업일수 조정 $$ Y_t = Z_t \times \frac{t월의\ 영업일수}{t월의\ 평균\ 영업일수} $$
  • 달력 조정 $$ Y_t = Z_t \times \frac{365.25 \div 12}{t월의 일수} $$

안정시계열과 불안정시계열

  • 안정시계열 stationary time series
    • 구간이 달라지더라도 매 구간별 특성이 동일한 시계열. 추세적 변화, 주기적 변화가 없는 시계열
  • 불안정시계열 nonstationary time series
    • 시계열의 평균 및 분산이 시간에 따라 변화하는 시계열
  • 경제 시계열은 대체로 추세변동요인과 계절변동요인이 뚜렷한 불안정시계열이다.
  • 여러가지 방법으로 시계열을 조정한다. 대표적으로 차분과 평활화가 있다.
In [7]:
random_ts <- rnorm(100, mean = 0, sd = 1)
random_ts %>% ts.plot()
In [8]:
sin1 <- sin(1:100/100*6*pi) 
sin1 %>% ts.plot()
In [9]:
sin_trend <- sin1 + 1:100*0.06
sin_trend %>% ts.plot()
In [10]:
sim_ts <- sin_trend + random_ts
sim_ts %>% ts.plot()
In [26]:
increasing_var <- rnorm(100, mean = 0, sd = 2 * sqrt(seq(from=1,to=5,length=100)))
increasing_var %>% ts.plot()
In [27]:
sim_ts_tv <- sim_ts + increasing_var
sim_ts_tv %>% ts.plot()

차분

  • 차분 : 장기적인 변동을 제거하는데 유용한 방법
  • 현재 시점에서 과거 인접 시점의 자료를 빼준다.
    • 1차 차분식 : $\Delta Y_t = Y_t - Y_{t-1}$
    • 3차 차분식 : $\Delta Y_t = Y_t - T_{t-3}$
  • 장점 : 차분을 하면 비교 대상 시점 대비 현재 시점의 증가 또는 감소분을 알 수 있어서 누적되는 추세가 없는 시계열로 변환할 수 있다.
  • 단점 : 단기 변동을 증폭시킨다.
In [13]:
sim_ts %>% ts.plot()
diff(sim_ts) %>% ts.plot()
In [14]:
p1 <- samsung %>% 
        mutate(log_price = log(Price)) %>% 
        ggplot(aes(x=Date, y=log_price, group=1)) + 
            geom_line(color='blue') + 
            theme(axis.text.x=element_blank())

p2 <- samsung %>% 
        mutate(diff_price = c('NA', diff(log(Price)))) %>% 
        ggplot(aes(x=Date, y=diff_price, group=1)) + 
            geom_line(color='black') + 
            theme(axis.text.x=element_blank(), axis.text.y=element_blank())

p1 / p2
In [15]:
gdp <- read.csv('gdp.csv')
head(gdp, 2)
A data.frame: 2 × 2
quartergdp
<fct><dbl>
12016 1413482.6
22016 2434462.9
In [16]:
p1 <- gdp %>% 
        ggplot(aes(x=quarter, y=gdp, group=1)) + 
            geom_line(color='blue')
p2 <- gdp %>% 
        mutate(diff_gdp = c(NA, NA, NA, NA, diff(gdp, 4))) %>% 
        ggplot(aes(x=quarter, y=diff_gdp, group=1)) + 
            geom_line(color='black')
p1 / p2
Warning message:
"Removed 4 row(s) containing missing values (geom_path)."

평활화 ; 이동평균(Moving Average)

  • 평활화 : 주기가 짧은 변동요인을 제거하여 시계열의 기조적 흐름을 파악할 수 있다.
  • 평활화의 종류
    • 중심화이동평균 : 대상 시점을 중심으로 과거, 미래의 시점의 평균을 계산하므로 원래 시계열과 시차 구조가 동일하다는 장점이 있으나, 최근 시점의 이동평균 값을 계산할 수 없다는 단점이 있다.
      • 3기 중심화이동평균 : $Y_t = \frac{1}{3}(Z_{t-1}+Z_t+Z_{t+1})$
    • 후방이동평균 : 대상 시점을 기준으로 과거 시점의 값과 평균을 계산하므로 최근 이동평균을 구할 수 있으나, 원래 시계열보다 후행하는 단점이 있다.
      • 3기 후방이동평균 : $Y_t = \frac{1}{3}(Z_{t-2}+Z_{t-1}+Z_t)$
    • 가중이동평균 : 시점마다 가중치를 달리한다.
      • 최근에 가중치를 주는 3기 후방가중이동평균 : $Y_t = \frac{1}{6}(3Z_t + 2Z_{t-1} + 1Z_{t-2})$
    • 이중이동평균 : 이동 평균 값을 다시 이동평균한 것
In [17]:
samsung_2021 <- samsung %>% filter(year(samsung$Date)==2021)
samsung_2021 %>% 
    mutate(five_center = rollmean(samsung_2021$Price, 5, fill=NA, align='center'), 
           five_right = rollmean(samsung_2021$Price, 5, fill=NA, align='right')) %>%
    gather(key = 'key', value = 'value', Price, five_center, five_right) %>%
    ggplot(aes(x=Date, y=value, group=key, color=key)) +
        geom_line() + 
        theme(legend.text=element_text(size=20))
Warning message:
"tz(): Don't know how to compute timezone for object of class factor; returning "UTC". This warning will become an error in the next major version of lubridate."
Warning message:
"Removed 8 row(s) containing missing values (geom_path)."
  • 이동평균 방법마다 결측치가 있는 시기가 달라진다.

'공부 > 시계열' 카테고리의 다른 글

시계열 : arima, garch  (0) 2021.06.20