Zum Hauptinhalt springen

SPSS Häufigkeitsauswertungen in R selbstgemacht

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?
     

spss-frequencies-befehl-beispiel

 

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

spss-frequencies-ausgabe-r

 

Stefan Seltmann
Dein Ansprechpartner
Stefan Seltmann
Lead Expert
Stefan liebt das Programmieren, vor allem rund um Data Engineering und Data Science, und arbeitet quasi in seinem Hobby. Gerade für Softwareentwicklung mit Python und/oder Spark punktet er als b.telligents Telefonjoker.
#CodeFirst, #TestMore, #CodeDoctor