데이터 분석은 여러 도메인에서 활용되지만, 특히 거시경제, 금융분야에서는 대부분 시계열 데이터(Time Series Data)을 다룹니다. 시계열 데이터는 데이터셋의 요일, 휴무일 파악부터 증감율을 파악하며 새로운 패턴을 파악할 수 있고, 이를 활용하여 추세를 파악할 수 있습니다. 

 

30.1. 시계열 데이터의 정의와 특징 (수정중)

더보기

(1) 시계열 데이터의 정의

시계열 데이터는 일정한 시간 간격으로 기록한 정보를 의미합니다. 대부분의 경우 경제, 환경, 인구 지표 등으로 활용됩니다.  

 

(2) 시계열 데이터의 특성

 ①시간종속성: 데이터셋의 행이 특정 시간을 의미함

 ②자기상관관계: 연속한 관측치끼리, 다른 변수가 아닌 본인 변수와의 상관관계가 존재함

 ③추세경향성: 장기적으로 봤을 때 값이 증가하거나 증감하는 추세(Trend)를 보임

 ④계절성, 순환성: 특정 흐름(계절, 월, 분기)이나 변동적인 주기에 따라 값이 변동함

 

(3)

 

30.2. 시계열 데이터 변환, as.Date()

더보기

(1) as.Date() 함수의 구조와 파라미터

Date 객체는 '연(yyyy)-월(mm)-일(dd)'형태로 구성된 객체로써, as.Date() 함수를 통해 기존 데이터를 날짜 형식으로 변환할 수 있습니다. Date() 함수는 존재하지 않으므로 as.Date() 함수를 사용해 Date 객체를 생성해야하며, 해당 함수의 구조는 다음과 같습니다. 

as.Date(x, format, optional=TRUE, ∙∙∙ )
 
파라미터 형태 설명
x   벡터 형식의 값
format   날짜 형식
optional   형식 처리를 똑바로 하지 못할 경우, NA로 처리
 

주로 원데이터를 살펴봤을 때 날짜 형식이 특이한 경우, format 파라미터로 그 형식을 정의하여 사용합니다. 

 

(2) 예시

예시를 위해, 작성 날짜인 2021년 11월 8일자로 Date 객체를 만들겠습니다. 코드는 다음과 같습니다.

as.Date("2021-11-08")
as.Date("2021/11/08")

일반적으로 특수 기호(/, -)로 연월일을 구분하나 원데이터가 특이한 경우, 다음과 같이 format 파라미터를 사용해 처리할 수 있습니다. 

as.Date("20211108", format="%Y%m%d")

 

PLUS) 표준 날짜 코드

R에서 날짜 처리할 때 사용하는 format 파라미터는 다음과 같은 표준 코드를 사용합니다. 

형태 설명 형식 자릿수 예시
%Y 연도 정수 4 2021
%y 연도 정수 2 2021
%m 정수 2 11
%B 월 이름 문자 < 9 November
%b 월 이름 문자 3 Nov
%d 정수 2 08
%a 요일 문자 1
%H 시간 정수 2 15
%M 정수 2 01
%S 정수 2 24

 

30.3. 시계열 데이터 변환, as.POSIXct()

더보기

(1) as.POSIXct() 함수의 구조와 파라미터

POSIXct 객체는 연(yyyy)-월(mm)-일(dd) 뿐만 아니라 시간(hh)-분(mm)-초(ss) 단위도 함께 구성된 객체입니다. as.POSIXct() 함수의 구조는 다음과 같습니다.

as.POSIXct(x, tz="", format, optional=TRUE, ∙∙∙ )
 
파라미터 형태 설명
x   벡터 형식의 값
tz   지역에 따른 시간대(timezone) 지정, 기본값은 현재 컴퓨터 셋팅
format   날짜 형식
optional   형식 처리를 똑바로 하지 못할 경우, NA로 처리

 

(2) 예시

작성 날짜인 2021년 11월 8일 15시 1분 24초를 기반으로 POSIXct 객체를 만들겠습니다.

as.POSIXct("2021/11/08 15:01:24")
as.POSIXct("20211108150124", format="%Y%m%d%H%M%S")

 

PLUS) as.POSIXct() 함수와 as.POSIXlt() 함수의 차이점 

R에서는 POSIXct 객체 외에도, POSIXlt 객체가 존재합니다. POSIXct 객체는 1970년 이후의 일자를 초단위로 변환하여 정의된 벡터로 구성, POSIXlt 객체는 월, 일, 시, 분, 초, 타임존 등의 값을 리스트로 구성되어 있다는 차이점이 있습니다. 예시를 위해 2021년 11월 8일 15시 1분 24초의 날짜정보를 가지는 POSIXct_01객체와 POSIXlt_01 객체를 정의하겠습니다. 

POSIXct_01 <- as.POSIXct("2021/11/08 15:01:24")
POSIXlt_01 <- as.POSIXlt("2021/11/08 15:01:24")

이 두 객체를 unclass() 함수를 통해 Class 특징을 없애고 단순한 상수만 출력하면 다음과 같습니다.

unclass(POSIXct_01)
unclass(POSIXlt_01)

POSIXct 객체를 해체(Unclass)하면 1970년 이후의 해당 시간까지 지나간 초(Seconds)가 기록되고, POSIXlt 객체를 해체하면 리스트로 저장된 날짜 속성(연, 월, 일, 시, 분, 초)이 기록되어 있음을 확인할 수 있습니다. 

 

30.4. 시계열 데이터 생성, ts()

더보기

(1) ts() 함수의 구조와 파라미터

ts() 함수는 시계열 객체를 만드는 데 사용하는 함수로써, 그 구조는 다음과 같습니다. 

ts(data, start, end, frequency, ∙∙∙ )
 
파라미터 형태 설명
data   해당 시계열에 입력될 데이터
start = 1   데이터의 첫 관찰 연도
end = numeric()   데이터의 끝 연도
frequency = 1   시계열 빈도
 

frequency 파라미터의 경우, 원 시계열 데이터의 성격에 따라 연(1)∙분기(4)∙월(12) 등으로 구성할 수 있습니다. 

 

(2) 예시

2021년부터 1부터 12까지의 값을 가지는 시계열 데이터에 대해, frequency 파라미터에 따라 어떻게 ts 객체가 구성되는지 예를 들어 보겠습니다. 해당 예시의 코드는 다음과 같습니다.  

ts(data=1:12, start=2021, frequency = 12)
ts(data=1:12, start=2021, frequency = 4)
ts(data=1:12, start=2021, frequency = 1)

frequency의 값에 따라 첫 번째 코드는 월별로, 두 번째 코드는 분기별로, 세 번째 코드는 연도 별로 값을 가짐을 확인할 수 있습니다. 

 

30.5. 시계열 데이터의 사칙연산

더보기

시계열 데이터는 기본적으로 사칙연산 중 곱셈, 나눗셈이 불가하며, 일반적으로 특정일을 기준으로 며칠을 더하고 빼거나, 기준일에서 기준일을 빼는 등의 연산을 수행할 수 있습니다. 정수 형식으로 연산을 시행할 수 있으며, 예시를 위해 2020년 11월 8일, 2021년 11월 8일 날짜 정보를 가지는 Date_01, Date_02 객체를 정의하겠습니다.

Date_01 <- as.Date("2020/11/08")
Date_02 <- as.Date("2021/11/08")

 

(1) 덧셈

Date 객체에서 덧셈을 실시할 경우, 일(Day)을 기준으로 계산됩니다. Date_01 객체에서 365일 더하고자 할 때, 코드는 아래와 같습니다.

Date_01 + 365

단, Date 객체와 Date객체 간 덧셈은 계산되지 않음을 확인할 수 있습니다.

Date_01 + Date_02

 

(2) 뺄셈

뺄셈 역시 덧셈과 마찬가지로 Date 객체에서는 일수로 계산되며, 2021년 11월 8일에 365일 빼고자 할 경우 다음과 같습니다.

Date_02 - 365

덧셈 연산과는 다르게, Date 객체와 Date 객체 간의 뺄셈 연산이 가능합니다. 뺄셈 연산은 -(minus sign)을 사용하거나 difftime() 함수를 사용하는데, Date_02와 Date_01 간의 일 수차이를 계산하고자 할때는 다음과 같습니다.

Date_02 - Date_01 
difftime(Date_02, Date_01)

 

30.6. 시계열 데이터의 전처리 

더보기

(1) 요일 추출 함수, weekdays() 

weekdays() 함수를 이용하여 해당 일수가 무슨 요일인지 출력할 수 있습니다. Date_01 객체의 날짜가 무슨 요일인지 파악하고자 할 때는 다음과 같습니다. 

weekdays(Date_01)

 

PLUS) 근무일과 휴일의 구분

weekdays() 함수에서 출력한 해당 요일이 휴일(Holiday)인지, 근무일(Workday)인지 구분하고자할 때는, ifelse() 문을 이용하여 간단히 값을 반활할 수 있습니다. 예시 코드는 다음과 같습니다.

ifelse(weekdays(Date_01) == "Sunday" | weekdays(Date_01) == "Saturday", 
       "Holiday", 
       "Workday")

 

(2) 시간 지연(Time lag) 함수, lag()

lag() 함수란 stats 패키지에 존재하는 함수로써, 데이터셋에 존재하는 k번째 이전행의 값을 호출하고자할 때 사용하는 함수입니다. 함수의 구조는 다음과 같습니다.    

lag(x, k, ∙∙∙ )
 
파라미터 형태 설명
x   데이터의 값
k = 1   시차 값 지정 
 

예시를 위해 2010년 6월 30일부터 2021년 11월 8일까지의 테슬라의 주가 종가(Close)를 기록한 TSLA.csv 파일을 불러와 Date 컬럼을 날짜 형식에 맞게 전처리하겠습니다.

TSLA.csv
0.19MB

출처: https://finance.yahoo.com/quote/TSLA/history/

TSLA_raw <- read.csv("data/TSLA.csv")
TSLA_close <- TSLA_raw[, c("Date", "Close")]
TSLA_close$Date <- as.Date(TSLA_close$Date)

이후 lag() 함수를 이용하여 이전 일의 종가를 기록한 Close_lag 컬럼을 생성하면 다음과 같습니다. 

TSLA_close$Close_lag <- lag(x=TSLA_close$Close, k=1)

2010년 6월 30일의 Close_lag 컬럼은 결측값으로 처리 됐음을 확인할 수 있는데, 이는 직전값이 존재하지 않기 때문에 그렇습니다.

 

(3) 시간 차분(difference) 컬럼 생성

차분이란, 연속된 관찰값들의 차이를 의미합니다. 지연 컬럼이 존재하면 손쉽게 차분 컬럼을 생성할 수 있습니다. 위 예시의 Close 컬럼과 지연된 값인 Close_lag 컬럼을 빼는 Close_diff 컬럼을 생성하면, 해당일의 주가변동금액을 파악할 수 있습니다.  

TSLA_close$Close_diff <- TSLA_close$Close - TSLA_close$Close_lag