食品分析數據品管Statistics & Measurement Uncertainty
Part 3 進階延伸/第 13 章(建議先修:Ch1–Ch2 統計基礎)

實戰應用:USDA FoodData Central 與配方計算 From Open Data to Formulation — Replicating TechWizard™ Workflows with Free Tools

老闆:「配方軟體一年授權 30 萬,你能不能不用它就做出營養標籤和最低成本配方?」這一章之後,你可以。

🔑 課前暖身 配方軟體很貴,但它的資料庫是免費公開的!USDA FoodData Central 收錄數十萬筆食品成分數據 (CC0 免費授權)。本章用免費資料+基礎代數,重現商業軟體的招牌功能:最低成本配方、營養標籤、逆向工程。
本章新詞先認識:FDC=USDA 食品成分資料庫;質量平衡=進=出的質量守恆列式法;線性規劃=在限制條件下找最便宜組合;overrun=冰淇淋打入的空氣比例。
名詞卡住了?回 Ch0 名詞圖鑑 查白話解釋與比喻。
學習目標
🧪 情境 TechWizard™ 是食品業的配方/標籤/成本計算軟體,它的原料資料庫內建整套 USDA 食品成分資料庫。 本章用免費的 FoodData Central + R, 把官網六個付費範例中最核心的兩個工作流—— Ice Cream 配方與 Reverse Engineering——完整重現一遍。 你會發現:商業軟體沒有魔法,只有你已經學過的統計與代數。

13.1 FoodData Central:免費的世界級食品成分資料庫

FDC 是美國農業部(USDA)維護的食品成分資料庫總入口,資料以 CC0 公眾領域釋出 (使用只需註明出處),提供網頁搜尋、整包 CSV 下載、免費 API 三種取得方式。 五種資料型的品質定位截然不同——這正是 Ch3「數據品質」觀念的活教材:

資料型內容更新教學定位
Foundation FoodsUSDA 自行分析,樣品層級+完整採樣/分析後設資料每年兩次方法對照真值、不確定度討論的最佳素材
SR Legacy傳統營養資料庫(分析+文獻+計算彙編),2018 年定稿不再更新配方計算最常用(本章採用)
Survey (FNDDS)國民營養調查 NHANES 用的食品/飲品每兩年膳食攝取評估
Experimental與 USDA 合作的期刊研究數據不定期研究選讀
Branded全球市售包裝食品的標籤資料每月標籤比較、逆向工程的題庫
⚡ 資料品質不等於資料新 SR Legacy 雖然 2018 年後不再更新,仍是配方業界最常用的基底; Foundation Foods 最新但食品項目較少。「哪一筆資料可信」比「資料新不新」更重要—— 每筆 Foundation 資料都附 dataPoints、min/max 與分析方法的後設資料, 就像 Ch3 的 QC 紀錄,讓你能判斷它的精密度與準確度。

13.2 教學對照表:把 TechWizard 的功能免費重現

TechWizard™ 功能官網對應範例本章的免費重現(R 內建函數)
目標導向配方Ice Creamsolve() 解質量平衡聯立方程(13.3)
最低成本配方(AI 引擎)Processed Cheese成本函數+可行線段端點搜尋(13.4)
營養標籤 / 規格書BBQ Sauce、Spice Blend配方加權平均+捨入規則(13.5)
逆向工程Reverse Engineer Ice Cream檢驗值→目標組成→再解一次配方(13.6)
原料資料庫維護Ingredient Request Wizard™FDC API / CSV + 供應商規格書(13.7)
💡 為什麼值得教? TechWizard 官網的每個範例(BBQ Sauce、Pizza、Spice Blend、Ice Cream、Reverse Engineering、 Processed Cheese、Blueberry Protein Drink)都有 PDF 與影片可當課堂引言; 本章則讓學生親手算出同樣的東西——理解原理之後,用哪套軟體都一樣。

13.3 目標導向配方:冰淇淋的質量平衡

對照 TechWizard 官網 Ice Cream 範例的規格(每 100 kg 配方): 脂肪 12%、非脂乳固形(MSNF)11%、砂糖 14%、玉米糖漿 3%、安定劑/乳化劑 0.5%, 剩下的 82.5 kg 由「乳原料+水」湊足。設 c=鮮奶油、m=全脂鮮乳、s=脫脂奶粉、w=水:

總質量:c + m + s + w = 82.5
脂 肪:0.3608c + 0.0325m + 0.0077s = 12
MSNF:0.0545c + 0.0865m + 0.9607s = 11 係數來自下表原料的 FDC 組成值(質量分數)

4 個未知數、只有 3 條方程式 → 存在「一個自由度」的整個配方家族! 這是配方設計的本質:規格只給出可行範圍,還需要一個額外準則(例如成本最低)才能選出唯一配方。

迷你原料資料庫(摘錄自 FDC / SR Legacy)

原料NDB 編號脂肪 %MSNF %水分 %單價 元/kg(示教用虛構)
鮮奶油(36%)0105336.085.4557.71230
全脂鮮乳010773.258.6588.1038
脫脂奶粉010950.7796.073.20280
砂糖193350—042
玉米糖漿供應商規格0—2055
安定劑/乳化劑供應商規格0—0850
⚡ FDC 覆蓋不了的部分,就是供應商規格書的價值 玉米糖漿、安定劑這類複合加工原料在 FDC 沒有對應品項(或只有籠統值)—— 實務上必須向供應商索取規格書(COA)。這正是 TechWizard 內建 「Ingredient Request Wizard™」的原因:資料庫 + 供應商文件 = 完整的原料檔案。

13.4 最低成本配方:線性規劃的端點直覺

把「一個自由度」參數化成脫脂奶粉用量 s,每個 s 解一次 3×3 聯立方程(R 的 solve()), 就得到整條可行配方家族;再算每個配方的原料成本:

成本 = 230·c + 38·m + 280·s + 0.5·w +(砂糖、糖漿、安定劑的固定成本) 成本是各項用量的「線性」函數 → 線性規劃(LP):極值必出現在可行區域的頂點。 本題可行集合是一條線段 → 最佳解必在兩端之一!
最低成本配方:成本曲線與兩配方比較
圖 13-1 左:成本隨脫脂奶粉用量單調上升,最便宜解在「水→0」的端點;右:兩個等效配方的用料比較(逆向工程結果)
方案鮮奶油全脂鮮乳脫脂奶粉水成本 元/100 kg
最便宜(水→0 的端點)28.847.95.50.311,169
最貴(鮮乳→0 的端點)33.00.39.639.611,480

同一個規格,配方成本可以差 311 元/100 kg(+2.8%)—— 食品廠的毛利就藏在這種計算裡。TechWizard 的「AI 配方引擎」= 同樣邏輯, 只是原料與限制式多到需要單純法(simplex method)自動求解。

13.5 加權營養計算 → 營養標籤

TechWizard 標籤功能的本質:配方加權平均出每 100 g 營養值,再換算每份、套法規捨入規則。 把 13.4 的最便宜配方加權(並用 Atwater 係數 4-4-9 驗算熱量):

熱量 = 4×蛋白質 + 4×碳水 + 9×脂肪 = 4×4.09 + 4×22.30 + 9×12.00 = 213.6 kcal/100 g 若與 FDC 資料庫的 Energy 差很多,通常是該筆資料用了「特定因子」(如乳品 3.87/4.27/8.79)——呼應 Ch4 的迴歸思維
營養素每 100 g(台灣格式)每份 66 g(美國 FDA 格式)
熱量214 kcal140 kcal
蛋白質4.1 g3 g
脂肪12.0 g8 g
碳水化合物22.3 g15 g
糖20.7 g14 g
鈉85 mg55 mg
📋 捨入規則(教學簡化版) 台灣:每 100 g 含量未滿 0.5 g 得標示為 0,一般標至整數; 美國 FDA:熱量 >50 取 10 的倍數、鈉 5–140 mg 取 5 的倍數、營養素 <0.5 g 標 0。 本表為教學簡化,實際以最新法規為準。算出來的標籤(140 kcal / 8 g 脂肪 / 14 g 糖) 與市售香草冰淇淋幾乎一模一樣——因為市售產品就是這樣算出來的。
🍦 為什麼美國每份是 66 g? 冰淇淋打入了空氣(overrun),同體積比混合原料輕很多:若產品密度 0.56 g/mL, overrun ≈ 95%。FDA 的每份參考量(RACC)是體積:本例沿用舊制 1/2 杯(118 mL),換算成重量時要把空氣算進去, 118 mL × 0.56 g/mL = 66 g,而不是把 118 直接當成 118 g。(2016 年起新制 RACC 為 2/3 杯=158 mL,同密度約 88 g;把程式裡的 serv 改成 88/100 即可。)配方是「重量世界」,標籤份量是「體積世界」——橋樑就是 overrun。

13.6 逆向工程:從競品檢驗值反推配方

TechWizard 的招牌功能:買競品來檢驗,反推等效配方。情境:競品香草冰淇淋實驗室檢測 脂肪 10.8%、蛋白質 4.4%。乳蛋白約占非脂乳固形的 36%, 故 MSNF ≈ 4.4 / 0.36 = 12.2%。把這兩個值當新目標,重跑一次 13.3 的聯立方程:

配方鮮奶油全脂鮮乳脫脂奶粉水成本 元/100 kg
我方設計(12%F / 11%M)28.847.95.50.311,169
競品還原(10.8%F / 12.2%M)25.250.46.80.110,791

競品是「低脂高MSNF」結構,成本還便宜 378 元/100 kg——這就是競品分析的價值。

⚡ 反推出的解為什麼「不唯一」?(呼應 Ch6–Ch8) ① 檢驗值本身有量測不確定度;② 標籤值經過捨入;③ MSNF 由蛋白質反推是模型假設; ④ 原料組成有批次變異。所以逆向工程得到的是「等效近似解」, 就像量測結果要帶 ±U 一起報告——配方也該帶著它的不確定度被解讀。

13.7 取得真資料:FDC API 與整包 CSV

  1. 到 fdc.nal.usda.gov/api-key-signup 免費申請 API 金鑰
  2. 用 foods/search 端點查詢(可限定資料型),例如奶油: https://api.nal.usda.gov/fdc/v1/foods/search?api_key=KEY&query=butter,salted&dataType=SR%20Legacy&pageSize=1
  3. R 不需 JSON 套件:readLines(url(...)) 抓回文字,regmatches + regexpr 抽出 "value":717(完整程式在下方,設 RUN_ONLINE <- TRUE 即可體驗)
  4. 要整包資料做統計:到 Download Datasets 頁複製 ZIP 連結 → download.file() → unzip() → read.csv("food.csv")(數十萬列,Ch1 的 mean()/sd() 直接派上用場)
  5. 引用格式(CC0 要求註明出處):U.S. Department of Agriculture, Agricultural Research Service. FoodData Central. fdc.nal.usda.gov
# ====== Ch13 USDA FDC x 配方計算 (完整版請下載 ch13_fdc.R) ======
# --- Part 1. 迷你原料資料庫 (摘自 USDA FoodData Central, SR Legacy, CC0) ---
ing <- data.frame(
  name    = c("鮮奶油","全脂鮮乳","脫脂奶粉","砂糖","玉米糖漿","安定劑"),
  protein = c(2.05, 3.15, 36.16, 0, 0, 0),
  fat     = c(36.08, 3.25, 0.77, 0, 0, 0),
  carb    = c(2.79, 4.80, 51.99, 99.98, 78, 0),
  ash     = c(0.61, 0.70, 7.92, 0, 0, 0),
  price   = c(230, 38, 280, 42, 55, 850))  # 示教用虛構單價 元/kg
ing$msnf <- ing$protein + ing$carb + ing$ash   # 非脂乳固形 (乳品慣用指標)

# --- Part 2+3. 目標導向 + 最低成本配方 (TechWizard Ice Cream 規格) ---
# 規格: 脂肪12 MSNF11 砂糖14 玉米糖漿3 安定劑0.5 -> 乳原料+水 = 82.5 kg
f_c <- .3608; f_m <- .0325; f_s <- .0077
n_c <- .0545; n_m <- .0865; n_s <- .9607
A <- rbind(c(1,1,1), c(f_c,f_m,0), c(n_c,n_m,0))  # 未知數(奶油,鮮乳,水)
balance_mix <- function(tf, tm, grid = seq(0, 12, .05)) {
  out <- data.frame(smp=grid, cream=NA, milk=NA, water=NA, ok=FALSE, cost=NA)
  for (i in seq_along(grid)) {
    b <- c(82.5 - grid[i], tf - f_s*grid[i], tm - n_s*grid[i])
    x <- tryCatch(solve(A, b), error = function(e) rep(NA_real_, 3))
    out[i, 2:4] <- x
    out$ok[i] <- !any(is.na(x)) && all(x >= -1e-9)   # 用量不能是負的
    if (out$ok[i]) out$cost[i] <- 230*x[1] + 38*x[2] + 280*grid[i] +
                     0.5*max(x[3], 0) + (14*42 + 3*55 + 0.5*850)
  }
  out
}
sol <- balance_mix(12, 11)
range(sol$smp[sol$ok])                 #> 5.50 ~ 9.55 kg 的可行線段
best <- sol[which.min(sol$cost), ]
round(best[c("cream","milk","smp","water")], 1)
#> 奶油 28.8 | 鮮乳 47.9 | 奶粉 5.5 | 水 0.3
best$cost                              #> 11169 元/100kg (整個家族最低)
plot(cost ~ smp, data = sol, subset = ok, type = "l", lwd = 2,
     col = "#1565C0", xlab = "脫脂奶粉 (kg)", ylab = "成本 (元/100kg)")
points(best$smp, best$cost, pch = 19, col = "red")
# 成本沿線段線性遞增 -> LP 最佳解必在端點 (TechWizard 配方引擎的核心直覺)

# --- Part 4. 加權營養計算 -> 標籤 ---
wt   <- unlist(best[c("cream","milk","smp")])
prot <- sum(wt*c(2.05, 3.15, 36.16))/100
carb <- (sum(wt*c(2.79, 4.80, 51.99)) + 14*99.98 + 3*78)/100
sugar<- 14 + sum(wt*c(2.79, 4.80, 51.99))/100 + 3*0.26
na   <- sum(wt*c(30, 43, 1010))/100
kcal <- 4*prot + 4*carb + 9*12         #> Atwater 4-4-9 = 213.6 kcal
serv <- 66/100    # 每份 1/2 杯(118 mL) x 0.56 g/mL = 66 g (已含 overrun 的空氣;新制 2/3 杯約 88 g)
c(熱量 = floor(kcal*serv/10)*10, 蛋白質 = round(prot*serv),
  脂肪 = round(12*serv), 碳水 = round(carb*serv),
  糖   = round(sugar*serv), 鈉mg = round(na*serv/5)*5)
#> 140 kcal / 蛋白質3 / 脂肪8 / 碳水15 / 糖14 / 鈉55 —— 市售標籤就是這樣來的!

# --- Part 5. 逆向工程:由競品檢驗值反推配方 ---
msnf_est <- 4.4 / 0.36                 #> 乳蛋白約占非脂固形 36% -> 12.2%
best_re  <- balance_mix(10.8, msnf_est)
best_re[which.min(best_re$cost), c("cream","milk","smp","water","cost")]
#> 奶油25.2 鮮乳50.4 奶粉6.8 水0.1, 約 10,791 元 (低脂結構反而更便宜)
# 解不唯一: 檢驗不確定度 + 標籤捨入 + MSNF 推估假設 (呼應 Ch6~Ch8)

# --- Part 6. 有網路時:FDC API 抓真資料 (金鑰免費申請) ---
# key <- "你的金鑰"   # fdc.nal.usda.gov/api-key-signup
# u <- paste0("https://api.nal.usda.gov/fdc/v1/foods/search?api_key=", key,
#             "&query=butter%2Csalted&dataType=SR%20Legacy&pageSize=1")
# txt <- paste(readLines(url(u), warn = FALSE), collapse = "")
# regmatches(txt, regexpr('"nutrientName":"Energy"[^}]*"value":[0-9.]+', txt))
#> 奶油 Energy "value":717 kcal (整包 CSV 則到 Download Datasets 頁)
R Console輸出 output
[1] 5.50 9.55
    cream milk smp water
111  28.8 47.9 5.5   0.3
[1] 11168.97
  熱量 蛋白質   脂肪   碳水     糖   鈉mg 
   140      3      8     15     14     55 
       cream     milk  smp      water     cost
136 25.24753 50.42204 6.75 0.08042593 10791.01
🎯 配方計算的行動清單 ① 先寫下目標規格(脂肪/MSNF/糖…),再列質量平衡方程式——缺一條就多一個自由度
② 自由度用成本最低收斂:線性目標函數的最佳解在端點,先檢查端點再談最佳化
③ 標籤 = 加權平均 + 法規捨入;熱量用 Atwater 4-4-9 交叉檢核
④ 逆向工程的解必須連同不確定度一起解讀,別把它當唯一真值
⑤ 原料資料 = FDC 公開資料 + 供應商規格書,兩者缺一不可

📊 Excel 也會算:配方計算

📊 沒有 R 也能動手

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

配方計算的核心是「解聯立方程」與「線性規劃」——Excel 用 規劃求解(Solver) 就能做,不用寫程式:
任務Excel 做法
質量平衡配方設各原料用量為變數格,營養合計用 =SUMPRODUCT(用量欄, 成分欄),開 Solver 設目標+限制
最低成本配方目標儲存格=SUMPRODUCT(用量,單價),Solver「最小化」,限制=營養規格上下限
營養標籤各原料「每100g 成分」× 用量加總:=SUMPRODUCT(...)
Solver 開啟:檔案→選項→增益集→「規劃求解載入項」。本章 R 的 solve()(解方程)與端點搜尋,在 Excel 就是 Solver 的「求解」。兩者答案相同——驗證了「商業軟體沒有魔法」。

13.8 參考文獻

  1. U.S. Department of Agriculture, Agricultural Research Service. FoodData Central. fdc.nal.usda.gov(CC0 公眾領域;本章原料組成摘錄自 SR Legacy:NDB 01053、01077、01095、19335).
  2. Owl Software. TechWizard™ Examples. owlsoft.com/techwizard/techwizard-examples(BBQ Sauce、Pizza、Spice Blend、Ice Cream、Reverse Engineer、Processed Cheese 六範例,附 PDF/影片).
  3. Goff, H. D.; Hartel, R. W. Ice Cream, 7th ed.; Springer: New York, 2013.(冰淇淋質量平衡配方、MSNF 定義與 overrun 計算之依據).
  4. Smith, J. S. Evaluation of Analytical Data. In Nielsen’s Food Analysis, 6th ed.; Ismail, B. P., Nielsen, S. S., Eds.; Springer, 2024; Chapter 4.(本課程數據品管統計之主軸教材).