Skip to content
Guides4 min read

アノテーター間一致度の測定

アノテーションプロジェクトでのCohenのKappa、FleissのKappa、KrippendorffのAlphaの計算と解釈方法。

Potato Team·

アノテーター間一致度の測定

アノテーター間一致度(IAA)は、異なるアノテーターが同じアイテムにどれだけ一貫してラベルを付けるかを測定します。高い一致度は信頼性の高いアノテーションを示し、低い一致度はガイドラインの不明確さまたはタスクの主観性を示唆します。

なぜ一致度を測定するのか?

  • ガイドラインの検証:低い一致度 → 不明確な指示
  • タスク難易度の評価:一部のタスクは本質的に主観的
  • アノテーターの資格確認:誰がさらなるトレーニングを必要とするかを特定
  • 信頼性の報告:学術論文に必要
  • ラベルの集約:アノテーションの統合方法を決定

一致度メトリクス

CohenのKappa(2人のアノテーター)

カテゴリカルデータで2人のアノテーターを比較:

text
κ = (Po - Pe) / (1 - Pe)

ここで:

  • Po = 観測された一致率
  • Pe = 偶然による期待一致率

解釈:

Kappa解釈
< 0偶然以下
0.01-0.20わずか
0.21-0.40まずまず
0.41-0.60中程度
0.61-0.80かなり
0.81-1.00ほぼ完全

FleissのKappa(3人以上のアノテーター)

カテゴリカルデータで複数のアノテーター:

yaml
quality_control:
  agreement:
    metrics:
      - fleiss_kappa

CohenのKappaと同じ解釈スケール。

KrippendorffのAlpha

最も柔軟 - 以下に対応:

  • 任意の数のアノテーター
  • 欠損データ
  • 様々なデータタイプ(名義、順序、間隔、比率)
yaml
quality_control:
  agreement:
    metrics:
      - krippendorff_alpha
    alpha_level: nominal  # or ordinal, interval, ratio

解釈:

  • α ≥ 0.80:信頼性あり
  • 0.67 ≤ α < 0.80:暫定的に許容
  • α < 0.67:信頼性なし

Potatoでの一致度設定

基本セットアップ

yaml
quality_control:
  agreement:
    enabled: true
    calculate_on_overlap: true
 
    metrics:
      - cohens_kappa
      - fleiss_kappa
      - krippendorff_alpha
 
    # Per annotation scheme
    per_scheme: true
 
    # Reporting
    report_interval: 100  # Every 100 annotations
    export_file: agreement_report.json

オーバーラップ設定

yaml
quality_control:
  redundancy:
    # How many annotators per item
    annotations_per_item: 3
 
    # Minimum overlap for calculations
    min_overlap_for_agreement: 2
 
    # Sampling for agreement
    agreement_sample_size: 100  # Calculate on 100 items
    agreement_sample_method: random  # or stratified, all

一致度の計算

ダッシュボードで

Potatoは管理ダッシュボードに一致度メトリクスを表示:

yaml
quality_control:
  dashboard:
    show_agreement: true
    agreement_chart: true
    update_frequency: 60  # seconds

API経由

bash
# Get current agreement metrics
curl http://localhost:8000/api/quality/agreement
 
# Response:
{
  "overall": {
    "fleiss_kappa": 0.72,
    "krippendorff_alpha": 0.75
  },
  "per_scheme": {
    "sentiment": {
      "fleiss_kappa": 0.78,
      "krippendorff_alpha": 0.80
    },
    "topic": {
      "fleiss_kappa": 0.65,
      "krippendorff_alpha": 0.68
    }
  },
  "sample_size": 150,
  "annotator_pairs": 10
}

CLI経由

bash
# Calculate agreement from output files
potato agreement --annotations annotation_output/ --output agreement_report.json
 
# With specific metric
potato agreement --annotations annotation_output/ --metric krippendorff --level ordinal

異なるアノテーションタイプの一致度

カテゴリカル(ラジオ、マルチセレクト)

yaml
quality_control:
  agreement:
    schemes:
      sentiment:
        type: nominal
        metrics: [cohens_kappa, fleiss_kappa]
 
      urgency:
        type: ordinal  # Low < Medium < High
        metrics: [krippendorff_alpha]

リッカートスケール

yaml
quality_control:
  agreement:
    schemes:
      quality_rating:
        type: ordinal
        metrics: [krippendorff_alpha, weighted_kappa]
 
        # Weighted kappa for ordinal
        weighting: linear  # or quadratic

スパンアノテーション

NERなどのスパンは特別な処理が必要:

yaml
quality_control:
  agreement:
    schemes:
      entities:
        type: span
        span_matching: overlap  # or exact, token
 
        # What to compare
        compare: label_and_span  # or label_only, span_only
 
        # Overlap threshold for "match"
        overlap_threshold: 0.5
 
        metrics:
          - span_f1
          - span_precision
          - span_recall

ランキング

yaml
quality_control:
  agreement:
    schemes:
      preference_rank:
        type: ranking
        metrics:
          - kendall_tau
          - spearman_rho

ペアワイズ vs 全体一致度

ペアワイズ(各ペア)

yaml
quality_control:
  agreement:
    pairwise: true
    output_matrix: true  # Agreement matrix
 
# Output:
# annotator1 × annotator2: κ = 0.75
# annotator1 × annotator3: κ = 0.68
# annotator2 × annotator3: κ = 0.82

全体(全アノテーター)

yaml
quality_control:
  agreement:
    overall: true
    metrics:
      - fleiss_kappa  # Designed for 3+ annotators
      - krippendorff_alpha

低い一致度の対処

問題領域の特定

yaml
quality_control:
  agreement:
    diagnostics:
      enabled: true
 
      # Items with most disagreement
      show_disagreed_items: true
      disagreement_threshold: 0.5
 
      # Labels with most confusion
      confusion_matrix: true
 
      # Annotators with low agreement
      per_annotator_agreement: true

低一致度への対応

yaml
quality_control:
  agreement:
    alerts:
      - threshold: 0.6
        action: notify
        message: "Agreement below 0.6 - review guidelines"
 
      - threshold: 0.4
        action: pause
        message: "Agreement critically low - pausing task"
 
    # Automatic guideline reminders
    show_guidelines_on_low_agreement: true
    guideline_threshold: 0.5

完全な設定

yaml
annotation_task_name: "Agreement-Tracked Annotation"
 
quality_control:
  # Redundancy setup
  redundancy:
    annotations_per_item: 3
    assignment_method: random
 
  # Agreement calculation
  agreement:
    enabled: true
 
    # Metrics
    metrics:
      - fleiss_kappa
      - krippendorff_alpha
 
    # Per-scheme configuration
    schemes:
      sentiment:
        type: nominal
        metrics: [fleiss_kappa, cohens_kappa]
 
      intensity:
        type: ordinal
        metrics: [krippendorff_alpha]
        alpha_level: ordinal
 
      entities:
        type: span
        span_matching: overlap
        overlap_threshold: 0.5
        metrics: [span_f1]
 
    # Calculation settings
    calculate_on_overlap: true
    min_overlap: 2
    sample_size: all  # or number
 
    # Pairwise analysis
    pairwise: true
    pairwise_output: agreement_matrix.csv
 
    # Diagnostics
    diagnostics:
      confusion_matrix: true
      disagreed_items: true
      per_annotator: true
 
    # Alerts
    alerts:
      - metric: fleiss_kappa
        threshold: 0.6
        action: notify
 
    # Reporting
    report_file: agreement_report.json
    report_interval: 50
 
  # Dashboard
  dashboard:
    show_agreement: true
    charts:
      - agreement_over_time
      - per_scheme_agreement
      - annotator_comparison

出力レポート

json
{
  "timestamp": "2024-10-25T15:30:00Z",
  "sample_size": 500,
  "annotators": ["ann1", "ann2", "ann3"],
 
  "overall_agreement": {
    "fleiss_kappa": 0.72,
    "krippendorff_alpha": 0.75
  },
 
  "per_scheme": {
    "sentiment": {
      "fleiss_kappa": 0.78,
      "confusion_matrix": {
        "Positive": {"Positive": 180, "Negative": 5, "Neutral": 15},
        "Negative": {"Positive": 8, "Negative": 165, "Neutral": 12},
        "Neutral": {"Positive": 12, "Negative": 10, "Neutral": 93}
      }
    }
  },
 
  "pairwise": {
    "ann1_ann2": 0.75,
    "ann1_ann3": 0.70,
    "ann2_ann3": 0.72
  },
 
  "per_annotator": {
    "ann1": {"avg_agreement": 0.73, "items_annotated": 500},
    "ann2": {"avg_agreement": 0.74, "items_annotated": 500},
    "ann3": {"avg_agreement": 0.71, "items_annotated": 500}
  },
 
  "most_disagreed_items": [
    {"id": "item_234", "disagreement_rate": 1.0},
    {"id": "item_567", "disagreement_rate": 0.67}
  ]
}

ベストプラクティス

  1. 早期に計算:最後まで待たない
  2. 適切なメトリクスを使用:名義 vs 順序 vs スパン
  3. 低い一致度を調査:多くの場合ガイドラインの問題が判明
  4. 論文で報告:学術研究に必須
  5. 閾値を設定:許容レベルを事前に定義

次のステップ


一致度の完全なドキュメントは/docs/core-concepts/user-managementをご覧ください。