# ラーメン豚山 スープAI評価 アルゴリズム特定レポート（改訂版 v2）

> **改訂の経緯**: 初版に対するレビュー指摘（件数不一致・加点ケースの見落とし・評価者集計の誤り・再現性欠如）を受け、
> 全数値を `analysis.py` でCSVから再計算し直した。指摘の多くはデータで裏付けられ、特に**Brix補正は対称な減点ではなく非対称（未満のみ罰する）**という重要な修正を反映した。

## 0. データソースと再現性
- 入力: `../data/raw_csv/base_export.csv`（Downloadsの「回答結果」フル版エクスポート。初版で参照した `グリッド10` は `data/raw_csv/legacy_ai_request_grid_10.csv` に保管）。
- **再計算は `python analysis.py` で誰でも再現可能**。出力は `analysis_output.txt` に保存。
- 件数（このフル版での実数）:
  - 全レコード **958**／うち**人間採点あり 687**／AI推論のみ（人間未採点）271
  - 異常値 `total=880`（入力ミス、2026/01/10小田原）1件を除外 → **分析対象 686件**
  - 対象期間: 2025/11/05 〜 2026/05/30
- ※初版の「573行/519件」やレビューの「520件」は旧 `グリッド10`（12月以降の部分集合）に基づく。データセットが差し替わったため件数が異なる。

---

## 1. 特定したアルゴリズム（2段階・濃度補正は非対称）

```
濃度込みの点数 ≈ 状態スコア(スープのみ点) + 濃度補正
  濃度補正 = −7.6 × max(0, 目標Brix − 実測Brix)      ← 目標未満のときだけ強く減点
           +  0  × max(0, 実測Brix − 目標Brix)        ← 目標以上は罰しない
  目標Brix: 開店前=13 / ディナー(17〜19時)=12
```

### 【重要な訂正】Brix補正は「片側」だった
初版は「目標から外れるほど減点（高すぎも減点する山型）」としたが**誤り**。再集計（`analysis.py §6`）では：

| 実測Brix − 目標 | 件数 | 濃度込み−スープのみ の平均 |
|---|---|---|
| −3.5 | 34 | **−6.1** |
| −2.5 | 27 | −9.3 |
| −2.0 | 55 | −5.5 |
| −1.0 | 175 | −3.1 |
| **±0** | 339 | +0.5 |
| +1.0 | 44 | **+3.9** |
| +1.5 | 9 | +2.2 |
| +2.5 | 3 | +16.7 |

→ ズレと補正は**単調増加**（相関 +0.36）。目標を**超えても減点されず、むしろ加点傾向**。回帰でも `gap_under = −7.6`、`gap_over = +0.2(≒0)` と非対称が明確。

### 【レビュー指摘2・3の確認】加点ケースは実在（73件）
`濃度込み > スープのみ` が **73件**（=, > , < は 494 / 73 / 119件）。
「素点 − ペナルティ」という単純式では再現不能で、レビューの指摘どおり。濃度込み点は
**「見た目の素点を、濃度（と総合）を踏まえて上下に再評価した別スコア」**と解釈すべき。
→ プロトタイプを非対称式に修正済み（`scoring_prototype.py`、超過は罰しない＝加点側を潰さない安全形）。

### 状態スコア（見た目）の重み（回帰係数, R²=0.560 / MAE=6.98 / N=686）
| 要因 | 寄与 | 要因 | 寄与 |
|---|---|---|---|
| 状態良い・微乳化 | **+9.5** | 分離・白すぎ・シャバ | −5.1 |
| 撮影不能(湯気/未沸騰等) | **−8.7** | 軽い・脂不足 | −4.1 |
| アブラ感過多・重い | −8.7 | ガラ感不足 | −3.7 |
| Brix目標未満(1あたり) | −7.6 | 火が強い/水位/薄い | ほぼ0〜−1.4(弱い) |

→ 中核は **乳化バランス**（微乳化が理想、分離/シャバは減点）と **脂とガラのバランス**（重すぎも軽すぎも減点）。火力単体・水位単体は弱い。

> **この回帰の限界（重要）**: 上記の重みは動画から抽出した特徴量ではなく、**評価備考(コメント)に現れた指摘語**とスコアの関係から得た擬似特徴量に基づく。
> つまり「動画から職人が見ている特徴量を特定した」のではなく「コメントに書かれた指摘とスコアの相関を見た」段階。コメントは事後の指摘のみで全状態を網羅しないため、減点要素が書かれない高評価回では特徴が立たない。**動画特徴量としての妥当性は未検証**（`feature_design.md`）。

---

## 2. 評価者別集計（レビュー指摘4を訂正・全データで再計算）

| 評価者(担当店) | 件数 | スープのみ平均 | 濃度込み平均 |
|---|---|---|---|
| 藤田　潤（神保町） | 315 | 93.4 | 91.9 |
| 川村　純史（小田原）| 212 | 79.0 | 75.6 |
| 稲葉　繁（武蔵村山）| 67 | 70.2 | 74.0 |
| 西島　功之助（大宮）| 55 | 60.7 | 66.9 |
| 垣内　孝太（静岡新川）| 37 | 82.7 | 74.6 |

- 初版の件数・平均の取り違えを修正。なお旧 `グリッド10`(部分集合)とは母数が違うため数値も異なる。
- **重要な限界**: 1評価者=1店舗で固定のため、「評価者の甘辛」と「その店のスープ実力」は**統計的に分離不能（交絡）**。よって上表の差を“バイアス”と断定できない。`scoring_prototype.py` でも参考値に留め、運用では補正0を既定とした。真の正規化には**同一店を複数評価者が採点するデータ**が必要。

---

## 3. 既存AIモデルの実力（新発見・JSON列より）
CSVの `結果` 列には現行AI推論の `pred_score` が入っている（`analysis.py §8`）。人間採点と対応する604件で比較：

- 出力は **{20, 60, 100} の3値のみ**（60が380件と大半）＝実質3段階分類器。
- 人間スコアとの相関 **0.31**、MAE **19.7点** … **精度はかなり低い**。

→ 現行AIは粗い3段階分類で、職人の連続評価を再現できていない。本レポートの2段階モデル＋画像特徴量で置き換える価値が定量的に示された。

---

## 4. 入力は「静止画像」で進める（方針確定）
本プロジェクトは**動画ではなく静止画像でAI判定する**方針。理由と設計は `feature_design.md`（画像AI版）に記載。要点：
- 動画専用特徴（対流速度・フレーム間差分・オプティカルフロー・泡/湯気の動き）は**使わない**。
- 静止画で安定して取れる **色分布・白濁度・表面油(油膜面積率)・液面ROI品質/白飛び率** を中心に。
- **Brixは画像から推定しない**（照明・湯気・反射の影響大）。濃度計の実測値を別入力にし、画像は見た目評価に専念。
- 静止画では粘度の直接計測は不可 → 表面の照り・濁りの均一性からの間接推定に留め、Brixで補う。

## 5. 成果物
| ファイル | 内容 |
|---|---|
| `analysis.py` | **再現可能な分析スクリプト**（件数・集計・相関・回帰・既存AI比較を全てCSVから再計算） |
| `analysis_output.txt` | 上記の実行ログ（数値の根拠） |
| `scoring_prototype.py` | 採点ロジック再現（非対称Brix補正・**静止画像入力前提**）(A) |
| `validate_prototype.py` | プロトタイプを人間686件で検証（MAE 9.8 / ±15点で78%一致。コメント由来特徴の限界により画像特徴量で改善見込み） |
| `feature_design.md` | **静止画像→特徴量の仮説設計**（未検証であることを明記）(B) |
| `../data/raw_csv/base_export.csv` | 分析に使用した正規データ |
| `分析レポート.md` | 本書 |

---

## 6. 残課題と開発順
1. **静止画データの整備**: 既存動画から代表フレームを切り出す or 店舗に静止画を撮ってもらい、職人スコアと紐づけ（スコア80〜100帯を重点収集）。
2. **特徴量はまだ仮説**: `feature_design.md` はOpenCVで測れる“候補”の段階。実画像での抽出精度・照明/湯気耐性・職人点との相関は未検証。静止画サンプルでの実測が次ステップ。
3. **開発順**: ①静止画整備 → ②OpenCV特徴量で説明可能モデル（本スコア式）→ ③画像分類/回帰AIで直接予測 → ④Brixを別入力で最終補正。
4. **濃度込み点の本質の確定**: 現状は「素点＋非対称Brix補正」で R²0.56/MAE7。加点73件には総合判断が混じる可能性。画像特徴量を入れて再検証。
5. **評価者バイアスの分離**: 同一店×複数評価者データの収集が前提。
6. **撮影品質ゲート**: 評価不能（白飛び/暗すぎ/被写体不足）を味評価から分離するのが最優先。
