59doit

[ R ] R과 python을 활용한 데이터 분석 시각화 #1 본문

portfolio

[ R ] R과 python을 활용한 데이터 분석 시각화 #1

yul_S2 2022. 12. 29. 09:40
반응형

 

 [ 시계열 분석 / 시각화 ]

USD_KRW.csv
0.02MB

 

 

USD/KRW 환율 데이터 (https://kr.investing.com/currencies/usd-krw-historical-data)에 있는 일별 환율데이터(2021년 11월 15일 ~ 2022년 11월 14일 대상)를 기반으로 회귀분석 또는 시계열분석을 이용하여 2022년 12월 우리나라 미국달러대비 원화 환율을 예측하고 시각화하시오.

* 회귀분석 실시 시 기본가정 충족 여부 확인 포함. 
* 기본가정 불충족 시에는 충족시킬 수 있는 방법을 제시하고 실행. 
* 제시한 방법으로도 기본가정 불충족 시에는 회귀선을 구하여 예측하고 comment 하시오.

 

 

#1 데이터 준비

data <- read.csv('C:/USD.csv',header=T)
str(data)
# 'data.frame': 261 obs. of  7 variables:
# $ 날짜  : Factor w/ 261 levels "2021-11-15","2021-11-16",..: 261 260 259 258 257 256 255 254 253 252 ...
# $ 종가  : Factor w/ 259 levels "1,175.19","1,176.73",..: 198 193 209 213 215 223 228 240 231 236 ...
# $ 오픈  : Factor w/ 254 levels "1,173.42","1,176.85",..: 193 203 208 209 220 225 233 236 229 240 ...
# $ 고가  : Factor w/ 259 levels "1,179.31","1,179.35",..: 198 205 214 212 221 227 237 236 231 238 ...
# $ 저가  : Factor w/ 260 levels "1,172.62","1,173.32",..: 196 199 211 213 216 228 231 242 234 237 ...
# $ 거래량: Factor w/ 39 levels "","1.68K","10.99K",..: 1 1 1 1 1 1 1 1 1 1 ...
# $ 변동  : Factor w/ 145 levels "-0.01%","-0.02%",..: 128 68 67 22 62 51 66 129 24 47 ...

# 종가를 기준으로 분석
df <- data.frame(data[1:2]) 
# 형 변환
df$날짜 <- as.Date(df$날짜,format="%Y-%m-%d")
# 쉼표 제거
df[,2] <- gsub(",","",df[,2])
# 형 변환
df[,2] <- as.numeric(df[,2])

str(df)
# 'data.frame': 261 obs. of  2 variables:
# $ 날짜: Date, format: "2022-11-14" "2022-11-11" "2022-11-10" ...
# $ 종가: num  1324 1314 1350 1371 1375 ...

 

  • 시계열 자료는 시간의 흐름에 따라 수집한 자료이다
  • 제시된 링크를 통해 1 년간 일별 환율 데이터 파일을 다운로드 파일 -> (USD_KRW)
  • 처음에 데이터 준비할 때 다운 받은 파일 바로 "data <- read.csv('C:/USD_KRW.csv',header=T)" 실행하면 Error in read.table(file = file, header = header, sep = sep, quote = quote,  :  열의 개수가 열의 이름들보다 많습니다 라는 Error 가 뜬다. 다운받은 파일을 보면 첫행에 문자+% 로 되어있어서 오류가 나는 것이기 때문에 첫행에 % 를 지워주고 새로 데이터를 저장한다.
  • 변수들이 factor 형으로 저장되어 있기 때문에 시계열 분석을 하기 위해서 변수를 날짜와 숫자형으로 변환한다.
  • 환율과 관련된 변수를 확인하면 종가, 오픈, 고가, 저가가 있는데 이 중 종가를 활용하여 분석을 시행
  • 추세선을 그리면 시간에 따라 상승하기 때문에 정상성 시계열로 바꾸는 차분을 시행
  • ARIMA 모형을 만들고, 그에 대한 타당성 검증을 진행

 

 

#2 추세선 시각화

#2-1) 날짜 오름차순 정렬

df2 <- df[order(df$날짜),]

 

#2-2) 추세선 시각화

plot.ts(df2[,-1])

 

  • 가격 관련 추세선은 비정상성 시계열, 시간에 따라 증가

 

 

#3 종가로 시계열 생성

as.numeric(format(df2$날짜,'%Y'))
tsdata <- ts(df2$종가,freq=1,start=1)
plot(tsdata)
  • tsdata : 종가 컬럼 시계열

 

 

 

#4 정상성 시계열로 변환

diff_tran <- diff(tsdata)
plot(diff_tran)

diff_tran : 차분된 시계열

 

 

 

#5 모델 식별과 추정

library(forecast)
arima <- auto.arima(tsdata)
arima
# Series: tsdata 
ARIMA(0,1,0) 

# sigma^2 = 60.03:  log likelihood = -901.24
# AIC=1804.47   AICc=1804.49   BIC=1808.03

 

 

 

#6 모형 생성

model <- arima(tsdata,order=c(0,1,0))
model
# Call:
#   arima(x = tsdata, order = c(0, 1, 0))


# sigma^2 estimated as 60.02:  log likelihood = -901.24,  aic = 1804.47
  • model : ARIMA 모형

 

 

#7 모형 진단(모형의 타당성 검정)

#7-1)

tsdiag(model)

 

#7-2) Box-Ljung 검정에 의한 잔차항 모형 진단

Box.test(model$residuals,lag=1,type="Ljung")
# Box-Ljung test

# data:  model$residuals
# X-squared = 0.27245, df = 1, p-value = 0.6017
  • p-value = 0.6017 > 0.05: 모형이 통계적으로 적절

 

 

 

#8 미래 예측

pred <- forecast(model,h=34)       #34일
plot(pred)
  • 1235.330원에서 1412.410원으로 예측

 

 

#9 예측 결과 데이터프레임으로 저장

fdf <- data.frame(pred)
write.csv(fdf,file="fore_df.csv")

 

 

#10 구하고자 하는 달의 중앙값

str(pred)
#lower & upper 의 각 95% 값의 median

median(pred$lower[,2])         # 1260.355
median(pred$upper[,2])        # 1387.385
  • 달의 마지막날값이 아닌 미래 예측의 중앙값을 기반으로 1260원에서 1387원으로 예측 할 수 있다

 

반응형
Comments