In diesem Artikel stelle ich beispielhaft die Auswertung eines Datensatzes in R dar.  Es werden zwei Typen von Hypothesen überprüft: eine Unterschieds- sowie eine Zusammenhangshypothese. Außerdem wird der Datensatz deskriptiv-statistisch betrachtet.

Die Daten wurden im Zeitraum vom 22.12.2020 bis zum 22.01.2021 in einer Online-Umfrage (Formr) erhoben. Befragt wurden Studierende sozialwissenschaftlicher Fächer.

Achtung: Korrelationsanalyse / Voraussetzungsprüfung wird demnächst hochgeladen.

Ergebnisse:

Hypothesen und Analyse

In der Präregistrierung vor der Datenerhebung wurde Folgendes angegeben:

Research Hypothesis 1
H0: Male social science students show the same or a smaller amount of preference for scientific methods and statistics as female ones.
H1: Male social science students show a higher preference for scientific methods and statistics.

Research Hypothesis 2
H0: There is no or a negative correlation between preference for scientific methods and statistics and conscientiousness among social science students.
H1: Social science students show a positive correlation between preference for scientific methods and statistics and conscientiousness.
Analysis
We are going to conduct a t-test analysis to examine gender-specificity in preference for scientific methods and statistics as well as a correlation analysis to test for a potential correlation between preference for scientific methods and statistics and conscientiousness. To eliminate potential confounders, we are going to use descriptive statistics in order to analyze discrepancies in gender proportion between the different social science majors.

Arbeitsschritte

  1. Extraktion und Aufbereitung der Variablen
    1.1 NAs entfernen
    1.2 Gender in Faktor umkodieren
    1.3 Umpolen der inversen Items
    1.4 Skalenwert berechnen

  2. Deskriptivanalyse
    2.1 Histogramm nach Geschlecht
    2.2 Histogramm nach Fachzugehörigkeit
    2.3 Verteilungen über Fachsemester
    2.4 Verteilung über gewiss
    2.5 Verteilung nach Alter
    2.5 Normalverteilung überprüfen

  3. Inferenzanalyse
    3.1 Unterschiedshypothese mittels T-Test
    3.2 Zusammenhangshypothese mit Regressionsanalyse / Korrelationsanalyse

Datensatz laden

Um das Working Directory festzulegen, muss der exakte Dateipfad in den Befehl eingetragen werden. Unter diesem Pfad sollte auch der Datensatz gespeichert sein (in unserem Fall als data.json).



setwd("/Volumes/ ... /Datensatz") # Working Directory festlegen, in dem die JSON-Datei abgelegt ist

data = as.data.frame(jsonlite::fromJSON("data.json")) # JSON-Datei aus dem Working Directory abrufen

Dieser Datensatz enthält etliche unvollständige Durchgänge und somit unbrauchbare Daten.

Sollten die oben genannten Schritte nicht funktionieren, muss vorher ein fehlendes Package geladen werden.



install.packages("jsonlite")
library(jsonlite)

Datensatz filtern

Diese unvollständigen Dateneingaben müssen rausgefiltert werden. Dafür mache ich mir zunutze, dass Formr auch den Endzeitpunkt eines Umfragedurchgangs protokolliert. Diese Variable heißt ended. Zeilen, die NA bei der Variable ended anzeigen, können folglich gelöscht werden, denn der Umfragedurchgang wurde nie abgeschlossen.

Zur Sicherheit wähle ich eine zweite Filtervariable: gewiss6. Diese ist die letzte Variable aus dem Datensatz und entspricht auch dem letzten Item aus der Umfrage.

Um uns das Filtern zu erleichtern nutzen wir das dplyr-Package:



install.packages("dplyr") # Package installieren, sofern noch nicht geschehen
library(dplyr)

Als Kriterium für den Filter gilt somit die Vollständigkeit (keine NAs):



complete.cases(data$ended, data$gewiss6) # Filterkriterium nach Vollständigkeit, das eine boolesche Variable ausgibt

Die Filterung geschieht mit dem Befehl filter().



filter(data, complete.cases(data$ended, data$gewiss6)) # Filtern des Datensatzes nach dem o. g. Kriterium

Die gefilterten Daten speichere ich in einem neuen Datensatz. Damit lautet die vollständige Operation:



data_new <- filter(data, complete.cases(data$ended, data$gewiss6))  # gefilterten Datensatz abspeichern

print(data_new) # neuen, gefilterten Datensatz begutachten

Der neue Datensatz data_new sollte nur noch die abgeschlossenen Umfragedurchgänge beinhalten:

Sollte der Datensatz nur noch NAs enthalten oder auf eine andere Weise auffällig sein, empfielt es sich, die vorigen Schritte nochmal zu überprüfen.

Erste Betrachtung

Im Folgenden zeige ich einige Befehle, um sich einen deskriptiv-statistischen Überblick über den Datensatz zu verschaffen.

Histogramm nach Geschlecht

Um ein Histogramm nach Geschlecht zu erstellen, muss die Variable gender zunächst in einen Faktor überführt werden.



gender <- factor(data_new$gender,
                    labels = c("männlich", "weiblich", "divers"))

Anschließend kann das Histogramm mit dem plot-Befehl erstellt werden:



plot(gender,
     main = "Geschlechterverteilung",
     sub = "n = 80")

Mit weiteren Argumenten kann der Plot verfeinert werden.



plot(gender,
     ylab = "absolute Häufigkeit",
     main = "Geschlechterverteilung",
     sub = "n = 80",
     col = "lightblue")

Histogramm nach Alter

Mit dem Argument breaks wird die Anzahl an Gruppen des Histogramms bestimmt.



hist(data_new$alter, breaks = 20,
     ylab = "absolute Häufigkeit", xlab = "Alter", 
     main = "Verteilung nach Alter", sub = "n = 80",
     col = "lightblue")



hist(data_new$alter, breaks = 10,
     ylab = "absolute Häufigkeit", xlab = "Alter", 
     main = "Verteilung nach Alter", sub = "n = 80",
     col = "lightblue")



hist(data_new$alter, breaks = 5,
     ylab = "absolute Häufigkeit", xlab = "Alter", 
     main = "Verteilung nach Alter", sub = "n = 80",
     col = "lightblue")

Umpolung inverser Items

Inverse Items müssen vor der Berechnung der Skalenwerte umgepolt werden:

1 → 5
2 → 4
3 → 3
4 → 2
5 → 1

In unserem Datensatz müssen etliche Variablen umgepolt werden. Deswegen erspare ich mir die manuelle rechnerische Umpolunng.



# Manuelle rechnerische Umpolen

pref2_invers <- -1 * (data_new$pref2-6)

Stattdessen verwende ich das car-Package.



install.packages("car")
library(car)

> library(car)
Lade nötiges Paket: carData

Attache Paket: ‘car’

The following object is masked from ‘package:dplyr’:

    recode

# Die Warnung kann ignoriert werden.

Die Umpolung erfolgt anschließeng mit der Funktion recode().



# Umpolung inverser Items (pref2 / pref 7)

data_new$pref2_invers <- recode(data_new$pref2, "1=5; 2=4; 3=3; 4=2; 5=1")
data_new$pref7_invers <- recode(data_new$pref7, "1=5; 2=4; 3=3; 4=2; 5=1")

# Umpolung inverser Items (gewiss2 / gewiss3 / gewiss4 / gewiss5 / gewiss6)

data_new$gewiss2_invers <- recode(data_new$gewiss2, "1=5; 2=4; 3=3; 4=2; 5=1")
data_new$gewiss3_invers <- recode(data_new$gewiss3, "1=5; 2=4; 3=3; 4=2; 5=1")
data_new$gewiss4_invers <- recode(data_new$gewiss4, "1=5; 2=4; 3=3; 4=2; 5=1")
data_new$gewiss5_invers <- recode(data_new$gewiss5, "1=5; 2=4; 3=3; 4=2; 5=1")
data_new$gewiss6_invers <- recode(data_new$gewiss6, "1=5; 2=4; 3=3; 4=2; 5=1")

Skalenwerte berechnen

Als nächstes berechne ich die Skalenwerte meiner beiden Faktoren pref und gewiss. Hierfür kann ich a) den Mittelwert oder b) die Summe der Items meiner Faktoren bestimmen. Ich verwende das arithmetische Mittel.

Um meine Items auszuwählen, verwende ich die Funktion subset(). Diese ermöglichst es mir, beliebig viele Variablen aus meinem Datensatz auszuwählen.



data_new$gewiss_mean <- rowMeans(subset(data_new, select = c("gewiss1", "gewiss2_invers", "gewiss3_invers", "gewiss4_invers", "gewiss5_invers", "gewiss6_invers")))
data_new$pref_mean <- rowMeans(subset(data_new, select = c("pref1", "pref2_invers", "pref3", "pref4", "pref5", "pref7_invers", "pref8")))


Streuung betrachten

Weiterhin können Varianz und Standardabweichung der Faktorwerte bestimmt werden.



gewiss_var <- var(data_new$gewiss_mean)
gewiss_sd <- sd(data_new$gewiss_mean)

pref_var <- var(data_new$pref_mean)
pref_sd <- sd(data_new$pref_mean)

Einen guten Überblick über die Streuung der Variablenwerte eines Faktors erhalten wir durch einen Box-Wishker-Plot.



boxplot(data_new$gewiss_mean,
        horizontal = TRUE,
        xlab = "Ausprägung der Gewissenhaftigkeit",
        main = "Streuung des Primärfaktors Gewissenhaftigkeit",
        sub = "n = 80",
        col = "lightblue")

Wir sehen: Der Faktor ist in unserer Stichprobe nicht symmetrisch verteilt, sondern rechtssteil bzw. linksschief. Der Median liegt knapp unter 4. Nach unten gibt es einen statistischen Ausreißer.

Das bestätigt sich bei einem detaillierten Blick auf die Verteilung:



hist(data_new$gewiss_mean,
     breaks = 20,
     plot = TRUE,
     xlim = c(0,5),
     xlab = "Ausprägung der Gewissenhaftigkeit",
     ylab = "absolute Häufigkeit",
     main = "Streuung des Primärfaktors Gewissenhaftigkeit",
     sub = "n = 80",
     col = "lightblue")

Um einen detaillierten Überblick zu erhalten, verwende ich die Funktion summary().



summary(data_new$gewiss_mean)

> summary(data_new$gewiss_mean)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  2.000   3.500   3.917   3.829   4.333   5.000 

Korrelationsanalyse

Nun wende ich mich der zweiten Hypothese zu. Diese postuliert einen positiven Zusammenhang zwischen der Präferenz für Methoden und Statistik pref und der Gewissenhaftigkeit gewiss.

Für eine schnelle Korrelationsanalyse verwende ich das ggpubr-Package.



install.packages("ggpubr")
library(ggpubr)



ggscatter(data_new, x = "gewiss_mean", y = "pref_mean", 
          add = "reg.line", conf.int = TRUE, 
          cor.coef = TRUE, cor.method = "pearson",
          add.params = list(color = "black", fill = "lightblue"),
          title = "Korrelation von Gewissenhaftigkeit und der Präferenz für Methoden und Statistik",
          xlab = "Gewissenhaftigkeit", ylab = "Präferenz für Methoden und Statistik")

Die schwarzen Punkte sind die einzelnen Datenpunkte. Bei der Geraden handelt es sich um die Regressionslinie, die von einem hellblauen Konfidenzintervall umgeben ist.

Der Pearson-Koeffizient lässt sich mit der Funktion cor() berechnen.



cor(x = data_new$gewiss_mean, y = data_new$pref_mean, method = "pearson")

> cor(x = data_new$gewiss_mean, y = data_new$pref_mean, method = "pearson")
[1] 0.3810502