一緒に動く2つの数
相関は、2つの数が一緒に増えたり減ったりする関係です。その強さと向きを、相関係数という1つの数で言い表せます。ただし、それだけでは「原因」まではわかりません。
貸し自転車の店では、気温が高い日ほど貸出が多く、雨の日ほど少ないように見えます。この関係を数で測ります。
このレッスンのゴール
メモ
2つの数の関係を相関係数で測り、原因とは区別して言うことができる。
キーワード
| ことば | いみ |
|---|---|
| 散布図 | 2つの数を、点で並べたグラフ |
| 相関 | 2つの数が、一緒に動く関係 |
| 相関係数 | 直線の関係の向きと強さを、-1から1で表した数 |
| 外れ値 | 他の値から大きく離れた値 |
| 因果関係 | 一方が、他方の原因になっている関係 |
| 交絡 | 別の要因が、2つの数を同時に動かしていること |
学生が入力するセルは、このプレビューでは空白です。
散布図と相関係数
2つの数を点で並べたグラフが散布図です。点が右上がりなら正の相関、右下がりなら負の相関です。
相関係数は、その向きと強さを-1から1で表します。1に近いほど右上がりの直線に並び、0に近いほど直線の関係がありません。
相関係数の読み方
| 相関係数 | 点の並び |
|---|---|
| 1 | ちょうど右上がりの直線 |
| 0.7 前後 | 右上がりの傾向がはっきりある |
| 0 | 直線の関係がない |
| -0.7 前後 | 右下がりの傾向がはっきりある |
| -1 | ちょうど右下がりの直線 |
学生が入力するセルは、このプレビューでは空白です。
気温と雨の相関係数
docker exec jupyter python3 -c "import csv, statistics as s; rows = list(csv.DictReader(open('hires.csv'))); h = [int(r['hires']) for r in rows]; t = [float(r['temp_c']) for r in rows]; rain = [float(r['rain_mm']) for r in rows]; print(round(s.correlation(t, h), 3), round(s.correlation(rain, h), 3))"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
相関係数は掛けて足して割る
2つの数それぞれの、平均との差を掛けて足します。それを、差の2乗の合計どうしを掛けて平方根を取った数で割ると、相関係数です。
一緒に平均より上、または下にある点が多いほど、掛けた値がプラスになり、相関係数は1に近づきます。
例: 気温と貸出の計算
| 気温 | 貸出 | 気温の差 | 貸出の差 | 掛けた値 |
|---|---|---|---|---|
| 0 | 130 | -10 | -64 | 640 |
| 5 | 160 | -5 | -34 | 170 |
| 10 | 190 | 0 | -4 | 0 |
| 15 | 240 | 5 | 46 | 230 |
| 20 | 250 | 10 | 56 | 560 |
| 合計 | 2乗の合計 250 | 2乗の合計 10520 | 1600 |
学生が入力するセルは、このプレビューでは空白です。
相関係数を手で計算する
# 気温と貸出台数の相関係数を、手で計算します。
temps = [0, 5, 10, 15, 20]
hires = [130, 160, 190, 240, 250]
mean_x = sum(temps) / len(temps)
mean_y = sum(hires) / len(hires)
top = 0
left = 0
right = 0
for n in range(len(temps)):
dx = temps[n] - mean_x
dy = hires[n] - mean_y
top = top + dx * dy
left = left + dx ** 2
right = right + dy ** 2
print("相関係数:", round(top / (left * right) ** 0.5, 4))
# 最後の 250 を 100 に変えて、もう一度実行してください。
# 1つの外れた点で、相関係数はどう変わりますか。
相関係数は直線だけを測る
2つの数がはっきり関係していても、直線でなければ、相関係数は小さくなります。x が -2 から 2 のとき、y が x の2乗なら、点は U字に並びますが、相関係数は0です。
外れ値が1つあるだけでも、大きく動きます。必ず散布図を先に描いてください。
U字の相関係数
docker exec jupyter python3 -c "import statistics as s; print(round(s.correlation([-2, -1, 0, 1, 2], [4, 1, 0, 1, 4]), 3))"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
多くの人は、相関が強ければ、一方が他方の原因だと考えます。相関は、一緒に動くことしか示しません。別の要因が、両方を動かしているかもしれません。
一緒に動いても原因とは限らない
アイスの売上と、熱中症で運ばれた人の数は、一緒に増えます。どちらも、暑い月に増えるからです。この別の要因が交絡です。
原因かどうかは、相関係数ではなく、比べる条件をそろえた調べ方で確かめます。
例: 月ごとの3つの数
| 月 | 気温(度) | アイスの売上(千円) | 熱中症の人数 |
|---|---|---|---|
| 4月 | 15 | 120 | 2 |
| 5月 | 20 | 180 | 5 |
| 6月 | 25 | 260 | 12 |
| 7月 | 30 | 340 | 30 |
| 8月 | 32 | 380 | 36 |
| 9月 | 27 | 280 | 15 |
学生が入力するセルは、このプレビューでは空白です。
さらに挑戦: 土日と貸出
ノートブックで、土日なら1、平日なら0の列を作り、貸出台数との相関係数を求めてください。
気温の0.77より小さいはずです。それでも、土日の貸出が多いと言えるのはなぜでしょうか。一文で書きましょう。