【 實用統計模型 】文組生也能輕鬆學會的統計邏輯!

NTU Data Analytics Club
10 min readMay 1, 2024

--

在 NTU DAC 下學期的社課,經過前面的機器學習基本概念以及兩堂 Python 社課,相信社員們對 Python 的使用和資料分析已有基本的概念!這次的社課很榮幸邀請到 DAC 第四屆資訊設計長 Richard 學長,現職為快找整合顧問有限公司、以及 Cutters AI Technologies 的 Data Analyst,和同學們分享 #實用統計模型。

Richard 學長透過自身的跨領域背景,致力於「用一般人也能聽得懂方式講述統計觀念」,帶領社員了解統計的不同面向與應用~

本文 Key Takeaways:

✨ Jupyter Notebook 使用小技巧

✨ 如何定義「好」的迴歸線?

✨ 怎麼用 Python 製作迴歸報表和解讀?

✨ 資料建模

✨ 羅吉斯迴歸

✨ 商業問題實戰練習

Jupyter Notebook 使用小技巧

🧠 在每一次開啟一個新的 Jupyter Notebook 時,可以先簡單條列式紀錄本次目的,讓自己大的腦梳理本次任務,更能夠讓未來與同事的協作更加順利

💡 先寫 Markdown,不要馬上開始 coding

💡 設定開始時間、結束時間 ➔ 瞭解 code 要跑的時間

💡 在數據分析的最一開始:灌入數據科學三寶 ➔ numpy、pandas、matplotlib

實戰商業問題

Step1. 查看資料的資訊

✏️ data.info( )

Step2. 查看前五筆數據

✏️ data.head()

Step3.查看資料的描述性統計

✏️ data.describe()

Step4. 在資料前處理時先更改欄位名稱,讓欄位一目瞭然

✏️ data = data.rename(columns={ })

💡 Tips:中文的文字可先改為英文,避免字體出現問題

Step5. 繪製 Scatter plot

✏️ plt.scatter(data[‘income’], data[‘food_expenditure’], s=10, color=’black’, alpha=0.3)

💡 Notes:s 代表「點的大小」、color 代表「顏色」、alpha 代表「透明度」

如何定義「好」的迴歸線

🧠 一條好的迴歸線能夠最好地擬合資料,並最小化預測值與實際值之間的差距,通常會使用最小平方迴歸(OLS)方法來進行配適。

Least Square Estimation (LSE) ➔ 最小平方法是一種直觀性很強的線性估計方法

Maximum Likelihood Estimation (MLE) ➔ 是一種估計模型參數的方法,適用時機在於手邊有模型,但是模型參數有無限多種,透過真實觀察到的樣本資訊,想辦法導出最有可能產生這些樣本結果的模型參數,也就是挑選使其概似性 (Likelihood) 最高的一組模型參數,這系列找參數的過程稱為最大概似估計法。

殘差 = 實際值 − 迴歸線的預測值,而把每一個殘差取平方,全部加起來,就會是「殘差平方和」,能夠讓殘差平方和最小的線就是我們要的迴歸線!

如何使用 Python 製作迴歸報表和解讀

Step1. 為了使用 statsmodels,需給 X 增加一列常數作為截距

✏️ X = sm.add_constant(data[ ])

Step2. 定義 y = data[ ]

Step3. 使用最小平方法(OLS)進行配適

✏️ model = sm.OLS(y, X).fit( )

Step4. 顯示迴歸結果

✏️ print(model.summary( ))

🧠 在解決商業問題前至少需要看懂

R² (判定係數) 即代表這個模型能解釋的百分比

coef (coefficients):代表該模型的每個迴歸係數(coefficients)

P>|t| (P-value):這個係數在建立 100 次中,有幾次是可用的?(通常報告上,可以不負責任的解釋為,這個迴歸係數存在的機率為何?)

資料建模

🧠 如果要拿掉一個變項,一定要知道為什麼,使商業邏輯通順!

Step1. 為了使用 statsmodels,需要給 X 增加一列常數作為截距

✏️ import statsmodels.api as sm

✏️ X = sm.add_constant(data[[ ]])

Step2. 被迴歸變數

✏️ y = data[ ]

Step3. 使用「簡單線性迴歸」模型進行,統計上叫做 OLS (Ordinary Least Squares) ✏️ model = sm.OLS(y, X).fit( )

Step4. 印出統計結果

✏️ print(model.summary())

💡 如果樣本獨立且服從同一個常態分配,可以 用 QQPlot 把線拉直來看是否有符合常態分佈

💡 Shapiro-Wilk Test,p-value >= 0.05, 代表殘差可能是常態分配的,意味著迴歸模型可能適合這些數據

💡 p-value < 0.05, 即殘差可能不是常態分配,這意味著迴歸模型可能不適合這些數據。因此在商業問題上要符合常態分佈不容易。

💡Richard 也提醒大家,教科書上所定義的各項數值(如:p-value、t 檢定等)不一定能實際符合每個商業問題的需求,建議同學熟悉產業並適時作出調整

羅吉斯迴歸

🧠 羅吉斯迴歸類似線性迴歸分析,主要在探討依變數與自變數之間的關係。線性迴歸中的依變數 (Y) 通常為連續型變數,但羅吉斯迴歸所探討的依變數(Y)主要為類別變數,特別是分成兩類的變數(例如:是/否、有/無、同意/不同意等)。然而,在商業用途中,Logistic Regression 其實「預測」的意義比較大,不一定要詳細解釋數字含義,只需要知道方向性即可。

Step1. 為了使用 statsmodels,需要給 X 增加一列常數作為截距

✏️ X = sm.add_constant(data[ ])

Step2. 被迴歸變數

✏️ y = data[‘ ‘]

Step3. 設定目標函數

✏️ model_Logit = sm.Logit(y, X).fit( )

Step4. 印出統計結果

✏️ print(model_Logit.summary( ))

圖 1:羅吉斯迴歸指標、定義與計算方式(表格經連振宇同意後使用)

實戰商業問題:運用鐵達尼號資料瞭解各變數和倖存勝算間的關係

圖 2:羅吉斯迴歸常見的圖表與舉例(圖片經連振宇同意後使用)

線性方程 = 2.4235−0.3202(𝑝𝑐𝑙𝑎𝑠𝑠)−0.0414(𝑎𝑔𝑒)+0.1773(𝑠𝑖𝑏𝑠𝑝)−0.3291(𝑝𝑎𝑟𝑐ℎ)

+0.0041(𝑓𝑎𝑟𝑒)

艙等每上升一單位,倖存勝算取自然對數就會下降 0.3202

年齡每上升一歲,倖存勝算取自然對數就會下降 0.0414

每多一位船上的兄弟姐妹或配偶,倖存勝算取自然對數就會增加 0.1773

每多一位船上的父母或小孩,倖存勝算取自然對數就會下降 0.3291

每多一元票價,倖存勝算取自然對數就會增加 0.0041

💡Tips:在羅吉斯迴歸中,「數值」雖然不直觀,不過「方向性」很直觀!也可以用 Odds Ratio 來解釋羅吉斯迴歸結果,會更淺顯易懂~

Step1. 首先,先計算 odds ratio 的值

✏️ odds_ratios = pd.DataFrame(

{“Odds Ratio”: model_Logit1.params,

“Lower CI”: model_Logit1.conf_int( )[0],

“Upper CI”: model_Logit1.conf_int( )[1],

})

✏️ odds_ratios = round(np.exp(odds_ratios), 四捨五入)

✏️ odds_ratios

➔ 可得到每個數值的 Odds Ratio、最低/最高信賴區間,例如:

艙等/年齡每上升一單位,倖存勝算就會變成原本的__倍

每多一位船上的兄弟姐妹、配偶或小孩,倖存勝算就會變成原本的__倍

票價每多一元,倖存勝算就會變成原本的__倍

查看資料集中所有數值型變數之間的兩兩關係

➔ 繪製 Pairplot

✏️ sns.pairplot(data, hue=’survived’, diag_kind=’kde’, kind=’scatter’, palette=’husl’)

# hue: 顏色

# diag_kind: 對角線的圖表類型

# kind: 非對角線的圖表類型,

# palette: 調色板

✏️ plt.show( )

圖 3、4:變項的多重共線性(表格經連振宇同意後使用)

Probit Regression

➔ 一種廣義的線性模型,常用於處理二元分類問題,其中 dependent variable 是二元的,也就是只有兩個可能的結果。Probit 迴歸的主要應用是在分析並針對依變數 (dependent variable) 的機率進行建模,通常用於探索事件發生的機率。

Step1. 為了使用 statsmodels,需要給 X 增加一列常數作為截距

✏️ import statsmodels.api as sm

X = sm.add_constant(data[[ ]])

Step2. 被迴歸變數

✏️ y = data[ ]

Step3. 設定目標函數

✏️ model_Probit = sm.Probit(y, X).fit( )

Step4. 印出統計結果

✏️ print(model_Probit.summary( ))

Step5. 獲取預測機率

✏️ y_prob = model_Probit.predict(X)

Step6. 獲取預測類別

✏️ _pred = np.where(y_prob > 0.5, 1, 0)

圖 5:廣義線性模型(表格經連振宇同意後使用)

最後 Richard 學長也提醒大家在做統計時要特別注意 Missing Value 問題!

✏️ 例如:為了解決春吶犯罪過多的問題,政府加派警力,今年犯罪數目再創新高

➔ 在此議題中的重點是春吶影響警力、也影響犯罪人數,並非警察影響犯罪人數。因此,這個例子如果使用迴歸並不能得到正確的結論,還是須回歸到 story telling 才能真正解決問題!

再次感謝 Richard 學長利用一堂課程的時間,用簡單明瞭卻十分扎實的方式,帶領同學由淺入深認識統計邏輯、模型以及觀念,相信同學有滿滿的收穫!

2024.03.20 實用統計模型社課

歡迎各位讀者拍手交流,NTU DAC 也會持續在 Medium、Facebook 與 LinkedIn 更新多樣的資訊,歡迎對資料有興趣的大家持續關注,跟我們交流想法~👏🏻👏🏻

____________________________

📣工商時間

如果你對 DAC 的課程內容深感興趣的話,想要學習資料科學的你/妳別忘了鎖定與關注 FB 粉專、IG ,還有 Podcast 頻道,和我們一起在資料分析和商業決策的路上成長~

💡學習資源

DAC 官網:https://ntudac.com/

FaceBook:https://www.facebook.com/NTUDAC

Podcast:https://linktr.ee/ntudacpodcast

LinkedIn:https://www.linkedin.com/company/ntudataanalyticsclub

Instagram:https://www.instagram.com/ntu_dac/

#NTUDAC #第五屆 #數據分析 #資料分析 #商業決策 #NTUDAC社課精華 #實用統計模型

--

--

NTU Data Analytics Club

臺大資料分析與決策社 (NTUDAC) 為一群對資料科學抱有熱忱的臺大學生創立, 旨在教授學員如何利用數據分析解決商業問題的商業性社團,在 Medium 將分享社團課程與實作專案內容,以期推廣資料分析的相關資訊。