More Related Content
Similar to Pythonで時系列のデータを分析してみよう (20)
Pythonで時系列のデータを分析してみよう
- 14. JupyterでPandasを使って見よう
飛行機乗客数のデータを使ってPandasで読み込んでみよう
In [ 1 ]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from matplotlib.pylab import rcParams
rcParams['figure.figsize'] = 15, 6
Pandasをインポートします。
numpyをインポートします。
matplotlibをインポートします。
マジックコマンドでインラインを指定
matplotlibのデフォルト設定を変更
グラフのサイズを変更(横,縦)
- 15. JupyterでPandasを使って見よう
飛行機乗客数のデータを使ってPandasで読み込んでみよう
In [ 2 ]:
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()
ファイル名を指定
先頭の5行を表示する
デフォルトで先頭の5行を表示
CSVの見出しを指定
datatype型を指定
データ型を指定しましょう
- 22. 季節調整モデルを表示しよう
飛行機乗客数のデータを、トレンド、季節性、残差にそれぞれ分解しよう
In [ 4 ]:
import statsmodels.api as sm
res = sm.tsa.seasonal_decompose(data)
original = data
trend = res.trend
seasonal = res.seasonal
residual = res.resid
plt.figure(figsize=(8, 8))
version 0.8.0以上
季節調整モデルを作成
オリジナルデータ
トレンドデータ
季節性データ
残差データ
グラフ描画枠作成、サイズ指定
- 23. 季節調整モデルを表示しよう
オリジナル、トレンド、季節性、残差をそれぞれ表示しよう
In [ 4 ]:
# オリジナルデータのプロット
plt.subplot(411)
plt.plot(original)
plt.ylabel('Original')
# trend データのプロット トレンド
plt.subplot(412)
plt.plot(trend)
plt.ylabel('Trend')
# seasonalデータ のプロット 季節性
plt.subplot(413)
plt.plot(seasonal)
plt.ylabel('Seasonality')
# residual データのプロット 残差
plt.subplot(414)
plt.plot(residual)
plt.ylabel('Residuals')
plt.tight_layout() # グラフの間隔を自動調整
- 25. 季節調整モデルを表示しよう
トレンド、季節性、残差に分解されたか確かめよう
In [ 5 ]:
sum_three_data = trend + seasonal + residual # トレンド + 季節性 + 残差
plt.figure(figsize=(8, 4))
plt.plot(original, label='original')
plt.plot(sum_three_data, label='trend +season +resid', linestyle='--')
plt.legend(loc='best') 凡例表示を設定
- 33. 自己相関(ACF)と偏自己相関(PACF)
自己相関と偏自己相関のデータを作成しグラフにしよう
In [ 6 ]:
fig = plt.figure(figsize=(8, 8))
ax1 = fig.add_subplot(211)
sm.graphics.tsa.plot_acf(data, lags=40, ax=ax1)
ax2 = fig.add_subplot(212)
sm.graphics.tsa.plot_pacf(data, lags=40, ax=ax2)
plt.tight_layout()
自己相関(ACF)のグラフ
偏自己相関(PACF)
グラフ間のスキマ調整を行う
- 34. 自己相関(ACF)と偏自己相関(PACF)
In [ 6 ]:
一日前の値が今日にどれくらい影響して
いるかが分かる
ズラしたデータのステップ数を
ラグ(lag)と呼ぶ
今日と二日前の関係には間接的に一日前
の影響が含まれます
偏自己相関を使うと、一日前の影響を除
いて今日と二日前だけの関係を調べられ
ます
- 35. 自己相関(ACF)と偏自己相関(PACF)
In [ 6 ]:
自己相関係は、コサインカーブが減衰して
いくような規則正しい形になっています
データが「24ずれたところで自己相関が
極端に高くなり、
「12」、「36」で自己相関が極端に低く
なっています
したがって、このデータは「24」の周期
をもっており、似たような形を繰り返して
いることが推測できます
水色が95%の信頼区間になります
- 38. SARIMA(p, d, q)(P, D, Q)[s]
● パラメータp、d、qは
ARIMAに適用する自己回帰、差分、移動平均の次数
● P、D、Qは、季節調整に適用する次数
● 最後 s は季節調整に適用する周期を指定します
- 39. SARIMA(p, d, q)(P, D, Q)[s]
テストデータ1年を除いてモデル作成しよう
In [ 7 ]:
sarimax_train = sm.tsa.SARIMAX(passengers_train2,
order=(3, 1, 3),
seasonal_order=(0, 1, 1, 12),
enforce_stationarity = False,
enforce_invertibility = False
).fit()
自己回帰、差分、移動平均の次数
季節調整に適用する次数、最後周期
和分過程に自己回帰モデルを適用する
移動平均モデルの反転可能条件を維持し
ない
- 41. 予測してみよう]
飛行機乗客数のデータ1年を除いてモデル作成しよう
In [ 8 ]:
sarimax_train2_pred = sarimax_train.predict('1959-12', '1960-12')
plt.plot(data, c="r", label="actual")
plt.plot(sarimax_train2_pred, c="b", label="model-pred", alpha=0.7) # 透過率70%
plt.legend(loc='best') 凡例を自動で適切に表示
予測データ作成
- 45. 予測した1年を拡大してみよう
飛行機乗客数のデータ1年を除いてモデル作成しよう
In [ 9 ]:
predict_dy = sarimax_train.get_prediction(start ='1959-12', end='1960-12')
predict_dy_ci = predict_dy.conf_int(alpha=0.05)
plt.plot(passengers_test2, label="Actual")
plt.plot(predict_dy.predicted_mean, c="b", label="model-pred", alpha=0.7)
plt.fill_between(predict_dy_ci.index, predict_dy_ci.iloc[:, 0], predict_dy_ci.iloc[:, 1],
color='g', alpha=0.2)
plt.legend(loc='upper left')
信頼区間のデータを取得
指定範囲を
塗りつぶす
凡例を左上に表示
- 51. SARIMA(p, d, q)(P, D, Q)[s]
テストデータ1年を除いてモデル作成しよう
In [ 7 ]:
sarimax_train = sm.tsa.SARIMAX(passengers_train2,
order=(3, 1, 3),
seasonal_order=(0, 1, 1, 12),
enforce_stationarity = False,
enforce_invertibility = False
).fit()
自己回帰、差分、移動平均の次数
季節調整に適用する次数、最後周期
和分過程に自己回帰モデルを適用する
移動平均モデルの反転可能条件を維持し
ない