Skip to content
Guides6 min read

Mesurer l'accord inter-annotateurs

Comment calculer et interpréter le Kappa de Cohen, le Kappa de Fleiss et l'Alpha de Krippendorff pour vos projets d'annotation.

Potato Team·

Mesurer l'accord inter-annotateurs

L'accord inter-annotateurs (IAA) mesure la cohérence avec laquelle différents annotateurs étiquettent les mêmes éléments. Un accord élevé indique des annotations fiables ; un accord faible suggère des consignes peu claires ou des tâches subjectives.

Pourquoi mesurer l'accord ?

  • Valider les consignes : Un accord faible signifie des instructions peu claires
  • Évaluer la difficulté de la tâche : Certaines tâches sont intrinsèquement subjectives
  • Qualifier les annotateurs : Identifier qui a besoin de plus de formation
  • Rapporter la fiabilité : Requis pour les publications scientifiques
  • Agréger les étiquettes : Déterminer comment combiner les annotations

Métriques d'accord

Kappa de Cohen (2 annotateurs)

Pour comparer deux annotateurs sur des données catégorielles :

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

Où :

  • Po = accord observé
  • Pe = accord attendu par hasard

Interprétation :

KappaInterprétation
< 0Moins que le hasard
0.01-0.20Léger
0.21-0.40Passable
0.41-0.60Modéré
0.61-0.80Substantiel
0.81-1.00Quasi parfait

Kappa de Fleiss (3+ annotateurs)

Pour plusieurs annotateurs sur des données catégorielles :

yaml
quality_control:
  agreement:
    metrics:
      - fleiss_kappa

Même échelle d'interprétation que le Kappa de Cohen.

Alpha de Krippendorff

Le plus flexible - fonctionne avec :

  • N'importe quel nombre d'annotateurs
  • Des données manquantes
  • Divers types de données (nominal, ordinal, intervalle, ratio)
yaml
quality_control:
  agreement:
    metrics:
      - krippendorff_alpha
    alpha_level: nominal  # or ordinal, interval, ratio

Interprétation :

  • α ≥ 0.80 : Fiable
  • 0.67 ≤ α < 0.80 : Provisoirement acceptable
  • α < 0.67 : Non fiable

Configurer l'accord dans Potato

Configuration de base

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

Configuration du chevauchement

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

Calculer l'accord

Dans le tableau de bord

Potato affiche les métriques d'accord dans le tableau de bord d'administration :

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

Via 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
}

Via 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

Accord pour différents types d'annotation

Catégoriel (Radio, Multiselect)

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

Échelles de Likert

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

Annotations par span

Pour la NER, les spans nécessitent un traitement spécial :

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

Classements

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

Accord par paires vs global

Par paires (chaque paire)

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

Global (tous les annotateurs)

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

Gérer un accord faible

Identifier les zones problématiques

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

Actions en cas d'accord faible

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

Configuration complète

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

Rapport de sortie

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}
  ]
}

Bonnes pratiques

  1. Calculez tôt : N'attendez pas la fin
  2. Utilisez les métriques appropriées : Nominal vs ordinal vs span
  3. Investiguez l'accord faible : Révèle souvent des problèmes de consignes
  4. Rapportez dans les publications : Requis pour le travail scientifique
  5. Fixez des seuils : Définissez les niveaux acceptables à l'avance

Prochaines étapes


Documentation complète sur l'accord sur /docs/core-concepts/user-management.