🗺️ AI 學習與考證地圖
中級科目二程式實戰 · 假設檢定

Welch t 檢定判決書:
p 直接比 α——它是機率,不是差距

正解 Cp=0.021 < α=0.05 → 拒絕「兩組平均相等」的虛無假設、差異達統計顯著;equal_var=FalseWelch t 檢定(不假設變異數相等)。本站 scipy 1.17.1 實跑(逆向工程 A 組 48 位/B 組 52 位、變異數比 3.9 倍):round(p,3)=0.021 一字不差、t=2.3644、df=76.7 帶小數(Welch 招牌)。A 認錯案型——獨立樣本硬用成對檢定,實跑 ValueError(48 vs 52 對不上);B 自創「砍半」規則——雙尾 p 直接與 α 比D 把機率當秒數——實際差距是 26.1 秒,另外算。口訣:獨立找 ind、變異不等找 Welch——p 是機率,不是差距

閱讀模式

00題目

比較 A/B 兩組互相獨立使用者的平均停留時間是否有顯著差異(α=0.05),且兩組變異數可能不相等。下列程式與判讀何者正確?

from scipy import stats   # 統計檢定工具箱
res = stats.ttest_ind(group_a, group_b, equal_var=False)   # 獨立樣本 t 檢定(Welch 版)
print(res.pvalue)   # 輸出 0.021

先說:無罪推定與 5% 的冤枉底線

把假設檢定想成一場法庭審判。被告是一句無聊的話:「A/B 兩組其實沒有差別」——這就是虛無假設 H0,開庭前先做無罪推定。接著檢察官呈上證據(兩組的資料),法官只問一個問題:「假如被告真的無罪(兩組真沒差),出現這麼懸殊證據的機率有多小?」——這個機率就是 p 值。實跑給你看:把 100 位使用者的組別標籤隨機重洗 10,000 次(H0 為真的平行世界),差距像本案這麼懸殊的只出現 224 次(2.24%)——夠罕見。最後看陪審團的底線:α=0.05 是社會願意「冤枉好人」的機率上限——p=0.021 < 0.05,證據罕見到超過底線 → 推翻無罪推定、判「有差異」(正解 C)。三個錯誤選項是三種法庭鬧劇:A 認錯案型(把「兩批不同的人」當成「同一批人前後測」——程式當場報錯);B 自創「底線砍半」的怪規則;D 把「證據的罕見程度」唸成「贓款金額 0.021 秒」。

三個先立好的事實(全部實跑): round(p, 3)=0.021 與題目一字不差(全值 0.0206)——資料是逆向工程出來的真資料(48 vs 52 位、變異數比 3.9 倍)。 equal_var=False=Welch:標準誤各用各的變異數、自由度 76.7 帶小數——手算三步與 scipy 一字不差。 雙尾 p 值已經涵蓋兩尾——直接與 α 比;「跟 α/2 比」是 B 的自創規則。

先點開看:虛無假設 H0p 值是什麼Welch t 檢定

不熟假設檢定?你需要先認識下列名詞

點擊後出現漸進式說明:白話說明 → 說清楚一點 → 常見錯誤與考點。

判決三件套
虛無假設 H0p 值是什麼α 顯著水準雙尾與砍半迷思
Welch 的世界
Welch t 檢定Student t 與合併變異數自由度 76.7 的小數變異數不等的警訊標準誤 SE
樣本身世
獨立樣本成對樣本 ttest_relA/B 測試的統計學排列檢定
顯著的真義
「顯著」的真正意思偽陽性與 αCohen's d 效果量顯著 ≠ 差距大t 分布與尾巴

不熟 Python?你需要先認識下列名詞

點擊後出現漸進式說明

起手式
from scipy import statsttest_ind 的簽名equal_var=False缺值遇到檢定
讀結果
res 物件三兄弟round 與顯示位數實際差距自己算ddof=1 樣本變異數
對質工具
stats.t.sf 生存函數讀 ValueError排列檢定怎麼寫default_rng 與重現

01逐行拆解:三行程式、一場審判

五段,一段一段走完。右上角的「看位置」可以把這一段放回完整程式裡看。

第 1 段工具箱與被告:兩組獨立使用者
from scipy import stats   # SciPy 的統計工具箱
# A 組 48 位、B 組 52 位——不同使用者、互相獨立;變異數比 3.9 倍

檢定住在 scipy.stats(sklearn 管建模、scipy 管統計推論——兩個工具箱分工)。被告先驗明正身:A 組 48 位(平均 300.9 秒、標準差 35.6)、B 組 52 位(平均 274.8 秒、標準差 70.5)——不同的人、互相獨立(A 的死因埋在這)、且變異數差 3.9 倍(題目說「可能不相等」不是客套——這正是 equal_var=False 的出場理由)。

相關名詞:from scipy import stats獨立樣本變異數不等的警訊

第 2 段ttest_ind + equal_var=False:獨立樣本的 Welch 檢定
res = stats.ttest_ind(group_a, group_b, equal_var=False)   # ind=獨立;False=Welch

函式名拆開讀:ttest_indindependent(獨立樣本)——兩批不同的人各量一次;成對(同一批人前後測)才用 ttest_relequal_var=False=不假設兩組變異數相等——改用 Welch t 檢定:標準誤各用各的變異數、自由度用 Welch–Satterthwaite 公式(本題實跑 76.7,帶小數)。C 選項的後半句「equal_var=False 代表採用 Welch t 檢定」——逐字正確

相關名詞:ttest_ind 的簽名equal_var=FalseWelch t 檢定

第 3 段p=0.021:與題目一字不差
print(round(res.pvalue, 3))   # 實跑:0.021——與題目一字不差(全值 0.0206)

這個 0.021 不是抄題目的——本站逆向工程出一組真資料(48 vs 52 位、seed 掃描),讓 Welch 檢定跑出 round(p,3)=0.021 一字不差。p 值的身分證:「假如 H0 為真(兩組真沒差),出現至少這麼極端資料的機率」——它是機率,介於 0 與 1、沒有單位;「兩組差 0.021 秒」(D)從詞性上就錯了。

相關名詞:p 值是什麼round 與顯示位數res 物件三兄弟

第 4 段t 與 df:帶小數的自由度是 Welch 的簽名
print(round(res.statistic, 4))   # 實跑:t = 2.3644
print(round(res.df, 1))   # 實跑:自由度 76.7——帶小數,Welch 的招牌

檢定統計量 t=2.3644:差距是標準誤的 2.36 倍——夠懸殊。自由度 76.7 是個彩蛋級的考點:Student t 的 df 是整數(n₁+n₂−2=98),Welch 的 df 帶小數(Welch–Satterthwaite 公式的產物)——考卷上看到 df=76.7 這種數字,就知道有人開了 equal_var=False。對照實跑:equal_var=True 時 p=0.0231、df=98——本題兩者結論相同,但別因此輕敵(03 節的病態案例天差地遠)。

相關名詞:自由度 76.7 的小數Student t 與合併變異數t 分布與尾巴

第 5 段手算 Welch 三步:與 scipy 一字不差
se = np.sqrt(va/na + vb/nb)   # 11.0506——各用各的變異數,不合併
t = (group_a.mean() - group_b.mean()) / se   # 26.1 / 11.0506 = 2.3644
# df = Welch–Satterthwaite 公式 → 76.7;p = 2 × t 分布右尾 → 0.0206

黑盒子拆開驗貨: 標準誤 se=√(s²A/nA+s²B/nB)=11.0506——注意兩組的變異數各算各的、不合併(這正是 Welch 與 Student 的分水嶺); t=差距 26.1 ÷ 11.0506=2.3644 df 代 Welch–Satterthwaite 公式得 76.7、p=2 × t 分布右尾機率=0.0206。三個數字與 scipy 全部一字不差(np.isclose 三連 True)。

一句話記住本題:獨立找 ind、變異不等找 Welch——p 直接比 α,它是機率,不是差距。C 的每個半句都對;A、B、D 各錯在案型、比法、詞性。

相關名詞:標準誤 SEstats.t.sf 生存函數ddof=1 樣本變異數

02p 值判讀庭:0.021 到底在說什麼

p 的本義(模擬 10,000 個 H0 世界)、與 α 的判決流程、B 的砍半謬誤——三回合開庭:

互動實驗室:p 值判讀庭H0 世界 10,000 次重抽只有 2.24% 這麼極端 · p 比 α 不砍半
本站實跑判決:把 100 位使用者的組別標籤隨機重洗 10,000 次(強迫 H0 為真的平行世界),|t|≥2.3644 的只出現 224 次=2.24%——與參數法的 p=0.0206 相互印證:p 值=「H0 為真時,出現至少這麼極端資料的機率」。判決流程一行:p(0.021)< α(0.05)→ 拒絕 H0 → 差異達統計顯著。雙尾 p 值已經把兩邊尾巴都算進去了——直接與 α 比;B 的「大於 0.05 的一半故不拒絕」是把單尾臨界值的世界觀錯接到雙尾 p 值上,自創規則。

相關名詞:p 值是什麼雙尾與砍半迷思排列檢定

03Welch 對決室:equal_var=False 買了什麼保險

同一批資料、兩種算法對決——本題的溫和版、病態案例的殘酷版、手算的拆解版:

互動實驗室:Welch 對決室本題 0.0206 vs 0.0231 · 病態案例 0.4106 vs 0.0087 · 手算一字不差
為什麼預設就該想到 Welch:Student t 把兩組變異數合併成一個(假設它們相等);當「小組配大變異」時,合併變異數被大組的小變異拉低、t 被灌水——實跑病態案例(10 人 sd 86.7 vs 100 人 sd 9.8):Student p=0.0087 判顯著、Welch p=0.4106 說證據不足——df 從 108 掉到 9.0,一個天堂一個地獄。Welch 在變異數真的相等時也只損失一點點效率——所以「變異數可能不相等」時開 equal_var=False 是便宜的保險絲;本題題幹白紙黑字給了這個條件。

相關名詞:Welch t 檢定Student t 與合併變異數自由度 76.7 的小數

04成對與獨立法庭:A 認錯了案型

「A/B 測試」四個字容易讓人聯想到「成對」——把兩種案型攤開對質:

互動實驗室:成對與獨立法庭獨立=兩批人 · ttest_rel 實跑 ValueError · 什麼時候才用成對
本站實跑判決:成對檢定(ttest_rel)的前提是「同一批受試者、兩次測量」——第 i 位的前測配第 i 位的後測,兩組長度必然相同。本案 A 組 48 位、B 組 52 位是不同的使用者——實跑 stats.ttest_rel(group_a, group_b) 當場 ValueError: Array shapes are incompatible for broadcasting(48 vs 52 根本配不成對)。A/B 測試的標準設計正是「隨機分流、互相獨立」——獨立樣本用 ttest_ind,A 選項連題幹的「互相獨立」四個字都沒讀

相關名詞:獨立樣本成對樣本 ttest_relA/B 測試的統計學讀 ValueError

05差距與機率分辨室:D 把詞性搞錯了

0.021 與 26.1 秒——兩個完全不同的東西,攤開來分:

互動實驗室:差距與機率分辨室差距 26.1 秒 · Cohen's d 0.46 · 大樣本 1.67 秒也顯著
報告的正確寫法(兩個數字都要給):「A 組平均停留 300.9 秒、B 組 274.8 秒,差距 26.1 秒(Cohen's d=0.46,中等偏小);Welch t 檢定 t(76.7)=2.36、p=0.021 < 0.05,差異達統計顯著。」——p 回答「差異是不是抽樣運氣」、差距與效果量回答「差多少、值不值得行動」。大樣本警世(實跑):n=20,000 時差 1.67 秒也顯著(p=0.0051、d=0.028 微小)——顯著是「有證據」,不是「差很大」

相關名詞:實際差距自己算Cohen's d 效果量顯著 ≠ 差距大

06考場加碼:檢定選擇速查表與砍半的身世

t 檢定家族速查(考場最常考「選哪支」):

場景函式例子
兩組不同的人(獨立)ttest_ind(a, b, equal_var=False)本題 A/B 測試(Welch 保險絲)
兩組不同的人、確信變異數相等ttest_ind(a, b)(預設 True)教科書的 Student t
同一批人、前後兩次ttest_rel(before, after)改版前後同一批會員的停留時間
一組 vs 已知常數ttest_1samp(a, popmean=300)本月平均是否 ≠ 300 秒的目標
# 對照組實跑:equal_var=True(Student)——本題溫和、病態案例天差地遠
print(stats.ttest_ind(group_a, group_b, equal_var=True).pvalue)   # 0.0231(df=98 整數)
# 病態案例(10 人 sd 86.7 vs 100 人 sd 9.8):Student 0.0087 vs Welch 0.4106
「砍半」到底從哪來的?合法的 α/2 只出現在臨界值法的雙尾檢定:把 5% 的冤枉配額分給兩條尾巴各 2.5%,去查 t 的臨界值(±t₀.₀₂₅)——這是在「切 α」,不是在「切 p」。而軟體回報的雙尾 p 值已經把兩尾機率加總(p=2×單尾),所以判決永遠是 p 與完整的 α 比。B 的錯法=把臨界值法的 α/2 錯接到 p 值上——兩套流程各自成立、混著用就出事。順帶一提:本題 0.021 連 0.025 都小於——B 連自己的錯誤規則都套錯結論。
串起系列:「科目二統計線」:第 13 頁評估指標、第 16 頁圖表對帳、第 20 頁分位數、第 22 頁串流統計——本頁補上推論統計(假設檢定)的一塊。「不報錯的錯」家族:B 與 D 的程式一個字都不用改、錯全在嘴上——與第 27 頁「四選項零報錯」同款陰險;A 反而是會爆的好錯(ValueError 當場攔)。「一字不差」工法:本頁的 0.021 與第 25 頁的 0.08/0.60/2.4 同款——從題目數字逆向工程出真資料,再讓套件親口說出題目那一行。

相關名詞:成對樣本 ttest_rel雙尾與砍半迷思偽陽性與 α

07四個選項收工

A應改用 stats.ttest_rel,因為 A/B 測試屬於成對樣本認錯案型

題幹白紙黑字「兩組互相獨立」——A/B 測試的標準設計就是隨機分流、兩批不同的人。成對檢定要「同一批人兩次測量」:實跑 ttest_rel(group_a, group_b) 當場 ValueError(48 vs 52 配不成對)。獨立找 ind、成對找 rel。

Bp 值 0.021 大於 0.05 的一半,故無法拒絕虛無假設自創砍半規則

雙尾 p 值已經涵蓋兩條尾巴——判決永遠是 p 與完整的 α 比:0.021 < 0.05 → 拒絕。α/2 只活在「臨界值法」裡(兩尾各分 2.5% 去查 ±t₀.₀₂₅)——切的是 α 不是 p。順帶:0.021 其實也小於 0.025——B 連自創規則都套錯。

Cp=0.021 < 0.05 拒絕「兩組平均相等」的虛無假設、差異達統計顯著;equal_var=False=Welch t 檢定正確

三個半句全對(實跑蓋章):p=0.0206、round 後 0.021 一字不差;0.021 < 0.05 → 拒絕 H0、達顯著(H0 世界實測只有 2.24% 這麼極端);equal_var=False=Welch——標準誤各用各的變異數、df=76.7 帶小數,手算三步與 scipy 一字不差。

Dttest_ind 回傳的 0.021 是兩組平均數的實際差距(秒)詞性錯亂

p 值是機率——介於 0 與 1、沒有單位。實際差距要自己算:group_a.mean()−group_b.mean()=26.1 秒(Cohen's d=0.46)。兩個數字連量綱都不同;把 p 唸成秒數,報告會差出一千倍的世界觀。

回到題目:現在再作答一次

再看一次同一道題。這次你手上有一句口訣了:獨立找 ind、變異不等找 Welch——p 直接比 α,它是機率不是差距

res = stats.ttest_ind(group_a, group_b, equal_var=False)   # 獨立+Welch
print(round(res.pvalue, 3))   # 0.021 < α=0.05 → 拒絕 H0

08自我檢測

八題,全部都是本題的延伸。答錯會直接告訴你錯在哪。

09重點整理

  1. 假設檢定=法庭:H0(兩組沒差)先做無罪推定 → p 值=「若真沒差,出現這麼懸殊證據的機率」→ p < α(冤枉底線 5%)就推翻無罪推定。
  2. 正解 C 三個半句(實跑):round(p,3)=0.021 一字不差(全值 0.0206);0.021 < 0.05 → 拒絕 H0、差異達統計顯著;equal_var=False=Welch t 檢定
  3. 本案資料(逆向工程):A 組 48 位(300.9±35.6 秒)、B 組 52 位(274.8±70.5 秒)——變異數比 3.9 倍、t=2.3644、df=76.7
  4. p 的本義(實跑):標籤重洗 10,000 次的 H0 世界裡,|t|≥2.3644 只出現 224 次(2.24%)——與參數法 0.0206 相互印證;p 不是「H0 為真的機率」。
  5. B 的死因:雙尾 p 值已含兩尾——直接與完整的 α 比;α/2 只活在臨界值法(兩尾各 2.5% 查 ±t₀.₀₂₅)——切 α 不切 p;且 0.021 連 0.025 都小於,B 連自創規則都套錯。
  6. A 的死因(實跑):兩組互相獨立(不同人、48 vs 52)——ttest_rel 要同一批人前後測,實跑當場 ValueError: Array shapes are incompatible for broadcasting
  7. D 的死因(實跑):p 是機率、無單位——實際差距 group_a.mean()−group_b.mean()=26.1 秒、Cohen's d=0.46;0.021 與 26.1 連量綱都不同。
  8. Welch 手算三步(實跑):se=√(s²A/nA+s²B/nB)=11.0506(不合併變異數)→ t=26.1/11.0506=2.3644 → df 用 Welch–Satterthwaite=76.7、p=2×右尾=0.0206——與 scipy 一字不差
  9. df 的指紋:Student df=n₁+n₂−2=98(整數);Welch df=76.7(帶小數)——看到小數自由度就知道開了 equal_var=False。
  10. 病態案例(實跑):10 人 sd 86.7 vs 100 人 sd 9.8——Student p=0.0087 誤判顯著、Welch p=0.4106(df 9.0)守住——equal_var=False 是便宜的保險絲。
  11. 顯著 ≠ 重要(實跑):n=20,000 差 1.67 秒也顯著(p=0.0051、d=0.028 微小)——報告要同時給 p 與差距/效果量。
  12. 考場口訣獨立找 ind、變異不等找 Welch——p 直接比 α,它是機率,不是差距
完整程式碼