R-Tutorial: Teil 3: Grafiken und Zufallszahlen

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 und in Teil 2 der R-Tutorial-Reihe eine Vertiefung in Richtung Ablaufsteuerung und dem Einsatz von Funktionen erfolgte, bietet der dritte Teil der R-Tutorial-Reihe einen Einstieg in die Syntax zur Erzeugung von Grafiken und von Zufallszahlen und -stichproben in der Programmiersprache R .

  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.

  Übersicht

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

  1. 1 Grafiken erzeugen
     1-1 High-level Grafikbefehle:
       plot, curve, hist, boxplot, dev.new()

     1-2 Low-level Grafikbefehle: points und lines

  2. 2 Zufallszahlen erzeugen

  3. 3 Zufallsstichproben erzeugen

1 Grafiken erzeugen

Die Datenvisualisierung ist ein wichtiger Schritt der Datenanalyse und R ist eine Sprache, die speziell für statistische Aufgaben entwickelt wurde und eine starke Unterstützung für die Datenvisualisierung bietet. Grafiken können in R entweder durch die Funktionen des R-Pakets graphics oder durch die Funktionen des Pakets ggplot realisiert werden. Das R-Grafik-Paket graphics enthält alle zur Erzeugung und Formatierung von Grafiken benötigten Befehle. Man unterscheidet zwischen high-level befehlen, die eine komplette Grafik erzeugen, und low-level Befehlen, die eine zuvor erstellte Grafik ergänzen.

1-1High-level Grafikbefehle

Die high-level Optionen sind Befehle aus dem graphics-Paket, die ein Grafikfenster erstellen, Die wichtigsten Befehle zum Plotten, also dem Erzeugen einer Grafik, sind plot, curve, hist, boxplot. 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. Neben dem automatischen Öffnen eines Grafikfensters kann mit dem Befehl dev.new() ein neues Grafikfenster geöffnet werden. Dies ist bei der Handhabung mehrerer Grafiken nützlich.

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. Der Vektor x wird mit Hilfe der Funktion rep erzeugt, indem jeder der Werte des ersten Arguments so oft wiederholt wird, wie das zweite Argument es angibt.

R-Skript Output
 # Erzeuge den Vektor 1, 2, 2, 2, 3, 3, 4 
 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
 # Neues Grafik-Fenster 
 dev.new() 
 # Erzeuge 5x den Wert 1 
 a=rep(1, 5) 
 # Erzeuge die Liste 2, 3, 6, 9, 1 
 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.

Variablen visualisieren mit hist und boxplot

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: hist und boxplot
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 1
 attach(cars)  
 # QQ-Plot erzeugen: 
 qqnorm(speed)         
 qqline(speed)        
  
 # Histogramm erzeugen: 
 # Anzahl der Intervallklassen = 20 
 hist(speed, nclass=20) 
  
 # Boxplot erzeugen: 
 boxplot(speed) 
  
 detach(cars) 

Output 2 Output 3

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 Grafiken

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 1
 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") 

Output 2 Output 3

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.

1-2 Low-level Grafikbefehle

Low-level Grafikbefehle 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. Alternativ 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 5) wird eine Unterschrift ergänzt, anstelle von main= und sub= kann auch title(main="...", sub="...") (Zeile 8 und 9) 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 Grafikoptionen
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.

2 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ächstkleineren 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


3 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)

YouTube-Video

Der Einstieg in R mit RStudio wird durch YouTube-Videos (Screencast mit zusätzlichen Erläuterungen) veranschaulicht.

Fazit & Ausblick

Dieser letzte Teil der R-Tutorial-Reihe Teil 3: Grafiken und Zufallszahlen zeigte einen Einstieg in die Syntax zur Erzeugung von Grafiken und von Zufallszahlen und -stichproben in der Programmiersprache R und bildet den Abschluss des Einsteiger-Tutorials mit den vorherigen Teilen Teil 1: Variablen, Vektoren, Matrizen, regelmäßigen Folgen und Teil 2: Kontrollstrukturen und Funktionen.

Der interaktive RVisLearner [5] ist eine Lern-App, die zeigt, wie man Datenvisualisierungen einerseits mit den R-Funktionen hist und plot aus dem R-Paket graphics und andererseits mit den entsprechenden Funktionen des Tidyverse-Pakets ggplot2 erstellt. Sowohl die R-Grafiken als auch das ggplot2-Paket können verwendet werden, um Daten als Histogramm, Streudiagramm, Boxplot usw. darzustellen, und die resultierenden Diagramme sind ähnlich ansprechend. Sie unterscheiden sich darin, wie die Argumente den Funktionen zugeführt werden, und in Bezug auf die Lernkurve.

Autoren, Tools und Quellen

Autoren:
 M.Sc. Anke Welz
 Prof. Dr. Eva Maria Kiss

Tools:

R, RStudio

elab2go Links:

Nützliche Links zu R: