ここまで、1つのデータをどう見るか(平均、散らばり、分布の形)を学んできました。ここからは、2つのデータの関係を見ていきます。身長と体重、勉強時間とテストの点数、気温とアイスの売上。片方が増えると、もう片方も増えるのかという問いです。
この関係を と呼びます。そして、その強さを −1 から +1 までの1つの数字で表せます。便利な道具ですが、数字だけを見ると必ず騙されます。この回では、その理由と対処まで扱います。
1. 相関係数の読み方
相関の強さを表す数字を相関係数といいます。−1 から +1 の範囲に収まり、値の意味は次のとおりです。
| 値 | 意味 | 身近な例 |
|---|---|---|
| +1 に近い | 片方が増えると、もう片方も増える | 身長と体重 |
| 0 に近い | まっすぐな関係が見えない | 靴のサイズとテストの点数 |
| −1 に近い | 片方が増えると、もう片方は減る | 運動時間と体脂肪率 |
注意してほしいのは、+1 に近いほど「偉い」わけではないということです。相関係数は関係の強さを表すだけで、良い悪いを表しているのではありません。また、プラスとマイナスは向きの違いでしかありません。−0.9 と +0.9 は、向きが逆なだけで、関係の強さとしては同じです。マイナスを「弱い」と読んでしまう間違いは意外に多いので、気をつけてください。
2. Python で計算してみる
実際に計算してみましょう。難しい式は使わず、ライブラリに任せます。ここでは3種類のデータを作って、それぞれの相関係数を見比べます。
import numpy as np
rng = np.random.default_rng(42)n = 100
# もとになる数(勉強時間だと思ってください)x = rng.uniform(0, 10, n)
# 1. 正の関係: 勉強するほど点数が上がる(多少のばらつきあり)y_plus = 8 * x + rng.normal(0, 8, n)
# 2. 関係なし: まったく別のものy_none = rng.uniform(0, 100, n)
# 3. 負の関係: 増えると減るy_minus = 100 - 8 * x + rng.normal(0, 8, n)
for name, y in [("正の関係", y_plus), ("関係なし", y_none), ("負の関係", y_minus)]: r = np.corrcoef(x, y)[0, 1] print(f"{name}: 相関係数 = {r:+.2f}")`np.corrcoef` が相関係数を計算してくれます。結果を見ると、正の関係では +0.9 あたり、関係なしでは 0 付近、負の関係では −0.9 あたりの値になるはずです。乱数を使っているので、実行するたびに少し変わります。
3. 数字だけを見ると騙される
ここからがこの回の本題です。相関係数が同じでも、中身がまったく違うことがあります。これを示した有名な例が です。
1973年に統計学者のアンスコムが作った4組のデータで、平均も、散らばりも、相関係数もほぼ同じなのに、グラフにすると全然違う形になります。数字だけを見ていると、この違いに気づけません。
import numpy as np
# アンスコムの数値例(4組のうち3組)x1 = np.array([10, 8, 13, 9, 11, 14, 6, 4, 12, 7, 5])y1 = np.array([8.04, 6.95, 7.58, 8.81, 8.33, 9.96, 7.24, 4.26, 10.84, 4.82, 5.68])
# 曲がった関係(まっすぐではない)y2 = np.array([9.14, 8.14, 8.74, 8.77, 9.26, 8.10, 6.13, 3.10, 9.13, 7.26, 4.74])
# 1点だけ大きく外れているx3 = np.array([8, 8, 8, 8, 8, 8, 8, 19, 8, 8, 8])y3 = np.array([6.58, 5.76, 7.71, 8.84, 8.47, 7.04, 5.25, 12.50, 5.56, 7.91, 6.89])
for name, x, y in [("ふつうの関係", x1, y1), ("曲がった関係", x1, y2), ("外れ値が1つ", x3, y3)]: r = np.corrcoef(x, y)[0, 1] print(f"{name:12s} 相関係数 = {r:.2f} 平均y = {y.mean():.2f}")実行すると、3つとも相関係数が 0.82 前後になります。それなのに中身は「ふつうの関係」「曲がった関係」「1点だけ外れている」とまったく違う。数字が同じでも、意味は同じではないわけです。
3番目の例では、11個のうち10個は x が同じ値で、残り1個だけが遠くにあります。この1点があるだけで相関係数は 0.82 になりますが、関係があるとは言えません。 の影響は、それくらい大きい。
4. だから散布図を見る
対処はとても簡単です。 を描く。それだけで、上の3つの違いは一目で分かります。
import matplotlibmatplotlib.rcParams["font.family"] = "Hiragino Sans" # 日本語表示のためmatplotlib.rcParams["axes.unicode_minus"] = Falseimport matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 3, figsize=(12, 4))
for ax, (name, x, y) in zip(axes, [("ふつうの関係", x1, y1), ("曲がった関係", x1, y2), ("外れ値が1つ", x3, y3)]): ax.scatter(x, y) ax.set_title(f"{name}\n相関係数 {np.corrcoef(x, y)[0, 1]:.2f}") ax.set_xlim(0, 20) ax.set_ylim(0, 14)
plt.tight_layout()plt.show()同じ相関係数なのに、絵にすると全然違うことが分かります。先にグラフを見るというのは、EP.04 でヒストグラムについて言ったことと同じです。統計では、数字を計算する前に形を見るのが基本になります。数字は形を1つの値に押し込めたものなので、押し込める過程で情報が失われていると考えると分かりやすいでしょう。
5. まっすぐな関係しか測れない
相関係数には、もう一つ大事な限界があります。まっすぐな関係の強さしか測れないという点です。
たとえば、気温とエアコンの使用量を考えてみてください。寒い日も暑い日も使いますが、ちょうど良い気温の日は使いません。グラフにするとU字型になります。この場合、関係はあるのに相関係数はほぼ 0 になります。
import numpy as np
# 気温を -5 度から 35 度までtemp = np.linspace(-5, 35, 200)
# エアコン使用量: 15度あたりが最も少なく、離れるほど増える(U字)usage = (temp - 15) ** 2
r = np.corrcoef(temp, usage)[0, 1]print(f"相関係数 = {r:.3f}")print("→ ほぼ 0 だが、実際にははっきりした関係がある")相関係数が 0 だから関係がない、とは言えないということです。ここでも散布図を見れば、きれいなU字がすぐ分かります。
6. まとめと、次回への橋渡し
相関は、2つのデータの関係を1つの数字で表せる便利な道具です。ただし限界を知って使う必要があります。
- 必ず散布図も見る — 数字が同じでも中身は違う
- 外れ値を確認する — 1点で結論が変わることがある
- まっすぐな関係しか測れない — 曲がった関係は 0 に見える
- 強さの基準は分野で違う — 一律の目安を当てはめない
そして、相関について最も大事な注意がもう1つあります。相関があっても、原因と結果の関係があるとは限らないということです。これは間違えやすく、しかも間違えると結論が大きくずれるので、次回まるごと1回を使って扱います。
相関係数は −1 から +1 で関係の強さを表す。ただし同じ数字でも中身は違う(アンスコムの数値例)。外れ値1個で結論が変わることがある。曲がった関係は測れない。だから 散布図 を必ず見る。次回は「相関があっても原因とは限らない」という、もっと大事な話をします。
この記事の感想を教えてください
あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。