›  Demo-R1: R-Tutorial: Teil 3

Der dritte Teil der R-Tutorial-Reihe bietet einen Einstieg in die Syntax zur Erzeugung von Grafiken und von Zufallszahlen und -stichproben in der Programmiersprache R .

Nachdem in Teil 1 der R-Tutorial-Reihe eine erste Einführung in das Basiswissen der Programmiersprache R bzgl. der Syntax, Variablen, Matrizen, regelmäßigen Folgen und dem Umgang mit Datensätzen erfolgt ist, enthielt Teil 2 der R-Tutorial-Reihe eine erste Vertiefung in Richtung Ablaufsteuerung und dem Einsatz von eigenen und in Paketen vordefinierten Funktionen. Dieser Teil schließt das Tutorial mit der Vertiefung in die Syntax zu Grafiken und Zufallszahlen ab.

Hinweise und Besonderheiten zur Syntax werden an Beispiel-Codes gezeigt.

info-icon Motivation

R ist eine freie Programmiersprache für statistische Berechnungen und Grafiken. Sie wurde 1992 von den Statistikern Ross Ihaka und Robert Gentleman an der Universität Auckland für Anwender mit statistischen Aufgaben neu entwickelt und ist auf UNIX-Plattformen, Windows and MacOS lauffähig. Die R-Umgebung wird ausdrücklich ebenfalls als R bezeichnet und ist Teil des GNU-Projekts.

Warum R?

R gilt als eine Standardsprache für statistische Problemstellungen sowohl in der Wirtschaft als auch in der Wissenschaft. Da der Quellcode öffentlich ist, bietet R die Möglichkeit, schnell neue Pakete zu entwickeln und zur Verfügung zu stellen.

Die kostenlosen und online verfügbaren Pakete erweitern das Anwendungsfeld von R auf viele Fachbereiche. Die interne Dokumentationen und auch die Foren, die sich mit der Anwendung von R befassen, bieten dem Benutzer die Möglichkeit die Funktionalität von R leicht zu erfassen und anzuwenden.

Warum RStudio?

RStudio ist eine kostenlose und integrierte Entwicklungsumgebung für die Progammiersprache R, durch RStudio wird die Benutzerfreundlichkeit von R erhöht. Der Aufbau der Entwicklungsumgebung ist einfach und sehr übersichtlich.

R vs. MATLAB und Python

R wird, wie MATLAB und Python, insbesondere für die Entwicklung von Anwendungen im Bereich des Maschinellen Lernens verwendet, um z.B. im Rahmen der Vorausschauenden Wartung Prognosen oder Clusteranalysen zu erstellen. Die drei Sprachen bieten zum Teil ähnliche Funktionalität (Bibliotheken für statistische Probleme, ausgefeilte Grafik- und Visualisierungsmodule), wobei jede ihre Stärken und Schwächen hat. Während R auf statistische Programmierung spezialisiert ist, ist MATLAB allgemeiner auf mathematische Problemstellungen ausgelegt. Python hingegen ist eine Programmiersprache, die um statistische Programmbibliotheken erweitert wurde. Die Gemeinsamkeiten und Unterschiede in der Syntax und Verwendung werden hervorgehoben, um Wechslern den Einstieg in R zu erleichtern.

info-icon Übersicht

Das Tutorial ist in drei Abschnitte gegliedert, die die R-Syntax an einfachen Beispielen erklären und aufeinander aufbauen:

  1. Grafiken erzeugen

  2. Zufallszahlen erzeugen

  3. Zufallsstichproben erzeugen

Grafiken erzeugen

High-level Grafikoptionen

Das R-Grafik-Paket graphics enthält alle zur Erzeugung und Formatierung von Grafiken benötigten Befehle. Die high-level Optionen sind Befehle aus dem graphics-Paket, die ein Grafikfenster erstellen. Neben dem automatischen Öffnen eines Grafikfensters kann mit dem Befehl dev.new() (engl. device new) ein neues Grafikfenster geöffnet werden. Dies ist bei der Handhabung mehrerer Grafiken nützlich. Die wichtigsten Befehle zum Plotten, also dem Erzeugen einer Grafik, sind plot und curve. Der plot-Befehl erhält als Parameter die x- und y-Koordinaten der darzustellenden Daten, und optional eine Auflistung von weiteren Grafikargumenten. Dem curve-Befehl wird eine Funktion (z.B. sin(x)) und Werte für die Parameter/Argumente from und to übergeben, die den Bereich angeben, über den die Funktion geplottet wird.

Hinweis: In Python wird mit der Matplotlib-Bibliothek und deren Befehl pyplot zunächst ein Figure-Objekt erstellt (pyplot.figure), in das mit dem plot-Befehl aus der pyplot-Bibliothek Grafiken eingefügt werden. In MATLAB erfolgt auch erst die Öffnung eines Grafikfensters mit figure und dem anschließenden Einfügen einer Grafik mit dem plot-Befehl.

Beispiel: Vektor plotten
Im folgenden Beispiel wird der Vektor x gegen den Index seiner Einträge geplottet, dies geschieht, indem nur die x-Koordinate, also der Vektor x als Parameter an den plot-Befehl übergeben wird.

R-Skript Output
 x=rep(c(1,2,3,4),c(1,3,2,1))
 plot(x) 

Beispiel: nx2-Matrix plotten
Im folgenden Beispiel wird die 3x2-Matrix X an den plot-Befehl übergeben, dabei wird zur Erzeugung der Grafik die erste Spalte gegen die zweite Spalte der Matrix geplottet, die Datenpunkte werden zeilenweise erkannt. Die Grafik wird in dem vorher mit dev.new() geöffneten Grafikfenster eingebettet.

R-Skript Output
 dev.new() 
 X=matrix(c(1,2,3,1,2,3),3,2) 
 plot(X) 

Beispiel: Datenpunkte plotten
Im Folgenden werden die Werte des Vektors a gegen die Werte des Vektors b geplottet. Die Grafik wird in dem vorher mit dev.new() geöffneten Grafikfenster eingebettet.

R-Skript Output
 dev.new() 
 a=rep(1,5) 
 b=c(2,3,6,9,1) 
 plot(a,b)  

Beispiel: Funktionen plotten
Im folgenden Beispiel wird die Sinus-Funktion im Bereich 0 bis 2π mit einer Schrittweite der x-Werte von 0.2 in ein neues Grafikfenster geplottet.

R-Skript Output
 x=seq(0,2*pi, by=0.2) 
 dev.new() 
 plot(x, sin(x)) 

Beispiel: Funktionen mit curve-Befehl plotten
Wie im vorherigen Beispiel wird die Sinus-Funktion im Bereich 0 bis 2π in ein neues Grafikfenster geplottet, diesmal aber mit dem curve-Befehl, dieser erzeugt default einen Linienplot.

R-Skript Output
 dev.new() 
 curve(sin(x), from=0, to=2*pi) 

Bei Verwendung von RStudio muss nicht unbedingt immer ein neues Grafikfenster geöffnet werden, da unter dem Tab Plots über die Pfeile auf alle in der R-Session erstellten Plots zugegriffen werden kann.

Weitere nützliche Grafiken für Variablen

Zur Analyse von Variablen aus Datensätzen stellt R viele nützliche Befehle zur Verfügung, diese sind in den Paketen stats und graphics enthalten. Eine Übersicht der Befehle zur Erzeugung eines Histogrammes, eines Quantil-Quantil-Plots oder eines Boxplots wird im folgenden Beispiel gezeigt.

Beispiel: Nützliche Grafiken für Variablen
Der Datensatz cars aus dem datasets-Paket wird als Bezugsdatensatz festgelegt (attach-Befehl), somit kann ohne den $-Operator auf dessen Variablen/Spalten zugegriffen werden. Für die speed-Variable wird ein Normal-QQ-Plot, ein Histogramm und ein Boxplot erzeugt. Danach wird der Bezug auf den Datensatz wieder gelöst (detach-Befehl).

R-Skript Output
 attach(cars)  
 # QQ-Plot erzeugen: 
 qqnorm(speed)         
 qqline(speed)        
  
 # Hisogramm erzeugen: 
 # Anzahl der Intervallklassen = 20 
 hist(speed, nclass=20) 
  
 # Boxplot erzeugen: 
 boxplot(speed) 
  
 detach(cars) 



Bei der Verwendung von plot und curve findet eine automatische Beschriftung der Achsen und das Festlegen der Grenzen für die x- und y-Achse statt. Um diese Ausgabe passender zu gestalten werden den High-level Grafikoptionen weitere Grafikargumente/ -parameter übergeben.

Formatierung über Grafikargumente

Typ der Grafik festlegen

Um den Typ, d.h. Punkte, Kurve/Linien oder Beides, einer Grafik festzulegen, kann dem plot-Befehl das type-Argument übergeben werden. Mit type="p" wird ein Punkteplot erstellt, mit type="l" ein Linienplot (siehe auch curve()) und mit type="b" wird eine Linie von Punkten unterbrochen erstellt. Dazu folgendes Beispiel:

R-Skript Output
 c=seq(0,2*pi, by=0.2) 
 # Typ der Grafik: Punkte, Kurve/Linien, Beides 
 dev.new() 
 plot(c, sin(c), type="p") 
 dev.new() 
 plot(c, sin(c), type="l") 
 dev.new() 
 plot(c, sin(c), type="b") 



Achsenbeschriftung und Wertebereiche

Die x-Achsenbeschriftung erfolgt mit dem Grafikargument xlab="..." (d.h. x-Label) und der für die x-Werte angezeigte Wertebereich in der Grafik wird mit xlim=c(untereGrenze, obereGrenze) (d.h. x-Limes/Grenze) angepasst. Dementsprechend werden die Argumente ylab und ylim verwendet um die y-Achsenbeschriftung bzw. den Wertebereich der y-Achse anzupassen. Siehe dazu den folgenden Quellcode:

R-Skript Output
 c=seq(0,2*pi, by=0.2) 
 # Achsenbeschriftung 
 dev.new() 
 plot(c, sin(c), type="l",  
   xlab="x-Werte", ylab="Sinus von x") 
  
 # Grenzen für x- und y-Achse  
 dev.new() 
 plot(c, sin(c), type="l",  
   xlab="x-Werte", ylab="Sinus von x",  
   xlim=c(0,pi), ylim=c(0,1)) 


Hinweis: In Python kann bei der Verwendung der pandas-Bibliothek der plot-Befehl direkt auf ein DataFrame angewandt werden, die Formatierung der Grafik erfolgt dabei mit .set_title('...'), .set_xlabel('...'), set_ylabel('...') und .set_ylim(untereGrenze, obereGrenze) bzw. .set_ylim(untereGrenze, obereGrenze). In MATLAB stehen dafür title('...'), xlabel('...') bzw. ylabel('...') und axis([x_untereGrenze x_obereGrenze y_untereGrenze y_obereGrenze]) zur Verfügung.

Low-level Grafikoptionen

Low-level Grafikoptionen ergänzen bestehende Grafiken, d.h. diese Optionen können erst nach Aufruf einer High-level Grafikoption angewandt werden. Die wichtigsten Optionen sind points, diese ergänzt Punkte in einer bestehenden Grafik, und lines, diese ergänzt Linien in einer bestehenden Grafik. Aletrnativ zu lines() kann auch die High-level Grafikoption curve mit dem Argument add=T, also curve(..., add=T), aufgerufen werden um Linien zu ergänzen.

Weitere Low-level Grafikoptionen sind title, diese ergänzt einen Titel in der Grafik, und legend, diese ergänzt eine Legende. Alternativ zu title kann der High-level Grafikoption auch das Argument main="..." übergeben werden, also plot(x,y,main="Titel der Grafik"). An den folgenden Beispielen wird die Verwendung der Grafikoptionen erläutert.

Beispiel: Verwenden von points() und lines()
Es wird eine Grafik erzeugt, die die Sinus- und Cosinus-Funktion im Bereich 0 bis 2π zeigt. Der Cosinus wird in die Grafik mit dem Sinus mittels points und lines ergänzt, d.h. der Cosinus wird als Punkteplot kombiniert mit einer Linien dargestellt. Mit dem pch- Argument können verschiedene Symbole für die Punkte gewählt werden:

Mit dem sub-Argument beim plot-Aufruf (Zeile 4) wird eine Unterschrift ergänzt, anstelle von main= und sub= kann auch title(main="...", sub="...") (Zeile 7) verwendet werden.

R-Skript Output
 c=seq(0,2*pi, by=0.2) 
 plot(c, sin(c), type="l",  
     xlab="x-Werte", ylab="f(x)",  
     main="Sinus und Cosinus",sub="eine Periode") 
  
 # alternativ: title()-Aufruf: 
 # title(main="Sinus und Cosinus", sub="eine Periode") 
 # pch=Symbol für Datenpunkte 
 points(c, cos(c), pch=1)              
 lines(c, cos(c)) 

Beispiel: High- und Low-level Grafkoptionen
Es wird eine Grafik erzeugt, die die Sinus- und Cosinus-Funktion im Bereich 0 bis 2π zeigt. Der Cosinus wird in die Grafik mit dem Sinus mittels lines ergänzt. Mit dem lty- Argument können verschiedene Linientypen gewählt werden:

Beim plot-Aufruf wird das Argument type="l" verwendet, um einen Linenplot zu erzeugen, das Argument col="red" um die Linie rot zu zeichnen und xaxt="n" um die x-Achsenwerte zu unterdrücken. Diese werden mit axis(side=1, at=seq(0,2*pi,length=5)) manuell eingefügt, indem an der Position 1=below (alternativ: 2=left, 3=above and 4=right) im Bereich 0 bis 2π fünf Werte (length=5) eingetragen werden.

Weiterhin zeichnet abline(h=0) eine horizontale Linie bei Null ein (Syntax: abline(a,b): zeichnet Gerade a+bx) und es wird Text mittels der Low-level Grafikoption text (Syntax: text(x-Koord, y-Koord, labels= "enthält Text", weitere Argumente)) eingefügt. Und mit der Grafikoption legend wird die Legende in das Grafikfenster eingefügt (Syntax: legend(x-Koordinate,y-Koord.,legend=c("Sinus", "Cosinus"), lty=c(1,3), col=c("red", "blue"))).

R-Skript Output
 plot(c, sin(c), type="l",  
     xlab="x-Werte", ylab="f(x)",  
     main="Sinus und Cosinus", 
     sub="eine Periode",  
     col="red", xaxt="n")  
  
 lines(c, cos(c),  
   lty=3, col="blue")           
  
 legend(0,-0.5, 
   legend=c("Sinus", "Cosinus"),  
   lty=c(1,3), col=c("red", "blue"))  
  
 text(c(2*pi-0.1,2*pi-0.5),       
   c(-0.3,1) ,  
   labels=c("Sinus", "Cosinus"), 
   col=c("red","blue")) 
  
 #Werte für x-Achse manuell eingeben 
 axis(side=1,  
   at=seq(0,2*pi,length=5))   
 abline(h=0)  

Durch Eingabe von colors() in die Konsole werden alle 657 Farben, die in R zur Verfügung stehen, aufgelistet:

Hinweis: In Python wird die Funktion legend() der Pandas-Bibliothek direkt auf die Grafik angewandt, d.h. plotName.legend(), um eine Legende automatisch zu erzeugen. In MATLAB wird nach Erzeugung einer Grafik, z.B. mittels plot(), mit dem anschließenden Befehl "hold on" das aktuelle Grafikfenster für alle weiteren Plots verwendet, mit legend('Text1','Text2', ...) wird die Legende eingefügt und mit "hold off" wird die Fixierung des Grafikfensters wieder aufgelöst.

Zufallszahlen erzeugen

Da R auf statistische Programmierung spezialisiert ist, bietet es für alle bekannten Verteilungen der Wahrscheinlichkeitstheorie vier Funktionen an: die Dichte, die Verteilungsfunktion, die Quantilfunktion und den Zufallszahlengenerator. Die Funktionsnamen bestehen aus: d/p/q/r + Verteilungstyp. Die Argumente der Funktionen hängen vom Verteilungstyp ab. Die wichtigen Funktionen zur statistischen Analyse sind im Paket stats enthalten. In folgenden Beispielen werden die Gleichverteilung und die Normalverteilung genauer betrachtet.

Beispiel: Gleichverteilte Zufallszahlen und deren Histogramm
Um n gleichverteilte Zufallszahlen zwischen a und b zu erzeugen, wird die Funktion runif(n, min=a, max=b) aufgerufen, default sind die Werte a=0 und b=1. Das Histogramm über diese Werte wird mit hist() erzeugt.

R-Skript Output
 # eine Zufallszahlen in [0,1]
 runif(1) 
 
 # 4 Zufallszahlen in [0,1]
 runif(4)
 
 # 3 Integer-Zahlen in [0,100]
 floor(runif(3, min=0, max=101)) 
 # floor: Abrunden auf den nächskleineren Integer
  
 # Histogramm über 1000 Zufallswerte
 z=runif(1000, min=0, max=1)
 hist(z)


Beispiel: Normalverteilte Zufallszahlen und deren Reproduzierbarkeit
Um n normalverteile Zufallszahlen mit Erwartungswert a und Standardabweichung b zu erzeugen, wird die Funktion rnorm(n, mean = a, sd = b) aufgerufen, default sind die Werte mean=0 und sd=1, beschreiben also eine Standardnormalverteilung.
Um die Zufallszahlen zu reproduzieren, d.h. immer dieselben Zahlen zu ziehen, wird mit set.seed(Wert) ein Seed festgelegt, dieser dient dem Zufallsgenerator als Startwert. Wenn kein Seed gesetzt wird dient die Systemzeit als Startwert.
Das Histogramm über die Zufallswerte wird mit hist() erzeugt.

R-Skript Output
 y=rnorm(1000) 
 #seed aus der Systemzeit 
 hist(y)
 
 rnorm(5)
 rnorm(5) 
 # liefert andere Zahlen 
 # Reproduzierbarkeit: Seed setzen
 
 set.seed(88)
 rnorm(5)
 set.seed(88)
 rnorm(5)      
 #liefert dieselben Zahlen wie vorher


Zufallsstichproben erzeugen

Um aus gegebenen Daten eine Zufallsstichprobe zu ziehen, wie es z.B. bei der Zerlegung eines Datensatzes in Trainings- und Testdaten erforderlich ist, wird die Funktion sample aus dem base-Paket verwendet.

Beispiel: Ziehen mit und ohne Zurücklegen der Daten
Aus den Datenwerte 1 bis 12 wird mit sample eine Zufallsstichprobe der Größe size gezogen. Wenn das Argument replace auf TRUE gesetzt wird, dann wird mit Zurücklegen gezogen, damit sind Wiederholungen der Werte möglich. Default wird die Stichprobe ohne Zurücklegen, also mit replace=FALSE, erzeugt.

R-Skript Output
 #---Ziehen aus gegebenen Daten---
 x = 1:12
 
 # eine Permutation von x, 
 # d.h. ohne Zurücklegen ziehen
 sample(x,size=12)
 
 # ein Bootstrap-Sample von x, 
 # d.h. mit Zurücklegen ziehen, 
 # Wiederholungen sind erlaubt
 sample(x,size=12, replace = TRUE)

Autoren, Tools und Quellen

Autoren:
 M. Sc. Anke Welz
 Prof. Dr. Eva Maria Kiss
Tools:
R, RStudio
Quellen und weiterführende Links
R-Tutorial Teil 1: Variablen, Vektoren, Matrizen, regelmäßigen Folgen
R-Tutorial Teil 2: Kontrollstrukturen und Funktionen
R-Dokumentation im Comprehensive R Archive Network (CRAN)