雑記

お気付きの点がありましたらご指摘いただけますと幸いです。

💜

f:id:cookie-box:20211229165400p:plain:w70
  • 系列データをトレンド、季節性、残差に分解する statsmodels.tsa.seasonal.STL は以下のように実行できますね。ほぼ [1] の Examples のままですが。なお、なぜ二酸化炭素濃度が季節性をもつのかという点ですが、北半球では春に二酸化炭素濃度が最大値になる、というより、光合成が最も活発な夏に二酸化炭素濃度が減る傾きが最大値になるということらしいです。実際、このデータ(ハワイのマウナロアの二酸化炭素濃度)の季節成分も5月が最大値で10月が最小値になっています。

    import pandas as pd
    pd.set_option('display.max_rows', None)
    %matplotlib inline
    import matplotlib.pyplot as plt
    plt.rcParams["font.size"] = 15
    plt.rcParams["figure.figsize"] = (11, 8)
    from statsmodels.datasets import co2
    from statsmodels.tsa.seasonal import STL
    
    dataset = co2.load()
    # 月次データにする ( DatetimeIndex をもつデータにしておくと STL にその周期を読み取ってもらえる)
    data = dataset.data.resample('M').mean().ffill()
    res = STL(data).fit()
    print(res.seasonal.iloc[:24])  # 季節成分
    # 図示
    res.plot()
    plt.show()
    

    robust=True とすると帰り値に重みが返ってきますね。外れ値がトレンドや季節性に反映されないようにして、残差に押し付けるのでしょうか。こちらの方が絶対値最大の残差の絶対値が大きくなるようです。

    res = STL(data, robust=True).fit()
    print(res.seasonal.iloc[:24])  # 季節成分
    print(res.weights.iloc[:24])  # 外れ値の影響を軽減するための重み
    # 図示
    res.plot()
    plt.show()