第05回 相関と因果¶
10/27(火)Ⅱ講 10:35〜12:15・B402教室
「相関がある」と「原因である」は、まったく違う
今日のリンク
- 📊 スライドを開く
- 📓 Colabノートを開く(05_correlation.ipynb)
- 📝 課題を提出する(Moodle・第5回)
- 課題の本文はこのページの末尾にあります
- 🤖 NotebookLMで復習する(この回の内容をAIに質問できます)
この回のゴール¶
- 散布図と相関係数 r で2変数の関係を読める
- 相関 ≠ 因果であることを、交絡・逆因果・偶然の観点から説明できる
- 相関を見たときに「対抗仮説(第三の変数)」を立てて批判的に検証できる
- 発展:\( r \) が標準化した値の積の平均であることと、\( -1 \le r \le 1 \) を、自分で導ける
- 発展:「体重を統制する(偏相関)」が何を引き算しているのかを、標準化だけで導ける
到達目標との対応:G1(記述)・G2(批判的検証の入口)。
前回の答案から¶
第4回の記述(パートB・60点)は、10/25時点の69名で満点36名(52%)/平均55.7点だった。 パートAの小テストは77名中70名が満点。初めてコードを書いた回としては上出来である。
まず、配布ノートの不具合をお詫びする
print("妊娠期間日 標準偏差", df["妊娠期間日"].____().round(1), "日") という形が残っていた。
.std() が返すのは1個の数値(float)で、列まるごと(Series)ではない。
floatには .round() が無いので 'float' object has no attribute 'round' が出る。
10名がここで詰まった。ノート側の間違いで、皆さんのミスではない(10/20に修正済み)。
そのうえで、4名が型の違いまで自力で突き止めた。
「Seriesには .round() があるが、計算後の単一の数値には無い」――正しい診断である。
直し方は、組み込み関数で囲む round(df["妊娠期間日"].std(), 1)。
板書:df["列"] → Series(列まるごと)/df["列"].std() → float(1個の数値)
① 直したあとに出た数値を書かなかった(69名中30名)
引用が無くて点が止まった人が43%。第3回の25%から増えた。内容が悪いのではない。 B2が「エラーの原因と解決」を聞く問題だったので、原因を特定したところで話が終わってしまった。
列名を間違えるとエラーが起きるため計算ができなかった。もう一度列名を確認し、修正した
直ったのは分かる。だが何が出たのかが書かれていない。 「直したら平均5880.9gが出た」の一言があれば満点だった。
「直った」で終わらせず、出力を見るところまでを1セットにする。 これはエラー処理の作法でもある。直ったつもりで値がおかしい、はよくある。
② .mode() が返す値を「典型値」と読んでしまう
今回いちばん良かった答案を挙げる。
最頻値(一腹産子数)1.01 は、一回の出産で1.01頭生まれる種が多い、という意味に見える。 しかし実際には、一腹産子数として1.01という値が記録されている種が最も多かったことを表している
.mode() は記録値の重複を数えて最多のものを返すだけで、分布の山とは別物である。
体重の最頻値 992.4g も、6種で最多というだけのこと。
同じ留保を書けた人は10名ほどいた。
「数字が出た」と「その数字が何を表している」は別。これが今日の入口になる。
③ 手計算のほうが正確だ、と書いた
手計算は、値を求める正確さにおいて役立ち、コードは値を求める速さで役に立つ
逆である。376種の体重を電卓で足せば、どこかで打ち間違える。 コードの強みは速さだけでなく、同じ処理を何度でも間違いなく繰り返せることにある。 手計算の利点は正確さではなく、仕組みが見えることである。
④ B2が感想で終わった(2名)
頻繁にエラーが発生していたので、目的意識をしっかり持っていくようにしたい
どのコードで、どの文字が、どう間違っていたのかが分からない。 次の4点を書く。場所・原因・直し方・出た数値。
穴埋め①で
df["体重g"]とgを全角で打って KeyError が出た。半角に直したら先頭の 4749.96 が表示された
今日につながること¶
前回は「機械が出した数字に、何の数字で、単位は何で、それは信じてよいのかというラベルを貼るのが人間の仕事」という話だった。
今日は、そのラベルの中でもいちばん間違えやすいものを扱う。「この2つには関係がある」というラベルである。
r = 0.657 という数字は、コードが一瞬で出してくれる。だがそれが「原因と結果」なのかどうかは、画面には出ない。
今日は、同じ r を出したあとで体重をそろえて計算し直すと 0.051 まで落ちる例を見る。
数字は何も嘘をついていない。読み方のほうが間違っていたのである。
1. フック:この相関を信じる?¶
- 「アイスの売上が増えると水難事故も増える」――アイスを禁止すれば事故は減る?
- 「チョコ消費量が多い国ほどノーベル賞が多い」――チョコで頭が良くなる?
相関は本物。でも結論はばかげている。なぜそうなるのかを、霊長類データで解き明かす。
そして今日は、ばかげているとすぐには分からない例を扱う。そちらが本番である。
2. 散布図と相関係数 r¶
2つの量の関係は、点を打った散布図で見るのが基本。その「直線的な関係の強さ」を1つの数にしたのが 相関係数 r(−1〜+1)。
| r | 意味 |
|---|---|
| +1 に近い | 片方が増えると他方も増える(右上がり) |
| −1 に近い | 片方が増えると他方は減る(右下がり) |
| 0 に近い | 直線的な関係がない |
何桁にもまたがる量は対数で見る
体重・行動圏などは種によって数千倍違う。第3回でやったとおり、こういう量は対数の目盛りで扱う(そうしないとゴリラ1種が図を支配し、アンスコムのIV型になる)。以下の r はすべて対数変換後の値。
体重 と 行動圏:r ≈ 0.68(n=153種)。体の大きい種ほど広い範囲を使う ―― 大きい動物はたくさん食べる必要があるから、というのは納得のいく関係だ。
導出①:相関係数 r は「標準化した値の積の平均」である
2つの変数を、それぞれ標準化する。\( z_{x_i} = (x_i-\bar{x})/s_x \)、\( z_{y_i} = (y_i-\bar{y})/s_y \)。標準化すると平均0・標準偏差1になり、単位が消える(第3回の偏差値と同じ操作)。
r の定義は、共分散を両者の標準偏差で割ったものである。
分母の \( s_x s_y \) を、分子の2つの因子に1つずつ配ると、
つまり r は「標準化した2つの値の積の平均」である。両方とも平均より上(または両方とも下)の個体は積が正、片方だけ上の個体は積が負。r はその符号つきの積をならしたものだ。
ここから「r は単位に依存しない」が出る。体重を g から kg に直しても、標準化の段階で倍率が消えるので r は変わらない。上の注記で対数に直すと r が変わるのは、対数変換が単なる倍率変更ではなく、値の並び方そのものを変えるからである。
数値で確かめる:体重 × 行動圏(ともに対数、n=153)では、共分散を割る定義でも、標準化した積の平均でも、どちらも r = 0.6799 になる。
使った数学:平均・標準偏差の定義(微I)、総和の記号操作と定数の括り出し(線I)。
導出②:なぜ r は −1 と +1 の間に収まるのか
二乗は負にならない。必要なのはこれだけである。
標準偏差1に揃えた定義から \( \sum z_{x_i}^2 = n \)、\( \sum z_{y_i}^2 = n \)。また導出①より \( \sum z_{x_i} z_{y_i} = nr \)。
差の二乗和を展開すると、
左辺は二乗の和だから0以上。よって \( 2n-2nr \ge 0 \)、すなわち \( r \le 1 \)。
同じように和の二乗和を展開すると \( \sum (z_{x_i}+z_{y_i})^2 = 2n+2nr \ge 0 \) で、\( r \ge -1 \)。合わせて \( -1 \le r \le 1 \) が出る。
等号はいつ成り立つか。\( r=1 \) は \( \sum(z_{x_i}-z_{y_i})^2 = 0 \)、つまりすべての個体で \( z_{x_i}=z_{y_i} \) のときだけ。標準化した値が完全に一致する、すなわち y が x の正の一次式で書けるときである。\( r=-1 \) は \( z_{x_i}=-z_{y_i} \) で、負の傾きの直線。「r = ±1 は完全な直線関係」という言い方は、この等号条件から来ている。
数値で確かめる:体重 × 行動圏(対数、n=153、r=0.6799)では \( \sum(z_x-z_y)^2 = 97.95 \) で、\( 2n-2nr = 97.95 \)。一致する。そしてこれが0より大きいぶんだけ、r は1に届いていない。
r が測っているのは直線関係の強さだけ
この導出が保証するのは「r が −1 から 1 に収まること」と「両端が直線に対応すること」であって、r の大小がどちらを原因と見なすべきかは一切語らない。交絡があれば r は大きく出るし(§4)、直線でない関係なら r は小さく出る(§5)。導出は「r が何を測っているか」を正確にするためのものであり、因果の判断は式の外側の問題である。
使った数学:二乗の非負性、展開と総和の整理(微I・線I)。
3. 「乳離れが遅い種ほど、広く動きまわる」?¶
離乳日齢(子が乳離れするまでの日数)と 行動圏km2 の相関:r ≈ 0.66(n=97種)。
さきほどの体重と行動圏(0.68)とほとんど変わらない強さである。
「子育て期間が長い種ほど、広い行動圏を必要とする」――もっともらしい。生態学の論文の見出しになりそうだし、理屈も後付けできる(長く子を連れて歩くから広い範囲を使うのだろう、など)。
だが――本当に離乳の遅さが原因か? ここで立ち止まるのが統計の思考。
4. 交絡を疑え ―― 第三の変数¶
「乳離れが遅い種」とは、どんな種か。大きい種である。そして大きい種は行動圏も広い。確かめると:
- 離乳日齢 と 体重 の相関:r ≈ 0.85(ほとんど同じことを測っていると言えるほど強い)
チンパンジー(45kg)は離乳まで1,261日=3年半かかり、行動圏は10.85km²。ネズミキツネザル(48g)は離乳40日、行動圏0.01km²。どちらの列も、体の大きさが動かしている。これが 交絡(confounding) だ。
確かめ方:体重を統制する(偏相関)¶
| 離乳日齢と行動圏 | r |
|---|---|
| 単純な相関 | 0.657 |
| 体重を統制後 | 0.051(ほぼ0) |
離乳の効果は消えた
アイスと水難事故(犯人は「気温」)、チョコとノーベル賞(犯人は「経済的豊かさ」)と同じ構造。 相関を見たら、因果を結論する前に『隠れた第三の変数(交絡)』を疑う。
導出③:「体重を統制する」とは、何を引き算しているのか(偏相関)
ノートブックのこのセルは np.linalg.lstsq ―― 最小二乗法 ―― を呼んでいる。これは第10回の回帰の先取りなので、いまはコードの中身を書けなくてよい。出てきた2つの数字(0.657 と 0.051)を読み比べられれば十分である。
先に定義
偏相関(partial correlation) \( r_{xy \mid w} \):第三の変数 \( w \) で説明できる分を \( x \) と \( y \) の両方から引き、その残り同士でとった相関のこと。「\( w \) を統制したときの \( x \) と \( y \) の相関」と言うときの、その相関である。
以下は、この「説明できる分」とは何で、引き算の結果どういう式になるのかを導くものである。
ノートブックが内部で何をしているのかは、第3回の標準化と、導出①②で出した事実だけで追える。回帰の公式は要らない。記号も導出①②と同じ ―― 総和 \( \sum \) のまま進める。
ステップ0:道具をそろえる。
3つの量 ―― 離乳日齢 \( x \)・行動圏 \( y \)・体重 \( w \)(すべて対数)―― を標準化して \( z_{x_i}, z_{y_i}, z_{w_i} \) とする。導出①②で確かめたことを、そのまま持ってくる。
| 事実 | 式 | 出どころ |
|---|---|---|
| 標準化した値の平均は0 | \( \sum z_{x_i} = 0 \)(他も同様) | 第3回・導出① |
| 標準化した値の二乗和は n | \( \sum z_{x_i}^2 = n \)(他も同様) | 導出② |
| 積の和は n×相関 | \( \sum z_{x_i} z_{y_i} = n\,r_{xy} \) | 導出① |
3つめは、任意の組について成り立つ。つまり \( \sum z_{x_i} z_{w_i} = n\,r_{xw} \)、\( \sum z_{y_i} z_{w_i} = n\,r_{yw} \) も使える。これだけが材料である。
ステップ1:体重で説明できる分を引いた「残り」を作る。
各個体 \( i \) について、\( z_{x_i} \) から \( a\,z_{w_i} \) を引いた残りを
と書く。体重が大きいほど離乳も遅いのだから、体重ぶんを \( a \) 倍して差し引いてやる、という操作である。係数 \( a \) はまだ決まっていない。
まず、残りの平均は0のままである(あとで使う)。
ステップ2:残りのばらつきを、a の式として書く。
\( a \) は「引いたあとに残るばらつきが最小」になるように決めたい。そこで残りの二乗和を展開する。導出②と同じ、二乗を展開して項ごとに和をとるだけである。
ステップ0の表を、3つの和に1つずつ代入する。
ステップ3:平方完成して、最小になる a を見つける。
かっこの中は \( a \) についての二次式である。\( a \) を含む項をまとめて平方完成する。
第1項は二乗だから負にならず、\( a = r_{xw} \) のときだけ0になる。第2項は \( a \) を含まない定数である。したがって
- 最小になるのは \( a = r_{xw} \) のとき
- そのときの残りのばらつきは \( \sum e_{x_i}^2 = n\left(1 - r_{xw}^2\right) \)
最適な係数が、相関係数そのものになった。 これが標準化の効きどころである。単位をそろえておいたから、「どれだけ引けばよいか」が r で書けてしまう。
行動圏のほうも、文字を入れ替えるだけでまったく同じ計算になる。
ステップ4:残り同士の積の和を計算する(ここが山場)。
\( e_x \) と \( e_y \) の積の和を、かっこを展開して4つの項に分ける。
4つの和に、ステップ0の表を1つずつ代入する。
| 項 | 代入する和 | 結果 |
|---|---|---|
| 第1項 | \( \sum z_{x_i} z_{y_i} = n\,r_{xy} \) | \( +n\,r_{xy} \) |
| 第2項 | \( \sum z_{x_i} z_{w_i} = n\,r_{xw} \) | \( -n\,r_{xw} r_{yw} \) |
| 第3項 | \( \sum z_{w_i} z_{y_i} = n\,r_{yw} \) | \( -n\,r_{xw} r_{yw} \) |
| 第4項 | \( \sum z_{w_i}^2 = n \) | \( +n\,r_{xw} r_{yw} \) |
第2項と第3項で同じものを2回引き、第4項で1回足している。差し引き、1回ぶんだけ引いたことになる。
ステップ5:残り同士の相関を作る。
「体重を統制した相関」とは、残り \( e_x \) と残り \( e_y \) の相関のことである。相関係数の定義(導出①)を、平均0の量どうしに当てはめると
(分母が標準偏差の役をしている。ステップ1で平均が0のままだと確かめておいたので、偏差を取り直す必要がない。)ステップ2〜4の結果を入れる。
分母の2つの平方根をかけると \( \sqrt{n}\times\sqrt{n}=n \) が出るので、n が約分されて消える。
これが 偏相関 である。標本の大きさ n がきれいに消えたことに注意したい。偏相関は、3つの相関係数だけから計算できる。
ここまでを図で見る。
数値で確かめる。3つの列すべてに値がある n=97種では、\( r_{xy}=0.6570 \)(離乳×行動圏)、\( r_{xw}=0.8543 \)(離乳×体重)、\( r_{yw}=0.7485 \)(行動圏×体重)。
ノートブックが最小二乗で出した 0.0510 と一致する。式でも、コードでも、同じ数にたどり着く。
何が起きていたのか。見かけの相関 0.6570 のうち、\( 0.8543 \times 0.7485 = 0.6394 \) は体重を経由して説明できてしまう分だった。引き算して残るのは 0.0176 しかない。それを残りのばらつき(0.3447)で割り直したのが 0.051 である。
「乳離れが遅い種ほど広く動きまわる」の中身は、ほとんど全部が「体が大きい」だったということだ。
使った数学:二次式の平方完成と最小値(微I)、総和記号の展開と定数の括り出し(線I)、標準化というスケール変換(第3回)。新しい公式はひとつも使っていない ―― 導出①②で出した3つの事実と、かっこの展開だけである。
この分野では、これが最大の落とし穴である
生き物のデータでは、体の大きさがほとんど全部に効く。寿命も、妊娠期間も、行動圏も、集団サイズも、大きい種ほど大きい。だから種どうしを比べると、何と何を組み合わせても相関が出る。
ノートブックでは全組み合わせを一括で比べている。強い相関が21組並び、そのうち12組が体重を統制すると消える。
| 例 | 単純r | 体重統制後 |
|---|---|---|
| 頭胴長 × 行動圏 | +0.668 | −0.036 |
| 妊娠期間 × 最長寿命 | +0.560 | +0.069 |
| 行動圏 × 出産間隔 | +0.533 | −0.133 |
これは統計の失敗ではなく、世界のほうがそうできているということ。だから比較生物学では「体サイズを統制したうえで、まだ残る関係は何か」が本当の問いになる(第10回の回帰・第11回のモデル選択につながる)。
相関が因果でない代表的な理由:
- 交絡:第三の変数が両方を動かす(今回の例)
- 逆因果:原因と結果が逆かも(「運動するから健康」か「健康だから運動できる」か)
- 偶然:たまたま相関しただけ
5. r だけ見るな ―― アンスコムの四重奏¶
有名な例。4つのまったく違うデータが、どれも r = 0.82、回帰直線もほぼ同じ。でも散布図は別物(直線・曲線・外れ値・1点が支配)。
r という1つの数だけで「関係あり」と報告するのは危険。必ず散布図を見る。
さらに r が測れるのは直線的な関係だけ。y = x² のようなきれいな放物線でも r ≈ 0 になり、「関係なし」と誤解する。やはりまず散布図。
まとめ¶
| 注意 | 中身 |
|---|---|
| 相関 ≠ 因果 | 一緒に動いても原因とは限らない |
| 交絡 | 隠れた第三の変数が両方を動かす |
| 逆因果 | 原因と結果が逆かも |
| 偶然 | たまたまの相関 |
| r だけ見ない | アンスコム・非線形・外れ値 → 必ず散布図 |
相関を見たら、まず散布図を描き、次に『第三の変数』を疑う。 因果を本当に確かめるには 実験(ランダム化) が要る。 「関係がありそうだ」と感じた瞬間に因果を読み込むのは、第1回の代表性ヒューリスティックと同じ癖である。もっともらしさは、証拠ではない。
今日の課題(Moodle提出)¶
配点:100点(選択40点 + 記述60点)/ 提出先:Moodle / 提出期限:次回授業の開始時刻まで
Colab 05_correlation.ipynb を実行したうえで答えること。今回の記述は 「批判的に考える」ことが主役。
パートA:選択問題(各10点 ×4=40点)¶
A1. 霊長類データで「体重」と「行動圏」(ともに対数)の相関係数 r に最も近いのは?
- (ア) 0.0 (イ) 0.7 (ウ) −0.7 (エ) 1.0
A2. 「離乳日齢」と「行動圏」は r≈0.66 だったが、体重を統制すると相関がほぼ0(0.05)になった。この現象の説明として最も適切なのは?
- (ア) 乳離れが遅いことが、広い行動圏を直接もたらしている
- (イ) 「体の大きさ」という第三の変数が、離乳日齢と行動圏の両方を動かしていた(交絡)
- (ウ) 計算ミス
A3. アンスコムの四重奏が教えることとして最も適切なのは?
- (ア) 相関係数 r が同じなら、データの中身も同じ
- (イ) r が同じでも、散布図の形はまったく違うことがある。だから必ず図を見る
- (ウ) r は常に信用できない
A4. 「y = x² の放物線データで r ≈ 0 だった」。ここから言える、相関係数の限界は?
- (ア) r はデータ数が多いと0になる
- (イ) r は直線的な関係しか測れず、曲がった関係は見逃す
- (ウ) 放物線には関係がない
パートB:記述問題(AIフィードバック対象・60点)¶
【第5回だけの扱い】数値の引用は任意です
この回の記述は考え方そのものを見る問題なので、ほかの回と違い、数値を引用しなくても満点になります。
- B1は、新聞の見出しという架空の題材を検討する問題です。朝食と成績のデータは手元にないので、数字は書けません。授業のデータ(「離乳日齢と行動圏はr=0.657だったが体重統制後は0.051」など)をたとえとして引ければ加点材料にしますが、必須ではありません。
- B2は、身のまわりの例を自分で作る問題なので、はじめから数値は求めていません。
満点の条件は数字ではなく、対抗仮説(第三の変数)を1つ名指しし、それが両方を動かす仕組みを説明できているかです。
B1.(30点) 次の見出しを読んで答えなさい。
「朝食を毎日食べる子どもは、食べない子より成績が良い ―― だから朝食を食べさせましょう」
この見出しは「朝食 → 成績」の因果を主張している。今日の授業をふまえ、この主張をそのまま信じてよいかを論じなさい。少なくとも、朝食以外の『対抗仮説(第三の変数)』を1つ挙げ、なぜそれが成績を説明しうるかを書くこと。
B2.(30点) 「相関 ≠ 因果」を、自分の身のまわりの例で1つ作りなさい。
- 一緒に増減しそうな2つのこと(相関がありそうな例)
- それを「Aが原因でBが起きる」と結論するのが危ういのはなぜか(交絡・逆因果・偶然のどれか)
目安:B1・B2あわせて350〜550字。自分の言葉で書くこと。
字数は目安です。多少の過不足で減点はしません。見るのは、設問が挙げた要素(上の箇条書き)が書けているかどうかです。ただし要素が抜けていれば、その分は引きます。
次回予告
第6回「確率分布と標本/中心極限定理」。なぜ数百人の調査で全国を語れるのか。一部から全体を推測する、推測統計への入り口。