食品分析數據品管Statistics & Measurement Uncertainty
Part 1 數據品管統計(Nielsen's Food Analysis 第4章)/第 5 章

有效數字與異常值檢定 Significant Figures, Dixon Q-test & Grubbs Test

學長的報告寫 64.7201359%,被退件;學姊把一個「怪數據」刪掉,被告學術不端。兩個地雷,這一章教你怎麼避開。

🔑 課前暖身 為什麼課本寫 64.72% 而不是 64.7201359%?為什麼全班都考 60–80 分、有人考 5 分你會先懷疑他缺考? 本章教你有效數字的專業規則,以及判斷「手滑數據」的客觀檢定——還有重要提醒:不能為了報告漂亮而亂刪數據。
本章新詞先認識:有效數字=報告該保留的位數;異常值=明顯不合群的可疑數據;Q 檢定/Grubbs 檢定=判斷能否刪除的「法律依據」。
名詞卡住了?回 Ch0 名詞圖鑑 查白話解釋與比喻。
學習目標

5.1 有效數字:報告的誠實度

有效數字 = 所有確定的位數 + 最後一位有疑義的位數。 多報是膨風、少報是浪費。Nielsen 的規則:

規則例子有效位數
小數點後的零算64.7205
前導零(0.00xx)不算0.00722
夾在中間的零算6.4074
整數末端的零預設不算7000 → 7×10³1
寫成 7000.0 則末端零算7000.05

運算取位:乘除看「有效位數最少」的項;加減看「小數位數最少」的項。 先算完再一次四捨五入。

36.54 × 238 × 1.1 = 9566.172 → 9600(1.1 只有 2 位)

7.45 + 8.725 = 16.175 → 16.18(7.45 只有 2 位小數) Nielsen 4.5.1 的兩個課本例題
⚠️ 稀釋倍數的陷阱(課本經典) 咖啡因 43.5 μg/mL 稀釋 50 倍 → 43.5×50 = 2175。若把「50」當 1 位有效數字會得到 2000—— 嚴重低估!A 級容量瓶的容許差 ±0.05 mL,稀釋倍數應寫成 50.0(3 位)→ 2180 μg/mL。 每個數字都要檢視它的「器皿依據」,不能機械套規則。

5.2 異常值:能不能刪?

Nielsen 的答案很明確:「非常罕見(very rarely)」,且必須經過審慎評估。 為了讓精密度變漂亮而刪數據=扭曲結果。客觀工具是 Dixon Q 檢定:

Q = gapW = 可疑值與最近鄰的距離全距(最大 − 最小) Nielsen 式 (4.26):Q > 臨界值 → 該值可在 90% 信賴下捨棄
n345678910
Q0.90 臨界值0.940.760.640.560.510.470.440.41

課本範例:水分 4 重複 64.78、64.53、64.45、55.31?
Q = (64.45 − 55.31)/(64.78 − 55.31) = 9.14/9.47 = 0.97 > 0.76(n=4)→ 可捨棄。

習題 3(乾物質):88.62、88.74、89.20、82.20?
Q = 6.42/7.00 = 0.917 > 0.76 → 可捨棄。捨棄後 mean = 88.85、SD = 0.31 (捨棄前 mean = 87.19、SD = 3.34——差很多!這就是為什麼檢定要客觀)。

# --- Dixon Q 檢定(90% 信賴)---
q_crit <- c("3"=.94, "4"=.76, "5"=.64, "6"=.56,
            "7"=.51, "8"=.47, "9"=.44, "10"=.41)

q_test <- function(x) {
  x <- sort(x); n <- length(x)
  gap <- max(x[2]-x[1], x[n]-x[n-1])   # 兩端誰更可疑
  Q <- gap / (x[n] - x[1])
  list(Q = round(Q,3), Qcrit = q_crit[[as.character(n)]],
       reject = Q > q_crit[[as.character(n)]])
}
q_test(c(64.78, 64.53, 64.45, 55.31))
#> $Q [1] 0.965   $Qcrit [1] 0.76   $reject [1] TRUE

dry <- c(88.62, 88.74, 89.20, 82.20)
q_test(dry)                            # Q=0.917 > 0.76 -> TRUE
dry2 <- dry[-which.min(dry)]           # 捨棄後重算
round(c(mean=mean(dry2), SD=sd(dry2)), 2)
#>  mean    SD
#> 88.85  0.31

# --- 95% 信賴區間(捨棄前 vs 後)---
round(mean(dry) + c(-1,1)*qt(.975,3)*sd(dry)/2, 2)  # 87.19±5.31
round(mean(dry2) + c(-1,1)*qt(.975,2)*sd(dry2)/sqrt(3), 2)
R Console輸出 output
$Q
[1] 0.965

$Qcrit
[1] 0.76

$reject
[1] TRUE

$Q
[1] 0.917

$Qcrit
[1] 0.76

$reject
[1] TRUE

 mean    SD 
88.85  0.31 
[1] 81.88 92.50
[1] 88.09 89.61

5.3 進階:Grubbs 檢定

Q 檢定只看「與最近鄰的距離」,一次只適合處理一個可疑值。 Grubbs 檢定用「離群距離 ÷ 標準差」:

G = max |xi − x̄|SD > Gcrit(n, α) → 為異常值

對乾物質數據:G = |82.20 − 87.19|/3.34 = 1.496 > 1.481(n=4, 95% 雙尾)→ 勉強超過臨界值,判定為異常值;但差距極小,實務上應優先查實驗紀錄找原因,而不是只憑檢定剔除。

# Grubbs 臨界值(t 分布近似公式)
grubbs_crit <- function(n, alpha = 0.05) {
  t2 <- qt(alpha/(2*n), df = n-2)^2
  ((n-1)/sqrt(n)) * sqrt(t2/(n-2+t2))
}
round(sapply(4:8, grubbs_crit), 3)
#>  n=4    n=5    n=6    n=7    n=8
#> 1.481  1.715  1.887  2.020  2.127

G <- max(abs(dry - mean(dry))) / sd(dry)
G                                  #> 1.496
G > grubbs_crit(4)                 #> TRUE -> 82.20 是異常值
R Console輸出 output
[1] 1.481 1.715 1.887 2.020 2.127
[1] 1.495783
[1] TRUE
🔗 其實你剛剛做的就是「假說檢定」 Q 檢定與 Grubbs 檢定的骨架一模一樣:先假設 H0:這個可疑值和其他值來自同一個母體(它只是運氣不好的正常數據)。 算出的 Q 或 G 超過臨界值=「如果 H0 為真,這麼極端的值很罕見」,所以拒絕 H0。 完整邏輯(H0、p 值、型一/型二錯誤)在 Ch15 假說檢定。 但請記住:拒絕 H0 不等於可以直接刪數據——檢定只說「它很可疑」,能不能刪還要過下面的三條底線。
⚖️ 學術倫理三條底線 ① 只有可追溯的操作失誤紀錄(漏加試劑、樣品灑落)+統計檢定支持,兩者兼備才可刪除
② 刪除必須在報告中揭露(檢定方法、數值、理由)
③ QUAM §2.4.13 同樣警告:「純粹以統計理由拒絕數值通常不明智」——統計是輔助,不是藉口

📊 Excel 也會算:異常值檢定與有效數字

📊 沒有 R 也能動手

⬇ 下載本章 Excel 活頁簿 數據、公式、白話說明都排好了,打開就能算;改黃色儲存格試試看,最後一張工作表會幫你和 R 的答案對照。

有效數字:若 =ROUND(數值, 小數位數);要求保留有效數字則 =ROUND(數值, 位數-1-INT(LOG10(ABS(數值))))。
Dixon Q 檢定:將 4 個值由小到大排序於 A1:A4(如 55.31、64.45、64.53、64.78),可疑值若是最小值:
計算Excel 函數說明
gap(可疑值與相鄰的差距)=A2-A164.45-55.31=9.14
全距 W=A4-A164.78-55.31=9.47
Q 值=(A2-A1)/(A4-A1)約 0.97
判定=IF(Q>0.76,"可剔除","保留")n=4 臨界值 0.76
若可疑值是最大值,Q==(A4-A3)/(A4-A1)。Excel 內無 Q 檢定,查表為首。

Grubbs 檢定:適用於不需要排序的原始資料(如 A1:A4):
計算Excel 函數說明
G 值=MAX(ABS(A1:A4 - AVERAGE(A1:A4))) / STDEV(A1:A4)須按 Ctrl+Shift+Enter (舊版) 或直接 Enter (新版)
臨界值 Gcrit=(COUNT(A1:A4)-1)/SQRT(COUNT(A1:A4)) * SQRT(T.INV.2T(0.05/COUNT(A1:A4), COUNT(A1:A4)-2)^2 / (COUNT(A1:A4)-2 + T.INV.2T(0.05/COUNT(A1:A4), COUNT(A1:A4)-2)^2))利用 \(\alpha/n\) 反求雙尾 t 分配,免查表!
判定=IF(G值 > G_crit, "可剔除", "保留")n=4 時 Gcrit 算出來精準等於 1.481