データサイエンスのいろは · ⏱️ 読了目安 6分

「線を引いたら未来が見えた」気がして、範囲外で転んだ

散布図に線を引いたら、明日のことまで分かった気がした。僕のノートは、線一本で急に占い師の顔をしてくる。

回帰直線は、データの中の傾向を一本にまとめる道具であって、データの外の未来を保証する線ではない。 今日は僕が作った架空の数字で、線を引くところまでと、線を伸ばしてはいけないところを見てみる。

まず、5つの点に線を引く

練習時間と、翌日の20問テストの正解数を置いた。実際の誰かを測った数字ではなく、仕組みを見るために作った例だ。

練習時間 x(時間)正解数 y(問)
111
213
314
416
516

右肩上がりなので、僕の頭はすぐ「練習すれば正解数が増える」と言い始めた。頭は散布図を見ると因果関係まで勝手に買ってくる。今日はそこまでは買わない。

5点の平均は、練習時間が3時間、正解数が14問。各点が平均からどちらへどれだけ離れているかを使って、線の傾きを計算する。

傾き = Σ(x−3)(y−14) ÷ Σ(x−3)²
     = 13 ÷ 10
     = 1.3

つまり、この5点に一番なじむ線は、練習時間が1時間増えると正解数が約1.3問増える形になる。切片も計算すると、線はこうなった。

予測値 y = 10.1 + 1.3x

線の引き方は、各点から線までの縦のズレを二乗して、その合計が一番小さくなるようにする。横のズレではない。ここを間違えると、別の線を熱心に引くことになる。

この線で5つの練習時間を計算すると、予測値は11.4、12.7、14.0、15.3、16.6問になる。実際の11、13、14、16、16問から、そこそこ近い。

近いから、よく当たるのか

この「そこそこ近い」を一つの数字にしてみる。実際の正解数の平均14問からのズレを全部足した大きさは18。線を引いた後に残ったズレの二乗の合計は1.1だった。

そこで、

決定係数 R² = 1 − 1.1 ÷ 18
             = 約0.939

となる。R²は、正解数のばらつきのうち、今回の線でどれくらい説明できたかを見る値だ。この例では約0.939だから、5点の並びには線がかなり沿っている。

……ここで僕は、危うく「この線は正しい」と書くところだった。R²が高いことは、この5点に線がよく合ったという話であって、次に来る点が線の上に乗るという予約票ではない。

線はきれいだった。伸ばす手が雑だった。
線はきれいだった。伸ばす手が雑だった。

線の外へ出たら、別の話になる

この架空のテストは20問満点だった。では、練習時間を10時間にしたらどうなるか。線に入れると、

10.1 + 1.3×10 = 23.1

23.1問。満点が20問なのに、線は23.1問を提案してきた。線が計算を間違えたのではない。僕が、1〜5時間のデータしかない場所から、10時間という遠い場所まで伸ばしたからこうなった。

データの範囲の内側で値を読むのは内挿、外側へ伸ばして読むのは外挿と呼ぶ。内挿なら必ず安全という意味ではないけれど、少なくとも今回見た範囲の近くにいる。外挿では、練習時間が増えたら疲れるのか、問題が難しくなるのか、満点で頭打ちになるのか、線の計算に入っていない事情が急に出てくる。

それに、練習時間と正解数が一緒に増えたからといって、練習時間だけが理由とは限らない。問題を覚えていた、前日に睡眠を取った、そもそも簡単な問題だった。回帰直線は関係の形を要約するが、原因の身分証までは発行しない。

今日の手の内

僕が2つの数字に線を引いたあと、確認する順番はこうなった。

  1. 傾きが何を1単位増やしたときの値か読む
  2. 線がデータの中でどれくらい沿っているかを見る
  3. 予測する値が、観測した範囲の内側か外側か確かめる
  4. 線の関係を、そのまま原因だと呼ばない

今回の5点では、傾き1.3、切片10.1、R²は約0.939だった。数字だけ見れば、かなりきれいな線だ。でも10時間に伸ばした瞬間、20問満点のテストに23.1問と書いた。きれいな線ほど、手を放す場所を決めておく必要がある。

ノートの端に、練習時間1〜5時間のところだけ実線を残した。6時間から先は点線にした。占い師になりかけた線が、満点の手前で我に返った。

やあ、ここまで読んでくれてありがとう。

身近な疑問に引っかかったら、数えて確かめないと気が済まない。引っかかってから「なるほど」に辿り着くまでの過程を置く場所「猫だくさん」。