時系列分析は、時間の経過とともに変化するデータを解析し、未来の動向を予測するための重要な手法です。ビジネスの売上予測や気象データの解析、株価の予測など、さまざまな分野で活用されています。特にPythonは豊富なライブラリを活かして、初心者でも比較的簡単に時系列分析に挑戦できる環境を提供しています。
この記事では、時系列分析の基礎から代表的な手法、さらにPythonによる実装方法までを丁寧に解説します。初めて時系列分析に触れる方でも理解しやすい内容を心がけていますので、ぜひ一緒に学んでいきましょう。
この記事で学べること:
- 時系列データの特徴と基本的な取り扱い方
- 主要な時系列分析手法(移動平均、指数平滑法、ARIMAなど)の概要
- Pythonを使った時系列分析の実装例
例えば、時系列データの基本的なモデルの一つである自己回帰モデル(ARモデル)は、次のように表されます。
\[ x_t = \phi_1 x_{t-1} + \phi_2 x_{t-2} + \cdots + \phi_p x_{t-p} + \epsilon_t \]
ここで、\( x_t \)は時点\( t \)の値、\( \phi_i \)はモデルのパラメータ、そして\( \epsilon_t \)は誤差項です。このようなモデルを理解し、適切に使うことが時系列分析の第一歩です。
時系列分析は多様な手法が存在しますが、基本的な考え方と代表的なモデルを理解することで、実際のデータに応用できる力が身につきます。Pythonの強力なライブラリを活用すれば、複雑な処理も効率的に行えます。まずは移動平均や指数平滑法から始め、徐々にARIMAモデルなど高度な手法に挑戦してみてください。継続的に実践を重ねることで、時系列データから有益な洞察を得るスキルが確実に向上します。
時系列分析の基礎知識
時系列分析とは、時間の経過に沿って観測されたデータを解析し、未来の値を予測したり、データの特徴を理解したりする手法です。例えば、株価、気温、売上高など時間に依存したデータが対象となります。
時系列データの重要な特徴には以下のものがあります。
- トレンド: 長期的な増加や減少の傾向
- 季節性: 一定の周期で繰り返されるパターン
- ランダム性: 予測が難しい不規則な変動
基本的な時系列モデルには自己回帰(AR)、移動平均(MA)、およびこれらを組み合わせたARMAモデルがあります。例えば、自己回帰モデルは過去の値\(
x_{t-1}, x_{t-2}, \ldots
\)を用いて現在の値\( x_t \)を予測します。具体的には、AR(1)モデルは次の式で表されます。
\[
x_t = \phi x_{t-1} + \epsilon_t
\]
ここで、\(\phi\)はモデルの係数、\(\epsilon_t\)は誤差項(ホワイトノイズ)です。Pythonでは、statsmodelsライブラリを使って簡単にARモデルを実装可能です。
from statsmodels.tsa.ar_model import AutoReg
import numpy as np
# サンプルデータ生成
np.random.seed(0)
data = np.random.randn(100)
# AR(1)モデルの適用
model = AutoReg(data, lags=1)
model_fit = model.fit()
print(model_fit.params)
このように時系列分析は、データの構造を理解し未来予測に役立てる強力なツールです。次のセクションでは、代表的な手法と具体的なPython実装を詳しく解説します。
時系列分析とは何か
時系列分析とは、時間の経過に伴って観測されるデータを解析し、未来の動向を予測する手法です。例えば、株価や気温、売上高といったデータが対象になります。特徴として、過去のデータが未来の値に影響を与えることを前提にしています。
時系列データは一般的に以下のように表されます。
観測値を \( x_t \) としたとき、時間 \( t=1,2,3,\dots \) に対応するデータの集合です。
時系列分析では、データの傾向や季節変動、ランダムな変動を分解し、モデル化を行います。代表的なモデルの一つが自己回帰モデル(ARモデル)です。
ARモデルは過去のデータを用いて現在の値を予測します。一般的な一次自己回帰モデルは次の式で表されます。
\[
x_t = \phi x_{t-1} + \epsilon_t
\]
ここで、\( \phi \) はモデルのパラメータ、\( \epsilon_t \) は平均ゼロの誤差項です。この式は「現在の値は直前の値の線形結合と誤差の和で表される」ことを意味します。
Pythonでは、statsmodelsライブラリを使い簡単にARモデルを実装できます。以下はその例です。
from statsmodels.tsa.ar_model import AutoReg
import numpy as np
# サンプルデータの作成
np.random.seed(0)
data = np.random.randn(100)
# 自己回帰モデルの学習(ラグ1)
model = AutoReg(data, lags=1)
model_fit = model.fit()
# 予測
pred = model_fit.predict(start=90, end=99)
print(pred)
このように時系列分析は、過去の時間的パターンを活用し未来の予測や異常検知に役立ちます。初心者でもPythonで扱いやすいため、まずは基本的なモデルから学ぶことをおすすめします。
時系列データの特徴
時系列データは、時間の経過に沿って観測されたデータのことを指します。株価や気温、売上高など、時間軸に沿った変化を分析する際に用いられます。時系列分析を行う上で押さえておきたい特徴がいくつかあります。
- 自己相関性
時系列データは過去のデータと現在のデータが関連していることが多く、この関係性を自己相関と呼びます。例えば、昨日の気温が今日の気温に影響を与えることがあります。 - トレンド
長期的に増加または減少する傾向がある場合、これをトレンドといいます。たとえば、人口の増加や売上の伸びが該当します。 - 季節性
一定の周期で繰り返すパターンが存在する場合、季節性と呼びます。気温の季節変動や小売業の販売周期が例です。 - ランダム性(ノイズ)
予測できない不規則な変動も含まれており、これをノイズと呼びます。データ分析ではこのノイズを除去または考慮することが重要です。
これらの特徴を適切に捉えることで、より精度の高い予測や解析が可能になります。時系列分析では、これらの性質を数理モデルに反映させることが基本です。
時系列分析の目的と応用例
時系列分析とは、時間の経過に沿って集められたデータを解析し、未来の動向を予測したり、パターンを理解する手法です。主な目的は、過去のデータから規則性や傾向を見つけ出し、将来の値を推定することにあります。
具体的な応用例としては以下が挙げられます。
- 株価や為替の価格変動の予測
- 気象データの分析による天候予測
- センサーデータからの異常検知
- 売上データを用いた需要予測
- 健康管理における心拍数や体温の変動解析
時系列分析では、データの自己相関を考慮することが重要です。自己相関とは、ある時点のデータが過去の特定の時点のデータとどの程度関連しているかを示します。例えば、自己相関係数 \( r_k \) は次の式で表されます。
\[
r_k = \frac{\sum_{t=1}^{N-k} (x_t – \bar{x})(x_{t+k} – \bar{x})}{\sum_{t=1}^N (x_t – \bar{x})^2}
\]
ここで、\( x_t \) は時刻 \( t \) のデータ、\( \bar{x} \) は平均値、\( k \) はラグ(遅れ)を表します。このような分析を通じて、モデル構築や予測の精度向上が可能です。
代表的な時系列分析の手法
時系列分析は、時間の経過に沿ったデータの変動を理解し、未来の予測を行うための技術です。ここでは、初心者でも理解しやすい代表的な手法を紹介します。
-
移動平均 (Moving Average)
過去のデータの平均を計算し、データの変動を平滑化します。例えば、3期間の単純移動平均は以下の式で表されます。
\[
SMA_t = \frac{1}{3} (x_{t} + x_{t-1} + x_{t-2})
\]
これによりノイズが減り、トレンドが見やすくなります。 -
自己回帰モデル (ARモデル)
現在の値を過去の値の線形結合としてモデル化します。ARモデルの1次の場合、式は以下の通りです。
\[
x_t = \phi x_{t-1} + \epsilon_t
\]
ここで、\(\phi\)はパラメータ、\(\epsilon_t\)は誤差項です。 -
指数平滑法 (Exponential Smoothing)
最新の観測値に重みを多く与え、過去のデータは指数関数的に減衰させます。単純指数平滑法の更新式は以下です。
\[
S_t = \alpha x_t + (1-\alpha) S_{t-1}
\]
\(\alpha\)は平滑化係数で、0から1の間の値を取ります。
これらの手法はPythonで簡単に実装できます。次に、単純移動平均をPythonで計算する例を示します。
import pandas as pd
data = [10, 12, 13, 15, 14, 16, 18]
series = pd.Series(data)
moving_average = series.rolling(window=3).mean()
print(moving_average)
このコードは3期間の移動平均を計算し、滑らかな時系列を作成します。時系列分析の基本を理解し、Pythonでの実装に挑戦しましょう。
移動平均法の概要と特徴
移動平均法は、時系列分析で最も基本的かつ広く使われる手法です。過去のデータの平均値を一定期間ごとに計算し、変動の傾向を滑らかにします。これにより、ノイズを減らしてトレンドを捉えやすくすることができます。
具体的には、時系列データ \( x_t \) に対して、期間 \( n \) の単純移動平均(SMA)は次のように計算されます。
式:
\[
SMA_t = \frac{1}{n} \sum_{i=0}^{n-1} x_{t-i}
\]
解釈:
時点 \( t \) の移動平均値は、直近 \( n \) 期間のデータの平均です。これにより、短期的な変動が平滑化され、長期的なトレンドが見えやすくなります。
Pythonでの実装はとても簡単で、Pandasライブラリのrolling関数を使います。
import pandas as pd
# 例:時系列データの作成
data = pd.Series([10, 12, 13, 15, 14, 16, 18, 17, 19, 20])
# 3期間の単純移動平均を計算
moving_avg = data.rolling(window=3).mean()
print(moving_avg)
このように移動平均法は、初学者でも扱いやすく、データのトレンド把握に有効です。特に季節変動やランダムなノイズを抑えたい時に役立ちます。
指数平滑法の種類と使い方
指数平滑法は、時系列分析で広く使われる手法の一つです。過去のデータに指数関数的に減少する重みをつけて予測を行います。主に以下の3つの種類があります。
- 単純指数平滑法(SES): トレンドや季節性がない安定した時系列に適用します。
- ホルトの線形指数平滑法: トレンド成分を考慮したモデルです。
- ホルト・ウィンター法: トレンドに加え季節変動も扱います。
単純指数平滑法の基本式は次の通りです。
予測値 \( \hat{y}_{t+1} \) は、
\[
\hat{y}_{t+1} = \alpha y_t + (1 – \alpha) \hat{y}_t
\]
ここで、\( y_t \) は時点 \( t \) の実測値、\( \hat{y}_t \) は時点 \( t \) の予測値、\( \alpha \) は平滑化定数(0 < \( \alpha \) < 1)です。
この式は、最新の実測値を重視しつつ過去の予測値も考慮する形で更新されます。Pythonのstatsmodelsライブラリを使うと簡単に実装可能です。
from statsmodels.tsa.holtwinters import SimpleExpSmoothing
import numpy as np
data = np.array([112, 118, 132, 129, 121, 135, 148, 148])
model = SimpleExpSmoothing(data)
fit = model.fit(smoothing_level=0.2)
forecast = fit.forecast(1)
print(f"次の予測値: {forecast[0]:.2f}")
この例では、平滑化定数を0.2に設定し、次の時点の値を予測しています。指数平滑法は計算も軽いため、初心者でも取り組みやすい時系列分析の手法です。
ARIMAモデルの基本構造
ARIMAモデルは、時系列分析で広く使われる手法です。英語で「AutoRegressive Integrated Moving Average」の略で、
自己回帰(AR)、差分(I)、移動平均(MA)の3つの要素から成り立っています。これにより、非定常なデータにも対応可能です。
モデルは次のように表されます。
式:
\[
\phi(B)(1 – B)^d y_t = \theta(B) \varepsilon_t
\]
- \( y_t \):時系列データの値
- \( B \):バックシフト演算子(\( B y_t = y_{t-1} \))
- \( d \):差分の次数(非定常性の調整)
- \( \phi(B) \):自己回帰係数の多項式
- \( \theta(B) \):移動平均係数の多項式
- \( \varepsilon_t \):ホワイトノイズ(誤差項)
解釈すると、AR部分は過去の値に依存し、MA部分は過去の誤差に依存します。差分はデータのトレンドを取り除く役割です。
Pythonでの実装例は以下の通りです。statsmodelsライブラリを使い、ARIMAモデルを簡単に適用できます。
from statsmodels.tsa.arima.model import ARIMA
import numpy as np
# サンプルデータ生成(ランダムウォーク)
np.random.seed(0)
data = np.cumsum(np.random.randn(100))
# ARIMAモデルの定義 (p=1, d=1, q=1)
model = ARIMA(data, order=(1, 1, 1))
result = model.fit()
print(result.summary())
このコードでは、1階差分と自己回帰・移動平均の次数を1に設定しています。結果の要約にはモデルの詳細が含まれます。
季節調整とトレンド分析
時系列分析において、季節調整とトレンド分析は重要な役割を果たします。季節調整はデータに周期的な変動がある場合に、その影響を取り除く手法です。一方、トレンド分析は長期的な傾向を把握するために用いられます。これらを理解することで、より正確な予測や意思決定が可能になります。
季節調整の基本
季節調整では、時系列データ \(Y_t\) を以下のように分解します。
\[
Y_t = T_t + S_t + R_t
\]
- \(T_t\): トレンド成分(長期的な傾向)
- \(S_t\): 季節成分(周期的な変動)
- \(R_t\): 残差成分(ランダムな変動)
季節調整は、\(S_t\) を取り除き、トレンドや残差に注目します。
Pythonでの実装例
Pythonではstatsmodelsライブラリのseasonal_decompose関数を用いて簡単に分解できます。
from statsmodels.tsa.seasonal import seasonal_decompose
import pandas as pd
# サンプルデータの読み込み(時系列データ)
data = pd.read_csv('timeseries.csv', index_col='date', parse_dates=True)
# 季節分解(加法モデル)
result = seasonal_decompose(data['value'], model='additive', period=12)
# トレンド成分の取得
trend = result.trend
# 季節成分の取得
seasonal = result.seasonal
# 残差成分の取得
residual = result.resid
このようにして季節成分を除去し、トレンドを分析できます。トレンド分析では移動平均なども活用されますが、分解によりより詳細な理解が可能です。
Pythonでの時系列分析入門
時系列分析とは、時間の経過に沿って記録されたデータを解析し、未来の値を予測する手法です。Pythonでは、pandasやstatsmodelsなどのライブラリを利用して簡単に扱えます。基本的な流れは以下の通りです。
- データの読み込みと前処理
- トレンドや季節性の確認
- モデルの構築と予測
まず、時系列データは日時情報をインデックスに設定します。たとえば、pandasでCSVから読み込む際は次のコードを使います。
import pandas as pd
data = pd.read_csv('data.csv', parse_dates=['date'], index_col='date')
次に、単純な移動平均(MA)を用いてデータの傾向を滑らかにします。移動平均は過去の値の平均を計算し、ノイズを減らす手法です。式は以下のように表されます。
\[
MA_t = \frac{1}{k} \sum_{i=0}^{k-1} x_{t-i}
\]
ここで、\(k\)は平均を取る期間、\(x_t\)は時刻\(t\)の値です。Pythonでは以下のように実装できます。
window_size = 3
data['MA3'] = data['value'].rolling(window=window_size).mean()
このようにして時系列の傾向を把握しつつ、次の段階でARIMAなどのモデルを使い予測を行います。まずはデータの特徴を掴むことから始めましょう。
Pythonで使う主要ライブラリの紹介
時系列分析を行う際、Pythonには多くの便利なライブラリが揃っています。初心者がまず押さえておきたい主要ライブラリは以下の通りです。
- pandas:データの読み込みや時系列データの操作に最適なライブラリです。日付や時間のインデックスを簡単に扱えます。
- numpy:数値計算の基盤であり、配列操作や数学関数を効率的に使えます。時系列データの前処理に役立ちます。
- matplotlib:データの可視化に使われる基本ライブラリ。時系列のトレンドや季節性をグラフで確認できます。
- statsmodels:統計モデルの実装が充実しています。自己回帰(AR)や移動平均(MA)などの時系列モデルを簡単に構築可能です。
- Prophet:Facebookが開発した時系列予測ライブラリで、トレンドや季節性を自動で検出しやすい点が特徴です。
例えば、pandasを使って時系列データを読み込む基本コードは以下のようになります。
import pandas as pd
# CSVファイルからデータを読み込み、日付をインデックスに設定
data = pd.read_csv('timeseries.csv', parse_dates=['date'], index_col='date')
# データの先頭5行を表示
print(data.head())
これらのライブラリを組み合わせて、時系列分析を効率的に進めていきましょう。
Pandasによる時系列データの扱い方
時系列分析を行う上で、Pandasは非常に強力なツールです。まず、時系列データは時間軸に沿ったデータの集合であり、日時情報をインデックスとして持つことが多いです。Pandasでは、DatetimeIndexを使って時系列を管理します。
例えば、文字列の日時データを日時型に変換するには、pd.to_datetime()を用います。これにより、日付や時間の計算や抽出が容易になります。
基本的な操作は以下の通りです。
- 日時インデックスの設定
- 時間での抽出やスライス
- リサンプリングによる頻度変換(例:日次→月次)
- 欠損値の補完やシフト操作
例えば、日時をインデックスに設定し、月ごとの平均値を計算するコードは以下のようになります。
import pandas as pd
data = {'date': ['2023-01-01','2023-01-02','2023-02-01','2023-02-02'],
'value': [10, 15, 20, 25]}
df = pd.DataFrame(data)
df['date'] = pd.to_datetime(df['date'])
df.set_index('date', inplace=True)
monthly_mean = df.resample('M').mean()
print(monthly_mean)
このように、Pandasは日時の変換から集計まで一連の操作を簡潔に行えます。時系列分析の基盤として非常に役立つため、初心者の方はぜひ習得しましょう。
Matplotlibでの時系列データの可視化
時系列分析においてデータの可視化は非常に重要です。MatplotlibはPythonでよく使われるグラフ描画ライブラリで、時系列データを直感的に理解するのに役立ちます。
まず、時系列データは時間軸に沿ったデータの変動を表します。例えば、日付ごとの売上や気温などです。Matplotlibでこれらを描く基本的な方法は、横軸に時間、縦軸に観測値を設定することです。
具体的には、以下のように時系列データをプロットします。
import matplotlib.pyplot as plt
import pandas as pd
# サンプルの時系列データ作成
dates = pd.date_range('20230101', periods=10)
values = [10, 12, 9, 14, 13, 15, 12, 11, 14, 16]
# DataFrameにまとめる
df = pd.DataFrame({"Date": dates, "Value": values})
df.set_index("Date", inplace=True)
# プロット
plt.figure(figsize=(8,4))
plt.plot(df.index, df["Value"], marker='o')
plt.title("時系列データの可視化")
plt.xlabel("日付")
plt.ylabel("値")
plt.grid(True)
plt.show()
このコードでは、まず日付をインデックスに設定し、横軸に日付、縦軸に値を指定して折れ線グラフを描画しています。マーカーをつけることで、各データ点が見やすくなります。
時系列分析の前段階として、このようなグラフを使いデータの傾向や異常値を視覚的にチェックしましょう。Matplotlibは直感的に操作できるので、初心者にもおすすめです。
statsmodelsを使ったARIMAモデルの実装
時系列分析でよく使われるARIMAモデルは、自己回帰(AR)、差分(I)、移動平均(MA)の三要素を組み合わせたモデルです。ARIMAは以下のように表現されます。
\[ \phi(B)(1 – B)^d y_t = \theta(B) \varepsilon_t \]
- \( \phi(B) \):自己回帰項の多項式
- \( (1 – B)^d \):時系列の差分を表し、非定常性を解消
- \( \theta(B) \):移動平均項の多項式
- \( \varepsilon_t \):ホワイトノイズ
Pythonのstatsmodelsライブラリを使えば、ARIMAモデルを簡単に実装できます。まず、モデルの次数(p, d, q)を決めてから、以下のコードで学習を行います。
from statsmodels.tsa.arima.model import ARIMA
model = ARIMA(時系列データ, order=(p, d, q))
model_fit = model.fit()
print(model_fit.summary())
ここで、pは自己回帰の次数、dは差分の次数、qは移動平均の次数です。モデルの適合度やパラメータ推定結果が表示され、時系列の傾向や季節性を捉える分析に役立ちます。
実践!Pythonで時系列分析を行う手順
時系列分析をPythonで始めるには、まずデータの準備から始めます。Pandasを使い、時系列データを読み込み、日時をインデックスに設定します。次に、データの傾向や季節性を理解するために、グラフで可視化しましょう。
基本的な時系列モデルの一つに自己回帰(AR)モデルがあります。ARモデルは過去のデータ値を用いて未来の値を予測します。式は以下の通りです。
自己回帰モデル(AR)の式:
\[
X_t = c + \sum_{i=1}^p \phi_i X_{t-i} + \epsilon_t
\]
ここで、\(X_t\)は時刻\(t\)の値、\(c\)は定数項、\(\phi_i\)はモデル係数、\(\epsilon_t\)は誤差項です。
Pythonでこれを実装するには、statsmodelsライブラリのARIMAモデルを利用します。ARIMAはAR成分の他に差分(I)と移動平均(MA)を含みますが、単純なARモデルとしても使えます。具体的なコード例は以下です。
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA
# データの読み込みと日時インデックス設定
data = pd.read_csv('timeseries.csv', parse_dates=['date'], index_col='date')
# データの可視化
data.plot()
plt.show()
# ARモデルの適用(p=2の場合)
model = ARIMA(data, order=(2,0,0))
result = model.fit()
# 予測値の取得とプロット
forecast = result.predict(start=len(data), end=len(data)+10)
forecast.plot()
plt.show()
この手順により、Pythonでの基本的な時系列分析が体験できます。まずはデータの理解から始め、徐々にモデルのパラメータ調整や他の手法を試してみましょう。
データの前処理と欠損値処理
時系列分析を行う前に、データの前処理は非常に重要です。特に欠損値は分析結果に大きな影響を与えるため、適切に処理する必要があります。時系列データでは、欠損値が連続する場合やランダムに発生する場合があり、その性質に応じた対応が求められます。
欠損値処理の基本的な方法には以下のようなものがあります。
- 削除: 欠損値を含む行を除去する。ただしデータ量が減少しすぎるリスクがある。
- 補完: 直近の値や平均値で穴埋めする。時系列では前後の値を使うことが多い。
- 予測: 他の変数やモデルを使って欠損値を推定する。
Pythonのpandasライブラリでは、欠損値の補完に fillna() 関数がよく使われます。例えば、欠損値を前の時刻の値で埋める方法は以下の通りです。
df['value'] = df['value'].fillna(method='ffill')
この方法は「前方補完(forward fill)」と呼ばれ、時系列の連続性を保つのに役立ちます。また、線形補間を行う場合は次のコードを使います。
df['value'] = df['value'].interpolate(method='linear')
線形補間は欠損値の前後の値を直線でつなぐ形で推定します。時系列分析における前処理は、モデルの精度を左右する重要なステップです。適切な欠損値処理で信頼できる分析結果を得ましょう。
モデルの構築とパラメータ推定
時系列分析におけるモデル構築は、過去のデータからパターンを抽出し、未来の予測を行うための重要なステップです。代表的なモデルには、自己回帰(AR)、移動平均(MA)、およびその組み合わせであるARMAモデルがあります。これらのモデルでは、パラメータを推定することで、データの特徴を数値的に表現します。
例えば自己回帰モデル(AR(1))は、現在の値 \(x_t\) が1つ前の値 \(x_{t-1}\) とノイズの線形結合で表されます。
式で表すと:
\[
x_t = \phi x_{t-1} + \epsilon_t
\]
ここで \(\phi\) は自己回帰係数、\(\epsilon_t\) は平均0の白色雑音です。この \(\phi\) をデータから推定することが、モデル構築の中心になります。
Pythonでは、statsmodelsライブラリを使うと簡単にパラメータ推定が可能です。以下のコードはAR(1)モデルの推定例です。
from statsmodels.tsa.ar_model import AutoReg
import numpy as np
# サンプルデータ生成
np.random.seed(0)
data = np.random.randn(100)
# AR(1)モデルのフィッティング
model = AutoReg(data, lags=1)
model_fit = model.fit()
# 推定されたパラメータを表示
print(model_fit.params)
このコードでは、データに対して自己回帰モデルを当てはめ、\(\phi\) を含むパラメータを推定します。推定結果を利用して、未来の値の予測や異常検知などに応用できます。
予測結果の評価方法
時系列分析でモデルの性能を評価することは、予測の信頼性を確認する上で重要です。代表的な評価指標には、平均絶対誤差(MAE)、平均二乗誤差(MSE)、決定係数(R²スコア)などがあります。
まず、平均絶対誤差(MAE)は予測値と実測値の差の絶対値の平均を表し、誤差の大きさを直感的に把握できます。数式は以下の通りです。
\[
\mathrm{MAE} = \frac{1}{n} \sum_{t=1}^n |y_t – \hat{y}_t|
\]
ここで、\(y_t\)は実際の値、\(\hat{y}_t\)は予測値、\(n\)はデータ数です。
次に、平均二乗誤差(MSE)は誤差の二乗平均で、誤差の大きな値をより重視します。
\[
\mathrm{MSE} = \frac{1}{n} \sum_{t=1}^n (y_t – \hat{y}_t)^2
\]
最後に、決定係数(R²スコア)はモデルがどれだけデータの分散を説明できているかを示し、1に近いほど良いモデルとなります。
\[
R^2 = 1 – \frac{\sum_{t=1}^n (y_t – \hat{y}_t)^2}{\sum_{t=1}^n (y_t – \bar{y})^2}
\]
ここで、\(\bar{y}\)は実測値の平均です。
Pythonのscikit-learnを使った評価例は以下の通りです。
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
# 実測値と予測値の例
y_true = [100, 105, 110, 115, 120]
y_pred = [102, 107, 111, 113, 118]
mae = mean_absolute_error(y_true, y_pred)
mse = mean_squared_error(y_true, y_pred)
r2 = r2_score(y_true, y_pred)
print(f"MAE: {mae:.2f}")
print(f"MSE: {mse:.2f}")
print(f"R2 Score: {r2:.2f}")
これらの指標を活用し、モデルの改善や比較を行うことで、より精度の高い時系列予測が可能になります。
実際のデータを使った分析例
ここでは、Pythonで時系列分析を実際に行う例を紹介します。対象データは、架空の月別売上データです。まず、単純移動平均(SMA)を計算し、データの傾向を把握します。
単純移動平均は過去n期間の平均を取る手法です。式は以下の通りです。
\[
SMA_t = \frac{1}{n} \sum_{i=0}^{n-1} y_{t-i}
\]
ここで、\(y_t\)は時点tの観測値、nは移動平均の期間です。SMAにより短期的な変動を平滑化し、トレンドを見やすくします。
次にPythonコードで実装してみましょう。
import pandas as pd
import matplotlib.pyplot as plt
# 架空の月別売上データを作成
data = {
'month': pd.date_range(start='2023-01-01', periods=12, freq='M'),
'sales': [210, 215, 230, 220, 225, 240, 250, 245, 260, 270, 275, 280]
}
df = pd.DataFrame(data).set_index('month')
# 3ヶ月の単純移動平均を計算
df['SMA_3'] = df['sales'].rolling(window=3).mean()
# 結果のプロット
plt.figure(figsize=(8,4))
plt.plot(df.index, df['sales'], label='売上')
plt.plot(df.index, df['SMA_3'], label='3ヶ月移動平均', linestyle='--')
plt.title('月別売上と3ヶ月単純移動平均')
plt.xlabel('月')
plt.ylabel('売上')
plt.legend()
plt.grid(True)
plt.show()
このコードでは、pandasのrolling関数を使い、3ヶ月の単純移動平均を計算しています。グラフにより、元の売上データと平滑化されたトレンドが視覚的に比較できます。初心者でも理解しやすい時系列分析の基本的な一歩です。
時系列分析の応用と今後の展望
時系列分析は、金融市場の価格予測や売上の季節変動の把握など、幅広い分野で活用されています。例えば、株価の変動を予測することで投資判断をサポートし、需要予測により効率的な在庫管理を実現します。また、気象データの解析から異常気象の早期検知にも役立っています。
今後は、機械学習や深層学習と時系列分析を組み合わせることで、精度の高い予測モデルが期待されています。特に、LSTM(長短期記憶)ネットワークのようなリカレントニューラルネットワークは、過去の長期依存関係を捉えるのに有効です。
例えば、LSTMモデルは以下の式で表されます。
入力ゲート、忘却ゲート、出力ゲートのそれぞれを計算し、記憶セルの状態を更新します。
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
# サンプルデータの形状: (サンプル数, 時間ステップ, 特徴量)
X_train = np.random.rand(100, 10, 1)
y_train = np.random.rand(100, 1)
model = Sequential()
model.add(LSTM(50, activation='relu', input_shape=(10, 1)))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')
model.fit(X_train, y_train, epochs=20, verbose=0)
これにより、単純な統計モデルよりも複雑なパターンを捉えられるため、より現実的な予測が可能になります。初学者の方もPythonのライブラリを活用しながら、時系列分析の応用範囲を広げていきましょう。
機械学習と時系列分析の融合
時系列分析は過去のデータから未来を予測する技術です。近年では機械学習と組み合わせることで、より精度の高い予測が可能になりました。機械学習はパターン認識に優れており、非線形な関係性を捉えることができます。
例えば、単純な線形回帰モデルでは未来の値 \( y_t \) を過去の値 \( x_t \) から予測します。数式で表すと以下のようになります。
\[
y_t = \beta_0 + \beta_1 x_t + \epsilon_t
\]
ここで、\(\beta_0\) は切片、\(\beta_1\) は係数、\(\epsilon_t\) は誤差項です。しかし、実際の時系列データは非線形で複雑な場合が多いです。
そこで、機械学習の手法であるランダムフォレストやニューラルネットワークを利用します。Pythonの代表的なライブラリとしてscikit-learnやTensorFlowがあります。
以下はランダムフォレストを用いた時系列予測の簡単な例です。
from sklearn.ensemble import RandomForestRegressor
import numpy as np
# 過去のデータ(特徴量)
X = np.array([[1], [2], [3], [4], [5]])
# 予測対象のデータ(目的変数)
y = np.array([2, 3, 2, 5, 4])
model = RandomForestRegressor()
model.fit(X, y)
# 未来の値を予測
future = np.array([[6]])
prediction = model.predict(future)
print(prediction)
このように機械学習を取り入れることで、複雑な時系列データの予測力向上が期待できます。初心者でもライブラリを活用することで簡単に実装できるため、時系列分析の幅が広がります。
異常検知への応用
時系列分析は、データの時間的変動を理解するだけでなく、異常検知にも有効です。異常検知とは、通常のパターンから外れたデータ点を特定することを指します。例えば、機械の故障予兆や金融取引の不正検出などに応用されています。
基本的な方法の一つに「予測誤差を利用する」手法があります。まず、時系列モデルで次の値を予測し、実際の値との差を計算します。差の大きい点は異常の可能性が高いと判断します。
具体的には、自己回帰モデル(ARモデル)を用いて、予測値を
\[ \hat{x}_t = \phi_1 x_{t-1} + \phi_2 x_{t-2} + \cdots + \phi_p x_{t-p} \]
と計算します。ここで、\( \phi_i \)はモデルの係数です。予測誤差は
\[ e_t = x_t – \hat{x}_t \]
で表され、\( e_t \)が一定の閾値を超えると異常と判定します。
Pythonでは、statsmodelsライブラリを使ってARモデルを簡単に実装できます。以下は基本的なコード例です。
from statsmodels.tsa.ar_model import AutoReg
import numpy as np
# サンプル時系列データ
data = np.array([1.0, 1.2, 1.1, 1.3, 5.0, 1.2, 1.1])
# モデルの学習(ラグ=2)
model = AutoReg(data[:-1], lags=2).fit()
# 次の値の予測
pred = model.predict(start=len(data)-1, end=len(data)-1)
# 予測誤差の計算
error = data[-1] - pred[0]
print(f"予測値: {pred[0]:.2f}, 実測値: {data[-1]}, 誤差: {error:.2f}")
このように、予測誤差が大きければ異常検知のシグナルとなります。異常検知は実運用で閾値の設定やモデル選択が重要ですが、時系列分析の基礎を理解することで、より精度の高い分析が可能です。
今後注目される時系列分析の技術
時系列分析は、過去のデータから未来を予測する重要な技術です。近年では、従来の統計モデルに加え、機械学習や深層学習を用いた手法が注目されています。特に、長期依存関係を捉えるために「LSTM(Long Short-Term Memory)」や「Transformer」モデルが多く利用されています。
例えば、LSTMは通常のリカレントニューラルネットワーク(RNN)の問題点である勾配消失を解決し、時系列データの長期的なパターンを学習できます。
また、Transformerは自己注意機構を用いて並列処理が可能で、金融や気象予測など大規模データに対して高速かつ高精度な予測を実現します。
実装例として、Pythonの有名なライブラリ「statsmodels」や「TensorFlow」を活用することで、初心者でも取り組みやすい環境が整っています。以下は、簡単なLSTMモデルの構築例です。
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
# 入力データの形状 (サンプル数, 時系列長, 特徴量数)
X_train = np.random.rand(100, 10, 1)
y_train = np.random.rand(100, 1)
model = Sequential()
model.add(LSTM(50, activation='relu', input_shape=(10, 1)))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')
model.fit(X_train, y_train, epochs=20, verbose=1)
このように、最新技術を取り入れることで、より精度の高い時系列分析が可能になります。初心者の方も基本を押さえつつ、これらの技術に挑戦してみてください。