Learning Objectives
- 畫散布圖並用 Pearson r 描述兩個數值變數「一起變化」的方向與強弱
- 說出 Pearson r 只量直線關係、容易受極端值影響,並知道什麼時候改用 Spearman 名次相關
- 解釋為什麼相關不等於因果,舉出第三變數與反向因果兩種可能
- 用辛普森悖論說明「分組看」與「合起來看」為什麼可能得到相反的結論
讀書時數多的人,成績也比較高嗎?
前幾課都在看一個變數:平均、中位數、分布。很多問題其實是在問兩個變數的關係: 讀書時數多的人期末成績比較高嗎?睡得多的人呢?通勤時間長的人呢?
回答這類問題有兩個工具:
- 散布圖:每個人是一個點,橫軸是一個變數、縱軸是另一個。先看圖,才知道關係長什麼樣子。
- 相關係數:用一個介於 −1 到 1 的數字,描述兩個變數「一起變大、一起變小」的程度。
這一課的資料是 students.csv(200 位學生的讀書、睡眠、通勤時間)與 grades.csv(600 筆修課成績),
都是程式產生的模擬資料,不是任何學校的真實資料;裡面的關係是產生資料時設定好的,不能拿來推論真實世界。
逐步看:相關係數矩陣與散布圖
每位學生修 3 門課,先算出每個人的期末平均,再接到學生資料表上。注意右邊記憶體區 df 多了一欄 final_avg。
Pearson r 量的是什麼
Pearson 相關係數 r 的想法:把兩個變數都換成標準分數(離平均幾個標準差,第 15 課),再看兩者是否同號。
r =(每個人的 z_x × z_y 加起來)÷(n − 1)
- x 高於平均時 y 也常高於平均(同號多)→ r 為正;一高一低(異號多)→ r 為負。
- r=1 或 −1:所有點剛好落在一條直線上。r=0:沒有直線關係。
- r 沒有單位,把時數換成分鐘、分數換成百分比,r 都不變。
讀 r 的時候要記得三件事:
| 要注意 | 為什麼 |
|---|---|
| 只量直線關係 | 點排成一條彎曲但一路上升的曲線,r 會小於 1;排成 U 形時 r 可能接近 0,但兩者明明有關係 |
| 容易受極端值影響 | 一個離群很遠的點就能讓 r 大幅改變,甚至變號 |
| 一定要先畫圖 | Anscombe(1973)做了四組資料,平均、變異數、相關係數幾乎一樣,畫出來卻完全不同 |
Spearman 名次相關把每個變數先換成名次(最小的是 1),再對名次算 Pearson r。 它量的是「x 越大、y 是否也越大」(單調關係),不要求是直線;極端值換成名次後只是「最大的那一名」,影響變小。 數值有很多極端值、分布很偏,或資料本身就是順序(例如滿意度 1~5)時,可以用 Spearman。
逐步看:名次、曲線與一個極端值
8 位同學的讀書時數與成績:一路上升,但越往右越平。先比較兩個係數,再加入一個極端值。
相關不等於因果
就算 r 很大,也不能說「x 造成 y」。觀察資料(只是記錄下來、沒有隨機分派)裡的相關,至少還有這幾種可能:
| 可能 | 例子 |
|---|---|
| 第三變數(干擾變數)同時影響兩者 | 對課程有興趣的人讀得比較多,也考得比較好;興趣才是共同的原因 |
| 反向因果 | 成績好的人比較有信心、願意多花時間讀,而不是多讀才變好 |
| 巧合 | 樣本小時,兩個無關的變數也可能算出不小的 r |
要回答「多讀書會不會讓成績變好」這種因果問題,需要隨機分派的實驗,或是很小心的研究設計;這超出這門課的範圍。 這一課的資料是模擬的,所以更不能從結果推論真實世界,例如「多睡覺會讓成績變好」。
辛普森悖論是第三變數最戲劇性的例子:每一組裡面都是正相關,合起來看卻是負相關,或反過來。 名稱來自 Simpson(1951)討論列聯表的論文。遇到這種情況,要依問題判斷該分組看還是合起來看; 如果分組的變數(例如課程)會同時影響兩個變數,通常分組看比較接近你想問的問題。
逐步看:分開看與合起來看
一個虛構的小例子:兩門課各 5 位同學。先算合起來的 r,再依課程分組各算一次。
實作:睡眠時數與期末平均
起始碼已經算好每位學生的期末平均(df["final_avg"])。請用 scipy.stats 算出睡眠時數(sleep_hours)與期末平均的
Pearson 與 Spearman 相關係數,各四捨五入到小數 3 位,印成兩行:
Pearson: ...
Spearman: ...
小測驗:讀懂相關係數
兩個變數算出 Pearson r 約等於 0。下面哪一個說法正確?
在逐步執行的例子裡,加入一位「讀 40 小時、只考 30 分」的同學後,哪一個係數變化比較小?為什麼?
模擬資料裡,讀書時數與期末平均的 r 約 0.37。下面哪一個結論最恰當?
下面程式會印出什麼?
import pandas as pd
df = pd.DataFrame({"x": [1, 2, 3, 4], "y": [10, 8, 6, 4]})
print(round(df["x"].corr(df["y"]), 2))
依課程分組時,每門課裡的 r 都是正的;所有課合起來時 r 卻是負的。這種現象稱為什麼?
重點整理
- 看兩個數值變數的關係:先畫散布圖,再算相關係數。
- Pearson r 介於 −1 與 1,量直線關係的方向與強弱;容易受極端值影響,曲線或 U 形關係會被低估。
- Spearman 先換成名次再算 r,量的是單調關係,比較不受極端值影響;資料是順序或很偏時可以用。
df.corr()算出整張相關係數表;stats.pearsonr、stats.spearmanr算一對變數,結果的.statistic是係數。- 相關不等於因果:可能有第三變數、反向因果或巧合;觀察資料不能下因果結論。
- 辛普森悖論:分組看與合起來看方向相反;要依問題判斷該看哪一個。
- 下一課回到「估計」:樣本算出來的平均有多不確定?用信賴區間表達。
延伸閱讀:Anscombe, F. J. (1973). Graphs in statistical analysis. The American Statistician, 27(1), 17–21; Simpson, E. H. (1951). The interpretation of interaction in contingency tables. Journal of the Royal Statistical Society, Series B, 13(2), 238–241。