5  Daten laden und fusionieren

5.1 Daten aus SosciSurvey (TF B)

Gehen Sie in SosciSurvey unter “Steuerung” auf “Erhobene Daten” und dann auf “Auswahlkritierien für gültige Fälle” und haken Sie “Interview (Aufruf der Fragenbogen-URL)” an und den Rest wieder ab, falls das noch an ist. Dann gehen Sie unter “Erhobene Daten” auf “Daten herunterladen”. Dort finden Sie mehrere Reiter für verschiedene Datentypen. Sie können Excel nehmen und sich so die Daten bequemer ansehen. Nehmen Sie dann für den R-Datensatz besser den Reiter “GNU R” und benennen Sie dort unter “Name d. Daten-Frame in R:” ihren Datensatz so wie Sie ihn gerne hätten (meine Empfehlung DATEN_BF). Bei “Variablen-Typen” nehmen Sie “Nummerische Codes für Skalen …” und bei “Residualoptionen:” nehmen Sie “Werte behalten, …”. Etwas weiter unten sehen Sie dann noch den Reiter “Variablen”. Dort nehmen Sie “Variablen, die im heruntergeladenen Datensatz min. zwei unterschiedliche Ausprägungen haben” (alles andere sind langweilige Konstanten). Darunter können Sie noch die “Verweildauer …” anhakeln und “Kennwerte zur Datenqualität …”. In der R-Onlineanleitung zu Methoden-Aufbau haben Sie das auch im Video erklärt.

5.2 R-Daten (RDS) der Befragung in Excel umwandeln (TF D/E)

Sie können dieses Beispielprojekt «Datenfusion.zip» für die Datenfusion herunterladen, speichern, entpacken (am besten in einem SWITCH-Drive-Ordner) und dann mit Ihren Datenfiles anpassen.

Wenn Sie die Befragungsdaten aus SosciSurvey geladen haben, ist es sinnvoll, die erstmal als Excel-Datei zu speichern, damit Sie dort die Ereigniskodierung machen können.

# den Datensatz laden, wie er von SosciSurvey kommt (TF B bitten, die Daten zur Verfügung zu stellen - auf unserer R-Seite gibts eine Anleitung)
DATEN_BF <- readRDS("data/DATEN_BEF.RDS") 

# speichere die Daten als Excel, damit die Ereginiskodierung gemacht werden kann
DATEN_BF |> writexl::write_xlsx("data/DATEN_BEF.xlsx")

Jetzt haben Sie die Inhaltsanalysedaten und die Befragungsdaten in Excel. Dort können Sie die Kodierung vornehmen. Jedes inhaltlich trennbare Ereignis in den Medien bekommt einen fixen Code. Wird über dasselbe Ereignis (wenn auch teils unterschiedlich) in mehreren Medien berichtet, muss es denselben Code bekommen.

5.2.1 “Logische Variablen” in numerische umwandeln

Einige Variablen kommen aus SosciSurvey als logische Variablen (True/Fals), die wollen wir alle gleich mal in Dummys (0/1-Variablen) umwandeln, weil wir wissen, dass 0 immer “FALSE” bedeutet und 1 “TRUE” und wir mit 0/1-Variablen (den Dummys) viel besser arbeiten und rechnen können.

# mutiere die Variablen für die gilt: is.logical als numerisch
DATEN_BF <- DATEN_BF |> 
  mutate(across(where(is.logical), as.numeric))

5.3 Datenfusionen (TF D/E)

Da wir Kommunikationswissenschaftler sind und Medieneigenschaften mit Befragungsergebnissen verbinden wollen, fusionieren wir hier die Datensätze der Inhaltsanalyse mit denen der Befragung.

5.3.1 Die Befragungsdaten an die Inhaltsanalyse matchen

Wir matchen aggregierte Zähl-Daten der Befragung an die Inhaltsanalyse. Wir haben Meldungen über Ereignisse in den Medien und haben die Leute gefragt, an was für Ereignisse aus den Medien sie sich gut erinnern können. Wir können nicht einzelnen Meldungen einzelnen Befragten zuordnen, aber wir können sagen, wie viele Befragte haben die Meldungen genannt, die in der IA kodiert wurden. Sie könnten theoretisch (praktisch sogar auch) Im Datensatz der Inhaltsanalyse die Überschrift und inhaltliche Kurzbeschreibung anschauen und je Meldung mit Strichliste zählen, wie oft Ihre Befragten genau die Meldung genannt haben, indem sie sich die notierten Meldungsnennungen aus der Befragung ansehen und überlegen, zu welchem Thema die passen. Da das sehr aufwendig ist und viel zu manuell, nehmen wir die kodierten Datensätze der Befragung, summieren die Nennungen je Themencode zusammen und hängen über den Themencode diese Anzahl der Nennungen an den Inhaltsanalysedatensatz.

Ablauf:

  1. kodierte Daten laden

  2. mal zur Sicherheit die Nennungen aus der Befragung nochmal angucken (frequencies = frq)

3.-5. Je Nennungsvariable der Befragung eine neue DatenTabelle (DT) erstellen. Die enthalten dann immer den codierten Themencode und die Anzahl der gezählten (count) Nennungen je Themencode.

  1. Die Datentabellen der Nennungen zusammenführen (full_join), so dass wir eine neue Tabelle bekommen, in der jeweils steht, wie oft das Thema bei der Nenn1 genannt wurde, bei Nenn2 und bei Nenn3.

  2. Zeilenweise die Summe der Nennungen in der Tabelle Nennungen berechnen. Damit bekommen wir pro Thema die Anzahl ihrer Nennungen, egal, ob nun bei der ersten, der zweiten oder der dritten Nennung.

  3. Kleben wir diese Nennungstabelle an die Inhaltsanlyse an. Also über den Schlüssel des Themencodes die Anzahl der Nennungen an jeder Stelle und die Gesamtzahl der Nennungen.

  4. Bei Themen dier IA, die von niemandem genannt wurden, steht nichts, also faktisch NA. Da wir hier sagen können, dass ein NA einer 0 entspricht, werden für die neu angehängten Variablen (deren Variablennamen alle mit “Nenn” anfangen) jeweils die NA durch 0en ersetzt. Fertig Datenfusion!

# Erstmal die beiden Datensätze laden:

IA <- readxl::read_excel("data/DATEN_IA_codiert.xlsx") |> 
  select(-any_of(starts_with("Nenn"))) # Falls die schon drin sind, vorher löschen

BEF <- readxl::read_excel("data/DATEN_BEF_codiert.xlsx")  

# Hier mal eine einfache Häufigkeitsauszählung
BEF |> sjmisc::frq(Nenn1, Nenn2, Nenn3)
## Nenn1 <numeric> 
## # total N=234 valid N=208 mean=5959.13 sd=5514.36
## 
## Value |  N | Raw % | Valid % | Cum. %
## -------------------------------------
##  1000 | 95 | 40.60 |   45.67 |  45.67
##  2000 |  1 |  0.43 |    0.48 |  46.15
##  2100 |  3 |  1.28 |    1.44 |  47.60
##  3000 |  2 |  0.85 |    0.96 |  48.56
##  4000 |  2 |  0.85 |    0.96 |  49.52
##  4200 |  1 |  0.43 |    0.48 |  50.00
##  4300 |  1 |  0.43 |    0.48 |  50.48
##  5000 |  3 |  1.28 |    1.44 |  51.92
##  6000 |  4 |  1.71 |    1.92 |  53.85
##  6100 |  2 |  0.85 |    0.96 |  54.81
##  6300 |  1 |  0.43 |    0.48 |  55.29
##  7000 |  1 |  0.43 |    0.48 |  55.77
##  8000 | 43 | 18.38 |   20.67 |  76.44
##  8100 |  2 |  0.85 |    0.96 |  77.40
## 10000 |  2 |  0.85 |    0.96 |  78.37
## 10100 |  1 |  0.43 |    0.48 |  78.85
## 11000 |  1 |  0.43 |    0.48 |  79.33
## 11100 |  1 |  0.43 |    0.48 |  79.81
## 13000 |  1 |  0.43 |    0.48 |  80.29
## 13100 |  1 |  0.43 |    0.48 |  80.77
## 15000 | 17 |  7.26 |    8.17 |  88.94
## 15100 |  5 |  2.14 |    2.40 |  91.35
## 15200 |  9 |  3.85 |    4.33 |  95.67
## 15300 |  2 |  0.85 |    0.96 |  96.63
## 16000 |  1 |  0.43 |    0.48 |  97.12
## 16100 |  4 |  1.71 |    1.92 |  99.04
## 16200 |  2 |  0.85 |    0.96 | 100.00
##  <NA> | 26 | 11.11 |    <NA> |   <NA>
## 
## Nenn2 <numeric> 
## # total N=234 valid N=192 mean=8007.81 sd=5025.40
## 
## Value |  N | Raw % | Valid % | Cum. %
## -------------------------------------
##  1000 | 37 | 15.81 |   19.27 |  19.27
##  1100 |  3 |  1.28 |    1.56 |  20.83
##  1300 |  1 |  0.43 |    0.52 |  21.35
##  2300 |  1 |  0.43 |    0.52 |  21.88
##  3000 |  2 |  0.85 |    1.04 |  22.92
##  4000 |  5 |  2.14 |    2.60 |  25.52
##  4100 |  3 |  1.28 |    1.56 |  27.08
##  5000 |  3 |  1.28 |    1.56 |  28.65
##  6000 |  6 |  2.56 |    3.12 |  31.77
##  6100 |  1 |  0.43 |    0.52 |  32.29
##  6200 |  1 |  0.43 |    0.52 |  32.81
##  6300 |  1 |  0.43 |    0.52 |  33.33
##  7000 |  1 |  0.43 |    0.52 |  33.85
##  8000 | 67 | 28.63 |   34.90 |  68.75
##  8100 |  4 |  1.71 |    2.08 |  70.83
##  8200 |  3 |  1.28 |    1.56 |  72.40
## 10000 |  2 |  0.85 |    1.04 |  73.44
## 11000 |  1 |  0.43 |    0.52 |  73.96
## 13000 |  1 |  0.43 |    0.52 |  74.48
## 13100 |  2 |  0.85 |    1.04 |  75.52
## 15000 | 27 | 11.54 |   14.06 |  89.58
## 15100 |  3 |  1.28 |    1.56 |  91.15
## 15200 |  5 |  2.14 |    2.60 |  93.75
## 15300 |  4 |  1.71 |    2.08 |  95.83
## 15500 |  1 |  0.43 |    0.52 |  96.35
## 16000 |  2 |  0.85 |    1.04 |  97.40
## 16100 |  5 |  2.14 |    2.60 | 100.00
##  <NA> | 42 | 17.95 |    <NA> |   <NA>
## 
## Nenn3 <numeric> 
## # total N=234 valid N=147 mean=9082.99 sd=4938.49
## 
## Value |  N | Raw % | Valid % | Cum. %
## -------------------------------------
##  1000 | 12 |  5.13 |    8.16 |   8.16
##  1100 |  2 |  0.85 |    1.36 |   9.52
##  2100 |  3 |  1.28 |    2.04 |  11.56
##  2200 |  1 |  0.43 |    0.68 |  12.24
##  2300 |  1 |  0.43 |    0.68 |  12.93
##  3100 |  4 |  1.71 |    2.72 |  15.65
##  4000 |  3 |  1.28 |    2.04 |  17.69
##  4100 |  5 |  2.14 |    3.40 |  21.09
##  4200 |  1 |  0.43 |    0.68 |  21.77
##  5000 |  2 |  0.85 |    1.36 |  23.13
##  6000 |  2 |  0.85 |    1.36 |  24.49
##  6100 |  1 |  0.43 |    0.68 |  25.17
##  6200 |  2 |  0.85 |    1.36 |  26.53
##  6300 |  4 |  1.71 |    2.72 |  29.25
##  7000 |  3 |  1.28 |    2.04 |  31.29
##  7100 |  2 |  0.85 |    1.36 |  32.65
##  7200 |  2 |  0.85 |    1.36 |  34.01
##  8000 | 34 | 14.53 |   23.13 |  57.14
##  8100 |  5 |  2.14 |    3.40 |  60.54
##  8200 |  1 |  0.43 |    0.68 |  61.22
##  9000 |  1 |  0.43 |    0.68 |  61.90
## 10000 |  5 |  2.14 |    3.40 |  65.31
## 11000 |  1 |  0.43 |    0.68 |  65.99
## 11100 |  1 |  0.43 |    0.68 |  66.67
## 13000 |  1 |  0.43 |    0.68 |  67.35
## 13100 |  2 |  0.85 |    1.36 |  68.71
## 15000 | 19 |  8.12 |   12.93 |  81.63
## 15100 |  5 |  2.14 |    3.40 |  85.03
## 15200 |  6 |  2.56 |    4.08 |  89.12
## 15300 |  5 |  2.14 |    3.40 |  92.52
## 15500 |  1 |  0.43 |    0.68 |  93.20
## 16000 |  3 |  1.28 |    2.04 |  95.24
## 16100 |  3 |  1.28 |    2.04 |  97.28
## 16200 |  4 |  1.71 |    2.72 | 100.00
##  <NA> | 87 | 37.18 |    <NA> |   <NA>
  
# Und hier wird gezählt, wie oft in BEF die verschiedenen Themen in der ersten Nennung vorkamen:
Nenn1_DT <- BEF |> # Erstelle eine neue Datentabelle (DT) "Nenn1" die aus BEF verarbeitet wurde und zwar wie folgt nach |> 
  count(Nenn1, name = "Nenn_1_n") |> # gruppiere nach der Variablen "Nenn_1_n" im Datensatz und zähle die Häufigkeit und schreibe die in "Nenn1"
  rename("Thema" = "Nenn1") # Nenne jetzt noch die Bezeichnung "Nenn_1_n" in "Thema" um, damit es nachher einfach mit "Thema" gematcht werden kann


# ... und hier für die zweite
Nenn2_DT <- BEF |> 
  count(Nenn2, name = "Nenn_2_n") |> 
  rename("Thema" = "Nenn2")


# ... Sie ahnen es:
Nenn3_DT <- BEF |> 
  count(Nenn3, name = "Nenn_3_n") |> 
  rename("Thema" = "Nenn3")


# Jetzt bauen wir einen Datensatz für die Themen, die Zählungen hat, wenn sie in "Nenn1_DT" bis "Nenn3_DT" genannt wurden:
Nennungen <- full_join(Nenn1_DT, Nenn2_DT, by = "Thema") |> # erstmal die Nenn2-Daten an die Nenn2-Daten
  full_join(Nenn3_DT, by = "Thema") |> # dann noch die Nenn3_DT an die beiden von oben
  mutate(across(c(Nenn_1_n, Nenn_2_n, Nenn_3_n), ~ tidyr::replace_na(.x, 0))) |>
  filter(!is.na(Thema)) |> 
  rowwise() |> # mache einen Summenindex, der Zeilenweise (rowwise) ...
  mutate(Nenn_Gesamt_n = sum(c(Nenn_1_n, Nenn_2_n, Nenn_3_n))) # ... die Anzahl der Nennungen aus Nenn1 bis Nenn3 aufsummiert = Anzahl der Themanennungen

# Diese Anzahl der Nennungen kleben wir jetzt hinten an den IA-Datensatz und nennen den fusionierten Datensatz "IAuBEF"
IAuBEF <- left_join(IA, Nennungen, by = c("Themencode" = "Thema")) |> 
  mutate(across(starts_with("Nenn"), ~ tidyr::replace_na(.x, 0))) 

5.3.2 Die Inhaltsanylsedaten an die Befragung machten

Jetzt wollen wir noch die Inhaltsanalysedaten an die Befragung matchen. Das ist komplizierter, weil es neben der Häufigkeit der Thematisierung der Themen in den Medien auch noch die ganzen Nachrichtenfaktoren gibt, die für uns interessant sind. Darum kommt da deutlich mehr zusammen.

Schrittweise:

  1. Wieder die kodierten Rohdaten laden.

  2. Die Inhaltsanalysedaten gruppieren nach Themencode …

  3. Je Themencode aufsummieren (aka aggegieren), wie häufig der Themencode in den Medien vorgekommen ist (wie bei der Befragung oben) und jetzt zusätzlich die Mittelwerte der NF berechnen mit mean(NF).

  4. Dann für jede Nennung die IA_Thema an den Datensatz joinen.


# Erstmal hole ich hier ganz frisch die ursprünglichen Datensätze wieder. 
IA <- readxl::read_excel("data/DATEN_IA_codiert.xlsx")
BEF <- readxl::read_excel("data/DATEN_BEF_codiert.xlsx") 

# Hier mache ich eine Tabelle "IA-Thema", 
IA_Thema <- IA |> 
  filter(!is.na(Themencode)) |> # die keine NAs beim Themencode enthält und ...
  group_by(Themencode) |> #... und nach "Thema" gruppiert ist, also Infos pro Thema enthält und zwar ...
  summarise(Thematisierung = n(), # Anzahl der Thematisierungen in den Medien
            EMO = mean(EMO, na.rm = TRUE), # die mittlere NF-Intensität aller Meldungen zum selben Thema (bzw. Themncode)
            KRI = mean(KRI, na.rm = TRUE), # wie EMO
            INS = mean(INS, na.rm = TRUE),
            KON = mean(KON, na.rm = TRUE),
            AKT = mean(AKT, na.rm = TRUE),
            BED = mean(BED, na.rm = TRUE),
            KURIO = mean(KURIO, na.rm = TRUE),
            SEN = mean(SEN, na.rm = TRUE),
            PRO = mean(PRO, na.rm = TRUE),
            SCHAD_MT = mean(SCHAD_MT, na.rm = TRUE),
            SCHAD_G = mean(SCHAD_G, na.rm = TRUE),
            WUN = mean(WUN, na.rm = TRUE),
            TRAG = mean(TRAG, na.rm = TRUE),
            ETHNO = mean(ETHNO, na.rm = TRUE),
            SUPER = mean(SUPER, na.rm = TRUE),
            PERS = mean(PERS, na.rm = TRUE),
            GWLT = mean(GWLT, na.rm = TRUE),
            GWLT_IG = mean(GWLT_IG, na.rm = TRUE),
            UEBR = mean(UEBR, na.rm = TRUE),
            T_FURCHT = mean(T_FURCHT, na.rm = TRUE),
            KNTR = mean(KNTR, na.rm = TRUE),
            NUTZ = mean(NUTZ, na.rm = TRUE)) # Die Anzahl der Artikel, wo das Thema vorkam   # 

# Hier werden jetzt, ähnlich wie oben, die Datensätze der IA an die BEF geklebt und zu BEFuIA fusioniert
BEFuIA <- left_join(BEF, IA_Thema, by = c("Nenn1" = "Themencode")) |> # zu jeder Nennung wir das "Thema" und die Mittelwerte der Variablen gehängt
  rename(Thematisierung_1 = "Thematisierung") |>  # wieder umbenennen
  left_join(IA_Thema, by = c("Nenn2" = "Themencode"), suffix = c("_1", "_2")) |> # jetzt die Themenvariablen nach Nenn2
  rename(Thematisierung_2 = "Thematisierung") |>  # wieder umbenennen
  left_join(IA_Thema, by = c("Nenn3" = "Themencode"), suffix = c("_1", "_3")) |> # und, is klar, gell
  rename(Thematisierung_3 = "Thematisierung") # und umbennenen, damit wir auch hier wissen, dass es zur Nenn3 gehört

5.4 Fusionierte Daten speichern (TF D/E)

Speichern Sie die fusionierten Daten für sich und geben Sie sie an Ihre Kolleg:innen aka Projektmitarbeitenden weiter.

# Datensatz der IA mit gematchten Meldungsnennungen der Befragung speichern
IAuBEF |> saveRDS("data/IA_und_Befragung.RDS")

# Datensatz der Befragung mit den gematchten durchschnittlichen NF-Intensitäten aus der IA gematcht
BEFuIA |> saveRDS("data/Befragung_und_IA.RDS")