Seit meinem Psychologiestudium war ich ein intensiver SPSS-Nutzer. Was mich über alle Versionen in dieser Zeit begleitet hat, waren die einfachen, knappen Befehle, um mir deskriptive Statistiken anzeigen zu lassen. Diese kurzen Kommandos gehen schnell in Fleisch und Blut über und ermöglichen ein schnelles Sichten der Daten.
Aktuell liegt mein Tool-Schwerpunkt bei R. Es ist eine hervorragende Alternative, aber trotz umfangreicher Erfahrung mit diesem Open-Source-Tool fehlt mir immer noch ein bisschen die gefühlte Usability von SPSS. Mir fehlen schlicht und einfach meine kurzen Kommandos. Nun ist es relativ leicht, SPSS-ähnliche Befehle selbst als Funktionen in R zu ergänzen.
Kurzbefehle in SPSS
SPSS-FREQUENCIES
Als Beispiel nehme ich den Frequencies-Befehl. In SPSS reicht es, für Befehle nur die ersten 3 bis 4 Buchstaben zu verwenden, solange es eindeutig ist. "FREQ kategorie." z. B. stellt mir für die Spalte "kategorie" für jeden distinkten Wert die absolute Häufigkeit, die prozentuale Häufigkeit, die prozentuale Häufigkeit an gültigen Fällen ohne Fehlende sowie die kumulierte prozentuale Häufigkeit dar. Für eine explorative Datenanalyse ist das sehr hilfreich, da ich sofort sehe:
- Was sind die häufigsten oder seltensten Werte?
- Welchen Anteil haben diese Werte an allen Daten bzw. an der gültigen Basis?
- Welchen Anteil nehmen die Top-3-Kategorien zusammen ein?
Wenn man den Befehl noch anpasst, z. B. "FREQ kategorie /FORMAT AFREQ.", dann werden die Häufigkeiten aufsteigend statt absteigend dargestellt.
FREQUENCIES-Nachbau in R
So, genau das hätte ich jetzt auch gerne in R.
Der Befehl lässt sich wie folgt über eine benutzerdefinierte Funktion umsetzen:
freq = function(x, sort='dfreq'){
df = as.data.frame(table(x, useNA = 'always'))
if (sort == 'dfreq'){
df = df[order(-df$Freq),]
}else if (sort == 'afreq'){
df = df[order(+df$Freq),]
}else if (sort == 'dvalue'){
df = df[order(df$x,decreasing = TRUE),]
}else if (sort == 'avalue'){
#do nothing, use table default
}
names(df)<-c("value","freq")
df$perc<-df$freq/sum(df$freq)*100
df$perc_val<-df$freq/sum(df$freq[!is.na(df$value)])*100
df$perc_val[is.na(df$value)]<-NA
perc_cum_v = c()
perc_cum = 0
for(value in df$perc){
perc_cum = perc_cum + value
perc_cum_v = c(perc_cum_v,perc_cum)
}
df$perc_cum = perc_cum_v
df
}
Was passiert hier?
- Über den table-Befehl wird zunächst die einfache Häufigkeit abgefragt und in ein Dataframe gepresst.
- Abhängig vom Parameter "order" werden die Inhalte sortiert.
- Es folgen Berechnungen über den gesamten Häufigkeitsvektor, um die Prozente zu ermitteln.
- Zuletzt wird der Vektor "perc_cum_v" mit den kumulierten Prozenten aufgebaut. Hierfür wird in einer Schleife das Ergebnis abgelaufen.
Das Endergebnis gefällt mir schon sehr gut! Zu einem späteren Zeitpunkt werde ich wohl noch weitere Funktionalitäten integrieren, z.B. einen "limit"-Befehl, um nur die Top-X-Kategorien anzuzeigen usw.
Aber in der Zwischenzeit hat die neue Funktion "freq" mir die Arbeit schon sehr erleichtert :-).
Das Beispiel unten zeigt ein Ergebnis der Funktion. Ich habe bewusst die Funktion so von SPSS abweichen lassen, dass fehlende Werte in den kummulierten Prozenten (perc_cum) berücksichtigt werden, da ich es so öfter benötige.
Beispielausgabe in R