閱讀難度:★★★☆☆
這篇文章的目的,在於幫助你理解,統計在生活中扮演的角色。
統計學裡面那些複雜的理論與計算,對多數人而言並不重要,但是每個人都應該要知道,統計到底幫了你什麼,然後如何應用到你的人生中。
這樣你就會比只會「讀」統計學的人還要厲害。為什麼呢?因為你是想玩真的,認真的學。
下面的內容會依序介紹:
生活中的統計
線性迴歸在統計裡扮演什麼角色
結論
那我們就開始囉!
在知道統計是什麼之前,記得這句話
「統計唯一的目的,就是要幫助我們做決定。」
什麼意思呢?舉個例子來說:
我有個國中同學,叫做李哥。整個學期,李哥除了禮拜五,幾乎每天都遲到,只有一次例外。
如果今天有人來問:「李哥會不會遲到啊?」
我就會先看看今天是不是禮拜五,不是的話我就說:「他肯定遲到啊!猜錯了體育課後,我請喝舒跑。」
但如果是今天是禮拜五,我就會說:「他今天一定會到。」
為什麼我敢賭舒跑?因為我自己偷偷做了統計。
在讀完上面小故事的同時,你應該也和我一樣做了統計,但你有意識到嗎?
其實我們一直都在做統計,很多時候是在無意識的情況之下做的。而這些統計,都是在幫助我們做決定。
再舉個例子,如果你從小就喜歡彈鋼琴,在學生時期也用很多課餘時間彈琴,然後看到2個統計數字:
畢業後因為各種原因,讓你沒有繼續彈鋼琴,找了一份工作,每天都努力工作,在 65 歲退休的機率是90%。
從學校畢業之後,每天做的事就是努力彈鋼琴,在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)
上面就是一個非常簡單的線性迴歸程式了!
現在的你應該還有很多疑問,像是為什麼最小化的是那個值?真正計算出影響程度與某個數字的過程是什麼?但是今天還不會把深入的數學代進來,這段的目的是要給你一個學習的藍圖,讓你知道線性迴歸,在統計裡扮演什麼角色。
總結:
我們平常會接觸到很多的統計數字:失業率統計、國民生產毛額統計、平均薪資統計、出生率、全校考試成績……等等太多了。
這時候都要回到最重要的一句話
「統計唯一的目的,就是要幫助我們做決定。」
用上面退休年齡與毅力的線性迴歸來說,如果看到毅力跟退休程度呈現反向的關係的時候,你並沒有任何感覺。或者你看到出生率逐年下降、失業率上升,也沒有任何感覺。
那我想問你,知道這些統計結果,真的幫到你了嗎?
當你開始思考這些統計數字的意思,對你的影響,然後幫助你更好地做了某個決定的時候,你才會開始真正了解統計的意義。
如果你也想體會學習的樂趣,歡迎來找我們。
Email: fastretrieve.ai@gmail.com
Comentarios