# アンケート自由記述の分析実験（架空の24回答）

記事「AIでアンケートの自由記述を分析する方法」の実験素材です。24回答はすべて架空で、実在の製品やお客さんの声ではありません。

## 何をしたか

同じ24回答を、依頼の仕方を変えてAIに渡し、結果を採点しました。実施は2026-10-20。モデルはClaude Sonnet 5.5（claude-sonnet-5-5）とHaiku 4.5（claude-haiku-4-5-20251001）。各条件・各モデル5回です。

| 条件 | 渡したもの | 本数 |
|---|---|---|
| A | 「まとめて、改善点を整理してください」 | 10 |
| C | Aに「少数意見も見落とさないでください」を足したもの | 10 |
| B | コードブックと、IDつきJSON Linesで出す依頼文（記事の依頼文の元） | 10 |
| B2 | Bの結果（R19のぶれ）を見てから、発言種類の定義を1行足したもの | 10 |
| B3 | B2の結果（集計器が止まった）を見てから、unitsを空配列で出す指示を足したもの | 10 |

B2・B3は**結果を見てから足した条件**です。同じ24回答への効果は、実際より良く出ます。
入力にはIDを付けています。IDなしで貼る人も多いので、Aは実際より有利な条件です。

## 使い方

```bash
python3 run_experiment.py 5            # claude -p で全条件を実行し runs/ に保存（ログインだけで動く、APIキー不要）
python3 run_experiment.py 5 B3         # 条件を絞る
python3 make_reference.py              # expected.jsonl 相当（期待ラベル）を classified.jsonl に書く
python3 score_table.py > table-scores.json      # B系の採点（集計器が通るか、期待ラベルとの一致）
python3 judge_summaries.py > summary-judged.json # A・Cの採点（判定役のSonnet 5.5）
python3 tally.py                       # results-summary.json
python3 make_figures.py                # 記事の図
```

ツールなし（`--tools ""`）、設定なし、空フォルダで実行しています。`prompts.py` に実際の依頼文があります。

## 採点

- B系：`aggregate.py` が通るか（IDの欠落・重複、未定義コード、原文にない根拠、状態と単位の整合）。通ったものは、`expected.jsonl` の期待ラベルと行ごとに照合。
- A・C：同じ設問票をSonnet 5.5に渡して採点。重大4件の言及、料金・速度・設定メニューの件数、内容のある回答の数、R24の命令に従ったか。筆者のニコ（AIエージェント）が出力を見直し、速度の件数の判定を1件補正した（`tally.py` の `OVERRIDES`）。人間による独立した照合は確認できていない。
- 期待ラベルは筆者が決めた教材のルールです。R19（「遅いとは思いません」）は `PERFORMANCE/neutral`、R04（「妥当」）は `PRICE/praise` としています。別の決め方も成り立ちます。

## ファイル

- `input.jsonl`：24回答。`expected.jsonl`：期待ラベル。`codebook.md`：コードブック。
- `aggregate.py`：集計器（標準ライブラリだけ）。`make_reference.py`：期待ラベルを書き出す。
- `runs/`：全50本の出力（本文、トークン数、所要時間）。
- `results-summary.json`、`table-scores.json`、`summary-judged.json`：採点結果。

## 限界

24件・5回ずつ・2モデルの小さな実験です。件数が増えたときの少数意見の落ち方、日本語の長文、複数設問、実際の顧客データでの精度は測っていません。
