Pythonで学ぶADF検定の基礎

Pythonで学ぶADF検定の基礎

デジタル化の波が押し寄せる中で、ビジネスにおけるデータの重要性はますます高まっています。

特に、時系列データは経済指標、株価、気象情報など、あらゆる分野で収集されており、その分析から得られる洞察は企業の意思決定を大きく左右します。

今回は、時系列分析の一手法であるADF検定をPythonを用いて学び、そのビジネスへの応用まで簡単に解説します。

時系列分析を通じて、データからより深い洞察を得る方法を理解し、実務への応用を目指しましょう。

時系列分析の重要性とADF検定の役割

時系列分析は、時間とともに観測されるデータの系列を分析する手法です。

この分析を通じて、データに含まれるパターンを発見し、未来の値を予測することが可能になります。

ビジネスの世界では、時系列分析を用いて市場のトレンドを読み解いたり、需要の予測、リスクの管理を行ったりすることが一般的です。

  • 在庫管理: 過去の販売データを分析して、将来の需要を予測し、適切な在庫レベルを維持
  • 市場分析: 経済指標や消費者の行動パターンの時系列データを分析して、市場のトレンドを把握
  • 価格戦略: 競合他社の価格設定の変遷を時系列分析し、最適な価格戦略を立案

 

ADF検定(Augmented Dickey-Fuller test)は、時系列データが定常性を持つかどうかを調べるための統計的手法です。

定常性とは、時系列データの統計的特性(平均や分散など)が時間に依存せず一定であることを指します。

多くの時系列モデルは、データが定常であることを前提としています。したがって、ADF検定を通じてデータがこの前提条件を満たしているかを確認することは、時系列分析を正確に行う上で非常に重要です。

ADF検定では、データに単位根が存在するかどうかを検定します。

単位根が存在する場合、データは非定常であり、予測モデルを構築する前に差分を取るなどの前処理が必要になります。逆に、単位根が存在しない場合は、データは定常性を持っていると判断されます。

  • 帰無仮説(H0): 時系列データに単位根が存在し、したがって非定常である。
  • 対立仮説(H1): 3つの異なる形式が考えられますが、基本的には時系列データが定常であることを示唆します。

異なる形式の対立仮説とは、以下の3つです。

1. 定数項のみを含むモデル

時系列データが定常であるという状況の対立仮説で、最も一般的なものです。

2. 定数項とトレンド項(ドリフト)を含むモデル

線形トレンド(ドリフト)を含むが、そのトレンドを除去した後の時系列データ(例:差分系列)は定常であるという状況の対立仮説です。

3. 定数項、線形トレンド、二次トレンドを含むモデル

時系列データが線形および二次のトレンド成分を含んでいるが、これらを除去した後は定常であるという状況の対立仮説です。

 

時系列データと単位根過程

 時系列データの特徴

時系列データは、定期的な間隔で観測されるデータの系列です。

時系列データの主な特徴は、時間の経過と共に観測されるため、データポイント間には時間的な依存関係が存在することです。

この依存関係は、過去のデータが未来のデータに影響を与えるという形で現れます。時系列データを扱う際には、この時間的な依存性を考慮することが重要です。

 

 単位根過程とは?

時系列データが単位根過程である場合、そのデータ系列は時間とともにその平均や分散が変動し続ける特性を持ちます。

このようなデータ系列は非定常であり、分析する前にデータを定常化する必要があります。

 

単位根過程を簡単な例を用い説明します。

今、以下のようなAR(1)(1次の自己回帰モデル)を考えます。

Yt=ϕYt1+ϵt\displaystyle Y_t = \phi Y_{t-1} + \epsilon_t
  • YtY_t:時刻 tt での時系列データの値
  • ϕ\phi:自己回帰係数
  • Yt1Y_{t-1}:時刻 t1t-1 での時系列データの値
  • ϵt\epsilon_t:時刻 tt での白色ノイズ(平均0、一定の分散を持つランダムな変動)

単位根過程の場合、ϕ=1\phi = 1 と設定すると、モデルは以下のようになります。ランダムウォークとも呼ばれます。

Yt=Yt1+ϵt\displaystyle Y_t = Y_{t-1} + \epsilon_t

この式を繰り返し適用して、YtY_t をさらに過去の項で表すと、以下のようになります。

Yt=Y0+ti=1ϵi\displaystyle Y_t = Y_0 + \sum_{t}^{i=1}\epsilon_i
  • Y0Y_0:初期値
  • ϵi\epsilon_i:時刻 ii での白色ノイズ

このプロセスの期待値(平均)を計算すると、以下のようになります。

E[Yt]=E[Y0]+ti=1E[ϵi]\displaystyle E[Y_t] = E[Y_0] + \sum_{t}^{i=1}E[\epsilon_i]

白色ノイズ ϵi\epsilon_i の期待値が0であると仮定すると、期待値 E[Yt]E[Y_t] は初期値 E[Y0]E[Y_0] に等しく、時間に依存しないことがわかります。

しかし、この平均は初期値に依存し、初期値が未知の場合、平均が不定となりうることを示しています。

分散については、時系列の各項が独立であり、ϵi\epsilon_i の分散が σ2\sigma^2 で一定であると仮定すると、以下のようになります。

Var[Yt]=Var[Y0]+ti=1Var[ϵt]=Var[Y0]+tσ2\displaystyle \begin{array}{ll} Var[Y_t] & = Var[Y_0] + \sum_{t}^{i=1}Var[\epsilon_t] \\[5pt] & = Var[Y_0] + t\sigma^2 \end{array}

 

この式から、時系列 YtY_t の分散が時間 tt に依存し、時間が経つにつれて線形に増加することがわかります。

これは、単位根過程において時系列が時間とともにその分散が変化し続けることを意味し、この性質が非定常性の一因となっています。

以上より、この単位根過程では時系列データの平均は初期値に依存し、分散は時間とともに線形に増加するため、時系列は定常状態にならず、その統計的特性が時間と共に変化し続けることが分かります。

 

 定常性とは?

時系列データが定常であるとは、その統計的特性(例えば平均や分散)が時間とともに変化しないことを意味します。定常性を持つ時系列データは、予測モデルの構築に適しています。

定常性を時系列データは、以下の条件を満たすデータです。

平均が一定

E[Yt]=μ\displaystyle E[Y_t]=\mu E[Yt]E[Y_t] は時点 tt での時系列データの期待値(平均)です。μ\mu は時間に依存しない定数です。

分散が一定

Var(Yt)=σ2\displaystyle Var(Y_t)=\sigma^2 Var(Yt)Var(Y_t) は時点 tt での時系列データの分散です。σ2\sigma^2 は時間に依存しない定数です。

自己共分散がラグにのみ依存

Cov(Yt,Ytk)=γk\displaystyle Cov(Y_t,Y_{t-k})=\gamma_k Cov(Yt,Ytk)Cov(Y_t,Y_{t-k}) は時点 tt とその kk 時間前の時点 tkt-k の間の自己共分散であり、この値はラグ kk にのみ依存し、時点 tt には依存しません。γk\gamma_kはラグ tt の自己共分散を表す定数です。

定常性の定義には弱定常性(平均と自己共分散が時間不変であること)と強定常性(全ての統計的性質が時間不変であること)がありますが、一般に時系列分析では弱定常性がよく使用されます。今示した3条件は、弱定常性の条件を表しています。

定常性の確認は時系列分析において基本的なステップであり、ADF検定はこの確認作業を行うための強力なツールです。

 

PythonでADF検定を実装する

時系列データの定常性を検定するには、Augmented Dickey-Fuller (ADF) 検定が広く用いられています。PythonのStatsmodelsライブラリを使用してADF検定を実装する方法について説明します。

 

 必要なPythonパッケージの紹介

ADF検定を行うには、statsmodels パッケージが必要です。このパッケージは統計モデリング、経済計量学、時間系列分析のためのクラスと関数を提供します。

まずはこのパッケージをインストールしましょう(まだインストールしていない場合)。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
pip install statsmodels
pip install statsmodels
pip install statsmodels

 

 ADF検定の実装手順

ADF検定を実施するための基本的なステップは以下の通りです。

  1. 必要なライブラリのインポート
  2. 検定を行う時系列データの準備
  3. ADF検定の実行
  4. 検定結果の解釈

 

以下に、これらのステップを実装したサンプルコードを示します。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# 必要なライブラリのインポート
import numpy as np
import pandas as pd
from statsmodels.tsa.stattools import adfuller
# 時系列データの生成(サンプルとしてランダムウォークを使用)
np.random.seed(42)
data = pd.Series(np.random.randn(100).cumsum())
# ADF検定の実行
result = adfuller(data)
# 検定結果の表示
print('ADF Statistic: %f' % result[0])
for key, value in result[4].items():
print('\t%s: %.3f' % (key, value))
print('p-value: %f' % result[1])
# 必要なライブラリのインポート import numpy as np import pandas as pd from statsmodels.tsa.stattools import adfuller # 時系列データの生成(サンプルとしてランダムウォークを使用) np.random.seed(42) data = pd.Series(np.random.randn(100).cumsum()) # ADF検定の実行 result = adfuller(data) # 検定結果の表示 print('ADF Statistic: %f' % result[0]) for key, value in result[4].items(): print('\t%s: %.3f' % (key, value)) print('p-value: %f' % result[1])
# 必要なライブラリのインポート
import numpy as np
import pandas as pd
from statsmodels.tsa.stattools import adfuller

# 時系列データの生成(サンプルとしてランダムウォークを使用)
np.random.seed(42)
data = pd.Series(np.random.randn(100).cumsum())

# ADF検定の実行
result = adfuller(data)

# 検定結果の表示
print('ADF Statistic: %f' % result[0])
for key, value in result[4].items():
    print('\t%s: %.3f' % (key, value))
print('p-value: %f' % result[1])

 

簡単なコード解説をします。

必要なライブラリのインポート

  • このコードでは`numpy`、`pandas`、および`statsmodels`の`adfuller`関数を読み込んでいます。

時系列データの生成

  • numpyの乱数生成器のシードを設定し、ランダムウォークのサンプルデータを生成します。
  • ランダムウォークは、前の値に正規分布に従うランダムな変動を加えたもので、非定常な時系列データの一例です。

ADF検定の実行

  • adfuller関数を使用してADF検定を実行します。
  • この関数は検定統計量、p値、使用されたラグ数、検定に使用された観測数、各信頼区間での臨界値、および最大情報量基準(AIC)を含む結果を返します。

検定結果の表示

  • 検定統計量(result[0])
  • 1%、5%、10%の臨界値
  • p値(result[1])

 

以下、実行結果です。

ADF Statistic: -1.358332
	1%: -3.498
	5%: -2.891
	10%: -2.583
p-value: 0.602081

 

ADF検定の結果の解釈

ADF検定を実行した後、その結果をどのように解釈するかが重要です。

ADF検定の出力結果の主要な部分について解説し、それらがどのように時系列データの定常性の判断に役立つかを説明します。

 

 ADF統計量とp値

ADF検定の結果はいくつかの部分から構成されますが、特に重要なのはADF統計量p値です。

ADF統計量

  • この値は時系列データが非定常である可能性を示します。
  • より具体的には、ADF統計量が特定の臨界値よりも小さい場合、帰無仮説(時系列データに単位根が存在し、データが非定常である)を棄却することができます。

p値

  • p値は、帰無仮説が正しいという前提のもとで、観測された結果(またはより極端な結果)が得られる確率です。
  • 通常、p値が0.05(または選択した他の有意水準)以下の場合、帰無仮説を棄却し、データが定常であると結論付けます。

 

 検定結果の判断基準

ADF検定の結果を解釈する際の一般的なガイドラインは以下の通りです。

ADF統計量が臨界値よりも小さい場合(例えば、1%、5%、10%の有意水準での臨界値)

帰無仮説を棄却し、時系列データが定常であると判断します。

p値が選択した有意水準(例えば0.05)以下の場合

帰無仮説を棄却し、データが定常であると結論付けます。

 

 例: ADF検定結果の解釈

先ほどの時系列データに対してADF検定を実施したところ、以下の結果が得られました。

  • ADF統計量: -1.358332
  • p値: 0.602081
  • 1%の臨界値: -3.498
  • 5%の臨界値: -2.891
  • 10%の臨界値: -2.583

検定統計量はいずれの臨界値よりも大きく、p値も高いため、データが定常とは言えないという結果が示されています。そのため、非定常であると判断します。

 

ビジネスへの応用:時系列分析を用いた事例紹介

時系列分析、特にADF検定のような定常性の検定は、データが分析の前提条件を満たしているかを確認するために不可欠です。

これらの手法を適切に利用することで、ビジネスにおける意思決定の精度を高め、戦略的アドバンテージを獲得することができます。

 

 ADF検定を用いたビジネス事例

ADF検定が、直接的にビジネス活用につながるというより、ADF検定による時系列の特徴を把握したり、予測モデルなどに活かすといった、活用になります。

 

  販売予測の例

小売業者にとって、将来の販売量を正確に予測することは、適切な在庫管理と効果的なマーケティング戦略を実施する上で不可欠です。

そこで、過去の販売データを収集し、ADF検定によりデータの定常性を確認しました。定常性などを確認できた後、季節性ARIMAモデル(SARIMA)を適用し、季節変動を考慮した販売予測を行いました。

予測によって、特定の季節やイベントにおける販売増加を事前に予見できるようになりました。

これによって、在庫過剰や品切れを防ぎ、キャンペーンや割引のタイミングを最適化することが可能になりました。

 

  需要予測による在庫管理の最適化の例

正確な需要予測は、在庫コストの削減と効率的なサプライチェーン管理に直結します。

ある製造業で、過去の販売実績と季節的要因を分析し、ADF検定でデータの定常性を確認しました。定常化されたデータに基づき、時系列分析モデルを用いて需要予測を行うようになりました。

精度の高い需要予測によって、生産計画の最適化、在庫レベルの適正化、サプライチェーン全体の効率化が実現しました。

これにより、顧客満足度の向上とコスト削減が同時に達成されました。

 

 時系列分析で得られるインサイトの活用方法

戦略立案

時系列分析から得られるトレンドや季節パターンの情報は、マーケティング戦略や製品開発計画の策定に活用されます。例えば、消費者行動の季節的変動を理解することで、キャンペーンのタイミングを最適化することができます。

リスク管理

金融業界では、時系列分析を用いて市場の変動やリスク要因を監視し、価格変動の予測やボラティリティの管理に役立てています。

オペレーションの最適化

生産計画や物流の最適化にも時系列分析が活用されます。生産量の季節的変動やトレンドを予測することで、資源の有効活用やコスト削減に繋がります。

 

まとめ

今回は、ADF検定の概要と、Pythonでの実装方法を解説し、特にビジネスシナリオでの応用例を紹介しました。

時系列データの定常性を確認するADF検定は、予測モデリングにおいて不可欠なステップです。

  • ADF検定は時系列データが予測モデリングに適しているかどうかを判断するために重要です。
  • ビジネス応用では、定常性の確認を通じて、在庫管理や販売戦略などが最適化されます。
  • 実践的ステップには、データの前処理、定常性の検定、適切なモデル選択、モデルの検証が含まれます。

ADF検定と時系列分析をビジネスに適用することで、データ駆動型の意思決定を支援し、競争力を向上させることができます。