[機械学習のはじめ方] Part42: 時系列の特徴と可視化

機械学習

このステップでは、時間の経過とともに記録される「時系列データ」の基本的な特徴と、その特徴を掴むための可視化手法について学びます。

1. 時系列データとは? 🤔

時系列データとは、一定の時間間隔(例: 秒、分、時間、日、月、年)で観測されたデータの系列です。例えば、以下のようなものが時系列データにあたります。

  • 毎日の株価の終値
  • 月ごとのウェブサイトの訪問者数
  • 時間ごとの気温の変化
  • 年間の製品売上高

時系列データ分析は、過去のパターンを理解し、将来の値を予測するために非常に重要です。ビジネス、金融、気象学、工学など、多くの分野で活用されています。

2. 時系列データの主な特徴 📊

時系列データは、しばしば以下の構成要素(特徴)に分解できると考えられています。これらの特徴を理解することが、適切な分析モデルを選択する上で重要になります。

特徴 説明
トレンド (Trend) 📈 長期的なデータの増加または減少の傾向。必ずしも直線的である必要はありません。 経済成長に伴う企業の売上高の長期的な上昇傾向。
季節性 (Seasonality) 📅 特定の周期(例: 1年、1週間、1日)で繰り返されるパターン。 夏にアイスクリームの売上が増え、冬に減る。週末にウェブサイトのアクセスが増える。
周期性 (Cyclicality) 🔄 固定された周期ではない、長期的な変動パターン。経済の景気循環など。季節性よりも周期が長く、不規則なことが多いです。 数年単位で変動する景気の好況・不況の波。
不規則変動 (Irregular Fluctuation / Noise) 上記のパターンでは説明できないランダムな変動。予測不可能な要素。 一時的なニュース、予期せぬ出来事による株価の短期的な変動。
自己相関 (Autocorrelation) 🔗 現在の値が過去の値とどれだけ関連しているかを示す指標。多くの時系列データでは、近い時点の値同士は似ている傾向があります(正の自己相関)。 今日の気温は昨日の気温と似ていることが多い。
定常性 (Stationarity) ⚖️ 時間の経過によらず、データの統計的性質(平均、分散、自己相関など)が一定である状態。多くの時系列モデルは、データが定常であることを仮定しています。非定常なデータは、差分を取るなどの処理で定常化することがあります。 トレンドや季節性がない、平均や分散が一定の時系列データ。

💡 これらの要素は、時系列データによってはっきりと現れるものもあれば、ほとんど見られないものもあります。また、複数の要素が組み合わさっていることが一般的です。

3. 時系列データの可視化手法 📉

時系列データの特徴を視覚的に捉えることは、分析の第一歩として非常に重要です。以下に代表的な可視化手法を紹介します。Pythonのライブラリ(Matplotlib, Seaborn, Pandas, Statsmodels)を使うことで、これらのグラフを簡単に作成できます。

  • 折れ線グラフ (Line Plot): 最も基本的な可視化手法です。時間軸を横軸、データ値を縦軸にとり、データの推移を線で結びます。トレンドや季節性の大まかなパターンを把握するのに役立ちます。
  • 自己相関プロット (ACF Plot): 自己相関関数(ACF: Autocorrelation Function)をグラフ化したものです。横軸にラグ(時間のずれ)、縦軸に自己相関係数をプロットします。どの程度過去の値が現在の値に影響を与えているか、季節性の周期などを確認できます。
  • 偏自己相関プロット (PACF Plot): 偏自己相関関数(PACF: Partial Autocorrelation Function)をグラフ化したものです。ある時点とそのラグk離れた時点の相関を、その間の時点の影響を除去して計算したものです。ARモデル(自己回帰モデル)の次数決定などに用いられます。
  • 季節性プロット (Seasonal Plot): 季節ごとのパターンを比較するためのグラフです。例えば、年ごとのデータを重ねてプロットしたり、月ごとの平均値を箱ひげ図で表示したりします。季節性の有無やパターンを明確に捉えることができます。
  • ラグプロット (Lag Plot): 横軸に時刻 t の値、縦軸に時刻 t-k (kはラグ)の値をプロットした散布図です。データのランダム性や自己相関の有無を視覚的に確認できます。点が直線状に並べば自己相関が強く、ランダムに散らばれば自己相関が弱いことを示唆します。
  • 移動平均線 (Moving Average): 折れ線グラフに重ねて描画されることが多く、短期的な変動を平滑化し、長期的なトレンドを見やすくします。

Pythonによる可視化の例

ここでは、PandasとMatplotlibを使って簡単な折れ線グラフを描画し、Statsmodelsを使ってACF/PACFプロットを描画する基本的なコードを示します。


import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf

# サンプルの時系列データを作成 (日付インデックスを持つPandas Series)
dates = pd.date_range(start='2023-01-01', periods=100, freq='D')
# トレンド + 季節性 + ノイズ を持つデータ例
data = np.linspace(0, 10, 100) + np.sin(np.linspace(0, 2*np.pi*5, 100)) * 2 + np.random.normal(0, 1, 100)
ts = pd.Series(data, index=dates)

# 1. 折れ線グラフの描画
plt.figure(figsize=(10, 4))
plt.plot(ts)
plt.title('Sample Time Series Data')
plt.xlabel('Date')
plt.ylabel('Value')
plt.grid(True)
plt.show()

# 2. ACFプロットの描画
fig, ax = plt.subplots(figsize=(10, 4))
plot_acf(ts, lags=40, ax=ax) # lagsで表示するラグ数を指定
plt.title('Autocorrelation Function (ACF)')
plt.xlabel('Lag')
plt.ylabel('ACF')
plt.grid(True)
plt.show()

# 3. PACFプロットの描画
fig, ax = plt.subplots(figsize=(10, 4))
plot_pacf(ts, lags=40, ax=ax, method='ywm') # methodを指定する場合がある
plt.title('Partial Autocorrelation Function (PACF)')
plt.xlabel('Lag')
plt.ylabel('PACF')
plt.grid(True)
plt.show()

# 4. Statsmodelsによる時系列分解 (簡単な例)
# seasonal_decomposeは季節周期(period)の指定が必要
# 今回は日次データで明確な週周期などがないため、適切なperiod設定が難しいが例として示す
# 実際のデータでは、データの特性に合わせてperiodを適切に設定する
try:
    # 例として7日周期を仮定
    decomposition = sm.tsa.seasonal_decompose(ts, model='additive', period=7)
    fig = decomposition.plot()
    fig.set_size_inches(10, 8)
    plt.suptitle('Time Series Decomposition (period=7)', y=1.02)
    plt.tight_layout()
    plt.show()
except ValueError as e:
    print(f"季節周期の設定に問題がある可能性があります: {e}")
    # 周期がデータ期間に対して短すぎる場合などにエラーになることがある

        

⚠️ seasonal_decompose を使う際は、データの特性に基づいた適切な period(季節周期)を指定することが重要です。例えば、月次データで年周期を見るなら period=12、日次データで週周期を見るなら period=7 となります。

4. まとめ ✨

今回は、時系列データの基本的な特徴(トレンド、季節性、周期性、不規則変動、自己相関、定常性)と、それらを視覚的に捉えるための代表的な可視化手法について学びました。

時系列データを分析する際は、まずデータを可視化し、どのような特徴を持っているかを把握することが非常に重要です。これにより、適切な前処理やモデル選択の方針を立てることができます。

次のステップでは、これらの特徴を考慮した上で、具体的な時系列モデル(RNNなど)について学んでいきましょう! 💪

コメント

タイトルとURLをコピーしました