# Orange Data Mining 實作指南 — NMR 食品分析（PCA + PLS 回歸）

> 給課堂用的「不寫程式」版本。學生用拖拉式 widget，重現 Python 影片裡的 PCA 與 PLS 回歸結果。
> 資料：`../data/wine_nmr_orange.tab`（40 支白酒 × 138 個 NMR 桶 + 17 項參考值，malicAcid 為目標值）。
> 一鍵開檔：`wine_nmr_workflow.ows`（已含 8 個 widget、8 條連線）。
> Orange 版本：3.36+（PCA、PLS、Test and Score 皆為內建）。

---

## Part 0 ｜ 安裝 Orange

1. 到 <https://orangedatamining.com/download> 下載安裝（Windows / macOS 皆可，含 Python）。
2. 開啟 Orange，看到空白 canvas、左側 widget 工具列即安裝成功。
3. 本指南用到的 widget 都是內建：**Data ▸ File / Data Table**、**Unsupervised ▸ PCA**、
   **Visualize ▸ Scatter Plot**、**Model ▸ PLS**、**Evaluate ▸ Test and Score / Predictions**。

---

## Part 1 ｜ 認識資料

`wine_nmr_orange.tab` 欄位（已標好角色，直接可用）：

| 欄位 | 數量 | 角色 (role) | 說明 |
|------|------|------------|------|
| `sample_id` | 1 | **meta** | 樣本編號（不參與分析） |
| 16 個參考值（除 malicAcid） | 16 | **meta** | 乙醇、甘油、pH 等（不作為預測目標） |
| `malicAcid` | 1 | **target（class）** | 蘋果酸含量 g/L，連續值 → PLS 回歸目標 |
| 138 個 ppm 桶（`p0.52` … `p5.98`） | 138 | **feature** | NMR bucketed intensities，面積標準化輸入 |

> 資料來源：KU Quality & Technology（ucphchemometrics.com）白酒 ¹H-NMR（NMR_40wines.mat），公開學術資料。

---

## Part 2 ｜ 開啟現成工作流程

`File ▸ Open` 選 `wine_nmr_workflow.ows`。會看到兩條分支：

```
                 ┌──────────────┐
         ┌──────▶│  Data Table  │   檢視分桶後光譜
         │       └──────────────┘
         │       ┌──────┐  Transformed Data   ┌──────────────────────────────┐
         │  ┌───▶│ PCA  │────────────────────▶│ Scatter Plot（Color=malicAcid）│  ← PCA 分支
 ┌───────┴──┐│   └──────┘                      └──────────────────────────────┘
 │  File    ├┤
 │wine_nmr_ ││   ┌─────┐ Learner  ┌──────────────┐  Data   ┌─────────────┐
 │orange.tab│└──▶│ PLS │─────────▶│ Test & Score │────────▶│ Predictions │
 └──────────┘    └─────┘          └──────────────┘         └─────┬───────┘
                    │                                              │ Predictions
                    │ Model                               ┌────────▼────────────┐
                    └────────────────────────────────────▶│ Scatter Plot        │  ← pred vs measured
                                                           │（x=malicAcid,       │
                                                           │  y=PLS predicted）  │
                                                           └─────────────────────┘
```

**第一步永遠是設定 File widget**：雙擊 `File` → 右下 `Browse` 選 `../data/wine_nmr_orange.tab` → 按 `Apply`。
（`.tab` 檔已標好角色：`malicAcid` = target（連續），`sample_id` / 其他參考值 = meta，138 個桶 = feature。）

> 中文路徑載入失敗時，把 `wine_nmr_orange.tab` 複製到純英文路徑再 Browse。

---

## Part 3 ｜ PCA 分支（對應第一支影片）

**目標**：把 138 個 NMR 桶壓成 2–3 個主成分，看酒的化學結構，並以蘋果酸濃度著色。

| # | 動作 | Widget 設定 | 應觀察到 |
|---|------|------------|---------|
| 1 | 拉 **File** | 載入 `wine_nmr_orange.tab` | 40 instances、138 features、target = malicAcid |
| 2 | 接 **Data Table** | （File→Data Table） | 看到分桶後 NMR 強度表格 |
| 3 | 接 **PCA** | 視窗內勾 **Normalize variables**（= autoscale），看變異解釋曲線 | **PC1 ≈ 78.5%**，前 3 個成分 ≈ 95.7% |
| 4 | 接 **Scatter Plot** | PCA 的 **Transformed Data** → Scatter Plot | 下一步上色 |
| 5 | 設定 Scatter Plot | Axis x = **PC1**、y = **PC2**、**Color = malicAcid** | 沿 PC1 有蘋果酸濃度梯度，高低濃度的酒分佈在不同側 |

**教學提問**：
- PCA 有沒有用到蘋果酸含量？（沒有，它是非監督；卻仍沿蘋果酸梯度排列 → 結構自己說話）
- 把 Color 改成其他參考值（乙醇、pH…），觀察不同化學梯度的位置。
- PCA 能直接告訴我們某支酒的蘋果酸是多少克嗎？（不能 → 需要 PLS 回歸）

> 影片的 Python 版多做了明確的面積標準化；Orange 只勾 Normalize（autoscale），座標數值會略有不同，
> 但「PC1 主導乙醇結構、蘋果酸沿 PC1 梯度分佈」的結論一致。

---

## Part 4 ｜ PLS 回歸分支（對應第二支影片）

**目標**：用 138 個 NMR 桶預測 **蘋果酸含量（g/L，連續值）**，並誠實驗證預測精度。

> **關於 Orange PLS widget**：本課的 PLS 是回歸（預測連續值），Orange 內建的 **PLS** widget
>（Orange.widgets.model.owpls.OWPLS）正是做數值回歸的——和本課完全對應。
> 把 `malicAcid` 設成 target（continuous），直接使用，不需任何替代方案。
> （這與質譜課不同：質譜課的 PLS-DA 是分類，Orange PLS 只做回歸，故改用 Logistic Regression。
>  NMR 課的 PLS 本來就是回歸，Orange PLS 直接可用。）

| # | 動作 | Widget 設定 | 應觀察到 |
|---|------|------------|---------|
| 1 | 拉 **PLS** | （Model 類別）**Components**（LV 數量）初設 7；**Iteration limit** 預設 | 產生 Learner 和 Model |
| 2 | 接 **Test and Score** | File 的 **Data** → Test&Score 的 **Data**；PLS 的 **Learner** → Test&Score。選 **Cross validation, 10 folds** | **R²（CV）≈ 0.93，RMSE ≈ 0.19 g/L** |
| 3 | 接 **Predictions** | File 的 **Data** → Predictions 的 **Data**；PLS 的 **Model** → Predictions 的 **Predictors** | 出現預測值欄位 |
| 4 | 接 **Scatter Plot** | Predictions 的 **Predictions** → Scatter Plot；Axis x = **malicAcid**（真實值）、y = **PLS predicted**（預測值） | 點沿對角線排列；R²、RMSE 呼應影片 nm07 |

**重現影片的「選 LV」教學（選做）**：
- 在 PLS widget 把 Components 從 1 逐漸增加到 12，觀察 Test&Score 的 RMSE：
  1 個 LV 時 RMSE ≈ 0.47 g/L；到 7 個 LV 時達到最低 ≈ 0.19 g/L。
- 超過 7 個 LV，RMSE 不再下降（有時甚至略升）——這就是「轉折點」，呼應影片 nm06。
- 教學結論：交叉驗證挑「夠用」的 LV 數，不是越複雜越好（避免過度擬合）。

**看哪些 ppm 桶在預測蘋果酸**（呼應影片 nm08）：
- 在 PLS widget 下方可看到 **Coefficients** 輸出接口，接 **Data Table**；
  或把 PLS Model 接 **Inspect Model**，查看各桶係數。
  係數最大的桶對應 ~2.96 ppm——正是蘋果酸 CH₂ 的化學位移，和影片係數圖一致。

---

## Part 5 ｜ 和 Python / 影片對照

| 概念 | 影片 / Python 圖 | Orange widget |
|------|-----------------|---------------|
| NMR 分桶光譜（原始） | nm01, nm02 | File → Data Table |
| 主成分數量 | nm03 scree | PCA 視窗內的變異曲線（PC1=78.5%） |
| 分數圖（依蘋果酸上色） | nm04 | PCA → Scatter Plot（Color=malicAcid） |
| 選 LV / RMSECV 轉折 | nm06 | PLS Components 調整 + Test&Score RMSE |
| 預測 vs 真實（R²=0.93） | nm07 | Predictions → Scatter Plot（x=malicAcid, y=predicted） |
| 哪些 ppm 在預測 | nm08 | PLS Model → Coefficients / Inspect |

學生先看影片建立直覺、看 Python 看「怎麼算」、最後用 Orange 親手「拉一遍」，三層遞進。

---

## Part 6 ｜ 疑難排解

| 現象 | 原因 / 修法 |
|------|------------|
| PLS / Test&Score 灰掉沒反應 | File 沒把 `malicAcid` 設成 target；檢查 `.tab` 的第三行 flags |
| Test&Score 看不到 R² | 選的是 Classification 而非 Regression 評估指標；切換至 Regression 欄 |
| Predictions Scatter 沒有「PLS predicted」欄位 | 確認 PLS 的 **Model** 接到 Predictions 的 **Predictors**（不是 Learner） |
| Scatter Plot 沒有 PC1/PC2 選項 | 確認連的是 PCA 的 **Transformed Data**（不是原始 Data） |
| R² / RMSE 和 Python 略不同 | 隨機折數略有差異（Orange 10-fold 預設 seed 不同）；量級一致即可（R² 應 ~0.9+） |
| 中文路徑載入失敗 | 把 `wine_nmr_orange.tab` 複製到純英文路徑再 Browse |
| PLS Components 設 1 時 RMSE 很高 | 正常——1 個 LV ≈ 0.47 g/L；需加到 7 個 LV 才達最低，這是課程重點 |
