top of page
作家相片FastRetrieve.ai

Blog #2: 統計與線性迴歸

閱讀難度:★★★☆☆


這篇文章的目的,在於幫助你理解,統計在生活中扮演的角色。


統計學裡面那些複雜的理論與計算,對多數人而言並不重要,但是每個人都應該要知道,統計到底幫了你什麼,然後如何應用到你的人生中。


這樣你就會比只會「讀」統計學的人還要厲害。為什麼呢?因為你是想玩真的,認真的學


下面的內容會依序介紹:

  1. 生活中的統計

  2. 線性迴歸在統計裡扮演什麼角色

  3. 結論

那我們就開始囉!

 

在知道統計是什麼之前,記得這句話

「統計唯一的目的,就是要幫助我們做決定。」


什麼意思呢?舉個例子來說:


我有個國中同學,叫做李哥。整個學期,李哥除了禮拜五,幾乎每天都遲到,只有一次例外。


如果今天有人來問:「李哥會不會遲到啊?」


我就會先看看今天是不是禮拜五,不是的話我就說:「他肯定遲到啊!猜錯了體育課後,我請喝舒跑。」


但如果是今天是禮拜五,我就會說:「他今天一定會到。」


為什麼我敢賭舒跑?因為我自己偷偷做了統計


在讀完上面小故事的同時,你應該也和我一樣做了統計,但你有意識到嗎?


其實我們一直都在做統計,很多時候是在無意識的情況之下做的。而這些統計,都是在幫助我們做決定


再舉個例子,如果你從小就喜歡彈鋼琴,在學生時期也用很多課餘時間彈琴,然後看到2個統計數字:

  1. 畢業後因為各種原因,讓你沒有繼續彈鋼琴,找了一份工作,每天都努力工作,在 65 歲退休的機率是90%。

  2. 從學校畢業之後,每天做的事就是努力彈鋼琴,在40歲的時候退休的機率是90%。

是你的話,會做什麼樣的決定?

第一個例子的統計學,大多數人應該都很容易就可以做出判斷。所以針對李哥會不會遲到這個問題,我們有一個好的統計方法。


第二個例子的統計學,就沒有這麼好判斷了,有很多原因參雜在其中,可能因為跟人生有關、或者要拿 20 年賭了才能知道⋯⋯等等。這些統計數字即便是真的,對於喜歡彈鋼琴的人,在畢業之後該怎麼做選擇,似乎也沒有決定性的影響能力。


統計的唯一目的,就是在幫助你做決定。

 

學習需要「系統」,依循「原則」能提升效率。


前面講到日常生活中的統計,我們所用的方法,都是一些在我們心裡的規則。


人類的學習很需要所謂的「系統」,在學習的時候,如果有一些原則可以去依循,都能在學習上更有效率。


這些原則有屬於比較廣泛的,像是學會思考才可以學得更快、或永不放棄就可以達成夢想。


而另一種則是很具體、詳細的,告訴你一步一步該怎麼做,可以更直接地遵循學習,這也是我們大部分採用的方式。


上面的圖表達了一個非常直接的流程:我們相信,退休年齡跟堅持做自己喜歡事物的程度,這兩者之間是有關係的。(堅持做自己喜歡事物的程度在下文我們改用毅力來代表。)


但是在「大腦的模型」那個地方,有太多複雜的結構,可能跟生長環境、個性有關,我們並沒有辦法列出所有的可能,然後一個一個去檢視。


在這個情況下,科學家的好習慣就用上了!讓我們先從最簡單的開始吧:


這時候就會開始有數學進入到我們的學習裡,因為數學是科學家們溝通很重要的一個語言。不過不用害怕,只要你記得我們的目的就是:把上面那張圖裡面「大腦的模型」的部分換掉,換成一個簡單一點的就好。


線性迴歸就是最基礎而且非常重要的一個的統計方法。


我們看下面的圖:

先不要糾結於這個公式是為什麼,我們先看他其中一個可能:


退休年齡 = -50 * 毅力 + 80


假設李哥的毅力是60%,那李哥的退休年齡就是50歲,因為:


50 = -50 * 60% + 80


如果李哥的弟弟,李弟,毅力是70%,那李弟退休年齡是45歲,因為:


45 = -50 * 70% + 80

上面是一個簡單的線性迴歸例子。接下來你就會問,該怎麼知道這些值呢?

  • 影響程度 = -50

  • 某個數字 = 80(你可以把它想成當 毅力 = 0 的情況)


先想想我們的目標:找到最符合現實世界的兩個數字。


完美的情況就是:當我知道一個人堅持做自己喜歡事物的程度是60%,那我就猜他的退休年齡是50歲,而他退休年齡也真的就是50歲。


然而世界上這麼多人,每個人不會完全一樣,所以我們的模型不可能完美,但至少我們要離得越近越好,對吧?


更具體的說,我們希望模型猜出來的退休年齡跟真實的退休年齡要越接近越好,用數學的語言就是要最小化這個值:

 

Coding Time!


我們就寫個小程式來玩玩看吧!

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

plt.style.use('ggplot')

constant = np.array([1,1,1,1,1,1,1])
### 毅力 X
persistence = np.array([0.82, 0.53, 0.30, 0.9, 0.75, 0.05, 0.41])
### 真實的退休年齡 Y
retire_age = np.array([31, 47, 56, 21, 33, 70, 65])

X = np.concatenate((constant.reshape(-1,1), persistence.reshape(-1,1)), axis=1) 
Y = retire_age

### 計算出影響程度與某個數字的方法
beta = np.matmul( np.linalg.inv(np.matmul(X.T, X)), np.matmul(X.T, Y)) 

### 印出線性迴歸方程式的圖
plt.scatter(persistence, retire_age, color="b")
plt.plot(np.linspace(0, 1, 101), np.linspace(0, 1, 101)*beta[1] + beta[0], color="r")
plt.title("Retire age = {:.4f} * Persistence + {:.4f}".format(beta[1], beta[0]))
plt.xlabel("Persistence")
plt.ylabel("Retire age")
plt.show()

上面的紅線就是我們算出來的一條線性迴歸方程式,而藍點的部分就是原始的資料。


這邊要注意到的是,紅色的線並沒有通過每個藍色的點。這代表我們預測的退休年齡跟每個人真實的退休年齡並不完全一樣。


你可以去想想為什麼會這樣?

如果你知道答案,那你可以更近一步地想,現在該怎麼辦,我要怎麼做才能讓預測跟真實情況越來越像呢?


下面我們把毅力,真實的退休年齡,預測的退休年齡以及誤差的數值都印出來。

predicted_retire_age = np.matmul(X, beta)
error = retire_age - predicted_retire_age
df = pd.DataFrame({"Persistence": persistence,
                   "True retire age": retire_age,
                   "Predicted retire age": predicted_retire_age,
                   "Error": error})
print(df)

上面就是一個非常簡單的線性迴歸程式了!


現在的你應該還有很多疑問,像是為什麼最小化的是那個值?真正計算出影響程度與某個數字的過程是什麼?但是今天還不會把深入的數學代進來,這段的目的是要給你一個學習的藍圖,讓你知道線性迴歸,在統計裡扮演什麼角色。

 

總結:


我們平常會接觸到很多的統計數字:失業率統計、國民生產毛額統計、平均薪資統計、出生率、全校考試成績……等等太多了。


這時候都要回到最重要的一句話


統計唯一的目的,就是要幫助我們做決定。


用上面退休年齡與毅力的線性迴歸來說,如果看到毅力跟退休程度呈現反向的關係的時候,你並沒有任何感覺。或者你看到出生率逐年下降、失業率上升,也沒有任何感覺。


那我想問你,知道這些統計結果,真的幫到你了嗎?


當你開始思考這些統計數字的意思,對你的影響,然後幫助你更好地做了某個決定的時候,你才會開始真正了解統計的意義。


如果你也想體會學習的樂趣,歡迎來找我們。


167 次查看0 則留言

最新文章

查看全部

Comentarios


bottom of page