- 問題
- 答え
- 解説
Python コード:
import pandas as pd import numpy as np from statsmodels.tsa.seasonal import seasonal_decompose np.random.seed(13) dates = pd.date_range( start='2023-01-01', periods=24, freq='M') data = np.random.randn(24) + np.arange(24) ts = pd.Series( data, index=dates) result = seasonal_decompose( ts, model='additive', period=12) print(result.seasonal.head(12))
回答の選択肢:
(A) 季節性成分の最初の12ヶ月の値
(B) 最初の12ヶ月の季節成分の平均値
(C) 季節成分の値を12月開始にした時系列データ
(D) 最初の12月の季節性成分の値
2023-01-31 0.135702 2023-02-28 -0.602476 2023-03-31 0.694209 2023-04-30 0.107268 2023-05-31 -0.248526 2023-06-30 1.694710 2023-07-31 0.964094 2023-08-31 0.463528 2023-09-30 1.082621 2023-10-31 -1.475766 2023-11-30 -1.163034 2023-12-31 -1.652328 Freq: M, Name: seasonal, dtype: float64
正解: (A)
回答の選択肢:
(A) 季節性成分の最初の12ヶ月の値
(B) 最初の12ヶ月の季節成分の平均値
(C) 季節成分の値を12月開始にした時系列データ
(D) 最初の12月の季節性成分の値
import pandas as pd import numpy as np from statsmodels.tsa.seasonal import seasonal_decompose np.random.seed(13) dates = pd.date_range( start='2023-01-01', periods=24, freq='M') data = np.random.randn(24) + np.arange(24) ts = pd.Series( data, index=dates) result = seasonal_decompose( ts, model='additive', period=12) print(result.seasonal.head(12))
詳しく説明します。
24期間の日付インデックスを生成します。スタート日付は’2023-01-01’で、期間(つまり日数)は24、頻度は月ごと(’M’)に設定しています。
dates = pd.date_range( start='2023-01-01', periods=24, freq='M')
dates
に格納されているデータは次のようになっています。
DatetimeIndex(['2023-01-31', '2023-02-28', '2023-03-31', '2023-04-30', '2023-05-31', '2023-06-30', '2023-07-31', '2023-08-31', '2023-09-30', '2023-10-31', '2023-11-30', '2023-12-31', '2024-01-31', '2024-02-29', '2024-03-31', '2024-04-30', '2024-05-31', '2024-06-30', '2024-07-31', '2024-08-31', '2024-09-30', '2024-10-31', '2024-11-30', '2024-12-31'], dtype='datetime64[ns]', freq='M')
この日付インデックスと、乱数の配列を用いて時系列データを作成します。乱数の配列はnumpy
のrandom.randn
(正規分布)を用いて生成し、そこに単純に範囲関数arange
を合わせたものになっています。
data = np.random.randn(24) + np.arange(24)
data
に格納されているデータは次のようになっています。
[-0.71239066 1.75376638 1.95549692 3.45181234 5.34510171 5.53233789 7.3501879 7.86121137 9.47868574 7.95462287 9.21101098 9.73839405 12.56284679 12.75667375 14.9137407 15.31735092 16.12730328 19.15038297 18.60628866 18.97322835 19.01583922 22.19070527 22.95283061 21.91281841]
このデータをpandasのSeries
に変換します。Series
は1次元のデータフレームで、label付けされたデータを保持できます。この例では、日付インデックスをラベルとし、生成したデータを値としています。
ts = pd.Series( data, index=dates)
ts
に格納されているデータは次のようになっています。
2023-01-31 -0.712391 2023-02-28 1.753766 2023-03-31 1.955497 2023-04-30 3.451812 2023-05-31 5.345102 2023-06-30 5.532338 2023-07-31 7.350188 2023-08-31 7.861211 2023-09-30 9.478686 2023-10-31 7.954623 2023-11-30 9.211011 2023-12-31 9.738394 2024-01-31 12.562847 2024-02-29 12.756674 2024-03-31 14.913741 2024-04-30 15.317351 2024-05-31 16.127303 2024-06-30 19.150383 2024-07-31 18.606289 2024-08-31 18.973228 2024-09-30 19.015839 2024-10-31 22.190705 2024-11-30 22.952831 2024-12-31 21.912818 Freq: M, dtype: float64
この時系列データに対し、statsmodels
パッケージのseasonal_decompose
関数を用い、時系列データをトレンド成分、季節性成分、残差成分に分解します。この結果を使うことで、季節調整を行うことができます。
result = seasonal_decompose( ts, model='additive', period=12)
その結果から季節性成分だけを取り出すため、result.seasona
lを用いています。また、head(12)
を通じて最初の12行だけを表示しています。
print(result.seasonal.head(12))
2023-01-31 0.135702 2023-02-28 -0.602476 2023-03-31 0.694209 2023-04-30 0.107268 2023-05-31 -0.248526 2023-06-30 1.694710 2023-07-31 0.964094 2023-08-31 0.463528 2023-09-30 1.082621 2023-10-31 -1.475766 2023-11-30 -1.163034 2023-12-31 -1.652328 Freq: M, Name: seasonal, dtype: float64
補足です。
結果の格納され散るresult
は、以下の公開属性やメソッドを持っています。
nobs
: 元の時系列データに含まれる観測値の数を返します。observed
: 元の時系列データを返します。plot
: 分解結果のプロットを行うためのメソッドです。トレンド成分、季節性成分、残差を視覚的に確認することができます。resid
: 分解後の残差成分を返します。これは、観測データからトレンドと季節性が除かれたものです。seasonal
: 分解後の季節性成分を返します。これは、データの中に反復するパターンを表しています。trend
: 分解後のトレンド成分を返します。これは、データの中に見られる長期的な上昇または下降のパターンを表しています。weights
: 分解の際に使用した重みを返します。結果の分解にどの程度影響を及ぼすかを示します。
今回は、seasonal
属性を使い、result
から季節成分を抽出しました。