# 6.10/화
# R 코드: Nile 데이터의 정상성 확인
# 1. 기본 설정 및 데이터 로드
data("Nile") # 연도별 나일강 유량 (1871~1970, 단위: 10^8 m^3)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
##
## 다음의 패키지를 부착합니다: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
# adf.test 사용, 추세적 변동 여부 확인
library(zoo) # rollmean, rollapply 등, 시계열 데이터 처리
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
##
## 다음의 패키지를 부착합니다: '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 ...
## 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)

# 평균이 시간에 따라 일정하다면 → 빨간 선이 수평에 가까워야 함
# 이동평균선이 상승 또는 하강 등 추세를 가짐
# rollmean(Nile, k = 10) 10년치 유량 데이터의 이동평균 계산
# 3. 분산 일정성 확인 (이동분산 시각화)
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 = "분산")

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

# ACF (자기상관함수) 시계열 데이터에서 시차(lag) 별로 자기 자신과의 상관관계를 나타냄
# Nile 시계열 데이터의 시차별(1~30 등) 자기상관 계수를 계산하고 막대그래프로 출력
# 공분산이 절대 시간이 아닌 시차에만 의존하는지 확인 (정상성 조건 중 하나)
# 시계열의 두 시점 간 공분산이 시간 차이(lag) 에만 의존하고, 절대 시간(t) 에 #의존하지 않아야 함
# 시간 시차(lag)별로 현재 시점과 얼마나 상관되는지를 나타냄. 본질적으로, ACF는 #시차별 공분산을 정규화한 값.
# 빠르게 0으로 수렴한다는 것의 의미 → 데이터가 단기적인 상관관계만 갖고, 시간이 #지남에 따라 과거 데이터의 영향력이 급격히 줄어듦을 의미.
# → 즉, 시계열의 공분산이 시차(lag)에만 의존하고, 절대 시간에 의존하지 않음을 시사.
# 상 시계열의 일반적 특성 자기상관이 낮고, 짧은 시차 내에서만 상관이 존재하며 빠르게 #감소함.
# 시계열 데이터에서의 의미
#예를 들어, 월별 강수량 데이터가 있다고 해보죠.
#이때, 7월과 8월의 차이, 또는 3월과 4월의 차이는 존재할 수 있어요.
#하지만 그 차이가 오직 몇 개월 차이냐에만 따라 달라지고,
#그게 2020년 3월이냐 2024년 3월이냐는 중요하지 않다면,
#→ 공분산이 절대적인 시간과 무관하고, 오직 시간 간격(시차)에만 의존한다고 합니다.
# 1차 및 2차 차분을 통한 평균 정상성 확보 (Nile 데이터)
# 1. 데이터 로드 및 시계열 확인
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)
# 12개월(1년) 단위로 평균을 내서,계절 요인(예: 12월이면 무조건 승객 수 증가)을 #완화하고,
# 갑작스러운 급등락도 평균화함으로써,
# 추세(T)만 부각되게 만듭니다.
# 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()`).

## 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()`).
# 최근 데이터에 더 큰 가중치를 주는 지수평활법 R 코드 예시
# 데이터 준비
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
## 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
# alpha는 평활 상수로 0~1 사이의 값.
# alpha가 클수록 → 최근 데이터의 영향력이 더 큼.
# 시각화
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 (Autoregressive Model)
# AR(2) 모형 적합 및 ACF/PACF 분석 (R 기준)
# 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에 가깝다”고 해석합니다.
# PACF에서 lag 3부터 부분자기상관계수가 0에 가까워지고 통계적으로 유의하지 않다면,
# 일반적으로 AR(2) 모형으로 식별할 수 있습니다.
# acf() 시차별 자기상관을 시각적으로 확인 (점차 감소: AR 모델 특징)
# pacf() 부분 자기상관함수 확인 (2시차에서 급격히 절단: AR(2) 모델 적합)
# 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 = "변화량")
# 5. 차분된 데이터의 ACF/PACF 확인
par(mfrow = c(1, 2))

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

# 6. MA(1) 모형 적합 (ARIMA(0,1,1) : 차분 1, MA(1))
ma_model <- arima(ts_data, order = c(0, 1, 1)) # MA(1)
summary(ma_model)
## Length Class Mode
## coef 1 -none- numeric
## sigma2 1 -none- numeric
## var.coef 1 -none- numeric
## mask 1 -none- logical
## loglik 1 -none- numeric
## aic 1 -none- numeric
## arma 7 -none- numeric
## residuals 100 ts numeric
## call 3 -none- call
## series 1 -none- character
## code 1 -none- numeric
## n.cond 1 -none- numeric
## nobs 1 -none- numeric
## model 10 -none- list
## Length Class Mode
## coef 1 -none- numeric
## sigma2 1 -none- numeric
## var.coef 1 -none- numeric
## mask 1 -none- logical
## loglik 1 -none- numeric
## aic 1 -none- numeric
## arma 7 -none- numeric
## residuals 100 ts numeric
## call 3 -none- call
## series 1 -none- character
## code 1 -none- numeric
## n.cond 1 -none- numeric
## nobs 1 -none- numeric
## model 10 -none- list
# 분해시계열
# 1. 데이터 불러오기
data("AirPassengers")
ts_data <- AirPassengers
# 2. 시계열 분해 (Multiplicative 방식)
decomp <- decompose(ts_data, type = "multiplicative")
# 3. 4요인 시각화
plot(decomp)

#이 코드를 실행하면 4개의 시계열 구성 요소가 각각의 그래프로 나열됩니다:
#원본 시계열 (Observed) – 실제 항공 승객 수 데이터
#추세 요인 (Trend) – 장기적인 증가 경향
#계절 요인 (Seasonal) – 연 단위 반복되는 계절 패턴
#불규칙 요인 (Random/Irregular) – 추세와 계절로 설명되지 않는 예외적 변동
# 순환요인(cycle)은 주기가 고정되지 않은 장기 변동입니다.
#→ 계절성처럼 "매년" 또는 "매월" 반복되는 고정된 주기가 아니므로,
# 모델이 자동으로 탐지하기 어렵습니다.