Einleitung

Dieser Text - geschrieben in R Markdown mit und fuer die Arbeit im R-Commander - ergaenzt das Buch Siegmund, Frank (2020). Statistik in der Archaeologie: eine anwendungsorientierte Einfuehrung auf Basis freier Software. Norderstedt: BoD. (Druckausgabe) - bzw. <www.frank-siegmund.de> (dort als PDF im Open Access).

Im Gegensatz zum (weitaus komfortabler) in RStudio eingebetteten RMarkdown ist es innerhalb des R-Commanders zwar moeglich, deutsche Umlaute zu schreiben, aber bei der Weiterverarbeitung mit Hilfe des R-Commanders kommt es zu Problemen. Daher muessen die Texte hier ohne deutsche Umlaute und scharfes S auskommen.

Zielsetzung dieser Datei ist es, den Lesern und Nutzern des genannten Buches alle im Buch enthaltenen Code-Beispiele so mitzugeben, dass sie per Copy & Paste nutzbar sind. So soll das muehsame Abtippen gespart und eine moegliche Fehlerquelle minimiert werden.

Der Text geht davon aus, dass alle relevanten Daten und Dateien auf Laufwerk “D” im Verzeichnis “RData” vorgehalten werden, was wir im folgenden per R-Commander zunaechst so einstellen. Dabei begegnen wir erstmals einer der wichtigen Eigenschaften dieses Textes: R-Code wird zwischen zwei Zeilen (eingangs und am Ende) eingebettet, die aus drei Schraegstrichen besteht. Das ist der Code, den Sie als Nutzer ggf. copy-pasten, oder markieren und ausfuehren.

Sollten Sie ein anderes Laufwerk und/oder Verzeichnis nutzen, koennen Sie das im R-Commander selbst umstellen, oder eben den nachfolgenden Code editieren, markieren und dann ausfuehren. Der R-Commander zeigt Ihnen links oben zwei Reiter: “R Skript” und “R Markdown”, und dieser Text hier kann in das Fenster “R Markdown” geladen, dort veraendert und auch wieder gespeichert werden, z.B. nachdem Sie ihn an Ihre Beduerfnisse und Gegebenheiten angepasst haben.

Klarstellung: der Original-Text ist jener mit der Datei-Endung .Rmd, die Varianten mit der Endung .html resp. .docx sind Ausgaben, die fuer das Lesen erzeugt wurden. Im R-Commander liest und arbeitet man in der Rmd-Fassung.

Wenn Ihnen das hier demonstrierte Vorgehen gefaellt, koennen Sie es auch sehr fruchtbar jenseits dieser Datei f?r Ihre eigene Arbeit einsetzen, d.h. in einer solchen RMarkdown-Datei Ihre eigenen Projekte komplett dokumentieren oder sich eine Art Notizzettel f?r erfolgreichen Code und Standardprozesse ablegen.

> setwd("D:/RData")

Kap 17: Graphische Darstellungen

Anhand des Beispieldatensatzes 1_Geldboersen.sav, der zu Beginn eingelesen wird. (Wir waehlen in unserem Beispiel die Datei im Format .sav [zu SPSS], weil diese sich als sehr robustes Austauschformat bewaehrt hat. Sie koennen gerne eine andere Variante einladen.

> Muenzen <- readSPSS("D:/RData/1_Geldboersen.sav", rownames=FALSE, 
+   stringsAsFactors=TRUE, tolower=FALSE)

Bitte erfolgreiches Laden kontrollieren, mit der Schaltflaeche “Datenmatrix betrachten” im R-Commander.

Balkendiagramm (Abb. 29)

> with(Muenzen, Barplot(Waehrung, xlab="Waehrung", ylab="Anzahl Muenzen"))

Moegliche Verfeinerungen mit Setzen der Saeulenfarbe, von Titel und Untertitel sowie Aenderung der Groesse der Beschriftung. Durch Editieren kann man im Try-and-Error-Verfahren lernen, was die einzelnen Parameter bedeuten und Veraenderungen bewirken.

> with(Muenzen, Barplot(Waehrung, xlab="Waehrung", ylab="Anzahl Muenzen", 
+  col="blue", main="Geldboersen 1989-2019", sub="(n=7.760)",
+  cex.axis=1.2, cex.lab=1.4)
+ )

Kreisdiagramm (Abb. 30)

> library(colorspace, pos=18)
> 
> with(Muenzen, pie(table(Waehrung), labels=levels(Waehrung), xlab="", 
+   ylab="", main="Waehrung", col=rainbow_hcl(3)))

Moegliche Verfeinerungen, u.a. mit laenderspezifischer Anpassung der Farben:

> with(Muenzen, pie(table(Waehrung), labels=levels(Waehrung), 
+   xlab="", ylab="", main="Anteile Waehrungen",
+   col=c("red","green","blue"), cex=1.2))

Balkendiagramm Abb. 32

> with(Muenzen, Barplot(Praegeort, xlab="Praegeorte", ylab="Anzahl Muenzen"))

…mit Verfeinerungen, bei vorherigem Wandel der Variable Ort in einen Faktor:

> Muenzen <- within(Muenzen, {
+   Ort <- factor(Ort, labels=c('A: Berlin','D: Muenchen','F: Stuttgart',
+   'G: Karlsruhe','J: Hamburg'))
+   })
> #
> with(Muenzen, Barplot(Ort, xlab="Praegeorte", ylab="Anzahl Muenzen",
+   cex.axis=1.2, cex.names=0.9, cex.lab=1.3, space=0.4)
+ )
> abline(h=200, col="white")
> abline(h=400, col="white")
> abline(h=600, col="white")
> abline(h=800, col="white")
> abline(h=1000, col="white")

Histogramme (Abb. 34-35 u. 41)

Zunaechst die einfache Fassung, wie Abb. 34:

> with(Muenzen, Hist(Jahr, scale="frequency", breaks="Sturges", 
+   col="darkgray", xlab="Praegejahr", ylab="Anzahl Muenzen"))

…dann mit Wegfiltern der wenigen alten Muenzen, um fuer die Zeit ab 1950 die Aufloesung zu verbessern.

> MuenzenAb1950 <- subset(Muenzen, subset=Jahr > 1949)
> # Klassenweiten automatisch:
> with(MuenzenAb1950, Hist(Jahr, scale="frequency", breaks="Sturges", 
+   col="darkgray", xlab="Praegejahr", ylab="Anzahl Muenzen"))

Nun mit dem Ziel Klassenweite = 2 Jahre. Weil Spanne = 70 Jahre, Klassenanzahl auf 35 gesetzt:

> with(MuenzenAb1950, Hist(Jahr, scale="frequency", breaks=35, col="darkgray",
+    xlab="Praegejahr", ylab="Anzahl Muenzen"))

> #
> with(MuenzenAb1950, Hist(Jahr, scale="frequency", breaks=35,
+   col="darkgray", xlab="Praegejahr", ylab="Anzahl Muenzen",
+   cex.axis=1.2, cex.lab=1.2))

Die Einfuehrung des Euro im Jahr 2002 setzt sich nun markant ab. Nun eine Fassung, bei der die drei Waehrungen durch den Befehl ‘groups= …’ vergleichend einander gegenuebergestellt werden:

> with(MuenzenAb1950, Hist(Jahr, groups=Waehrung, scale="frequency", 
+   breaks=35, col="darkgray", xlab="Praegejahr", ylab="Anzahl Muenzen"))

Idee fein, Darstellung im Ergebnis aber unrund, weil die Saeule der Euro-Muenzen aus dem Jahr 2002 die Skalierung so beeinflusst, dass alles andere kaum mehr sichtbar ist. Gleichwie: ein nuetzlicher Weg ist aufgezeigt, der mit wenig Aufwand gangbar ist.

gestapeltes / gestaffeltes Balkendiagramm (Abb. 45-46)

Ziel: die Muenz-Nominale (-Werte) differenziert nach Waehrung zu betrachten. Dazu m?ssen die bislang als Zahl / Messwert abgelegten Nominale zunaechst als “Faktor” umkodiert werden. Danach bestellen wir ein einfaches gestaffeltes Balkendiagramm (im Meue als “parallel nebeneinader” beschrieben).

> Muenzen <- within(Muenzen, 
+   Nominal <- as.factor(Nominal))
> #
> with(Muenzen, Barplot(Nominal, by=Waehrung, style="parallel", 
+   legend.pos="above", xlab="Nominale (Muenzwerte)", ylab="Anzahl Muenzen"))

Im folgenden Beispiel packen wir bewusset einmal viele moegliche Parameter in das Diagramm. Bei R werden alle Zeichen einer Zeile nach einem # als Kommentar verstanden - eine gute Moeglichkeit, sich seinen eigenen Code gut zu erklaeren und ihn verstaendlich zu halten, auch wenn man nach einer laengeren Pause ein Thema wieder neu aufrollt.

with(Muenzen, Barplot(Nominal, by=Waehrung, style=“parallel”, # setzt Saeulen nebeneinander, Alternative ist “###” legend.pos=“topright”, # setzt Legende nach rechts oben xlab=“Nominale (Rappen, Pfennige, Cent)”, ylab=“Anzahl Muenzen”, sub=“(n=7.760)”, # fuegt Untertitel hinzu density=45, # macht statt Fuellung Schraffuren angle=0, # setzt den Winkel der Schraffuren border=TRUE, # zieht feinen Rahmen in Saeulenfarbe um die Saeulen# Einleitung Dieser Text - geschrieben in R Markdown mit und fuer die Arbeit im R-Commander - ergaenzt das Buch Siegmund, Frank (2020). Statistik in der Archaeologie: eine anwendungsorientierte Einfuehrung auf Basis freier Software. Norderstedt: BoD. (Druckausgabe) - bzw. <www.frank-siegmund.de> (dort als PDF im Open Access).

Im Gegensatz zum (weitaus komfortabler) in RStudio eingebetteten RMarkdown ist es innerhalb des R-Commanders zwar moeglich, deutsche Umlaute zu schreiben, aber bei der Weiterverarbeitung mit Hilfe des R-Commanders kommt es zu Problemen. Daher muessen die Texte hier ohne deutsche Umlaute und scharfes S auskommen.

Zielsetzung dieser Datei ist es, den Lesern und Nutzern des genannten Buches alle im Buch enthaltenen Code-Beispiele so mitzugeben, dass sie per Copy & Paste nutzbar sind. So soll das muehsame Abtippen gespart und eine moegliche Fehlerquelle minimiert werden.

Der Text geht davon aus, dass alle relevanten Daten und Dateien auf Laufwerk “D” im Verzeichnis “RData” vorgehalten werden, was wir im folgenden per R-Commander zunaechst so einstellen. Dabei begegnen wir erstmals einer der wichtigen Eigenschaften dieses Textes: R-Code wird zwischen zwei Zeilen (eingangs und am Ende) eingebettet, die aus drei Schraegstrichen besteht. Das ist der Code, den Sie als Nutzer ggf. copy-pasten, oder markieren und ausfuehren.

Sollten Sie ein anderes Laufwerk und/oder Verzeichnis nutzen, koennen Sie das im R-Commander selbst umstellen, oder eben den nachfolgenden Code editieren, markieren und dann ausfuehren. Der R-Commander zeigt Ihnen links oben zwei Reiter: “R Skript” und “R Markdown”, und dieser Text hier kann in das Fenster “R Markdown” geladen, dort veraendert und auch wieder gespeichert werden, z.B. nachdem Sie ihn an Ihre Beduerfnisse und Gegebenheiten angepasst haben.

Klarstellung: der Original-Text ist jener mit der Datei-Endung .Rmd, die Varianten mit der Endung .html resp. .docx sind Ausgaben, die fuer das Lesen erzeugt wurden. Im R-Commander liest und arbeitet man in der Rmd-Fassung.

Wenn Ihnen das hier demonstrierte Vorgehen gefaellt, koennen Sie es auch sehr fruchtbar jenseits dieser Datei f?r Ihre eigene Arbeit einsetzen, d.h. in einer solchen RMarkdown-Datei Ihre eigenen Projekte komplett dokumentieren oder sich eine Art Notizzettel f?r erfolgreichen Code und Standardprozesse ablegen.

> setwd("D:/RData")

Kap 17: Graphische Darstellungen

Anhand des Beispieldatensatzes 1_Geldboersen.sav, der zu Beginn eingelesen wird. (Wir waehlen in unserem Beispiel die Datei im Format .sav [zu SPSS], weil diese sich als sehr robustes Austauschformat bewaehrt hat. Sie koennen gerne eine andere Variante einladen.

> Muenzen <- readSPSS("D:/RData/1_Geldboersen.sav", rownames=FALSE, 
+   stringsAsFactors=TRUE, tolower=FALSE)

Bitte erfolgreiches Laden kontrollieren, mit der Schaltflaeche “Datenmatrix betrachten” im R-Commander.

Balkendiagramm (Abb. 29)

> with(Muenzen, Barplot(Waehrung, xlab="Waehrung", ylab="Anzahl Muenzen"))

Moegliche Verfeinerungen mit Setzen der Saeulenfarbe, von Titel und Untertitel sowie Aenderung der Groesse der Beschriftung. Durch Editieren kann man im Try-and-Error-Verfahren lernen, was die einzelnen Parameter bedeuten und Veraenderungen bewirken.

> with(Muenzen, Barplot(Waehrung, xlab="Waehrung", ylab="Anzahl Muenzen", 
+  col="blue", main="Geldboersen 1989-2019", sub="(n=7.760)",
+  cex.axis=1.2, cex.lab=1.4)
+ )

Kreisdiagramm (Abb. 30)

> library(colorspace, pos=18)
> 
> with(Muenzen, pie(table(Waehrung), labels=levels(Waehrung), xlab="", 
+   ylab="", main="Waehrung", col=rainbow_hcl(3)))

Moegliche Verfeinerungen, u.a. mit laenderspezifischer Anpassung der Farben:

> with(Muenzen, pie(table(Waehrung), labels=levels(Waehrung), 
+   xlab="", ylab="", main="Anteile Waehrungen",
+   col=c("red","green","blue"), cex=1.2))

Balkendiagramm Abb. 32

> with(Muenzen, Barplot(Praegeort, xlab="Praegeorte", ylab="Anzahl Muenzen"))

…mit Verfeinerungen, bei vorherigem Wandel der Variable Ort in einen Faktor:

> Muenzen <- within(Muenzen, {
+   Ort <- factor(Ort, labels=c('A: Berlin','D: Muenchen','F: Stuttgart',
+   'G: Karlsruhe','J: Hamburg'))
+   })
> #
> with(Muenzen, Barplot(Ort, xlab="Praegeorte", ylab="Anzahl Muenzen",
+   cex.axis=1.2, cex.names=0.9, cex.lab=1.3, space=0.4)
+ )
> abline(h=200, col="white")
> abline(h=400, col="white")
> abline(h=600, col="white")
> abline(h=800, col="white")
> abline(h=1000, col="white")

Histogramme (Abb. 34-35 u. 41)

Zunaechst die einfache Fassung, wie Abb. 34:

> with(Muenzen, Hist(Jahr, scale="frequency", breaks="Sturges", 
+   col="darkgray", xlab="Praegejahr", ylab="Anzahl Muenzen"))

…dann mit Wegfiltern der wenigen alten Muenzen, um fuer die Zeit ab 1950 die Aufloesung zu verbessern.

> MuenzenAb1950 <- subset(Muenzen, subset=Jahr > 1949)
> # Klassenweiten automatisch:
> with(MuenzenAb1950, Hist(Jahr, scale="frequency", breaks="Sturges", 
+   col="darkgray", xlab="Praegejahr", ylab="Anzahl Muenzen"))

Nun mit dem Ziel Klassenweite = 2 Jahre. Weil Spanne = 70 Jahre, Klassenanzahl auf 35 gesetzt:

> with(MuenzenAb1950, Hist(Jahr, scale="frequency", breaks=35, col="darkgray",
+    xlab="Praegejahr", ylab="Anzahl Muenzen"))

> #
> with(MuenzenAb1950, Hist(Jahr, scale="frequency", breaks=35,
+   col="darkgray", xlab="Praegejahr", ylab="Anzahl Muenzen",
+   cex.axis=1.2, cex.lab=1.2))

Die Einfuehrung des Euro im Jahr 2002 setzt sich nun markant ab. Nun eine Fassung, bei der die drei Waehrungen durch den Befehl ‘groups= …’ vergleichend einander gegenuebergestellt werden:

> with(MuenzenAb1950, Hist(Jahr, groups=Waehrung, scale="frequency", 
+   breaks=35, col="darkgray", xlab="Praegejahr", ylab="Anzahl Muenzen"))

Idee fein, Darstellung im Ergebnis aber unrund, weil die Saeule der Euro-Muenzen aus dem Jahr 2002 die Skalierung so beeinflusst, dass alles andere kaum mehr sichtbar ist. Gleichwie: ein nuetzlicher Weg ist aufgezeigt, der mit wenig Aufwand gangbar ist.

gestapeltes / gestaffeltes Balkendiagramm (Abb. 45-46)

Ziel: die Muenz-Nominale (-Werte) differenziert nach Waehrung zu betrachten. Dazu m?ssen die bislang als Zahl / Messwert abgelegten Nominale zunaechst als “Faktor” umkodiert werden. Danach bestellen wir ein einfaches gestaffeltes Balkendiagramm (im Meue als “parallel nebeneinader” beschrieben).

> Muenzen <- within(Muenzen, {
+   Nominal <- as.factor(Nominal)
+ })
> 
> #
> with(Muenzen, Barplot(Nominal, by=Waehrung, style="parallel", 
+   legend.pos="above", xlab="Nominale (Muenzwerte)", ylab="Anzahl Muenzen"))

Im folgenden Beispiel packen wir bewusset einmal viele moegliche Parameter in das Diagramm. Bei R werden alle Zeichen einer Zeile nach einem # als Kommentar verstanden - eine gute Moeglichkeit, sich seinen eigenen Code gut zu erklaeren und ihn verstaendlich zu halten, auch wenn man nach einer laengeren Pause ein Thema wieder neu aufrollt.

> with(Muenzen, Barplot(Nominal, by=Waehrung,
+   style="parallel",
+   legend.pos="topright", 
+   xlab="Nominale (Rappen, Pfennige, Cent)",
+   ylab="Anzahl Muenzen",
+   sub="(n=7.760)",
+   density=60,
+   angle=0,
+   border=TRUE,
+   cex.axis=1.2,
+   cex.names=1.4
+ ))

Nun das Stapeldiagramm Abb. 46:

> with(Muenzen, Barplot(Nominal, by=Waehrung, 
+   style="divided", 
+   legend.pos="topright",
+   xlab="Nominale (Rappen, Pfennig, Cent)",
+   ylab="Anzahl Muenzen",
+   sub="(n=7.760)",
+   cex.axis=1.1,
+   cex.names=1.3
+ ))

Streuungsdiagramme: der Zusammenhang von 2 Variablen (Abb. 48)

> scatterplot(Jahr~Stichjahr | Waehrung,
+  regLine=FALSE, smooth=FALSE, boxplots=FALSE,
+  by.groups=TRUE, data=Muenzen,
+  jitter=list(x=1.3),              # "verrauscht" die Punkte, wg. der vielen Ueberlagerungen
+  xlab="Erhebungsjahr Geldboersen",
+  ylab="Praegejahr der Muenzen",
+  main="Zusammenhang Praegejahr - Erhebungsjahr",
+  cex=0.8,                         # macht die Punkte etwas kleiner
+  cex.axis=1.2,                    # Achsenbeschriftung etwas groesser
+  cex.lab=1.3,                     # Labels etwas groesser
+  ylim=c(1940,2020),               # begrenzt die Muenzen y-Achse auf 1940 bis 2020
+  legend=list(coords="topleft"),   # setzt die Legende oben links ins Diagramm
+  pch=c(20,5,1),                   # setzt die Art / Form der Punkte
+  col=c("red","black","blue"),     # setzt die Farben der Punkte
+  grid=TRUE                        # bestellt das Raster
+ )

Wechsel des Beispiel-Datensatzes, nun Graeberfeld Zwentendorf:

> Zwentendorf <- readSPSS("D:/RData/3_Zwentendorf.sav", rownames=FALSE, 
+   stringsAsFactors=TRUE, tolower=FALSE)
> #
> # Wandeln von "Sex" in Faktor:
> #
> Zwentendorf <- within(Zwentendorf, {
+   Sex <- factor(Sex, labels=c('Mann','Frau'))
+ })

Einfaches Streuungsdiagramm M1 vs. M17:

> scatterplot(M17~M1 | Sex, regLine=FALSE, smooth=FALSE, boxplots=FALSE,
+  xlab="M1: Schaedellaenge, in mm",
+  ylab="M17: Schaedelhoehe, in mm",
+  by.groups=TRUE,
+  legend=list(coords="topleft"), data=Zwentendorf,
+  xlim=c(165,200)
+ )

Streuungsdiagramm-Matrix (wie Abb. 53)

Ziel: Darstellung des Zusammenhangs von mehr als zwei metrischen Variablen

> scatterplotMatrix(~M1+M8+M17 | Sex, 
+   regLine=FALSE, smooth=FALSE, 
+   diagonal=list(method="density"),
+   by.groups=TRUE, data=Zwentendorf)
Warning: Using formula(x) is deprecated when x is a character vector of length > 1.
  Consider formula(paste(x, collapse = " ")) instead.

Der Datensatz enthaelt, hier (noch) nicht weggefiltert, einen einzelnen sehr kleinen Schaedel mit M1 um 140 mm, der als Ausreisser die Darstellung stark bestimmt. Fuer eine aussagekraeftigere Darstellung sollte dieser Fall aus dem Datensatz entfernt werden.

Weiter mit Teil 2/4…