# 20250610
# 시계열 데이터
# R 코드: Nile 데이터의 정상성 확인
# 1. 기본 설정 및 데이터 로드
data("Nile") # 연도별 나일강 유량 (1871~1970, 단위: 10^8 m^3)
#install.packages("tseries")
library(tseries) # adf.test 사용, 추세적 변동 여부 확인
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
#install.packages("zoo")
library(zoo) # rollmean, rollapply 등, 시계열 데이터 처리리
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
library(ggplot2)
# 데이터 확인
str(Nile)
## Time-Series [1:100] from 1871 to 1970: 1120 1160 963 1210 1160 1160 813 1230 1370 1140 ...
ts.plot(Nile, main = "Nile 연도별 유량 시계열", ylab = "유량", col = "blue")

# 2. 평균 일정성 확인 (이동평균선 시각화)
roll_mean <- rollmean(Nile, k = 10, align = "right", fill = NA)
plot(Nile, main = "이동평균 (k=10)을 통한 평균 일정성 확인", ylab = "유량")
lines(roll_mean, col = "red", lwd = 2)

#평균이 시간에 따라 일정하다면 -> 빨간 선이 수평에 가까워야 함
# 이동평균선이 상승 또는 하강 등 추세를 가짐
# 10년치 유량 데이터의 이동평균 계산
roll_var <- rollapply(Nile, width = 10, FUN = var, align = "right", fill = NA)
plot(roll_var, type = "l", col = "darkgreen", lwd = 2,
main = "이동분산 (k=10)을 통한 분산 일정성 확인", ylab = "분산")

# 분산이 수평 또는 거의 일정 → 분산 정상성 만족 가능성 있음
# 분산이 크게 요동치거나 점점 증가/감소 → 비정상 시계열 가능성 높음
# 공분산 시간차 의존 확인(ACF 그래프)
acf(Nile, main = "자기상관함수 (ACF) - 공분산 시간차 의존성 확인")

# ACF(자기 상관함수) 시계열 데이터
#NIL 시계열 데이터의 시차별 자기상관 계수를 계산하고 막대
#시계열 데이터에서의 의미하고 막대그래프로 출력
#공분산이 절대 시간
#예를 들어, 월별 강수량 데이터가 있다고 해보죠.
#이때, 7월과 8월의 차이, 또는 3월과 4월의 차이는 존재할 수 있어요.
#하지만 그 차이가 오직 몇 개월 차이냐에만 따라 달라지고,
#그게 2020년 3월이냐 2024년 3월이냐는 중요하지 않다면,
#→ 공분산이 절대적인 시간과 무관하고, 오직 시간 간격(시차)에만 의존한다고 합니다.
data("Nile") # 내장 시계열 데이터
plot(Nile, main = "원본 시계열 (Nile)", ylab = "유량")

# 2. 1차 차분
diff1 <- diff(Nile, differences = 1)
plot(diff1, main = "1차 차분 시계열", ylab = "변화량")

# 3. 2차 차분
diff2 <- diff(Nile, differences = 2)
plot(diff2, main = "2차 차분 시계열", ylab = "변화량")

# 이동평균법 적용 및 시각화 (R 코드)
# 1. 필요한 패키지 로드
library(zoo) # rollmean 함수
library(ggplot2) # 시각화
# 2. 데이터 준비: AirPassengers (월별 항공 승객 수, 1949~1960)
ts_data <- AirPassengers
# 3. 이동평균 계산 (예: 12개월 이동평균 = 1년 단위)
ma_12 <- rollmean(ts_data, k = 12, align = "center", fill = NA)
# 4. 시각화를 위한 데이터프레임 생성
df <- data.frame(
date = as.Date(time(ts_data)),
original = as.numeric(ts_data),
ma = as.numeric(ma_12)
)
# 5. 시각화
ggplot(df, aes(x = date)) +
geom_line(aes(y = original), color = "gray50", size = 1, linetype = "dashed") +
geom_line(aes(y = ma), color = "blue", size = 1.2) +
labs(title = "AirPassengers: 원시 시계열 vs 12개월 이동평균",
x = "연도", y = "승객 수") +
theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: Removed 11 rows containing missing values or values outside the scale range
## (`geom_line()`).

# 회색선이 원시 시계열이고 계절변동과 추세변동은 보이지 않고
# 파란색의일반적인 평균을 보여주는것
# 데이터 준비
data("AirPassengers") # 월별 항공 여객 수 (시계열 예제 데이터)
# 단순 지수평활법 적용: 최근 데이터에 더 큰 가중치
model_ses <- HoltWinters(AirPassengers, beta = FALSE, gamma = FALSE)
# 결과 확인 (alpha 값이 클수록 최근 데이터 가중치 ↑)
print(model_ses)
## Holt-Winters exponential smoothing without trend and without seasonal component.
##
## Call:
## HoltWinters(x = AirPassengers, beta = FALSE, gamma = FALSE)
##
## Smoothing parameters:
## alpha: 0.9999339
## beta : FALSE
## gamma: FALSE
##
## Coefficients:
## [,1]
## a 431.9972
plot(model_ses, main = "단순 지수평활법: 최근 자료에 높은 가중치 적용", col = "blue")
lines(fitted(model_ses)[,1], col = "red", lty = 2) # 예측값
legend("topleft", legend=c("실제값", "예측값"), col=c("blue", "red"), lty=c(1,2))

# 파란색 점선: 원래 데이터
# 빨간색 점선: 지수평활법으로 추정된 예측값 (최근 데이터를 더 반영함)
# 시계열 모형 AR
# 1. 데이터 로드 및 시계열 변환
data(Nile)
ts_data <- Nile
# 2. 시계열 시각화
plot(ts_data, main = "Nile 데이터 시계열", ylab = "유량")

# 3. ACF, PACF 확인
par(mfrow = c(1, 2)) # 1행 2열 시각화
acf(ts_data, main = "ACF: 자기상관함수")
pacf(ts_data, main = "PACF: 부분자기상관함수")

# R에서 그리는 ACF와 PACF 그래프에서 lag의 시작은 0부터입니다.
# 절단이란 “값이 유의하지 않을 정도로 작고, 통계적으로 0에 가깝다”고 해석합니다.
0# PACF에서 lag 3부터 부분자기상관계수가 0에 가까워지고 통계적으로 유의하지 않다면,
## [1] 0
# 일반적으로 AR(2) 모형으로 식별할 수 있습니다.
# acf() 시차별 자기상관을 시각적으로 확인 (점차 감소: AR 모델 특징)
# MA(1) 모형 시뮬레이션 및 ACF/PACF 분석
# 1. 데이터 로드 및 시계열 변환
data(Nile)
ts_data <- Nile
# 2. 시계열 시각화
plot(ts_data, main = "Nile 데이터 시계열", ylab = "유량", col = "blue")
# 3. ACF, PACF 확인
par(mfrow = c(1, 2)) # 1행 2열 레이아웃

acf(ts_data, main = "ACF: 자기상관함수")
pacf(ts_data, main = "PACF: 부분자기상관함수")

# 4. 차분하여 정상성 확보 (MA는 정상성 필요 없음이나, Nile은 비정상성 경향 있음)
ts_diff <- diff(ts_data)
# 차분된 시계열 확인
plot(ts_diff, main = "1차 차분된 Nile 시계열", ylab = "변화량")
# pacf() 부분 자기상관함수 확인 (2시차에서 급격히 절단: AR(2) 모델 적합)
# 5. 차분된 데이터의 ACF/PACF 확인
par(mfrow = c(1, 2))

pacf(ts_diff, main = "PACF: 차분된 시계열")
acf(ts_diff, main = "ACF: 차분된 시계열")

# 분해시계열
# 1. 데이터 불러오기
data("AirPassengers")
ts_data <- AirPassengers
# 2. 시계열 분해 (Multiplicative 방식)
decomp <- decompose(ts_data, type = "multiplicative")
# 3. 4요인 시각화
plot(decomp)

# Observed -> 원본데이터
# trend -> 추세요인
# sesonal -> 계절요인
# random -> 불규칙요인