데이터분석/미니프로젝트 04. 시계열 분석

04-01-01. prophet(구 fbprophet) 설치, 기초적인 시계열 테스트

책다니엘 2024. 4. 20. 05:28

시계열 데이터(Time Series Data)란 시간의 흐름에 대해 특정 패턴과 같은 정보를 가지고 있는 경우를 시계열 데이터라고 한다. 그리고 이러한 시계열 데이터 중 '주기성'을 가지고 있는 데이터를 다루는 경우는 'Seasonal Time Series'라고 한다.

시계열 데이터에서 트렌드를 찾고 나면, 그 트렌드 곡선을 빼고 주기적 특성을 찾게 된다.

 

일반적으로 머신러닝의 세계에서는 시계열 데이터를 다루지 않는다. 이번에는 단순히 맛만 보는 형태로 사용해본다.

** 과거 fbprophet이었던 라이브러리는 현재 prophet으로 바뀌었다! 설치하는 방식도 달라졌으니, 이번 프로젝트는 새로운 prophet 설치를 기준으로 서술한다.

 

** 먼저 시계열 데이터 분석에 대한 기초적인 정의를 적어둔다.

시간의 흐름(Time Series): 일정한 시간 간격으로 관측된 데이터를 의미한다.
트렌드(Trend): 데이터가 오랜 기간 동안 나타내는 장기적인 증가 또는 감소 패턴을 의미한다. 
계절성(Seasonality): 특정한 시간 주기에 따라 주기적으로 반복되는 패턴을 의미한다. 계절성은 연간, 월간, 주간 또는 일간과 같은 주기로 나타날 수 있다.
주기(Cycle): 일정한 주기로 반복되는 데이터의 패턴을 나타낸다. 주기는 트렌드나 계절성과 유사하지만, 보다 장기적인 관점에서 나타난다.
편향성(Bias): 모델이나 데이터에서 발생하는 시스템적인 오차를 의미한다. 편향성은 데이터의 모집단에 대한 대표성이나 모델의 복잡성 등에 기인할 수 있으며, 편향성을 고려하여 모델을 개선하거나 데이터를 보정해야 한다.
노이즈(Noise): 데이터에 포함된 무작위한 변동이나 오차를 의미한다. 노이즈는 데이터의 관측 오차나 외부 요인에 기인할 수 있으며, 시계열 분석에서는 이러한 노이즈를 최소화하고 신뢰할 수 있는 패턴을 식별하는 것이 중요하다.

 

1. 먼저 prophet을 사용하기 위해 기존과는 다른 가상환경을 사용할 것이다. (이전의 가상환경은 ctrl+c로 interrupt한 다음) 아래의 명령어로 새로운 가상환경을 만들어준다.

# prophet이라는 새로운 가상환경을 Anaconda prompt에서 생성, 파이썬 최신버전은 호환성 오류가 생기므로 일부러 3.8을 넣어 준다
conda create -n prophet python=3.8.0
# proceed? 에서 y 입력


# 새로운 가상환경으로 이동
activate prophet

 

2. facebook의 깃허브에서 prophet 라이브러리의 퀵스타트 튜토리얼에 따른다. prophet을 새로운 가상환경에 설치해 주자. 패키지 안에 pandas, numpy 등의 필수 패키지가 전부 있다. 추가 패키지는 필요할 때만 설치하도록 한다.

python -m install prophet

# jupyter notebook에서 실행하기 위해 jupyter notebook도 추가 설치
conda install jupyter -c conda-forge

https://facebook.github.io/prophet/docs/installation.html#python

 

Installation

Prophet has two implementations: R and Python.

facebook.github.io

 

3. 이번 툴을 활용하기 위해서는 Visual C++ Build Tool이 필요하다. 이전에는 해당 언어용 빌드툴이 따로 있었지만, 이제는(Visual Studio 2022의 경우)는 Visual Studio Tools 설치 도구를 통해 개발 목적에 맞게 선택 설치가 가능하다. 아래의 링크를 통해 필요한 빌드 툴을 받을 수 있다.

https://visualstudio.microsoft.com/ko/downloads/#build-tools-for-visual-studio-2022

 

Visual Studio Tools 다운로드 - Windows, Mac, Linux용 무료 설치

Visual Studio IDE 또는 VS Code를 무료로 다운로드하세요. Windows 또는 Mac에서 Visual Studio Professional 또는 Enterprise Edition을 사용해 보세요.

visualstudio.microsoft.com

툴 다운로드 및 실행 후
기본으로 세팅해주는 설정 그대로 설치 진행하였다.

 

4. 필요한 툴 설치와 가상환경 세팅을 모두 완료하였다면 잘 실행되는지 테스트해보자. 

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
## 간단한 데이터 재료 준비

time = np.linspace(0, 1, 365*2) # 0~1까지 730등분으로 나눔
result = np.sin(2*np.pi*12*time) # 2년간의 데이터가 sin의 특성을 가졌다는 의미의 코드
ds = pd.date_range('2017-01-01', periods=365*2, freq='D')
df = pd.DataFrame({'ds':ds, 'y':result})
df.head()

이런 dataframe이 만들어지고
이런 식의 그래프가 만들어진다

5. 위에서 만든 데이터 재료를 바탕으로 예측을 시도해보자.

from prophet import Prophet

m = Prophet(yearly_seasonality=True, daily_seasonality=True) # 연주기성, 일주기성 모두 가지고 있다는 뜻
m.fit(df)

# 30일간 미래의 데이터를 만들라는 코드
future = m.make_future_dataframe(periods=30) 
forecast = m.predict(future)

m.plot(forecast)

빨간색 표시한 부분이 예측한 미래의 데이터이다.

 

6. 이번에는 좀 더 어렵게 한다. 데이터가 좀 더 편향성을 가지도록 bias값을 넣어 주었다.

# 데이터에 편향성을 줘 보자

time = np.linspace(0, 1, 365*2)
result = np.sin(2*np.pi*12*time) + time

ds = pd.date_range('2017-01-01', periods=365*2, freq='D')
df = pd.DataFrame({'ds':ds, 'y':result})

df['y'].plot(figsize=(10,6))

이런 그래프가 나온다.

앞서 작성한 데이터 예측 코드를 다시 실행해보면 이렇게 된다.

 

m = Prophet(yearly_seasonality=True, daily_seasonality=True) # 연주기성, 일주기성 모두 가지고 있다는 뜻
m.fit(df)
future = m.make_future_dataframe(periods=30) # 30일간 미래의 데이터를 만들라는 코드
forecast = m.predict(future) 

m.plot(forecast)

잘 예측해주는 것 같다.

 

7. 이번에는 노이즈를 넣어 준다.

# 편향성이 들어간 데이터에 노이즈를 넣어 보자

time = np.linspace(0, 1, 365*2)
result = np.sin(2*np.pi*12*time) + time + np.random.randn(365*2)/4

ds = pd.date_range('2017-01-01', periods=365*2, freq='D')
df = pd.DataFrame({'ds':ds, 'y':result})

df['y'].plot(figsize=(10,6))

데이터에 노이즈가 들어갔다.

m = Prophet(yearly_seasonality=True, daily_seasonality=True) # 연주기성, 일주기성 모두 가지고 있다는 뜻
m.fit(df)
future = m.make_future_dataframe(periods=30) # 30일간 미래의 데이터를 만들라는 코드
forecast = m.predict(future) 

m.plot(forecast)

 

이전 그림보다(노이즈 이전) 정확성은 다소 떨어지지만, 그래도 여전히 잘 예측하는 것을 볼 수 있다.

 

지금까지 prophet을 설치하고 활용해 보았다. 이제 웹 유입량 데이터를 분석해보자.