LG DX DATA SCHOOL

0122 시계열 분석

getfeelingsfrom 2026. 1. 22. 16:57

시계열 자료

  • 시간의 흐름에 따라 관찰 기록된 값
  • 예측 모델에서 시간을 변수로 사용하는 특징

시계열 모형

1) 자기회귀 모형 (AR 모형)

  • 과거와 현재의 자신의 관계를 정의의한 것
  • p 시점 전의 자료가 현재 자료에 영향을 주는 모형
  • 이전 관측값(과거)이 이후 관측값(현재)에 영향을 주는 원리를 사용

2) 이동평균 모형(MA모형)

  • 과거와 현재 자신의 오차와의 관계를 정의
  • 각 시점별로 가중치가 다름

3) 자기회귀누적이동평균 모형 (ARIMA(p,d,q) 모형)

  • ARIMA 모형은 비정상시계열 모형임
  • ARIMA 모형을 차분이나 변환을 통해 AR 모형이나, MA 모형 이둘을 합치 ARMA 모형으로 정상화 할 수 있음
  • 현재와 추세간의 관계를 정의

⇒ 회귀라 정규성을 만족해야 의미를 가진다고 여김

  • 모든 시점에 대해 분석 필요한게 시계열 분석 → 일반화에 어긋남

 

 

데이터에 대한 평균식이 의미를 가지려면 → 정상성(정규분포와 비슷한 모양)

  • 연속되는 숫자들의 평균이 시간에 일정해야 함
  • 연속되는 숫자들의 분산(variance)가 시간에 일정해야 함
  • 연속되는 숫자들의 공분산(covariance)는 시간에 일정해야 함

 

  • 초록색: 정상 시계열(stationary)
  • → 평균이 일정하고 변동도 안정적이라, “전체 평균” 같은 대표값이 의미 있다.
  • 빨간색: 비정상 시계열(non-stationary)⇒ 전체 기간의 평균을 하나로 계산해도 어느 시점에는 맞고, 어느 시점에는 틀려서
  • 우리가 고른 평균식 자체가 의미가 없어짐.
  • → 평균/분산/상관 구조가 시간에 따라 변한다.
  • 평균이 변하는 비정상 추세에 있을 때는 ⇒ 차분(difference)을 통해 정상화
    • 차분은 현시점 자료에서 전시점 자료를 빼는 것임
  • 분산이 일정하지 않은 경우 → 변환(transformation)을 통해 정상화
    • 로그변환 : 큰 값의 변동을 눌러주고 작은 값의 변동을 상대적으로 키워 분산 안정화 효과
    • 제곱근 변화

시계열 분해법 → 지수 평활법

(모든 시계열 자료를 사용하여 평균을 구하며 시간의 흐름에 따라 최근 시계열에 더 많은 가중치를 부여하여 미래를 예측 )

 

정상성

  • 시계열분석(AR / MA / ARMA/ARIMA)에서 가장 중요함
  • 시간이 흘러도 시계열의 통계적 성질(평균, 분산, 공분산)이 변하지 않는 상태
    • 평균이 일정
    • 변동(분산)이 일정
    • 상관 구조(공분산)가 일정
  • 정상성 모델
    • AR(p) : 현재 값이 과거 값들의 영향을 받음
    • MA(q) : 현재 값이 과거 오차(충격)의 영향을 받음
    • ARMA(p,q) : AR + MA 합친 모델
  • 비정상 시계열
    • 차분(d)을 포함한 ARIMA(p,d,q)로 모델링
    • d=0이면 정상 → ARMA
    • d≥1이면 비정상 → 차분 포함 ARIMA

kings_ts 는 리스트가 아니라 시계열

kings_ts <- ts(kings)

 

ACF/PACF가 의미하는 것

  • ACF (자기상관함수)
    • 현재 값 Xt 와 과거 값 Xt−k 의 상관관계
    • “지금 값이 과거 몇 시점의 값과 얼마나 비슷한가?”
    • ACF는 MA 차수(q) 를 추정할 때 힌트가 된다.
  • PACF (부분자기상관함수)
    • 중간 lag 영향을 제거하고 순수한 lag k의 영향만 본 상관
    • PACF는 AR 차수(p) 를 추정할 때 힌트가 된다.

코드

# 1. 라이브러리 로드 (설치되어 있지 않다면 install.packages("forecast") 실행)
library(forecast)

# 2. 데이터 준비
kings <- c(60, 43, 67, 50, 56, 42, 50, 65, 68, 43, 65, 34, 47, 48, 41, 26, 65, 36, 64, 39, 
           57, 58, 70, 67, 53, 67, 71, 55, 66, 91, 72, 59, 67, 81, 67, 76, 77, 81, 62, 70, 81, 80)
kings_ts <- ts(kings) #벡터를 시계열 객체로 변환 

# 3. 데이터 탐색 및 시각화 (ACF, PACF)
# ACF와 PACF 그래프를 통해 AR(p)와 MA(q)의 차수를 결정합니다.
par(mfrow=c(2,2)) # 2x2 레이아웃 ( 한 화면에 4칸의 그래프) 

#---------------------------------------------------
# (1) 원본 데이터 시계열 그래프
	# 시간 순서에 따른 값의 변화 확인 
#---------------------------------------------------
plot.ts(kings_ts, main="영국 국왕들의 사망 시 나이", ylab="나이", xlab="순서", col="darkblue", lwd=2)



#---------------------------------------------------
# (2) ACF (자기상관함수) - MA 모델의 차수 결정에 활용
	# lag=1,2,3,…에서 현재 값과 과거 값의 상관을 보여줌
	# MA(q) 모델은 ACF가 q 이후에 절단(cutoff)되는 경향이 힌트가 될 수 있음
#---------------------------------------------------
acf(kings_ts, main="ACF (MA 차수 확인)")


#---------------------------------------------------
# (3) PACF (부분자기상관함수) - AR 모델의 차수 결정에 활용
# 중간 lag 영향 제거 후 순수하게 lag k의 영향만 본 상관
#---------------------------------------------------
pacf(kings_ts, main="PACF (AR 차수 확인)")


#---------------------------------------------------
# 4. 모델 구축
# AR(p) 모델: PACF가 1차 이후 절단되는 경향이 있으므로 AR(1) 시도
# MA(q) 모델: ACF를 참고하여 MA(1) 시도 (일반적으로 MR은 MA를 의미함)
#---------------------------------------------------

# AR(1) 모델 생성
#order=c(p,d,q)에서 p=1 (AR 1차) / d=0 (차분 없음) / q=0 (MA 없음)
#“현재 값이 바로 이전 값(1시점 전)의 영향을 받는다”
kings_ar <- arima(kings_ts, order=c(1,0,0))
print("--- AR(1) Model Summary ---")
print(kings_ar)

# MA(1) 모델 생성 (일반적으로 시계열에서 MA를 사용)
# “현재 값이 직전(1시점 전)의 오차(충격) 영향을 받는다”
kings_ma <- arima(kings_ts, order=c(0,0,1))
print("--- MA(1) Model Summary ---")
print(kings_ma)

#---------------------------------------------------
# 5. 모델 예측 및 그래프 작성
#forecast(kings_ar, h=5) : AR(1) 모델로 앞으로 5개 시점 예측 
													#예측값뿐 아니라 보통 예측구간(신뢰구간) 도 같이 계산됨
#---------------------------------------------------

par(mfrow=c(1,1))
plot(forecast(kings_ar, h=5), main="AR(1) 모델 예측 (향후 5인)")
lines(kings_ts, col="black")

#---------------------------------------------------
# 6. (참고) 자동 ARIMA 모델링
# auto.arima()는 가장 적합한 p, d, q 수치를 자동으로 찾아줍니다.
#---------------------------------------------------

auto_model <- auto.arima(kings_ts)
print("--- Auto ARIMA Best Model ---")
summary(auto_model)

# 최종 결과 시각화
plot(forecast(auto_model, h=8), main="최적 ARIMA 모델 예측 결과", 
     xlab="국왕 순서", ylab="나이", shadow=TRUE)

PACF(AR차수 확인)

  • 유의 수준 안에 들어오지 않은 막대 그래프 (래그 4지점) → 5지점에서는 극단적으로 뚝 떨어짐
  • ⇒절단현상
  • 과거 데이터가 언제까지 영향을 미치는지 확인 하고 싶으면 보면 된다
  • 래그가 5인 지점에서 상관지수가 뚝 떨어짐 ⇒ 4지점까지만 보면 됨

 

  • (4, 0, 0) = p(AR 4차),d(차분 없음),q(MA 없음)
  • AR(4)= ARIMA(4,0,0)ahepf
  • 이 변량이 없을 떄의 오차가 일반적인 편차 범위 안에 드는지 안드는지를 봄 평균적 오차
  • t-value는 극단적으로 작으면 끝으로 갈수록 ⇒ =-2를 기준으로 / 자유도없어서 그닥 의미 없음
  • log likelihood는 높을 수록 좋은 거

평균적인 오차에 비해서 오차를 줄여 → 설명력이 높다

 

사망 나이를 70세 전 후로 본다

순서 정보가 누락되면 학습 불가 → 포지션 정보, 시퀀스 정보, 날짜 정보 등을 추가적으로 가지고 있을 수 있도록 ⇒

 

 


주성분 분석 (Principal component analysis) = PCA

기술추론통계학 자료 p.202

차원 축소 (이때 차원은 feature = 변량)

고유벡터 : 고유한 특성은 변하지 않는다⇒ 가지고 있는 방향성은 바뀌지 않는다

주성분 분석 : y 값이 없다

  • 평균이 일정하고
  • 변동(분산)이 일정하고
  • 상관 구조(공분산)가 일정해야 한다.

방법론

  • 다수의 변수들이 가지고 있는 전체 변동을 잘 설명할 수 있는 중요한 몇 개의 변수(주성분)들을 새롭게 생성해서 원래의 데이터를 적은 수의 새로운 변수로 요약하는 기법
  • 원 데이터가 가지고 있는 복잡한 여러 개의 변수에서 서로 상관관계가 없는 소수의 주성분으로 데이터의 속성을 줄여나간다.

평균에 가까운 아이들은 개인 차가 나타나지 얺우으므로 그 변량을 가지고 새로운 벡터를 만드는 건 의미가 없다

평균이 아니라 각자의 특징대로 만들면 -⇒ 분산값이 크다

변량 모두 조합해서 새로운 벡터 하나 만들려고

분산 값이 큰 부분에는 가중치 크게? 평범한 필드에는 낮은 가중치

⇒ 이걸 합쳐서 새로운 벡터 하나 만듦 = 주성분 벡터

←→ 회귀 w는 실측치와 예측치의 차이가 최소가 되는걸 목표로

 

 

뽑아내는 t 값의 차이가 커야 ⇒

분산을 크게 주려면

  • 조금만 달라도 큰 가중치 ex) 바퀴 변량

  • 새로운 벡터들을 줄여서 학습할 때 사용
  • PCA1 일 때 0.6 → PCA2일 때 0.8이면 → PCA3…. 1 ?
  • 차원 축소 뿐 아니라 과적합도 예방 가능

 

 

# 1. 데이터 생성
scores <- data.frame(
  국어 = c(95, 88, 60, 55, 90, 70, 65, 50, 85, 78),
  영어 = c(92, 85, 65, 50, 95, 75, 60, 55, 80, 82),
  수학 = c(55, 60, 95, 88, 60, 85, 90, 92, 50, 75),
  과학 = c(60, 65, 90, 92, 55, 80, 95, 85, 65, 70)
)
str(scores)
summary(scores)
# 데이터 확인
head(scores)

# 2. PCA 실행 (scale = TRUE를 통해 표준화 수행)
pca_result <- prcomp(scores, scale = TRUE)

# 결과 요약 보기
summary(pca_result)

# 3. Biplot 시각화
biplot(pca_result, main = "학생 성적 PCA Biplot", cex = 0.8)
abline(h = 0, v = 0, lty = 2)

'LG DX DATA SCHOOL' 카테고리의 다른 글

01/26 DBSCAN  (0) 2026.01.27
0123 군집분석  (0) 2026.01.23
01/20  (1) 2026.01.21
01/19 결정트리부터 ...  (1) 2026.01.19
01/16 사이킷런으로 시작하는 머신러닝  (0) 2026.01.16