- 問題
- 答え
- 解説
Python コード:
import numpy as np
import pmdarima as pm
np.random.seed(42)
data = (np.linspace(0, 10, 200)
+ 5 * np.sin(2 * np.pi * np.arange(200) / 12)
+ np.random.randn(200) * 0.5)
model = pm.auto_arima(
data, seasonal=True, m=12,
trace=True, suppress_warnings=True)
print(model.summary())
回答の選択肢:
(A) 時系列データの異常値を自動的に検出・除去している
(B) AICを基準に、最適なARIMAモデルの次数(p,d,q)を自動選択している
(C) 時系列データをトレンド・季節性・残差に分解している
(D) 時系列データに対してグリッドサーチでハイパーパラメータを最適化している
Performing stepwise search to minimize aic
ARIMA(2,0,2)(1,1,1)[12] intercept : AIC=inf, Time=64.58 sec
ARIMA(0,0,0)(0,1,0)[12] intercept : AIC=381.431, Time=0.10 sec
ARIMA(1,0,0)(1,1,0)[12] intercept : AIC=333.441, Time=0.78 sec
ARIMA(0,0,1)(0,1,1)[12] intercept : AIC=inf, Time=3.31 sec
ARIMA(0,0,0)(0,1,0)[12] : AIC=487.601, Time=0.09 sec
ARIMA(1,0,0)(0,1,0)[12] intercept : AIC=380.955, Time=0.03 sec
ARIMA(1,0,0)(2,1,0)[12] intercept : AIC=309.960, Time=26.28 sec
ARIMA(1,0,0)(2,1,1)[12] intercept : AIC=inf, Time=62.30 sec
ARIMA(1,0,0)(1,1,1)[12] intercept : AIC=inf, Time=8.91 sec
ARIMA(0,0,0)(2,1,0)[12] intercept : AIC=308.872, Time=13.40 sec
ARIMA(0,0,0)(1,1,0)[12] intercept : AIC=333.080, Time=1.57 sec
ARIMA(0,0,0)(2,1,1)[12] intercept : AIC=inf, Time=54.22 sec
ARIMA(0,0,0)(1,1,1)[12] intercept : AIC=inf, Time=11.30 sec
ARIMA(0,0,1)(2,1,0)[12] intercept : AIC=309.925, Time=24.99 sec
ARIMA(1,0,1)(2,1,0)[12] intercept : AIC=311.891, Time=68.39 sec
ARIMA(0,0,0)(2,1,0)[12] : AIC=456.540, Time=5.89 sec
Best model: ARIMA(0,0,0)(2,1,0)[12] intercept
Total fit time: 346.189 seconds
SARIMAX Results
================================================================================
Dep. Variable: y No. Observations: 200
Model: SARIMAX(2, 1, 0, 12) Log Likelihood -150.436
Date: Sun, 08 Mar 2026 AIC 308.872
Time: 11:32:35 BIC 321.818
Sample: 0 HQIC 314.118
- 200
Covariance Type: opg
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
intercept 1.2557 0.081 15.554 0.000 1.098 1.414
ar.S.L12 -0.6956 0.062 -11.172 0.000 -0.818 -0.574
ar.S.L24 -0.3780 0.071 -5.337 0.000 -0.517 -0.239
sigma2 0.2792 0.033 8.574 0.000 0.215 0.343
===================================================================================
Ljung-Box (L1) (Q): 0.91 Jarque-Bera (JB): 1.50
Prob(Q): 0.34 Prob(JB): 0.47
Heteroskedasticity (H): 0.87 Skew: 0.16
Prob(H) (two-sided): 0.58 Kurtosis: 2.70
===================================================================================
正解: (B)
このコードは、pmdarimaライブラリのauto_arima関数を使い、AIC(赤池情報量基準)を最小化する最適なARIMAモデルの次数を自動的に探索しています。出力のトレースログから、さまざまな次数の組み合わせが試行され、最終的にAICが最も低いモデルが選ばれていることがわかります。
回答の選択肢:
(A) 時系列データの異常値を自動的に検出・除去している
(B) AICを基準に、最適なARIMAモデルの次数(p,d,q)を自動選択している
(C) 時系列データをトレンド・季節性・残差に分解している
(D) 時系列データに対してグリッドサーチでハイパーパラメータを最適化している
- コードの解説
-
このコードは、季節性を含む時系列データに対して、最適なSARIMAモデルの次数を自動選択するためのものです。
import numpy as np import pmdarima as pm np.random.seed(42) data = (np.linspace(0, 10, 200) + 5 * np.sin(2 * np.pi * np.arange(200) / 12) + np.random.randn(200) * 0.5) model = pm.auto_arima( data, seasonal=True, m=12, trace=True, suppress_warnings=True) print(model.summary())簡単に説明します。
ライブラリのインポート
numpy:数値計算を行うためのライブラリ。ここでは乱数生成や数値操作に使用しています。pmdarima:ARIMAモデルの自動次数選択を行うためのライブラリ。Rのauto.arimaに相当する機能をPythonで提供します。
データの生成
np.random.seed(42):乱数のシードを固定し、結果を再現可能にします。np.linspace(0, 10, 200):0から10まで等間隔に200個の値を生成し、線形トレンドを表現します。5 * np.sin(2 * np.pi * np.arange(200) / 12):周期12のサイン波を生成し、季節性を表現します。np.random.randn(200) * 0.5:平均0、標準偏差0.5のノイズを加えます。- これらを足し合わせることで、トレンド+季節性+ノイズを含む時系列データが生成されます。
auto_arimaの実行
pm.auto_arima():AICを基準にして、最適なARIMAモデルの次数(p,d,q)と季節次数(P,D,Q,m)を自動探索します。seasonal=True:季節性を考慮したSARIMAモデルを探索します。m=12:季節周期を12に設定します(月次データであれば12カ月周期)。trace=True:探索過程を逐次出力し、各モデルのAICと計算時間を表示します。suppress_warnings=True:収束しないモデルなどの警告を非表示にします。- なお、
stepwise=Trueがデフォルトで適用されており、ステップワイズ探索アルゴリズムにより高速に準最適な次数を見つけます。
- 選択肢の解説
-
(A) 時系列データの異常値を自動的に検出・除去している → ×
auto_arimaはモデルの次数選択を行う関数であり、異常値の検出や除去は行いません。異常値の検出には別の手法(例:IQR法、Isolation Forestなど)が必要です。(B) AICを基準に、最適なARIMAモデルの次数(p,d,q)を自動選択している → ○
正解です。トレースログに表示されている通り、さまざまな(p,d,q)(P,D,Q)の組み合わせを試行し、AICが最小となるモデルを自動的に選択しています。
(C) 時系列データをトレンド・季節性・残差に分解している → ×
時系列分解は
seasonal_decomposeやSTLなどの関数で行います。auto_arimaは分解ではなく、予測モデルの次数を決定する関数です。(D) 時系列データに対してグリッドサーチでハイパーパラメータを最適化している → ×
stepwise=Trueを指定しているため、全組み合わせを網羅するグリッドサーチ(総当たり探索)ではなく、ステップワイズ探索を行っています。ステップワイズ探索は、既に評価したモデルの結果に基づいて次の候補を効率的に選択するため、グリッドサーチよりも大幅に高速です。なお、
stepwise=Falseにするとグリッドサーチに近い網羅的探索になりますが、計算コストが大きくなります。 - AIC(赤池情報量基準)とは
-
AIC(Akaike Information Criterion)は、統計モデルの良さを評価するための指標で、以下の式で定義されます。
$$AIC = -2 \ln(L) + 2k$$
ここで、Lは最大尤度、kはモデルのパラメータ数です。
AICはモデルの当てはまりの良さ(尤度) とモデルの複雑さ(パラメータ数) のバランスを取る指標です。
- 尤度が高い(データへの当てはまりが良い)ほどAICは小さくなります。
- パラメータ数が多い(モデルが複雑)ほどAICは大きくなります。
つまり、AICが小さいモデルは「データをよく説明しつつ、過度に複雑ではない」モデルと解釈できます。
これにより過学習を抑制しながら、適切なモデルを選択することができます。
- auto_arimaのステップワイズ探索
-
auto_arimaのstepwise=Trueで使われるステップワイズ探索は、以下の手順で動作します。- 初期モデルの評価:いくつかの基本的な次数の組み合わせ(例:ARIMA(0,0,0)、ARIMA(1,0,0)、ARIMA(0,0,1)など)を評価します。
- 近傍探索:現在の最良モデルの近傍(次数を±1した組み合わせ)を評価します。
- 改善が見られなくなるまで繰り返し:AICが改善しなくなった時点で探索を終了します。
この方法は、全組み合わせを試す
stepwise=Falseの場合と比較して、はるかに計算時間が短くなりますが、大域的最適解を見逃す可能性もあります。精度を重視する場合はstepwise=Falseの使用も検討してください。 - 初期モデルの評価:いくつかの基本的な次数の組み合わせ(例:ARIMA(0,0,0)、ARIMA(1,0,0)、ARIMA(0,0,1)など)を評価します。

