[업무 지식]/Python
[시계열분석] polyfit, propher
에디터 윤슬
2024. 11. 26. 12:54
참고 도서
https://m.yes24.com/Goods/Detail/57670268
파이썬으로 데이터 주무르기 - 예스24
독특한 예제를 통해 배우는 데이터 분석 입문이 책은 누구나 한 권 이상 가지고 있을 파이썬 기초 문법책과 같은 내용이 아닌, 데이터 분석이라는 특별한 분야에서 초보를 위해 처음부터 끝까지
m.yes24.com
라이브러리 호출
import pandas as pd
import pandas_datareader.data as web
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
from prophet import Prophet
from datetime import datetime
plt.rcParams['font.family'] = 'AppleGothic'
1. Numpy의 polyfit으로 회귀 분석하기
pinkwink_web = pd.read_csv('PinkWink Web Traffic.csv',
encoding='utf-8',
thousands=',',
names = ['date', 'hit'],
index_col = 0)
pinkwink_web = pinkwink_web[pinkwink_web['hit'].notnull()]
pinkwink_web.head()
- plot 시각화
pinkwink_web['hit'].plot(figsize=(12, 4), grid=True)
- 데이터를 표현하는 함수 찾기(1차, 2차, 3차, 15차 다항식으로 표현하여 그 결과 확인)
time = np.arange(0, len(pinkwink_web))
traffic = pinkwink_web['hit'].values
fx = np.linspace(0, time[-1], 1000)
코드 설명
주어진 코드는 시간 데이터를 생성하고, 이를 기반으로 트래픽 데이터를 다룬 후, 보간(interpolation)이나 곡선 피팅(curve fitting)을 위한 준비 작업을 수행하는 코드입니다. 아래는 각 라인의 역할과 의미를 상세히 설명합니다.
- 1. time = np.arange(0, len(pinkwink_web))
- np.arange()
- np.arange(start, stop)는 start부터 stop-1까지의 정수 배열을 생성하는 NumPy 함수입니다.
- 기본적으로 1씩 증가하는 정수 배열을 만듭니다.
- 코드 동작
- len(pinkwink_web)은 pinkwink_web 데이터프레임의 행(row) 개수를 반환합니다.
- 따라서, np.arange(0, len(pinkwink_web))는 0부터 데이터프레임의 행 개수 - 1까지의 정수 배열을 생성합니다.
- 의미
- 이 배열은 시간(time)을 나타내며, 각 데이터 포인트가 시간 순서대로 나열되었음을 가정합니다.
- 예를 들어, 데이터가 초 단위로 수집된 웹 트래픽이라면, 이 배열은 각 초에 해당하는 인덱스를 제공합니다.
- np.arange()
- 2. traffic = pinkwink_web['hit'].values
- pinkwink_web['hit']
- pinkwink_web는 Pandas 데이터프레임이며, 'hit' 열은 특정 시간에 기록된 웹 트래픽(히트 수)을 나타냅니다.
- .values
- .values는 Pandas 시리즈 또는 데이터프레임 객체를 NumPy 배열로 변환합니다.
- 즉, 'hit' 열의 값을 NumPy 배열로 가져옵니다.
- 코드 동작
- traffic 변수는 'hit' 열의 값을 NumPy 배열로 저장합니다.
- 의미
- traffic은 시간(time)에 따른 웹 트래픽 데이터를 NumPy 배열로 저장한 것입니다.
- 이 배열은 곡선 피팅이나 보간(interpolation) 작업에 사용될 수 있습니다.
- pinkwink_web['hit']
- 3. fx = np.linspace(0, time[-1], 1000)
- np.linspace()
- np.linspace(start, stop, num)는 start부터 stop까지 균일한 간격으로 나뉜 num개의 값을 생성하는 NumPy 함수입니다.
- 코드 동작
- start=0: 시작값은 0입니다.
- stop=time[-1]: 끝값은 time[-1], 즉 마지막 시간값입니다.
- time[-1]은 배열에서 마지막 요소를 가져오는 표현입니다.
- num=1000: 총 1000개의 값을 생성합니다.
- 의미
- fx는 시간(time)을 더 세밀하게 나눈 배열입니다.
- 이는 보간(interpolation)이나 곡선 피팅 결과를 더 높은 해상도로 시각화하거나 분석하기 위해 사용됩니다.
- np.linspace()
- 기존 데이터 시각화
# 시각화 (기존 데이터와 새로운 간격)
plt.figure(figsize=(12, 4))
plt.scatter(time, traffic, label='Original Data', color='red')
plt.plot(fx, np.interp(fx, time, traffic), label='Interpolated Curve', color='blue')
plt.legend()
plt.show()
- 참값과 비교하여 에러 계산(1차, 2차, 3차, 15차)
def error(f, x, y):
return np.sqrt(np.mean((f(x)-y)**2))
f1p = np.polyfit(time, traffic, 1)
f1 = np.poly1d(f1p)
f2p = np.polyfit(time, traffic, 2)
f2 = np.poly1d(f2p)
f3p = np.polyfit(time, traffic, 3)
f3 = np.poly1d(f3p)
f15p = np.polyfit(time, traffic, 15)
f15 = np.poly1d(f15p)
print(error(f1, time, traffic))
print(error(f2, time, traffic))
print(error(f3, time, traffic))
print(error(f15, time, traffic))
430.8597308110963
430.6284101894695
429.53280466762925
330.4777302323968
함수 정의
f: 함수 또는 모델로, 입력값 x에 대해 예측값을 반환합니다.
x: 입력 데이터 (독립 변수).
y: 실제 관측값 (종속 변수).
반환값: f(x)(예측값)과 y(실제값) 간의 평균 제곱근 오차(RMSE).
- 에러 확인 시각화
plt.figure(figsize=(10, 6))
plt.scatter(time, traffic, s=10)
plt.plot(fx, f1(fx), lw=4, label='f1')
plt.plot(fx, f2(fx), lw=4, label='f2')
plt.plot(fx, f3(fx), lw=4, label='f3')
plt.plot(fx, f15(fx), lw=4, label='f15')
plt.grid(True, linestyle = '-', color = '0.75')
plt.legend(loc = 2)
plt.show()
2. Prophet 모듈을 이용한 forecast 예측
- 코드 작성
df = pd.DataFrame({
'ds': pinkwink_web.index,
'y': pinkwink_web['hit']
})
df.reset_index(inplace=True)
df['ds'] = pd.to_datetime(df['ds'], format = '%y. %m. %d.')
del df['date']
m = Prophet(yearly_seasonality=True)
m.fit(df)
1. 날짜와 방문수만 따로 저장
2. datetime 사용하여 날짜 선언
3. prophet 함수를 사용할 때 주기성이 연단위(yearly_seasonality)로 설정
- 이후 60일 데이터 예측
future = m.make_future_dataframe(periods = 60)
forecast = m.predict(future)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()
- plot 시각화
m.plot(forecast)
- 추가 정보 요약
m.plot_components(forecast)