59doit
[ R ] R과 python을 활용한 데이터 분석 시각화 #1 본문
반응형
[ 시계열 분석 / 시각화 ]
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원으로 예측 할 수 있다
반응형
'portfolio' 카테고리의 다른 글
[ R ] R과 python을 활용한 데이터 분석 시각화 #3 (1) (0) | 2022.12.30 |
---|---|
[ python ] R과 python을 활용한 데이터 분석 시각화 #2 (2) (0) | 2022.12.29 |
[ R ] R과 python을 활용한 데이터 분석 시각화 #2 (1) (0) | 2022.12.29 |
[ R ] Covid-19 (1) | 2022.12.05 |
[Python] Covid-19 (0) | 2022.11.14 |
Comments