import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
$y_t = Level + Trend + Seasonality + Noise$
from statsmodels.tsa.seasonal import seasonal_decompose
series = pd.Series([i+np.random.randint(10) for i in range(1,100)])
result = seasonal_decompose(series, model='additive', freq=1)
def plot_decompose(decomposeresult):
fig, (ax1, ax2, ax3, ax4) = plt.subplots(4,1, figsize=(15,8))
decomposeresult.observed.plot(legend=False, ax=ax1)
ax1.set_ylabel('Observerd')
decomposeresult.trend.plot(legend=False, ax=ax2)
ax2.set_ylabel('Trend')
decomposeresult.seasonal.plot(legend=False, ax=ax3)
ax3.set_ylabel('Seasonal')
decomposeresult.resid.plot(legend=False, ax=ax4)
ax4.set_ylabel('Resid')
plot_decompose(result)
$y_t = Level \times Trend \times Seasonality \times Noise$
series = pd.Series([i**2 for i in range(1,100)])
result = seasonal_decompose(series, model='multiplicative', freq=1)
plot_decompose(result)
airline = pd.read_csv('data/airline_passengers.csv', index_col='Month')
airline.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x7f69e404c240>
linear trend 를 가지고 있고 seasonality 와 trend 컴포넌트가 시간흐름에 따라 고정적일 때 (ex 매년 승객 1만명 증가) additive model 을 사용합니다. non-linear 하게 증가하거나 감소하는 trend 를 보일 경우 (ex 매년 승객 수 두 배 증가) multiplicative model 이 더 적합합니다.
챠트를 보면 초기에 비해 후기로 갈 수록 꾸준히 증가하는 비율로 비선형 증가 추세를 보이고 있습니다.
airline.index = pd.to_datetime(airline.index)
airline.head()
Thousands of Passengers | |
---|---|
Month | |
1949-01-01 | 112 |
1949-02-01 | 118 |
1949-03-01 | 132 |
1949-04-01 | 129 |
1949-05-01 | 121 |
result = seasonal_decompose(airline['Thousands of Passengers'], model='multiplicative')
plot_decompose(result)