注目キーワード
  1. Python
  2. コンペ

Pythonによる時系列データ入門【2026年版】:ARIMAモデルを中心にグラフ分析から予測まで

この記事では、Pythonとstatsmodelsライブラリを使った時系列データの基本的な扱い方から、グラフ作成、予測モデルの構築に至るまでをステップバイステップで解説していきます。

目次

この記事で学べること

この記事では以下の内容をステップバイステップで解説します。

  • 時系列データの基本概念(トレンド・季節性・残差とは何か)
  • Pythonとstatsmodelsを使ったデータの可視化と成分分解
  • コレログラム(自己相関グラフ)の読み方
  • ARIMAモデル・SARIMAモデルの仕組みと実装手順
  • LSTMディープラーニングモデルによる時系列予測の基礎

Pythonの基本的な文法を理解していれば、統計や機械学習の専門知識がなくても読み進められます。

時系列データとは?

時系列データとは、簡単に言えば「時間と共に記録されたデータ」です。これは、毎日の気温、毎月の店舗売上、毎分のインターネットトラフィックなど、あらゆるものが対象になります。私たちの周りには、時間とともに変わる多くの事象があり、それらをデータとして記録することで、過去の変化を見たり未来を予測したりする手がかりを得ることができます。

特にビジネスの世界では、「売上は冬に上がる」「夏にはアイスクリームがよく売れる」といった季節のパターンや、経年での売上の増減といったトレンドが重要です。これらは、時系列データが時間の経過とともにどのように変化するかを示すもので、この情報は製品の需要予測や在庫管理に活用されます。

季節性とトレンド

季節性とトレンドは時系列データの重要な要素です。季節性は、1年の特定の時期に観測されるパターン、例えばクリスマス前の売上増加などを指します。一方、トレンドは、より長い期間にわたるデータの上昇や下降の傾向を指します。これらは乗法モデルで表されることが多く、これはデータの季節的変動が時間とともに増減することを表します。

次のセクションでは、これらの概念を実際の例に適用し、Pythonを使ってどのようにデータを分析するかを見ていきます。私たちはstatsmodelsという強力なツールを用いて、データを詳細に分析し、有益な洞察を抽出する方法を学んでいきます。実際のグラフを用いた分析は次のステップで紹介しますので、その準備として、まずは時系列データの基本をしっかりと理解しましょう。

時系列分析を始めるにあたり、Pythonで使える強力なライブラリの一つにstatsmodelsがあります。このライブラリを使うと、統計モデルを構築し、統計テストを実行し、データを探索・分析できます。特に時系列データの分析においては、データのトレンドや季節性などを見つけ出し、未来のデータを予測するのに役立ちます。

statsmodelsのインストール

まず最初に、statsmodelsを使うためには、Python環境にインストールする必要があります。ほとんどの場合、pipコマンドで簡単にインストールできます。

pip install statsmodels

のコマンドを実行することで、statsmodelsライブラリがあなたのコンピュータにダウンロードされ、インストールされます。

成分分解の基本

時系列データを分析する際には、データをその構成要素に分解することがしばしば行われます。このプロセスを「成分分解」と呼びます。具体的には、データからトレンド(長期的な変動)、季節性(定期的な変動)、残差(その他の変動)を抽出することを指します。

Pythonで成分分解を行うには、まずサンプルデータが必要です。ここでは、単純化のために、短い期間の気温データを模擬的に生成してみましょう。

import numpy as np
import pandas as pd
from statsmodels.tsa.seasonal import seasonal_decompose
import matplotlib.pyplot as plt

# 2023年の日付範囲を生成
date_range = pd.date_range(start='2023-01-01', end='2023-12-31', freq='D')

# 正弦波を使って、夏が暑く冬が寒い気温データを模擬
# np.cosを使って1年を通じての気温変化を模擬し、中心を20度に設定
data = 20 + np.cos(np.linspace(0, 2 * np.pi, len(date_range))) * -10  # 冬が寒く、夏が暑い
data += np.random.normal(0, 3, len(date_range))  # ランダムなノイズを追加

# pandasのSeriesとして時系列データを作成
time_series = pd.Series(data, index=date_range)

# 成分分解の実行
result = seasonal_decompose(time_series, model='additive')

# 結果のプロット
result.plot()
plt.show()

このコードは、seasonal_decompose関数を用いて時系列データを成分分解し、結果をグラフで表示します。グラフからは、データのトレンド、季節性、そして残差が視覚的に理解できます。

このプロセスを通じて、時系列データの基本的な特性を探ることができます。次のセクションでは、このデータをさらに深く分析し、どのようにして時系列データから有益な情報を引き出すかを見ていきます。

定常性とは何か:モデル構築の前に知っておきたいこと

ARIMAなどの予測モデルを正しく使うためには、定常性(Stationarity)という概念を先に理解しておくと、後の内容がぐっとわかりやすくなります。

定常な時系列とは、時間が経っても平均・分散が一定なデータのことです。

イメージで言うと:

  • 定常:毎日の気温が年間を通じて±5℃の範囲で安定して変動している状態
  • 非定常:毎年じわじわと平均気温が上昇し続けている状態(トレンドあり)

実際の売上データや気温データの多くはトレンドや季節性を含むため非定常です。ARIMAモデルの「I(Integrated=統合)」の部分は、差分を取ることでこの非定常性を除去するステップです。

定常性の確認方法(ADF検定):

from statsmodels.tsa.stattools import adfuller

# ADF検定の実施(your_time_seriesを自分のデータに置き換えて使用)
result = adfuller(your_time_series)
print(f'ADF統計量: {result[0]:.4f}')
print(f'p値: {result[1]:.4f}')
# p値 < 0.05 であれば「定常」とみなせる

p値が0.05未満であれば定常と判断できます。0.05以上の場合は差分処理(後述のARIMAパラメータ「d」を1に設定するなど)を行ってから分析を進めます。

時系列データの視覚化

時系列データの分析では、データの視覚化が重要な役割を果たします。視覚化によって、データのトレンド、季節性、異常値などを直感的に理解することができます。このセクションでは、Pythonを使用して時系列データを視覚化するいくつかの方法について紹介します。

時系列グラフの基本

時系列データをプロットする基本的な方法から始めます。Pythonのmatplotlibライブラリを使用すると、データを簡単にグラフにすることができます。

import matplotlib.pyplot as plt

# フォント設定
plt.rcParams['font.family'] = 'Meiryo'  

# サンプルデータの時系列グラフをプロット
plt.figure(figsize=(10, 6))
plt.plot(time_series.index, time_series, label='気温')
plt.title('2023年の気温変動')
plt.xlabel('日付')
plt.ylabel('気温 (°C)')
plt.legend()
plt.show()

この基本的なグラフでは、年間を通じた気温の変動を視覚的に捉えることができます。特に、夏に最高気温、冬に最低気温を記録するパターンが明確に見て取れます。

コレログラムによる自己相関の分析

時系列データの特性をさらに深く理解するためには、自己相関を調べることが有効です。自己相関とは、時系列データ内の異なる時点の値がどのように関連しているかを示す指標です。statsmodelsライブラリのplot_acf関数を使用して、コレログラムを描画してみましょう。

from statsmodels.graphics.tsaplots import plot_acf

# コレログラムのプロット
plot_acf(time_series)
plt.show()

コレログラムは、時系列データの各ラグ(時間差)における自己相関を示すグラフです。自己相関とは、時系列データの異なる時点間での相関のことを指し、データポイントが時間的にどの程度関連しているかを数値化したものです。

コレログラムを見る際には以下の点に注意して解釈します:

ラグ0の自己相関:

ラグ0での自己相関は常に1です。これは、データポイントが自分自身と完全な正の相関を持つためです。

自己相関の振幅:

コレログラムの縦軸は自己相関の強さを表し、-1から1の範囲で示されます。値が1に近いほど強い正の相関、-1に近いほど強い負の相関を意味します。値が0に近い場合、相関はほとんどないと考えられます。

自己相関の減衰:

上のグラフでは、ラグが増加するにつれて自己相関の値が徐々に減少している様子が見られます。これは、時間が経過するにつれてデータポイント間の関連性が弱まっていることを示しています。

周期性の特定:

コレログラムで一定の間隔でピークが現れる場合、それはデータに周期性があることを示しています。例えば、ピークが毎12ラグごとに現れる場合、データには12単位の周期性があると解釈できます。

信頼区間:

グラフには通常、自己相関が統計的に有意であるかを示すための信頼区間(コレログラムの周りの薄い帯)が描かれています。自己相関の棒がこの帯を超えている場合、そのラグにおける自己相関は統計的に有意であり、偶然の結果ではないと考えられます。

上のコレログラムにおいて、多くのラグで自己相関が信頼区間を超えていることが確認できます。これは、時系列データが強い周期性を持っていることを示唆しています。また、自己相関が徐々に減少していることから、これらの周期的な変動は時間とともに影響が減少していく傾向にあることも読み取れます。この情報は、データに季節性や他の定期的なパターンが含まれていることを示唆しており、この分析は予測モデルを構築する際に非常に有益な情報となります。

外れ値の視覚化

時系列データにおける外れ値は、異常な気象現象や計測ミスなど、さまざまな原因で発生することがあります。外れ値を視覚化することで、これらの異常値を迅速に識別し、分析における考慮事項とすることができます。matplotlibfill_between関数を使用して、特定の条件下でのデータポイントを強調表示する方法を紹介します。

# 外れ値を強調表示するグラフの作成
plt.figure(figsize=(10, 6))
plt.plot(time_series.index, time_series, label='気温')
plt.fill_between(time_series.index, time_series, where=(time_series < 10), color='blue', alpha=0.3, label='低温')
plt.fill_between(time_series.index, time_series, where=(time_series > 30), color='red', alpha=0.3, label='高温')
plt.title('2023年の気温変動と外れ値の視覚化')
plt.xlabel('日付')
plt.ylabel('気温 (°C)')
plt.legend()
plt.show()

この方法を用いることで、特に低温や高温といった外れ値を直感的に捉え、分析の際の重要な手がかりとすることができます。今回の例では異常値がなかったため、10℃未満、あるいは30℃超といった値を外れ値とみなしていますが、実際には気温としては不適切な値などを検知する際などに利用可能です。

時系列データの予測モデル構築

次に時系列データを予測するためのモデル構築に移りますが、まずはどのようなモデルがあるかを見てみたいと思います。

一般的な時系列モデルの概観

時系列分析にはさまざまなアプローチが存在します。ここでは、主に使用されるモデルの種類とその特徴を簡単に解説します。

移動平均モデル (MA)

移動平均モデルは、過去の予測誤差の平均を利用して未来の値を予測します。シンプルで理解しやすいモデルですが、複雑な時系列データのパターンを捉えるには限界があります。

自己回帰モデル (AR)

自己回帰モデルは、過去の値を利用して未来の値を予測します。時系列データの自己相関を基にした予測を行うため、周期性やトレンドを持つデータに適しています。

統合移動平均自己回帰モデル (ARIMA)

ARIMAモデルは、自己回帰モデルと移動平均モデルの特徴を組み合わせ、さらに非定常性を扱うことができるようにしたモデルです。トレンドや季節性を取り除いたデータの予測に有効です。

季節調整統合移動平均自己回帰モデル (SARIMA)

SARIMAモデルは、ARIMAモデルに季節成分を加えたものです。季節性を持つ時系列データの分析に特に適しており、予測精度の向上が期待できます。

ベクトル自己回帰モデル (VAR)

複数の時系列データが相互に影響し合う場合に使用されるモデルです。各時系列データを同時に分析し、予測することが可能です。

ディープラーニングモデル

LSTM(Long Short-Term Memory)などのディープラーニングモデルは、非線形な時系列データや複雑なパターンを持つデータの予測に有効です。大量のデータから学習する能力が高い反面、モデルの解釈性には課題があります。

モデル選択の判断フロー

どのモデルを使うべきか迷ったときは、以下のフローを参考にしてください。

データを確認する
    ↓
季節性がある?(例:毎年夏に売上が上がるなど)
  Yes → SARIMAを検討
  No  → ARIMAを検討
    ↓
複数の時系列が相互に影響し合っている?
(例:気温と電力消費量を同時に分析したい)
  Yes → VARを検討
  No  → 単変量モデル(ARIMA/SARIMA)で十分
    ↓
非線形なパターンや長期的な依存関係が強い?
(例:数年分のSNSデータなど複雑な変動)
  Yes → LSTMなどのディープラーニングを検討
  No  → 統計モデルで対応

データ量の目安:

  • 数十〜数百点程度 → ARIMA/SARIMA(統計モデル)が安定しやすい
  • 数千点以上の大量データ → LSTMが複雑なパターンを捉えやすい

初めて時系列分析を行う場合は、まずARIMAから始めることを推奨します。

ARIMAモデルの理解と実装

時系列データの予測には様々な手法が存在しますが、特にARIMAモデルはその**解釈のしやすさと安定した予測性能**から広く利用されています。データ量が少ない場合(数十〜数百点程度)や、予測結果の根拠を説明できることが重要な場面では、LSTMなどのディープラーニングよりもARIMAが適しているケースが多いです。ここでは、ARIMAモデルの基本構造と、Pythonでの簡単な実装方法を見ていきましょう。

概要

ARIMA(AutoRegressive Integrated Moving Average)モデルは、時系列データの分析と予測に広く用いられる強力なモデルです。このモデルは、データの非定常性を取り除くために差分を取る「統合(I)」、過去の値に基づいて未来を予測する「自己回帰(AR)」、そして過去の予測誤差を利用する「移動平均(MA)」の3つの要素から成り立っています。

ARIMAモデルの構成要素

  • **AR(自己回帰)**部分は、時系列データの過去の値が未来の値にどのように影響するかをモデル化します。パラメータpは、モデルが参照する過去の観測値の数を指します。
  • **I(統合)**部分は、時系列データを差分して非定常性を取り除くプロセスを表します。パラメータdは、差分を取る回数を指します。
  • **MA(移動平均)**部分は、モデルの誤差項が過去の予測誤差にどのように影響されるかをモデル化します。パラメータqは、誤差項のモデリングに使用される過去の誤差項の数を指します。

ARIMAモデルの実装例

Pythonのstatsmodelsライブラリを用いて、簡単なARIMAモデルを実装し、時系列データの予測を行う例を紹介します。まずは、適切なパラメータ(p, d, q)を選択することが重要です。

import numpy as np
import pandas as pd
from statsmodels.tsa.arima.model import ARIMA
import matplotlib.pyplot as plt

# サンプルデータの生成(ここでは簡単な時系列データを想定)
np.random.seed(42)
data = np.random.randn(100).cumsum()

# pandas Seriesに変換
time_series = pd.Series(data)

# ARIMAモデルの定義とフィット
# ここではp=2, d=1, q=2としてみます
model = ARIMA(time_series, order=(2, 1, 2))
model_fit = model.fit()

# 未来の値を予測
forecast = model_fit.forecast(steps=10)

# 元の時系列データと予測値のプロット
plt.figure(figsize=(10, 6))
plt.plot(time_series, label='Original')
plt.plot(np.arange(len(time_series), len(time_series) + 10), forecast, label='Forecast')
plt.title('Time Series Forecasting with ARIMA')
plt.xlabel('Time')
plt.ylabel('Value')
plt.legend()
plt.show()

このコード例では、ARIMAモデルを定義し、フィットさせた後に未来の値を予測しています。実際のデータ分析では、まずデータの観察、次に適切なp, d, qの選択、そしてモデルの診断を行い、最適なモデルを決定するプロセスが重要になります。

モデルの選択と評価

ARIMAモデルのパフォーマンスを評価し、適切なパラメータを選択するには、AIC(赤池情報量基準)やBIC(ベイズ情報量基準)などの統計的指標を参照することが一般的です。これらの指標は、モデルの複雑さとデータへの適合度をバランス良く評価するためのものです。

ARIMAの実装まで進めてみて「Pythonや機械学習をもっと体系的に学びたい」と感じたら、独学とスクールのどちらが自分のペースに合っているかを整理してみるのも一つの手です。

AI時代にプログラミングスクールが必要な人・独学で足りる人の分かれ目を確認する

季節性を考慮した時系列分析:SARIMAモデル

時系列データにおいて季節性のパターンは一般的であり、これを考慮に入れた予測モデルを構築することが、予測の精度を高める鍵になります。SARIMAモデルは、ARIMAモデルを拡張し、季節性の影響を含む時系列データの分析と予測を可能にします。

SARIMAモデルの基本構造

SARIMAモデルは、(p, d, q)×(P, D, Q, S)という形式で表され、季節性と非季節性の両方の要素をモデル化します。ここで、p, d, qは非季節的成分を示し、P, D, Qは季節的成分を示し、Sは季節の期間を表します。この複合的な構造により、SARIMAモデルはより複雑な時系列データのパターンを捉えることができます。

PythonでのSARIMAモデルの実装

statsmodelsライブラリを使用することで、Pythonで簡単にSARIMAモデルを実装し、時系列データの予測を行うことができます。以下は、SARIMAモデルの基本的な実装例です。

import numpy as np
import pandas as pd
from statsmodels.tsa.statespace.sarimax import SARIMAX
import matplotlib.pyplot as plt

# サンプル時系列データの生成
np.random.seed(42)
data = np.sin(np.linspace(0, 2 * np.pi, 24)) + np.random.normal(0, 0.1, 24)
time_series = pd.Series(data, index=pd.date_range(start="2023-01-01", periods=24, freq="M"))

# SARIMAモデルの定義とフィット
# ここでは、非季節性成分としてp=1, d=1, q=1、季節性成分としてP=1, D=1, Q=1, S=12を使用
model = SARIMAX(time_series, order=(1, 1, 1), seasonal_order=(1, 1, 1, 12))
model_fit = model.fit()

# 未来の値を予測
forecast = model_fit.forecast(steps=12)

# 元の時系列データと予測値のプロット
plt.figure(figsize=(10, 6))
plt.plot(time_series, label='Original')
plt.plot(forecast, label='Forecast', linestyle='--')
plt.title('Time Series Forecasting with SARIMA')
plt.legend()
plt.show()

この例では、24ヶ月のデータに基づいて次の12ヶ月の予測を行っています。SARIMAモデルの季節的オーダーは、データに見られる季節性のパターンに基づいて選択されます。

SARIMAモデルの応用

SARIMAモデルは、季節性の影響が顕著な時系列データ、例えば小売業の月間売上や気象データの分析に特に有効です。適切なパラメータを選択することで、データの季節性パターンを正確にモデル化し、将来の時点での値を予測することができます。

時系列モデルの評価指標まとめ

モデルを構築したら、予測がどれくらい正確かを数値で確認することが重要です。主な評価指標を整理します。

指標一言でいうと特徴
MAE(平均絶対誤差)予測のズレの平均外れ値の影響を受けにくく安定した評価ができる
RMSE(二乗平均平方根誤差)ズレを二乗してから平均した値大きなズレを特に重く評価したいときに使う
MAPE(平均絶対パーセント誤差)ズレを割合で表した指標売上規模が違うデータ間での比較に便利
AIC / BIC統計モデル専用の選択基準モデルの複雑さと予測精度のバランスを評価する
from sklearn.metrics import mean_absolute_error, mean_squared_error
import numpy as np

# y_true: 実際の値、y_pred: モデルの予測値
mae = mean_absolute_error(y_true, y_pred)
rmse = np.sqrt(mean_squared_error(y_true, y_pred))
mape = np.mean(np.abs((y_true - y_pred) / y_true)) * 100

print(f'MAE: {mae:.2f}')
print(f'RMSE: {rmse:.2f}')
print(f'MAPE: {mape:.2f}%')

ARIMA/SARIMAではまずAIC・BICを参考にパラメータを選び、最終的にMAEやRMSEでテストデータに対する予測精度を確認するという流れが一般的です。

ディープラーニングによる時系列予測

近年、ディープラーニングは多くの領域で注目されており、時系列データの予測においても例外ではありません。ディープラーニングモデル、特にLSTMは、その長期依存性を捉える能力により、時系列予測の分野で非常に効果的です。このセクションでは、LSTMモデルの基本的な概念と、Pythonを使った実装例を紹介します。

LSTMモデルの概念

LSTM(Long Short-Term Memory)は、従来のリカレントニューラルネットワーク(RNN)が抱える**「勾配消失問題」**(学習が進むにつれて遠い過去の情報を忘れてしまう問題)を解決するために開発されました。LSTMは「入力ゲート」「忘却ゲート」「出力ゲート」という仕組みにより、どの情報を長期記憶に残すかを学習できる特殊なRNNです。これにより、時系列データのように時間的に連続するデータを扱う際に特に有効です。なお、2026年現在はLSTMに加えて**Transformerベースのモデル**(Temporal Fusion TransformerやPatchTSTなど)も時系列予測で注目されており、大規模データでの利用が広がっています。

PythonによるLSTMモデルの実装

PythonのKerasライブラリ(2026年現在はTensorFlow 2.x系に統合されており、`import tensorflow as tf`のあとに`tf.keras`として使用するか、独立パッケージ`keras`バージョン3.x系をインストールして使用できます)を使うことで、LSTMモデルを比較的シンプルなコードで実装することができます。ここでは、簡単な時系列データに対するLSTMモデルの構築と学習のプロセスを示します。

from keras.models import Sequential
from keras.layers import LSTM, Dense
import numpy as np

# サンプルデータの生成(例として正弦波を使用)
timesteps = 100
data = np.sin(np.linspace(0, 2 * np.pi, timesteps))

# データの前処理
# LSTMに入力するためのデータ形状に変換する必要があります
X = data[:-1].reshape(1, timesteps - 1, 1)
y = data[1:].reshape(1, timesteps - 1, 1)

# モデルの定義
model = Sequential()
model.add(LSTM(50, activation='relu', input_shape=(timesteps - 1, 1)))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')

# モデルの学習
model.fit(X, y, epochs=200, verbose=0)

# 予測値の生成
predicted = model.predict(X)

# 実データと予測データのプロット
import matplotlib.pyplot as plt

plt.plot(data[1:], label='Actual')
plt.plot(predicted.flatten(), label='Predicted')
plt.title('LSTM Time Series Prediction')
plt.legend()
plt.show()

このコード例では、LSTMモデルを使用して単純な時系列データの次のステップを予測しています。実際の応用では、より複雑なデータセットや、複数の特徴を持つ時系列データに対してもこのアプローチを適用することが可能です。

LSTMモデルの応用

LSTMモデルは、金融市場の予測、気象予報、言語モデリングなど、様々な分野で応用されています。その強力な時系列データの学習能力により、複雑な時系列パターンを予測する際に有効なツールとなります。


この記事を通じて、時系列データ分析の基礎からディープラーニングによる予測までを見てきました。今回は入門の内容でしたが、これをきっかけに実践を積んで精度の高いモデルを構築してもらえたら嬉しいです。

まとめ:時系列分析の学習ステップと次のアクション

この記事では、Pythonを使った時系列データ分析の基礎から実践まで以下の内容を解説しました。

  1. 時系列データの基本概念:トレンド・季節性・残差の理解
  2. 成分分解seasonal_decomposeによる視覚的把握
  3. データの視覚化:時系列グラフ・コレログラム・外れ値の可視化
  4. 定常性の確認:ADF検定によるモデル適用前の前処理
  5. ARIMAモデル:パラメータ(p,d,q)の選択からフィットまで
  6. SARIMAモデル:季節性を考慮した予測への拡張
  7. LSTMモデル:ディープラーニングによる複雑パターンの学習

次のステップとして

  • 自分のデータ(売上・気温・アクセス数など)でARIMAを実装してみる
  • pmdarimaライブラリのauto_arimaを使ったパラメータ自動選択を試す
  • Kaggleの時系列コンペ(例:Store Sales Forecasting)で実践経験を積む

Pythonのスキルをさらに体系的に身につけたいと感じたら、独学とスクールの使い分けを検討してみてください。

関連記事AI時代にプログラミングスクールが必要な人・独学で足りる人の分かれ目

データの可視化をさらに深めたい方はこちらも参考にしてください。

関連記事matplotlibのカラーマップ(cmap)と色指定の使い方を解説

最新情報をチェックしよう!