# 基本のライブラリを読み込む
import numpy as np
import pandas as pd
from scipy import stats
# グラフ描画
from matplotlib import pylab as plt
import seaborn as sns
%matplotlib inline
# グラフを横長にする
from matplotlib.pylab import rcParams
rcParams['figure.figsize'] = 15, 6
# 統計モデル
import statsmodels.api as sm
# 日付形式で読み込む
dateparse = lambda dates: pd.datetime.strptime(dates, '%Y-%m')
data = pd.read_csv('AirPassengers.csv', index_col='Month', date_parser=dateparse, dtype='float')
data.head()
# 日付形式にする
ts = data['#Passengers']
ts.head()
# プロット
plt.plot(ts)
# ローカルレベルモデルの推定
mod_local_level = sm.tsa.UnobservedComponents(ts, 'local level')
# 最尤法によるパラメタの推定
res_local_level = mod_local_level.fit()
# 推定されたパラメタ一覧
print(res_local_level.summary())
# 推定された状態・トレンドの描画
rcParams['figure.figsize'] = 15, 15
fig = res_local_level.plot_components()
# ローカル線形トレンドモデル
mod_trend = sm.tsa.UnobservedComponents(
ts,
'local linear trend'
)
# 最尤法によるパラメタの推定
# ワーニングが出たのでBFGS法で最適化する
res_trend = mod_trend.fit(method='bfgs')
# 推定されたパラメタ一覧
print(res_trend.summary())
# 推定された状態・トレンドの描画
rcParams['figure.figsize'] = 15, 20
fig = res_trend.plot_components()
# 季節変動ありのローカルレベルモデル
mod_season_local_level = sm.tsa.UnobservedComponents(
ts,
'local level',
seasonal=12)
# まずはNelder-Meadでパラメタを推定し、その結果を初期値としてまた最適化する。2回目はBFGSを使用。
res_season_local_level = mod_season_local_level.fit(
method='bfgs',
maxiter=500,
start_params=mod_season_local_level.fit(method='nm', maxiter=500).params,
)
# 推定されたパラメタ一覧
print(res_season_local_level.summary())
# 推定された状態・トレンド・季節の影響の描画
rcParams['figure.figsize'] = 15, 20
fig = res_season_local_level.plot_components()
# 季節変動ありのローカル線形トレンドモデル
mod_season_trend = sm.tsa.UnobservedComponents(
ts,
'local linear trend',
seasonal=12)
# まずはNelder-Meadでパラメタを推定し、その結果を初期値としてまた最適化する。2回目はBFGSを使用。
res_season_trend = mod_season_trend.fit(
method='bfgs',
maxiter=500,
start_params=mod_season_trend.fit(method='nm', maxiter=500).params,
)
# 推定されたパラメタ一覧
print(res_season_trend.summary())
# 推定された状態・トレンド・季節の影響の描画
rcParams['figure.figsize'] = 15, 20
fig = res_season_trend.plot_components()
# 詳細は以下の資料を参照してください
# http://www.statsmodels.org/stable/generated/statsmodels.tsa.statespace.structural.UnobservedComponents.html#statsmodels.tsa.statespace.structural.UnobservedComponents
# 季節変動ありのローカル線形トレンドモデル
# ただし、トレンドの分散は無し
mod_season_trend_d = sm.tsa.UnobservedComponents(
ts,
'local linear deterministic trend',
seasonal=12)
# まずはNelder-Meadでパラメタを推定し、その結果を初期値としてまた最適化する。2回目はBFGSを使用。
res_season_trend_d = mod_season_trend_d.fit(
method='bfgs',
maxiter=500,
start_params=mod_season_trend_d.fit(method='nm', maxiter=500).params,
)
# 推定されたパラメタ一覧
print(res_season_trend_d.summary())
# 推定された状態・トレンド・季節の影響の描画
rcParams['figure.figsize'] = 15, 20
fig = res_season_trend_d.plot_components()
# 詳細は以下の資料を参照してください
# http://www.statsmodels.org/stable/generated/statsmodels.tsa.statespace.structural.UnobservedComponents.html#statsmodels.tsa.statespace.structural.UnobservedComponents
# 季節変動ありのローカル線形トレンドモデル
# ただし、トレンドの分散は無し
mod_season_rw = sm.tsa.UnobservedComponents(
ts,
'random walk with drift',
seasonal=12)
# まずはNelder-Meadでパラメタを推定し、その結果を初期値としてまた最適化する。2回目はBFGSを使用。
res_season_rw = mod_season_rw.fit(
method='bfgs',
maxiter=500,
start_params=mod_season_rw.fit(method='nm', maxiter=500).params,
)
# 推定されたパラメタ一覧
print(res_season_rw.summary())
# 推定された状態・トレンド・季節の影響の描画
rcParams['figure.figsize'] = 15, 20
fig = res_season_rw.plot_components()
# 今まで計算してきたモデルのAICを格納する
aic_list = pd.DataFrame(index=range(6), columns=["model", "aic"])
aic_list.ix[0]["model"] = "res_local_level"
aic_list.ix[0]["aic"] = res_local_level.aic
aic_list.ix[1]["model"] = "res_trend"
aic_list.ix[1]["aic"] = res_trend.aic
aic_list.ix[2]["model"] = "res_season_local_level"
aic_list.ix[2]["aic"] = res_season_local_level.aic
aic_list.ix[3]["model"] = "res_season_trend"
aic_list.ix[3]["aic"] = res_season_trend.aic
aic_list.ix[4]["model"] = "res_season_trend_d"
aic_list.ix[4]["aic"] = res_season_trend_d.aic
aic_list.ix[5]["model"] = "res_season_rw"
aic_list.ix[5]["aic"] = res_season_rw.aic
# 結果の表示
aic_list
# 予測
pred = res_season_rw.predict('1960-01-01', '1961-12-01')
# 実データと予測結果の図示
rcParams['figure.figsize'] = 15, 6
plt.plot(ts)
plt.plot(pred, "r")