1. はじめに
時系列データを分析していると、一見強い相関があるように見えても、実際には何の関係もないというケースに遭遇することがあります。これが「見せかけの回帰」と呼ばれる現象です。
統計的に有意な結果が出たからといって、安心してはいけません。特にトレンドを持つ時系列データ同士を分析する際には、この見せかけの回帰という罠に陥りやすいのです。
この記事では、見せかけの回帰がなぜ起こるのか、どうやって見抜くのか、そしてどのように回避すればよいのかを、実例とともに解説していきます。
2. 見せかけの回帰とは
定義と概要
見せかけの回帰とは、実際には因果関係がない2つの時系列データ間で、統計的に有意な相関が見られてしまう現象を指します。英語ではspurious regressionと呼ばれています。
通常の回帰分析では、高いR²値やt統計量の有意性が「良いモデル」の指標となりますが、時系列データではこれらの指標が誤解を招くことがあるのです。
具体例:世界のCO₂濃度と博士号授与者数
ある期間(例:1960年〜2020年)の時系列データを見ると、「世界の大気中CO₂濃度」と「世界で授与された博士号の総数」の間には、統計的に非常に強い正の相関が見られます。
どちらのデータも、この期間にわたって一貫して右肩上がりのトレンドを示しているからです。しかし、この結果から「博士号取得者が増えると、CO₂排出量が増える」あるいは「CO₂濃度が上がると、なぜか博士号取得者が増える」といった直接的な因果関係を推論するのは誤りです。
共通の要因(潜伏変数)
この見せかけの相関は、両方の変数に影響を与える共通の要因(潜伏変数)によって引き起こされています。
その共通要因とは、「世界的な経済成長」「産業化の進展」「高等教育への投資拡大」といった、長期的な社会の発展トレンドです。
このように、両方のデータが「社会経済の長期的な発展」という共通の右肩上がりのトレンド(非定常性)を持っているため、見かけ上の強い相関が生まれてしまうのです。
なぜ問題なのか
見せかけの回帰が問題なのは、存在しない関係性に基づいて意思決定を行ってしまうリスクがあるためです。ビジネスの現場では、このような誤った分析結果に基づいて戦略を立ててしまうと、期待した効果が得られないだけでなく、リソースの無駄遣いにもつながります。
3. 見せかけの回帰が起きる仕組み
非定常性とトレンドの影響
見せかけの回帰が発生する主な原因は、データの非定常性です。非定常な時系列データとは、平均や分散が時間とともに変化するデータのことを指します。
トレンドを持つデータは典型的な非定常データです。例えば、右肩上がりで増加し続けるデータは、時間とともに平均値が上昇しているため非定常となります。
単位根とは
単位根とは、時系列データが非定常であることを示す統計的な性質です。単位根を持つデータは、過去のショックの影響が永続的に残り続けるという特徴があります。
数式で表すと、次のような自己回帰モデルを考えます。
yt = ρyt-1 + εt
ここで、ρ = 1 の場合、このデータは単位根を持つと言い、非定常となります。
t統計量の見かけ上の有意性
非定常データ同士で回帰分析を行うと、標準的なt統計量の分布が理論的な前提を満たさなくなります。その結果、実際には無関係なデータであっても、t統計量が異常に大きくなり、有意であるという結果が出てしまうのです。
これは統計的検定の信頼性が損なわれていることを意味しますね。
4. 実際にやってみる:見せかけの回帰の再現
Pythonを使って、実際に見せかけの回帰を再現してみましょう。
ランダムウォークの生成
まず、互いに独立な2つのランダムウォークを生成します。ランダムウォークとは、前の値にランダムな変化を加えていく時系列データで、典型的な非定常データです。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats
import statsmodels.api as sm
# シード固定
np.random.seed(42)
# サンプル数
n = 1000
# 独立な2つのランダムウォークを生成
y1 = np.cumsum(np.random.randn(n))
y2 = np.cumsum(np.random.randn(n))
# データフレーム作成
df = pd.DataFrame({
'y1': y1,
'y2': y2
})
# プロット
plt.figure(figsize=(12, 4))
plt.plot(y1, label='Y1', alpha=0.7)
plt.plot(y2, label='Y2', alpha=0.7)
plt.xlabel('Time')
plt.ylabel('Value')
plt.legend()
plt.title('Two Independent Random Walks')
plt.grid(True, alpha=0.3)
plt.show()
回帰分析の実行
次に、この2つの独立なデータに対して回帰分析を実行してみます。
# 回帰分析の実行
X = sm.add_constant(df['y1'])
model = sm.OLS(df['y2'], X)
results = model.fit()
print(results.summary())
高いR²値の罠
この分析結果を見ると、驚くべきことに高いR²値と統計的に有意なt値が得られることがあります。しかし、これらのデータは完全に独立に生成されたものであり、何の関係もありません。
これが見せかけの回帰の恐ろしさです。統計的指標だけを見ていると、本当は関係のないデータなのに、強い相関があると誤解してしまいます。
5. 見せかけの回帰を見抜く方法
見せかけの回帰を見抜くには、いくつかの診断方法があります。
データの可視化
まずは基本中の基本、データをプロットして視覚的に確認することが重要です。明確なトレンドや周期性が見られる場合は、見せかけの回帰の可能性を疑いましょう。
単位根検定
データが非定常かどうかを統計的に検定する方法として、ADF検定があります。ADF検定は、帰無仮説を「単位根が存在する(非定常である)」として検定を行います。
p値が0.05より大きい場合、データは非定常であると判断されます。この場合、通常の回帰分析を適用すると見せかけの回帰に陥る可能性が高いです。
残差の確認
回帰分析の残差に自己相関が強く残っている場合も、見せかけの回帰の兆候です。Durbin-Watson統計量を確認しましょう。
Durbin-Watson統計量が2から大きく離れている場合、残差に自己相関があることを示し、モデルの前提が満たされていない可能性があります。
6. 実践:正しい分析フロー
実際の時系列データ分析では、次のようなフローで進めることをおすすめします。
Step1: データの確認
まずはデータをプロットして、視覚的に特徴を把握しましょう。トレンド、季節性、外れ値などを確認します。
Step2: 定常性の検定
ADF検定などを用いて、データが定常かどうかを統計的に検定します。複数の系列がある場合は、すべてに対して検定を実施しましょう。
Step3: 適切な前処理
非定常の場合は、差分化、トレンド除去、共和分検定のいずれかを選択します。データの特性に応じて適切な方法を選びましょう。
Step4: 分析の実行
定常化したデータに対して回帰分析を実行します。分析後は必ず残差診断を行い、モデルの前提が満たされているか確認することが大切です。
7. まとめ
見せかけの回帰のチェックポイント
見せかけの回帰を避けるために、以下のポイントをチェックしましょう。
- データにトレンドがないか視覚的に確認する
- ADF検定で定常性を確認する
- 高いR²値だけで判断しない
- 残差の自己相関を確認する
- 必要に応じて差分化やトレンド除去を実施する
- 共和分関係の可能性も検討する
時系列分析で気をつけるべきこと
時系列データの分析では、通常の回帰分析とは異なる注意点があります。データの特性を理解し、適切な前処理を施すことが、正確な分析結果を得るための鍵となります。
見せかけの回帰は、統計的に有意な結果が必ずしも真実を表しているわけではないことを教えてくれる重要な教訓ですね。データの背後にある構造を理解し、慎重に分析を進めていきましょう。
8. 参考文献
- Granger, C. W. J., & Newbold, P. (1974). Spurious regressions in econometrics. Journal of Econometrics, 2(2), 111-120.
- Engle, R. F., & Granger, C. W. J. (1987). Co-integration and error correction: representation, estimation, and testing. Econometrica, 251-276.
- Hamilton, J. D. (1994). Time Series Analysis. Princeton University Press.