
見せかけの回帰を実測: 無関係なランダムウォーク1万ペアの偽有意率は、n=50の67%からn=5000の97%まで上がり続けた
「互いに何の関係もない2つの時系列を持ってきて相関を取ると、しばしばr=0.9のような強烈な相関が出る」——時系列分析の教科書に必ず載っている見せかけの回帰(spurious regression)の話だ。ナイジェリアの海賊の数と地球の平均気温、みたいなネタ画像は誰でも見たことがあると思う。
ただ、私はこの話をずっと「たまたま変な標本を引いたときの笑い話」くらいに受け取っていた。統計の基本感覚として「データを増やせば偶然の相関は消えていく」はずで、実際iidなデータならその通りになる。ところが単位根を持つ系列——ランダムウォーク——同士では、データを増やすほど誤判定が増えるらしい。大数の法則への信頼を逆撫でするこの主張、言葉で読んでも腹落ちしなかったので、Simpsonのパラドックスの記事と同じ流儀で、自分で大量にシミュレーションして偽有意率を実測してみることにした。
実験に使ったコードの全文はGitHubに置いています。
実験設計: 完全に独立なペアを1万組作って相関を測る
やることは単純で、完全に独立に生成した2系列のペアを大量に作り、それぞれのペアでPearsonの相関係数rと、通常のt検定(scipy.stats.pearsonrと同じ式)のp値を計算する。系列は本当に独立なのだから、p<0.05になったらそれは全部誤判定だ。この「p<0.05になってしまった割合」を偽有意率と呼ぶことにする。正しく機能していれば5%になるはずの数字だ。
系列は3種類用意した。
- iidガウスノイズ: 各時点が独立な標準正規乱数。教科書の前提そのもの
- AR(1) φ=0.8: 前の値を80%引きずる自己相関のある系列。ただし定常
- ランダムウォーク: ノイズの累積和。単位根を持ち、定常ではない
def gen_series(kind, npairs, T, rng, phi=0.8):
e = rng.standard_normal((npairs, T))
if kind == "iid":
return e
if kind == "rw":
return np.cumsum(e, axis=1) # ランダムウォーク
if kind == "ar1":
x0 = rng.standard_normal(npairs) * np.sqrt(1 / (1 - phi**2))
y, _ = signal.lfilter([1.0], [1.0, -phi], e, axis=1,
zi=(phi * x0)[:, None])
return y
ペア数は各条件1万組。系列長Tは50から5,000まで振る。自作のr/p計算はscipy.stats.pearsonrと一致することを最初に確認してある。
まず見てほしい: 独立な2本がこれだけ「連動」する
系列長300のランダムウォークのペアを40,000組生成して、rが高かった順に上位を並べてみた。次のGIFに出てくる2本の線は、すべて完全に独立に生成した乱数だ。

トップのペアはr=0.977、p値は1.7e-201。「p値が小さいから本物の関係だ」という理屈がいかに無力かがよく分かる。もちろんこれは4万組から選んだ上澄みだが、|r|>0.9のペアは4万組中465組(1.16%)もある。100回に1回以上の頻度で、無関係な2系列からr=0.9級の相関が出てくるということだ。
T=200でのr分布: ランダムウォークはほぼ一様に broken
チェリーピックした例ではなく分布全体を見る。系列長200で、3種それぞれ1万ペアのrのヒストグラムがこれだ。

数字にするとこうなる。
iid : 偽有意率 4.8% |r|中央値 0.048 max|r| 0.289
AR(1) φ=0.8 : 偽有意率 35.5% |r|中央値 0.102 max|r| 0.523
ランダムウォーク : 偽有意率 83.1% |r|中央値 0.418 max|r| 0.964
iidは教科書通り。偽有意率4.8%はほぼ設計通りの5%で、1万ペアの中の最大の|r|ですら0.289にしかならない。ところがランダムウォーク同士では、|r|の中央値が0.418。「典型的なペア」がすでにr=±0.4クラスの相関を持ち、|r|>0.5が40.1%、|r|>0.9も1.32%ある。分布の形も釣鐘型ではなく、-1から1までほぼ平坦に潰れている。t検定は83.1%のペアで「有意な相関」と答えた。20回中17回、存在しない関係を検出したことになる。
本題: データを増やすと、直るどころか悪化した
ここからが一番確かめたかったところだ。系列長nを50から5,000まで振って、偽有意率がどう動くかを測った。

n 50 100 200 500 1000 2000 5000
iid 4.9% 5.1% 4.7% 4.7% 4.9% 5.1% 5.2%
AR(1) 33.2% 35.4% 35.5% 35.6% 35.7% 36.0% 36.5%
ランダムウォーク 66.8% 75.7% 83.7% 89.7% 92.7% 94.8% 96.9%
RWの差分 5.1% 5.0% 4.8% 5.4% 4.9% 5.0% 4.6%
3つの系列で、3つのまったく違う運命が観測できた。
- iid: nによらず5%前後。「データを増やせば偶然の相関は消える」が成立している世界
- AR(1): 36%前後で頭打ち。5%よりずっと悪いが、nを増やしても際限なく悪化はしない
- ランダムウォーク: n=50の66.8%から単調に上がり続け、n=5000で96.9%。外挿すればさらに100%に近づいていく
面白いのは|r|の中央値の動きだ。iidでは中央値がn=50の0.097からn=5000の0.009へと、理論通り1/√nで縮んでいく。ところがランダムウォークの|r|の中央値はn=50でもn=5000でも0.41前後から動かない。相関係数が0に収束してくれない(理論的には、rが0ではなくある確率分布に収束することがPhillips (1986)で示されている)一方で、t検定の有意判定の閾値の方は√nでどんどん緩くなっていくので、「rは縮まないのに閾値だけ下がる」という挟み撃ちで偽有意率が100%へ向かう。nを増やすほど、間違った結論への確信だけが強まっていく構図だ。
自己相関の強さ×系列長のヒートマップ: 崖はφ=1にある
AR(1)のφを0から1まで動かすと、定常(φ<1)と単位根(φ=1)の間のどこで挙動が変わるのかが見える。φ×系列長の全組み合わせで偽有意率を測った。

どの行(φ固定)も、nを増やしたときの挙動は「ある水準で頭打ち」になっている。φ=0.6なら18%前後、φ=0.9なら50%強、φ=0.99ですら85%付近で止まる。右に行くほど色が濃くなり続けるのは、最上段のφ=1.0(ランダムウォーク)だけだ。
これを見るまで、私はφ=0.99とφ=1.0は「ほぼ同じもの」だと思っていた。数値としては1%しか違わない。しかしn=5000まで引き延ばすと、φ=0.99は85%で止まり、φ=1.0は96%を超えてなお上昇中——定常性の有無は、パラメータの連続的な違いではなく挙動の質を分ける崖なのだと、色の付き方で納得できた。ついでに言うと、φ=0.3という「軽い自己相関」でも偽有意率はすでに7%前後あり、5%を素朴に信じてよい範囲は思ったより狭い。
差分を取ると、偽相関はきれいに消えた
ランダムウォークの偽相関への古典的な処方箋は「差分を取れ」だ。ランダムウォークの1階差分はただのiidノイズなので、水準ではなく変化量同士で相関を取れば理屈の上では正常に戻る。実測でも、差分を取ったランダムウォークの偽有意率は全ての系列長で4.6〜5.4%と、iidと見分けがつかない水準まで戻った(上の折れ線グラフのオレンジ破線)。
個別のペアで見るとさらに分かりやすい。GIFにも出てきたr=0.965のペアの水準と差分を並べたのがこの図だ。

水準ではあれほど「連動」して見えた2本が、差分を取った瞬間にただのノイズ2本になり、r=0.025(p=0.67)まで落ちた。見せかけの相関の正体が「どちらも累積和で、たまたま同じ向きに漂っただけ」であることが、この1枚でよく分かる。
正直に書いておくべきこと
- この現象自体はYule (1926)の”nonsense correlations”以来100年知られていて、Granger & Newbold (1974)とPhillips (1986)で理論的に確立している。この記事の価値は新規性ではなく、教科書の1行を偽有意率のカーブとして実測したことにある
- 「見せかけの回帰」は本来は回帰係数のt検定について語られることが多い。今回は相関係数のt検定で測ったが、単回帰の傾きの検定と相関の検定は数学的に等価なので、話としては同じものだ
- 系列は素のガウス増分のみで、ドリフト(一方的なトレンド)は入れていない。ドリフト入り同士なら見かけの相関はもっと激しく出るはずで、今回の数字はむしろ控えめな条件での結果だ
- AR(1)の偽有意率が36%で頭打ちになるのはφ=0.8という設定に対する数字であって、AR(1)一般の定数ではない(ヒートマップの通りφに強く依存する)
- 対策として差分を挙げたが、実務では差分で情報が落ちるケース(共和分がある場合など)もある。「機械的に差分を取れば常に正しい」という話ではなく、単位根を持つ系列の水準同士の相関・回帰をナイーブなt検定で評価してはいけない、というのが正確なスコープだ
手を動かして意外だったこと
一番意外だったのは、n=50の時点ですでに偽有意率が66.8%あったことだ。やる前は「漸近的にじわじわ壊れていく話で、短い系列ならそこまでひどくないだろう」と思っていたが、実際には最初から壊れていて、nを増やすとさらに悪化する、という形だった。単位根系列に対する素朴なt検定は「大標本で破綻する」のではなく「最初から破綻していて、大標本がそれを隠すどころか確信に変える」。
もう1つは、上位ペアを選ぶときに踏んだ小さな罠だ。GIF用に「rが最大のペア」を取り出して差分を確認したら、差分にもr=0.123(p=0.033)という弱い相関が残っていた。一瞬「差分しても消えないのか?」と焦ったが、これは4万組から極端なrで選抜したことによる選択効果で、水準のrが極端に高いペアには「増分もたまたま少し相関していた」個体が混ざりやすい。実際、上位10ペアの差分のp値は0.03から0.85までばらけていて、選抜なしの集計では差分の偽有意率はきっちり5%前後だった。極端な例を選んで見せること自体が軽いバイアスを持ち込む、というのを図を作る工程で自分で踏んだのは、記事のテーマとの合わせ技として教訓的だった。
まとめ
- 完全に独立な2系列のペアを1万組ずつ生成し、Pearson相関のt検定がp<0.05を出す率(偽有意率)を実測した
- iidノイズでは教科書通り、どの系列長でも4.7〜5.2%に収まった
- ランダムウォーク同士ではn=50で66.8%、n=200で83.7%、n=5000で96.9%と、データを増やすほど偽有意率が上がり続けた。|r|の中央値は0.41前後からnを増やしても縮まない
- 40,000ペア中1.16%はr>0.9。最大はr=0.977(p=1.7e-201)で、無関係な2本がここまで「連動」して見える
- 定常なAR(1)はφ=0.8で36%前後、φ=0.99でも85%付近で頭打ちになる一方、φ=1.0(単位根)だけは上がり続けた。崖は「自己相関が強いこと」ではなく「単位根」にある
- ランダムウォークも差分を取れば偽有意率は4.6〜5.4%に戻った。r=0.965だったペアも差分後はr=0.025(p=0.67)
「データが多いほど結論は信頼できる」という直感は、データが定常であることに暗黙に依存している。トレンドを持つ2つのKPIをそのまま散布図にしてr=0.9を見つけたとき、それはn=200のランダムウォークのペアの40%が見せるのと同じ模様かもしれない。時系列の水準同士の相関を見せられたら、まず「差分を取っても残るのか」と聞く——今回の実測で、この一言の重みが数字として手に入った。
このブログでは、機械学習の仕組みを実際にコードで実装して確かめた実験をテーマ別に整理しています(拡散モデル・Transformer・強化学習・多様体学習・過学習など)。


