Auswertung

Hypothesentests & Co

BA Inhaltsanalyse: Inhalte öffentlicher Kommunikation KF E
Wintersemester 2025/2026
Dozent
Raum

Felix Dietrich

02 507

Reliabilitätstest

Im folgenden Beispiel wollen wir die Reliabilität der manuellen Codierung zweier Coder:innen überprüfen. Bei mehr als zwei Codierer:innen können Sie den Prozess analog durchführen, indem Sie alle Datensätze mit bind_rows() zusammenfügen. Wir gehen davon aus, dass für jede Codierer:in eine Excel-Datei mit den codierten Daten vorliegt, die wir zuvor in R einlesen und zu einem Datensatz zusammenfügen. Wichtig ist hierbei, dass in allen Excel-Dateien die gleiche Struktur (Spaltennamen) vorliegt (auch Groß-/Kleinschreibung beachten).

library(tidyverse)
library(readxl)

manuelle_codierung <-
  bind_rows(
    read_xlsx("Datei_von_Coder_A.xlsx"),
    read_xlsx("Datei_von_Coder_B.xlsx")
  )
manuelle_codierung
# A tibble: 10 × 4
      id coder_id category_1 category_2
   <int> <chr>         <dbl>      <dbl>
 1     1 A                 1          0
 2     2 A                 0          1
 3     3 A                NA         NA
 4     4 A                NA         NA
 5     5 A                 0          1
 6     1 B                 1          0
 7     2 B                 0          0
 8     3 B                 1          0
 9     4 B                 1          0
10     5 B                NA         NA

In unserem Beispiel hat jeder Coder fünf Einheiten codiert, wobei die Einheiten mit der ID 1 und 2 von beiden Codern bearbeitet wurden. Für die Reliabilitätsprüfung betrachten wir daher nur diese doppelt codierten Beiträge.

library(tidycomm)

manuelle_codierung |> 
  filter(id %in% 1:2) |>
  tidycomm::test_icr(unit_var = id, coder_var = coder_id)
# A tibble: 2 × 8
  Variable   n_Units n_Coders n_Categories Level   Agreement Holstis_CR
* <chr>        <int>    <int>        <int> <chr>       <dbl>      <dbl>
1 category_1       2        2            2 nominal       1          1  
2 category_2       2        2            2 nominal       0.5        0.5
# ℹ 1 more variable: Krippendorffs_Alpha <dbl>

Weitere Informationen zur Berechnung der Intercoder-Reliabilität finden Sie hier: https://stats.ifp.uni-mainz.de/ba-ccs-track/ia-reli-vali.html

Validitätstest

Zur Überprüfung der Validität der manuellen Codierung können wir die manuell codierten Daten mit einem bereits vorhandenen automatischen Codierungsergebnis vergleichen. Hierfür benötigen wir einen Datensatz, der sowohl die manuelle als auch die automatische Codierung enthält. Aus der manuellen Codierung erstellen wir zunächst unseren Goldstandard, den wir anschließend mit den automatischen Codierungsergebnissen mittels left_join() verbinden.

Im Goldstandard benötigen wir für jede Einheit nur eine Codierung. Als schnelle Lösung entfernen wir daher die doppelten Codierungen. Alternativ könnten wir hier auch die Codierungen einer Codierer:in übernehmen oder die Codierungen aller Coder:innen aggregieren (z.B. Mehrheitsentscheidung).

goldstandard <- 
  manuelle_codierung |> 
  filter(!id %in% 1:2) |> 
  filter(!is.na(category_1) & !is.na(category_2))

Anschließend verbinden wir den Goldstandard mit den automatischen Codierungsergebnissen. left_join() sorgt hierbei dafür, dass nur die Einheiten im Goldstandard berücksichtigt werden.

automatische_codierung
# A tibble: 5 × 3
     id category_1_auto category_2_auto
  <int>           <dbl>           <dbl>
1     1               1               0
2     2               0               1
3     3               1               0
4     4               0               1
5     5               0               1
validitaets_test <- 
  goldstandard |> 
  left_join(automatische_codierung, by = "id")

validitaets_test
# A tibble: 3 × 6
     id coder_id category_1 category_2 category_1_auto category_2_auto
  <int> <chr>         <dbl>      <dbl>           <dbl>           <dbl>
1     5 A                 0          1               0               1
2     3 B                 1          0               1               0
3     4 B                 1          0               0               1

Nun können wir den Validitätstest durchführen, indem wir die Codierungen im Goldstandard mit den automatischen Codierungen vergleichen. Im Beispiel vergleichen wir hierfür die Codierungen in category_1 mit denen in category_1_auto. Analog können Sie den Test für weitere Kategorien durchführen.

library(yardstick)

validitaets_test |> 
  mutate(gold = factor(category_1), observed = factor(category_1_auto)) |>
  conf_mat(truth = gold, estimate = observed)
          Truth
Prediction 0 1
         0 1 1
         1 0 1

Wir berechnen nun außerdem die Metriken Accuracy, Recall, Precision und das F-Maß, die Sie im Projektbericht angeben und interpretieren sollten.

vali_metrics <- metric_set(accuracy, recall, precision, f_meas)

validitaets_test |> 
  mutate(gold = factor(category_1), observed = factor(category_1_auto)) |>
  vali_metrics(truth = gold, estimate = observed, event_level = "second")
# A tibble: 4 × 3
  .metric   .estimator .estimate
  <chr>     <chr>          <dbl>
1 accuracy  binary         0.667
2 recall    binary         0.5  
3 precision binary         1    
4 f_meas    binary         0.667

Die Konfusionsmatrix zeigt uns die konkreten Übereinstimmungen und Fehler:

  • Richtig erkannt (0): 1 Fall – das System hat korrekt „0” erkannt
  • Richtig erkannt (1): 1 Fall – das System hat korrekt „1” erkannt
  • Falsch als 0 klassifiziert: 1 Fall – sollte „1” sein, wurde aber als „0” erkannt
  • Falsch als 1 klassifiziert: 0 Fälle – keine falschen „1”-Zuweisungen

Die Validitätsmetriken interpretieren diese Zahlen (mit Fokus auf Kategorie „1” als relevante Klasse):

  • Accuracy (0.667): In 67% aller Fälle liegt das System richtig (2 von 3 Fällen korrekt)
  • Recall (0.5): Von allen echten „1”-Fällen im Goldstandard hat das System 50% gefunden (1 von 2 „1” erkannt, 1 übersehen)
  • Precision (1.0): Von allen als „1” klassifizierten Fällen sind 100% tatsächlich „1” (1 korrekt, 0 falsch positiv)
  • F-Maß (0.667): Das harmonische Mittel aus Precision und Recall, das beide Aspekte ausbalanciert

Interpretation: Das System macht keine falschen „1”-Zuweisungen (Precision = 1.0), übersieht aber die Hälfte der relevanten Fälle (Recall = 0.5). Die Gesamtgenauigkeit liegt bei 67%.

Hypothesentests

Die Hypothesentests führen Sie anschließend mit dem vollständig automatisiert codierten Datensatz durch. In den meisten Fällen sind die Kategorien binär (0/1) kodiert, sodass wir für den Hypothesentest eine logistische Regression verwenden müssen (weitere Infos unter https://stats.ifp.uni-mainz.de/ba-aa-vl/logistische-regression.html).

m1 <- glm(category_1_auto ~ category_2_auto, automatische_codierung, family = binomial())
report::report_table(m1)
Parameter       | Coefficient |                95% CI |         z |      p
--------------------------------------------------------------------------
(Intercept)     |       24.57 | [-14521.01,         ] |  2.65e-04 | > .999
category 2 auto |      -49.13 | [         , 12375.75] | -4.11e-04 | > .999
                |             |                       |           |       
AIC             |             |                       |           |       
AICc            |             |                       |           |       
BIC             |             |                       |           |       
Tjur's R2       |             |                       |           |       
Sigma           |             |                       |           |       
Log_loss        |             |                       |           |       

Parameter       | Std. Coef. |      Std. Coef. 95% CI |      Fit
----------------------------------------------------------------
(Intercept)     |      -4.91 | [ -1.15e+05, 1.15e+05] |         
category 2 auto |     -26.91 | [ -1.28e+05, 1.28e+05] |         
                |            |                        |         
AIC             |            |                        |     4.00
AICc            |            |                        |    10.00
BIC             |            |                        |     3.22
Tjur's R2       |            |                        |     1.00
Sigma           |            |                        |     1.00
Log_loss        |            |                        | 2.14e-11

Sollte eine kategoriale Variable mit mehr als zwei Ausprägungen als Prädiktor genutzt werden, können wir uns an der Auswertung von Mittelwertvergleichen orientieren (https://stats.ifp.uni-mainz.de/ba-aa-vl/mittelwertvergleiche.html).