JOVANA
Explore Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

相關、直線與最小平方法

那團散點,以及最貼合它的那條線——相關衡量了什麼,又如何把「最佳配適」變成一個精確的概念。

兩個變數,一張散布圖

想像你是一位老師,心裡有個樸素的問題:多讀書,真的會伴隨較高的考試成績嗎?你悄悄記下五位學生各自讀了幾個小時、又各自考了幾分。這幾乎就是每一個迴歸問題的樣貌——你手上有一對對的數字,是同一個對象上的兩個測量值,而你想知道它們如何一起變動。

這兩欄各自是一個變數(variable)——也就是會因學生不同而改變的東西。這裡的兩個變數是讀書時數與考試成績。依慣例,我們把用來解釋或預測的那個變數稱為解釋變數(或預測變數),記為 x;把我們想理解或預測的那個變數稱為反應變數(或結果),記為 y。哪個當 x、哪個當 y,取決於你問的問題——這裡很自然會問:成績(y)如何隨時數(x)而變。

hours = [2, 4, 6, 8, 10]      # hours studied before the exam
score = [55, 65, 70, 80, 85]  # exam score (out of 100)

# five students, five (x, y) pairs
我們的迷你資料集:五位學生,每位都有一個 x(時數)與一個 y(成績)。

第一件該做的事——永遠都是——把資料畫出來,而不是先去摘要它。對兩個數值變數而言,最自然的圖就是散布圖:一個平面,橫軸是 x(時數)、縱軸是 y(成績)。每位學生變成一個點,落在他的(時數,成績)位置上。五位學生,五個點。退一步看,這些點通常會聚成一團雲,而這團雲的形狀就是整個故事。

我們的五位學生畫成散布圖。每個點代表一位學生;這些點從左下往右上爬升,暗示讀越久、分數越高。試著拖一條線穿過這團雲——稍後我們會精確定義哪條線才是最佳。

一張可互動的散布圖,五個點,橫軸是讀書時數、縱軸是考試成績,由左下往右上排列,並有一條你可以拖動、用來貼合這些點的直線。

共變異數與相關係數

我們的眼睛說這團雲往上傾斜,但眼睛會各執一詞,也沒辦法寫進報告。我們想要一個單一數字,捕捉兩個變數如何一起變動。出發點是「共同變動」:當一位學生的時數高於平均時,他的成績是不是也高於平均?

首先我們需要每個變數的中心。平均數(mean,就是一般的平均——把數值相加,再除以個數)是常用的選擇。我們五位學生的時數平均是 (2 + 4 + 6 + 8 + 10) / 5 = 6,記為 x̄(讀作「x-bar」);成績平均是 (55 + 65 + 70 + 80 + 85) / 5 = 71,記為 ȳ。

接著,把每位學生表示成「對平均的偏差」——也就是他高於或低於平均多少。讀 2 小時的學生是 2 − 6 = −4,比平均低 4 小時;他的成績 55 是 55 − 71 = −16,比平均低 16 分。把這兩個偏差相乘:(−4) × (−16) = +64。關鍵就在正負號。如果一位學生在兩者都低於平均,兩個負數相乘得正;兩者都高於平均,兩個正數也得正;只有當他在一邊高於、另一邊低於平均時,乘積才是負的。所以只要兩個變數方向一致,乘積就是正的。

\text{cov}(x,y)=\frac{1}{n}\sum_{i=1}^{n}(x_i-\bar{x})(y_i-\bar{y})

共變異數,用白話說:把每個資料點的(x 偏差)乘上(y 偏差),再取平均。

對我們的資料,這五個乘積是 64、12、0、18、56;總和是 150,所以共變異數是 150 / 5 = 30。它是正的,用一個數字確認了我們眼睛看到的事:那道向上的傾斜。

解方是把單位去掉。我們把共變異數除以 x 的標準差、再除以 y 的標準差——每個標準差代表一個變數對自身平均的典型距離,並帶著該變數的單位。除以兩者,單位就被完全消掉了。得到的就是相關係數(correlation coefficient),記為 r:一個純粹、無單位的數字,而且如我們接下來會看到的,它被牢牢限制在 −1 與 +1 之間。

r=\frac{\sum_{i=1}^{n}(x_i-\bar{x})(y_i-\bar{y})}{\sqrt{\sum_{i=1}^{n}(x_i-\bar{x})^2}\;\sqrt{\sum_{i=1}^{n}(y_i-\bar{y})^2}}=\frac{\text{cov}(x,y)}{s_x\,s_y}

相關係數 r 其實就是共變異數,用兩個標準差予以標準化,讓單位互相抵消。

把我們學生的數字算下去,得到 r ≈ 0.99——一個極為緊密的向上關係。

相關係數的範圍——以及它看不見的東西

相關係數永遠落在 −1 與 +1 之間,而這個範圍就是它的全部詞彙。值接近 +1,代表這些點幾乎完美地落在一條向上的直線上;接近 −1,幾乎完美地落在一條向下的直線上;接近 0,則完全沒有直線樣式。正負號是方向;離零的遠近是強度。

粗略地讀:|r| 大約 0.1 是若有似無的微弱趨勢,0.3 左右算輕度,0.5 左右算中度,超過 0.8 算強。但這些是經驗法則、不是定律——什麼算「強」完全取決於你的領域。在物理學裡 0.9 可能令人失望;在社會科學裡 0.4 可能就是一項受到讚譽的發現。

這裡有個人人會中的陷阱。相關係數只衡量「直線」關係的強度。一段關係可以強而有力、明顯、千真萬確,卻仍然 r ≈ 0。想像專注度如何取決於咖啡:一兩杯讓你精神,十杯卻讓你心悸又無法做事。畫出來是一個倒 U 形——一段很強的關係——但它上升的一半與下降的一半互相抵消,使 r 趨近於零。所以「r = 0」的意思是「沒有直線關係」,絕不是「沒有關係」。

相關係數對離群值也很脆弱。單單一個古怪的點——某位讀了 20 小時卻臨場慌亂、只考 10 分的學生——就能把 r 大幅拉高或拉低,讓一段弱關係看起來很強,或把一段強關係藏起來。這個數字無法告訴你有個搗亂的點潛伏其中;只有圖能。這一切最有名的示範就是安斯庫姆四重奏,一組刻意設計成共享相同摘要數字、外觀卻天差地遠的四個資料集。

安斯庫姆四重奏:四個資料集被設計成共享相同的平均數、相同的標準差、相同的相關係數 r ≈ 0.82——甚至連最佳配適線都一樣。然而其中一個是乾淨的直線趨勢,一個是直線嚴重失真的平滑曲線,一個是被單一離群值扭曲的完美直線,還有一個是只靠一個落單點撐住的垂直堆疊。相同的數字,四種不同的真相。

四張排成方格的小散布圖;全部共享相同的平均數、相同的相關係數與相同的最佳配適線,但其中一張是整齊上升的直線、一張是平滑曲線、一張是被單一高離群值帶偏的直線,還有一張是一疊垂直的點再加一個遠在他方的點。

什麼樣的線才算「最佳」?

相關係數給了我們關於強度與方向的判決,卻沒有給我們一件工具。我們通常想要更多:一條能摘要整團雲、讓我們對任何 x 讀出一個典型 y、又能拿來預測的線。穿過一團點,你可以畫出無窮多條線。哪一條,才配稱為最佳?

要比較不同的線,我們需要一個替它們打分數的方法。任取一條候選的線。對每位學生,這條線都給出一個預測——也就是這條線在該學生時數正上方的高度,記為 ŷ(讀作「y-hat」)。學生真正的成績是 y。兩者之間的落差,殘差 = 實際值 − 預測值,就是這條線對那位學生「猜錯」了多少。

e_i=y_i-\hat{y}_i=y_i-(a+b\,x_i)

第 i 位學生的殘差:他的實際成績,減去這條線(截距 a、斜率 b)所預測的值。

我們把這道落差「垂直」地量,因為這條線的工作是用 x 預測 y,所以垂直落差正好就是 y 上的預測誤差。一條好的線會讓這些殘差都很小。但我們不能直接把它們加起來:一條線可能正好坐在正中央、卻有巨大的誤差恰巧互相抵消——上方很大的正值、下方很大的負值,加總為零。我們需要一種「總誤差」的量法,絕不讓正負互相抵消。

有兩種誠實的解法:把殘差的絕對值加起來,或把它們的平方加起來。平方勝出,有三個理由。它讓每個誤差都變正,所以什麼都不會抵消。它對大誤差的懲罰遠重於小誤差——殘差 4 貢獻 16,殘差 2 卻只貢獻 4——所以這條線會被強力地拉往「避免重大失誤」的方向。而且平方是平滑的,這(靠一點微積分)會給出一條乾淨、精確、求最佳線的公式,而不必盲目搜尋。把絕對值加起來是個真正的替代方案,但平方是經典選擇,建立在它之上的方法就叫最小平方法。

同一團點,一條線穿過它的中央。好的線讓點保持平衡——上方與下方大致一樣多,且讓每一道垂直落差都很小。「最小平方法」就是用來精確挑出這條線的規則。

一團散落的點,中央畫著一條直線,使點在線的上方與下方保持平衡。

最小平方法:讓殘差平方和最小

現在我們可以用一句話說出目標。把所有殘差的平方加起來,得到殘差平方和(sum of squared residuals,常記為 SSR)。每一條候選的線都會產生它自己的 SSR。最佳配適線就是在所有可能的線當中,把 SSR 壓到最小的那一條。用這種方式配適一條線,稱為最小平方法(ordinary least squares,OLS)。

\text{SSR}=\sum_{i=1}^{n}\bigl(y_i-(a+b\,x_i)\bigr)^2

殘差平方和。最小平方法在所有的截距 a 與斜率 b 當中,尋找讓這個總和最小的那一組。

美妙之處在於,你不必試上百萬條線。因為平方是平滑的,微積分直接給我們一個精確答案——而它的材料你早就算過了。最佳斜率 b 正是我們在共變異數那裡遇過的分子與分母:上面是偏差乘積之和,下面是 x 偏差平方之和。最佳截距 a 則是讓這條線通過這團雲「質心」、也就是點 (x̄, ȳ) 的那個值。

b=\dfrac{\sum_{i=1}^{n}(x_i-\bar{x})(y_i-\bar{y})}{\sum_{i=1}^{n}(x_i-\bar{x})^2}\qquad a=\bar{y}-b\,\bar{x}

最小平方法的斜率與截距。注意斜率的分子,正是我們算共變異數時用過的那個總和(150)。

回想我們的總和:偏差乘積加起來是 150,而 x 偏差平方 (16 + 4 + 0 + 4 + 16) 加起來是 40。所以斜率是 b = 150 / 40 = 3.75,截距是 a = ȳ − b·x̄ = 71 − 3.75 × 6 = 48.5。因此我們五位學生的最小平方法直線是:

\hat{y}=48.5+3.75\,x

預測成績 = 48.5 + 3.75 ×(讀書時數)。

b=r\cdot\dfrac{s_y}{s_x}

斜率就是相關係數,再依 y 相對於 x 的離散程度重新縮放。

  1. 算出兩個平均數,x̄ 與 ȳ。
  2. 對每個點,求出它的偏差 (xᵢ − x̄) 與 (yᵢ − ȳ)。
  3. 在每個點把兩個偏差相乘,再把這些乘積加起來——這就是斜率的分子。
  4. 把每個 x 偏差平方後相加——這就是斜率的分母。
  5. 相除得到斜率 b;再令 a = ȳ − b·x̄ 得到截距。
  6. 寫出直線 ŷ = a + b·x,並檢查它確實通過 (x̄, ȳ) 以做合理性確認。
import numpy as np

hours = np.array([2, 4, 6, 8, 10])
score = np.array([55, 65, 70, 80, 85])

# slope (b) and intercept (a) of the least-squares line
b, a = np.polyfit(hours, score, deg=1)
print(round(b, 2), round(a, 2))   # -> 3.75 48.5

# the correlation coefficient r
r = np.corrcoef(hours, score)[0, 1]
print(round(r, 3))                # -> 0.993
實務上你絕不會手算。一行程式就會回傳我們算出的同一組斜率、截距與 r。
每一根短短的垂直線段就是一個殘差——真實點與配適線之間殘留的落差。最小平方法把每根線段平方,再滑動這條線,直到平方長度的總和達到最小。沒有任何一條別的線能在這項分數上勝過它。

一團點,一條配適線穿過其中;短短的垂直線段把每個點連到線上,標出殘差——也就是這條線沒能捕捉到的落差。

解讀斜率與截距

一條配適線,只有在你讀得懂它時才有用。斜率 b = 3.75 是詮釋的引擎:它說,比較兩位讀書時數相差一小時的學生,他們的預測成績相差約 3.75 分。斜率永遠是一個「率」——x 每變動一個單位、y 的變化量——而且它永遠帶著單位,這裡是「分/小時」。把 x 的步幅加倍,預測變化也加倍:多讀兩小時,約可換得 7.5 分的預測成績。這個數字、這個斜率,正是人們講迴歸係數時所指的東西。

截距 a = 48.5 是這條線與縱軸相交之處——也就是 x = 0、一位讀書零小時的學生的預測成績。這有時有意義,有時是胡說。只有當 x = 0 既符合現實、又落在你資料的範圍內時,才去解讀它。我們觀測到最小的 x 是 2 小時,所以 x = 0 落在我們量過的範圍之外;在這裡,48.5 最好被當成一個「用來定位這條線」的數字,而不是對一位從沒翻過書的學生的可信預測。

預測就只是代入。對一位讀了 7 小時的學生,這條線預測 48.5 + 3.75 × 7 = 74.75 分。只有在你實際觀測過的範圍內——這裡是 2 到 10 小時——才信任這種預測。把這條線硬拉到遠超出資料之外,稱為外插(extrapolation),是自信滿滿的預測去送命的地方:在 2 到 10 小時成立的直線樣式,未必能延續到 30 小時,那裡疲憊或許會把曲線壓平、甚至把它折回向下。

這裡的一切,都是線性迴歸的骨架,也是下一篇指南的主角。在那裡,我們會衡量這條線究竟解釋了多少變異(一個叫做判定係數 R²的量)、為斜率附上誠實的不確定性,並檢查一條線對你的資料悄悄做了哪些假設。

相關不等於因果(預告)

我們以整個學習路線中最重要的一句話作結:相關再強、斜率再陡,單憑它們,都無法證明 x 造成 y。我們的資料顯示成績隨時數上升,但光憑數字,無法告訴我們究竟是「讀書提升了成績」,還是「本來就強的學生剛好選擇讀得更多」。

經典的例子:整個夏天裡,冰淇淋銷量與溺水死亡人數一起起落,形成很強的正相關。冰淇淋並不會淹死任何人。是第三個變數——炎熱天氣——同時把兩者往上推。一個暗中同時驅動 x 與 y、因而在兩者之間「製造」出相關的變數,稱為干擾因子,而它正是相關不等於因果的原因。

每當你看到 x 與 y 相關,至少有四種故事能解釋它:x 真的造成 y;y 其實造成 x(反向因果);某個隱藏的第三者同時造成兩者(干擾);或者在一個小樣本、或精挑細選的樣本裡純屬巧合。迴歸本身無法分辨這些——它忠實地衡量「關聯」,對「原因」則保持沉默。

你現在已經擁有迴歸的地基:用散布圖去「看見」關係、用相關係數去衡量強度與方向、用殘差去定義什麼叫「錯」、用最小平方法去釘出那唯一的最佳線——再加上一份誠實,讓你能讀出它的斜率與截距而不過度宣稱。接下來,我們就在這些觀念之上,搭起簡單線性迴歸的完整機械。