| name | emotion-curve-feedback |
| description | Emotion Curve Feedback — Multi-Persona Emotional Journey Diagnostics for any sequential content. Simulate 2-4 audience personas advancing through the content unit by unit (slide, chapter/section, scroll block), score each unit's emotion on a -5..+5 scale per persona, render the smooth overlaid emotion curves with a matplotlib script, then read the valleys (where the content loses people), single-persona dips (persona conflict), and the landing height (how energized each persona is at the close). Turns those into priority-ordered fixes. Works on slide decks, articles, papers, landing pages, recruitment/donation pages, proposals, long announcements. Use when you want to evaluate content by the AUDIENCE's lived experience rather than the author's intent, or to find where it goes cold. This is the diagnostic counterpart to narrative-heat-engineering (NHE). Triggers: 「感情曲線で診断して」「どのスライド/セクションで冷めるか見て」「ペルソナ別に評価して」「谷を特定して」. |
Emotion Curve Feedback(感情曲線フィードバック)
Multi-Persona Emotional Journey Diagnostics
「作る側の熱量設計(narrative-heat-engineering / NHE)」に対する、診断側の方法論。
概要
順番に読まれる・見られるコンテンツを、複数ペルソナが「区間を1つずつ進んで体験していく」ものとしてシミュレートし、各区間の感情を ±スコア(-5〜+5) で数値化して感情曲線にする。曲線の谷と着地の弱さが、そのまま改善レバレッジになる。
いつ使うか(適用対象と区間の単位)
書き手の意図ではなく、聞き手の体験でコンテンツを評価したいとき:
| コンテンツ | 区間の単位 |
|---|
| ピッチ / 提案 / 研究発表 / 採用 / 寄付デッキ | スライド1枚 |
| 論文・申請書・提案書 | 章・節 |
| Webページ・LP・採用ページ | スクロールブロック |
| メール・長文告知・ツイートスレッド | 段落・ポスト |
以下、本文の「区間」は上表の単位を指す。デッキならスライド1枚がデフォルト。
中核となる3原則
- 1コンテンツ = 複数の通読体験。 平均的な聞き手は存在しない。同じものが人によって違うアークを描く。
- 感情は区間ごとにスコア化できる。 点をつなぐと曲線になり、勾配(上下の変化)が意味を持つ。
- 谷と着地の弱さ = 改善点。 「どこで冷めるか」「最後に動きたくなるか」が、加点よりも示唆を持つ。
ワークフロー(Step 0〜6)
Step 0 — 区間に分解する
コンテンツを順序ある区間に割る。10〜15区間が扱いやすい。これが横軸になる。区間数が多い場合は、意味のまとまりで束ねてよい。
ピッチデックの例:
[0] タイトル(フック)
[1] 問題提起・現状
[2] 解決策・提案
[3] 根拠・実績
[4] 未来・市場
[5] クロージング・CTA
Step 1 — ペルソナを2〜4人定義する
各ペルソナに、最低この3つを明文化する:
- 動機(何を確かめに来たか)
- 判断軸(何で良し悪しを決めるか)
- 離脱トリガ(何があると冷める/混乱するか)
⚠ ここで質が決まる。曖昧なペルソナ=曖昧な診断。
| コンテンツタイプ | 推奨ペルソナ例 |
|---|
| ピッチ/提案 | 投資家、パートナー候補、技術審査員、懐疑的・リスク回避型 |
| 研究発表・論文 | 同分野専門家、異分野応用志向、政策・実務担当、一般・教養志向 |
| 採用 | 即応募型、観望・慎重型、競合在籍・引き抜き型、新卒・未経験型 |
| 寄付/支援 | 熱心サポーター、初見の善意層、効率性・実績重視、関係性・信頼重視 |
| 製品紹介・LP | 初見・好奇心型、比較検討型、技術的詳細型、価格・ROI重視型 |
| 告知・ツイート | 業界初心者、同業者・情報通、投資家・経営層、一般読者 |
Step 2 — 感情スケールを決める
-5(強い違和感・離脱したい)〜 0(中立)〜 +5(前のめり・動きたい)。全ペルソナで同一スケールを使う。
| スコア | 感情状態 |
|---|
| +5 | 強い共感・興奮・納得 |
| +3 | 共感・興味・理解 |
| +1 | わずかな好印象 |
| 0 | 無関心・中立 |
| -1 | わずかな違和感 |
| -3 | 混乱・失望・不信感 |
| -5 | 強い拒否・怒り・脱落 |
Step 3 — 各区間 × 各ペルソナにスコア+一行理由
スコアだけでなく「なぜ上下したか」を必ず区間内の語句・要素に紐付ける。これが改善案の素になる。
重要:
- スコアは「その区間を見た直後の感情」
- 過去区間の累積ではなく、各区間単体の感情変動を記録
- ただし連続した低下は「蓄積的な不満」として記録
Step 4 — 滑らかな感情曲線グラフを描く
generate_emotion_curve.py スクリプトを使用してグラフを描画する。人数分の滑らかな曲線を重ねて、次の4つを読む:
- 共通の山(全員が上がる=最大の資産)
- 共通の谷(全員が下がる=最優先で修正する区間)
- 単独の谷(特定ペルソナだけ落ちる=ペルソナ衝突)
- 着地点の高さ(最後の区間で各人が高揚しているか)
uv run --with matplotlib,numpy,scipy python3 \
scripts/generate_emotion_curve.py /tmp/emotion_data.json /tmp/emotion_curve.png
(パスはこのスキルのディレクトリ基準。uv が無い環境では pip install matplotlib numpy scipy の上で python3 scripts/generate_emotion_curve.py <data.json> <out.png>。出力パスを省略するとカレントディレクトリの emotion_curve.png に保存する。)
JSONデータ形式:
{
"title": "感情曲線分析",
"x_label": "区間",
"y_label": "感情スコア (+5 〜 -5)",
"sections": ["タイトル", "問題", "解決策", "実績", "未来", "CTA"],
"personas": [
{
"name": "投資家A",
"scores": [2, -3, 1, 3, 4, 2],
"color": "#E74C3C"
},
{
"name"
Step 5 — 診断パターンを当てる
グラフから以下のパターンを読み取る:
| パターン名 | 特徴 | 意味 |
|---|
| モノトーン | 全区間でほぼ同じスコア | 感情刺激が弱い |
| 波型 | 上下が激しい | 興味を引くが信頼感が不安定 |
| 下降型 | 序盤高→終盤低 | 後半で期待を裏切る構造 |
| 上昇型 | 序盤低→終盤高 | 改善ストーリーだが序盤離脱リスク |
| V字回復 | 深い谷から急回復 | 衝撃的だが回復力の証 |
| 逆V字 | 高揚後に急落 | 約束過多・期待ハズレ |
| クロス(交差) | 複数ペルソナの曲線が交差 | 同じ区間が人によって違う価値になる |
谷(Valley)の特定
- 共通谷:全ペルソナまたは大多数がスコア低下を示した区間
- 個別谷:特定ペルソナのみが大幅に低下した区間
- 原因分析:なぜそこで感情が低下したか?
- 専門用語過多/文字が多すぎる?
- 期待と内容の乖離?
- 根拠不足?
- トーン・デザインの不一致?
着地(Landing)の評価
- 最終区間の平均スコア:全体の残存印象
- 着地の高低:高着地(+平均)=好印象で終了、低着地(-平均)=ネガティブ印象で終了
- 着地のばらつき:各ペルソナ間の最終印象の差が大きい=メッセージの届き方が不均一
Step 6 — 改善案を優先度付け
優先度 = 谷の深さ × そのペルソナの重要度。基本順序:
- 共通の谷
- 重要ペルソナの単独谷
- 着地(クロージング)の弱さ
アウトプット構成:
1. 感情曲線チャート(滑らかな曲線グラフ画像)
2. ペルソナ別アーク(区間ごとの一行理由+最高到達点/最大の谷/見終わった後の印象)
3. 改善案(優先度順)
- パターン名+処方+差分(コピー/レイアウト/順序の変更)
4. 裏取り方法(推定を実データで検証:実際の発表/公開での反応・視線・質疑や離脱のタイミング)
改善の処方をコンテンツ全体のナラティブに反映するときは narrative-heat-engineering スキル、(デッキの場合)実際の1枚のスライドに反映するときは slide スキルに渡す。
スコアリングのコツ(ブレを減らす)
- 絶対値より勾配を見る。 「+3か+4か」より「上がったか下がったか・どこで」が重要
- 同一ペルソナ内の相対で読む。 ペルソナ間でスコアの高さは比較しない(性格が違う)
- 根拠は必ず区間内の要素に紐付け。 紐付かないスコアは主観として割り引く
- 懐疑的ペルソナは高揚しにくいのが正常。 山が低くても谷が浅ければ成功
- 迷ったら中立(0)寄りに。 山と谷を作りすぎない
スクリプト
generate_emotion_curve.py(scripts/)
matplotlib + numpy + scipy を使用して滑らかな曲線の感情曲線グラフを生成する。
- 3次スプライン補間(
scipy.interpolate.make_interp_spline)でデータポイント間を滑らかに接続
- 元のデータポイントにマーカーと数値ラベルを表示
- 谷と着地の区間を色付きでハイライト
入力: JSONファイル(上記形式)
出力: PNG画像(デフォルトはカレントディレクトリの emotion_curve.png、第2引数でパス指定可)
Pitfalls
- スコアの主観性:LLMが推定する感情スコアは推測に過ぎない。複数ペルソナで客観性を担保するが、実際の反応は別途観察が必要
- ペルソナ選定が結論の大半を決める:狙う相手とズレたペルソナで診断しても意味がない
- 確証バイアスに注意:自分が好きな区間を高く付けがち。根拠の要素への紐付けが歯止め
- LLMに代行させる場合も:ペルソナ定義とスケールは人が固定する
- 区間分割の粒度:細かすぎるとノイズが増え、粗すぎると特徴が消える。デッキはスライド単位が基本、長いものは3〜7区間に束ねると読みやすい
- 日本語フォント:matplotlibでCJKフォントが見つからないとラベルが豆腐(□)になる。スクリプトは名前リスト(
Noto Sans CJK JP など)でフォールバックする。詳細は references/matplotlib-cjk-fonts.md
- グラフ生成の依存:
uv run --with matplotlib,numpy,scipy か、pip install matplotlib numpy scipy
コピペ用テンプレート
ペルソナ定義
名前/役割:
動機(何を確かめに来たか):
判断軸:
離脱トリガ:
スコア表(区間単位)
区間 | ペルソナA | A理由 | ペルソナB | B理由 | ペルソナC | C理由
00 タイトル | +1 | | +2 | | +0 |
01 問題 | ...
改善案
谷の区間:
パターン:
影響を受けるペルソナ/重要度:
処方(差分コピー/レイアウト/順序の変更):
優先度(谷の深さ×重要度):
連携スキル
- narrative-heat-engineering(NHE):「作る側の熱量設計」と「診断側の感情曲線」は対になる方法論。NHEで書いたコンテンツの感情曲線を診断し、熱量が下がる谷を特定して改善サイクルを回す
- slide(スライドデッキの場合):診断で出た処方を実際の1枚のスライドに反映する
- 詳しい診断パターン・ペルソナ型・テンプレートは
references/patterns-and-templates.md