Einführung in die Datenverarbeitung mit R+ (Stefan Bosse) [15.11.2024]

Einführung in die Datenverarbeitung mit R+ (Teil 1)

Einführung in die Datenverarbeitung mit R+ (Teil 1)
Vorwort
in der Zeile mit worker() entfernen, dann aber dieses Code Snippet nur einmale ausführen!) { lines:2; height:5 }
Literatur
Ziele
Konsolenausgabe
Variablen und Ausdrücke
Zuweisungen
Funktionen
Kontext und Workspace (Environment)
Zeichenketten
Listen
Vektoren
Matrizen
Indizierung von Aggregationen
Arithmetik
Schleifen und Bedingte Anweisungen
Datentabellen (Data Frames)
Analyse eines Beispieldatensatzes
Daten
Zerlgeung der Tabelle
Analysefunktionen
Grafische Analyse
X-Y Partitionierung

Vorwort

Diese interaktive Übung ist unterteilt in Code Snippets die direkt ausgeführt werden können. Im Code Editor kann das Programm entweder durch Klicken auf den Play Button oder durch CTRL-Enter Tasten durchgefürht werden. Die Code Snippets teilen sich ein gemeinsames Einvironment und bauen teilweise auf einander auf.


Die Verwendung des integrierten R Systems ist ganz einfach. Optional könenn die Berechnungen in einem separaten Worker Proezss ausgeführt werden (Kommentar # in der Zeile mit worker() entfernen, dann aber dieses Code Snippet nur einmale ausführen!)

 ▸ 
[]
 ✗ 
 ≡ 

Es wird in diesem Kurs der R-Dialekt R+ verwendet. R+ ist eine Reimplementierung von R in JavaScript und läuft direkt in Web Browsern, node.js und node webkit (nw.js) Applikationsprogrammen. Es ist keinee Softwareinstallation erforderlich!

Literatur

Ziele

In dieser Übung sollen folgende Ziele erreicht werden:

  1. Umgang mit R(+) als numerische Werkzeug.
  2. Einfache Daten algorithmisch verarbeiten.
  3. Einfache Datenstrukuren wie Listen, Vektoren und Matrizen verwenden können.

Konsolenausgabe

Werte und Texte können mit den Funktionen print, cprint und logg ausgegeben werden.


Konsolenausgabe

 ▸ 
[]
 ✗ 
 ≡ 

Variablen und Ausdrücke

Eine Variable ist in R eine Referenz auf Werte. Werte können sein:

Variablen kann ein neuer Wert (also eine Referenz) zugewiesen werden mit den <- und = Operationen. Der Pfeiloperator kann bevorzugt verwendet werden, der Unterschied zwischen beiden ist marginal, wobei = noch für benannte Funktionsparameter verwendet wird. Ausdrücke können beliebibig komplex sein, teils aus Operanden mit unterschiedlichen Datentypen bestehen. Es kann aber auch zu typsisierten Fehlermeldungen kommen. So können in R Zeichenketten nicht mittels + verknüpft werden (es ist die Funktion paste zu verwenden).


Variablen und Ausdrücke

 ▸ 
[]
 ✗ 
 ≡ 

Variablenamen können aus den Zeichen a-z, A-Z, den Zahlen 0-9 (außer an erster Stelle) und einem Punkt . bestehn.

Aufgabe 1. Zerlege folgenden komplexen Ausdruck in eine Sequenz von einfachen Asudrücken mit genau einer arithmetischen Operation (ggfs. unter Zuhilfename von weiteren Variablen).


Zerlegung eines kompelxen Ausdrucks

 ▸ 
[]
 ✗ 
 ≡ 

YTwtMSBiPC0yIGM8LTMKdDE8LWErYgp0MTwtdDErYwp0MjwtYS1iCnQyPC10Mi1jCnQzPC1hKmIKdDM8LXQzKmMKejwtdDEvdDIKejwteip0MwpwcmludCh6KQ==

Zuweisungen

Zuweisungsoperation sind:

x <- e
Zuweisung eines Wertes e (Ausdruck oder Wert) an die Variable x im aktuellen Kontext (Scope).
x = e
Zuweisung eines Wertes e (Ausdruck oder Wert) an die Variable x im aktuellen Kontext (Scope). Es gibt praktisch keinen Unterschied zum <- Operator (hier gar keinen).
x <<- e
Zuweisung eines Wertes e (Ausdruck oder Wert) an die Variable x ausschließlich im globalen Kontext.

Variablenzuweisung (und Erzeugung)

 ▸ 
[]
 ✗ 
 ≡ 

Funktionen

Berechnungsanweisungen können wie in jeder anderen Programmiersprache in Funktionen gebunden werden:

  1. Um eine Faktorisierung des Programms zu ermöglich
  2. Um häufig wiederkeherende Berechnungen nur einmal formuleiren zu müssen.

Eine Funktionsdefinition besteht aus:

  1. Dem Schlüsselwort function
  2. Einem Namen (gültiger R Identifizierer)
  3. Null, einem, oder mehreren Funktionsparametern
  4. Funktionskörper mit Berechnungsanweisungen. In R gibt es kein return, daher wird für eine Wertrückgabe einfach ein Ausdruck (am Ende) angegeben.

Funktionsdefinition (zwei Varianten)

 ▸ 
[]
 ✗ 
 ≡ 

Aufgabe 2. Erstelle ine Funktion mean(x,y,z) die den arithmetischen Mittelwert aus den drei Paremetern x, y und z berechnet. Teste die Funktion mit den Werten 14,9,13.


Mittelwertberechnung

 ▸ 
[]
 ✗ 
 ≡ 

ZnVuY3Rpb24gbWVhbih4LHkseikgewogICh4K3kreikvMwp9CmxvZ2cobWVhbigxNCw5LDEzKSk=

Kontext und Workspace (Environment)

Alle Variablen werden in einem globalen Arbeitsbereich (Kontext, Environment) angelegt, der bereits vordefinierte Werte enthält. Innerhalb von Funktionen existiert ein lokaler Kontext und Arbeitsbereich, und Variablenzuweisungen finden in diesem statt. Funkctionsparameter sind immer lokal.


Unterschiedliche Sichtbarkeit von Variablen

 ▸ 
[]
 ✗ 
 ≡ 

Aufgabe 3. Welche Sichtbarkeit haben die beiden Variablen x und x2 in der Funktion foo?


Will man in Funktionen "globale" Variablen ändern muss man den <<- Operator anstelle <- oder = verwenden!

Man kann das aktuelle Environment verändern (Module env), z.B. mittels der rm Funktion auch Variablen (oder Funktionen) entfernen. da Variablen ständig hinzugefügt werden, kann es sinnvoll sein den Arbeitsbereich wieder "aufzuräumen".


Modifikation des Environments: Entfernen von Variablen

 ▸ 
[]
 ✗ 
 ≡ 

Zeichenketten

Konstante Zeichenketten werden mit der "ABC"Syntax eingeführt. Zeichenketten können mit der paste Funktion zusammengefhrt werden (jeweils mit Trennzeichen):

Folgende Basisoperationen existieren:

Funktionen erwarten Argumente in der Reihenfolge der Parameterdefinition, z.B. foo(a,b,c) erwartet als erstes Argument a, dann b, d.h., foo(1,2,3). Alternativ können die Argumente auch den Parameternamen zugewiesen werden, wo die Reihenfolge dann keine Rolle mehr spielt, also z.B. foo(c=3,a=1,b=2)


Zeichenketten

 ▸ 
[]
 ✗ 
 ≡ 

Aufgabe 4. Zerlege die Zeichenkette "A-1 B-2 C-1" in 1. Tokens die durch ein Leerzeichen getrennt sind (als Liste), und dann 2. diese Tokens zerlegen mittels des Bindestrichs. Hinweis: Die Stringoperationnen können auch auf Vektoren von Zeichnketten angewendet werden!. strsplit liefert eine Liste, kann aber mit as.vector in einen Vektor umgewandelt werden.


Zerlegung einer Zeichenkette

 ▸ 
[]
 ✗ 
 ≡ 

cyA8LSAiQS0xIEItMiBDLTEiCnMudG9rZW5zIDwtIHN0cnNwbGl0KHMsJyAnKQpzLnRva2VuczIgPC0gc3Ryc3BsaXQoYXMudmVjdG9yKHMudG9rZW5zKSwnLScpCmluc3BlY3Qocy50b2tlbnMyW1sxXV0p

Listen

Listen sind geordnete Werte die entweder über einen numerischen Index oder über einen Elementnamen referenziert werden können. Listen werden mit der list Funktion erzeugt. Ein numerischer Selektor wird durch den [i] Operator eingeleitet.

Achtung: Verwendung des [index] Operators liefert hier wieder eine Liste mit einem Element! Will man das Listenelement direkt lesen verwendet man den [[i]] Operator!

Benannte Listenelemente können bei der Erzeugung mittels name=val erstellt werden, oder später durch die names Funktion. Listen könen mehrsortig sein (d.h., Elemente von verschiedenen Datentyp). Neue Elemnte können an einer bestimmten Position mittels append hinzugefügt werden.


Listen

 ▸ 
[]
 ✗ 
 ≡ 

In R+ gibt es die Kurzschreibweise {a=1,b=2,..} für list(a=1,b)2,..)! Es können auch numerisch indizierte Listen mittels der Syntax {1,2,3,..} (oder mit list) erzeugt werden. Hier ist nur eine numerische Referenzierung der Elemente möglich, also z.B. v[1].

Listen können mit der sort(FUN=function (a,b) { λ }) sortiert werden. Dabei sind a und b jeweils zwei Elemente aus der Liste die verglichen werden müssen. Wenn ein Tausch durchgeführt werden muss ist γ=TRUE, ansonsten γ=FALSE. Ein Beispiel für γ (funktioniert auch bei Strings) wäre a>b, dann wird die Liste aufsteigend sortiert.

Aufgabe. Zerlege die Zeichenkette "A-1 B-2 C-1" in Tokens durch Leerzeichen getrennt, verändere die Reihenfolge der Listenelement derart dass C B A als Reihenfolge entsteht, und füge die Listenelement wieder zu einer Textzeichenkette zusammen.


Zerlegung einer Zeichenkette

 ▸ 
[]
 ✗ 
 ≡ 

cyA8LSAiQS0xIEItMiBDLTEiCnNvcnQocy50b2tlbnMsRlVOPWZ1bmN0aW9uIChhLGIpIHsKICBhPGIKfSkKbG9nZyhwYXN0ZShzLnRva2Vucyxjb2xsYXBzZT0nICcpKQ==

Vektoren

Vektoren sind ähnlich Listen. Vektoren bieten anders als Listen die Möglichkeit Werte in kompakten (linearen) Arrays zu speichern. Daher kann ein bestimmter Datentype (mode) angegeben werden. Ein von einer Argumetenliste initialisierter Vektor wird mit c, ein konstant initialisierter mit vector erzeugt. Vektoren sind immer eindimensional. Mehrdimensionale "Vektoren" sind Arrays und Matrizen (zweidimensional), Teilbereiche eines Vektors können durch den Bracketoperator ausgewählt werden.

Folgende Vektorfunktionen sind wichtig:


Datenvektoren

 ▸ 
[]
 ✗ 
 ≡ 

In R+ gibt es die Kurzschreibweise [v1,v2,..] für c(v1,v2,..) um initialisierte vektoren zu erzeugen!

In R+ werden Matrizen spaltenweise organisiert (in R zeilenweise), d.h., eine Initialisierung mit einem Vektor [1,2,3,4] und zwei Spalten führt zu den Werten 1 und 2 in der ersten Zeile!

Aufgabe 6. Analysiere die folgenden Vektoren klassengerecht, notiere die Ergebnisse. Was bedeuten die statistischen Werte? Führe eine Recherche durch.


Statistische Analyse von Vektoren mit numerischen und "kategorischen" Werten

 ▸ 
[]
 ✗ 
 ≡ 

dXNlIG1hdGgKdm4gPC0gWzEwMCw1LDk5LC00LDEwMCwxMTAsNTVdCnZzIDwtIFsiYSIsImIiLCJhIiwiYyIsImEiLCJiIiwiYiJdCmxvZ2coZml2ZW51bSh2bikpCmxvZ2codGFibGUodnMpKQ==

Vektoren können mit der universellen plot Funktion visualisiert werden, wie im nachfolgenden Beispiel gezeigt ist. Die Nutzung der plot Funktion bedarf der Einbeziehung des plot Packages mit use plot.


Visualisierung von Vektoren

 ▸ 
[]
 ✗ 
 ≡ 

Aufgabe 7. Was ist der Unterschied zwischen den beiden Plot Funktionsaufrufen?


Matrizen

Eine Matrix (ähnlich einem Datenrahmen, folgendes gilt i.A. auch für Datenrahmen) ist eine zweidimensionale Tabelle und wird mit der matrix(init,nrow,ncol) Funktion erzeugt. Der Datentyp muss skalar bzw. atomar sein (numeric, logical, `character').

Unterschied Datenrahmen und Matrix: Eine Matrix sollte nur für "homogene" numerische Werte verwendet werden, wie z.B. Pixelwerte von Bildern oder mathematische Matrizen. Ein Datenrahmen ist hingegen eine universelle Tablle dessen Spalten verschiedene Variablen sind und die Zeilen einzelne Instanzen darstellen (z.B. von Experimenten).

Folgende Matrixfunktionen sind wichtig:


Matrixerzeugung und Operationen

 ▸ 
[]
 ✗ 
 ≡ 

In R+ gibt es die Kurzschreibweise [|v11,v12,..,c1n;c21,c22,..|] anstelle für matrix(c(v11,...),...) um initialisierte Matrizen zu erzeugen!

Aufgabe 8. Was ist der Unterschied bei der Initialisierung von data1, data2 und data3? Was passiert wenn anstelle 1:9 der Bereichsvektor 1:3 verwendet wird?


Relationale Ausdrücke angewendet auf Matrizen (oder natürlich auch Vektoren) liefern eine Boolesche Matrix oder einen Vektor (entweder mit Booleschen Werten FALSE oder TRUE, oder numerisch mit 0 und 1 Werten gefüllt)!

Will man die Positionen (row,col) haben kann man die which Funktion verwenden, die entweder den linearen Index (spaltenorientiert) oder mit der arr.ind=TRUE Option auch als Matrix liefert.


Relationale Operationen auf Matrizen

 ▸ 
[]
 ✗ 
 ≡ 

Aufgabe 9. Wenn ein Bild durch eine Matrix repräsentiert wird, wie kann eine Binärisierung des Bildes erreicht werden? Wählen im folgenden Beispiel den Schwellwert mit t=0.5. Alle Matrixelemente mit x < t sollen zu Null, und alle mit xt zu 1 werden.


Binärisierung von Matrizen

 ▸ 
[]
 ✗ 
 ≡ 

ZGF0YTMgPC0gbWF0cml4KHJ1bmlmKDkpLG5yb3c9MyxuY29sPTMpCmRhdGEzLmJpbiA8LSBjb3B5KGRhdGEzKQpkYXRhMy5iaW5bZGF0YTMuYmluPDAuNV0gPC0gMApkYXRhMy5iaW5bZGF0YTMuYmluPj0wLjVdIDwtIDEKbG9nZyhkYXRhMy5iaW4p

Matrizen und Bilder

Matrizen können für die Speicherung von Grauwertbildern verwendet werden. Das nachfolgende Beispiel zeigt die Visualisierung einer Matrix als Grauwertbild.


Bilder als Matrizen

 ▸ 
[]
 ✗ 
 ≡ 

Bildverarbeitung wird in einem anderen Tutorial eingeführt.

Indizierung von Aggregationen


Elementauswahl von Matrizen

 ▸ 
[]
 ✗ 
 ≡ 

Arithmetik

Arithemtische (+, -, *, /, %, %%), relationale (<, >, >=, <=, ==, !=) und bitweise logische (&, |) Operationen können auf einer Vielzahl von Datentypen inklusive Aggregationen wie Listen und Vektoren direkt angewendet werden. Bei Listen und Vektoren werden diese Operationen elementweise angewendet und erzeugen einen neuen Vektor.


Arithmetik auf Datenvektoren

 ▸ 
[]
 ✗ 
 ≡ 

Man kann Vektoren mit der c(v1,v2,..) Funktion zusammenfügen!

Aufgabe 10. Zerlege und analysiere den primes[primes>5] Ausdruck. Was liefert primes>5 und wie funktioniert die Reduktion (Filterung) des Vektors? Erstelle einen Teilvektor aus primes der nur Werte < 5 und Werte > 10 enthält.


Bereichsselektion eines Datenvektors und Zusammenfügung von Vektoren

 ▸ 
[]
 ✗ 
 ≡ 

cHJpbWVzIDwtIFsxLDMsNSw3LDExLDEzLDE3LDIzLDI5XQpwcmltZXMuc2VsZWN0ZWQ1IDwtIHByaW1lc1twcmltZXM8NV0KcHJpbWVzLnNlbGVjdGVkMTAgPC0gcHJpbWVzW3ByaW1lcz4xMF0KcHJpbWVzLnNlbGVjdGVkIDwtIGMocHJpbWVzLnNlbGVjdGVkNSxwcmltZXMuc2VsZWN0ZWQxMCk=

Schleifen und Bedingte Anweisungen

R bietet Schleifen für die wiederholte Ausführung von Anweisungen und bedingte Anweisungen (if-else). Schleifen sind Iteratoren über Bereiche, Vektoren, oder Listen, und für wiederholte arithmetische Berechnungen hilfreich.


Schleifen und bedingte Anweisungen

 ▸ 
[]
 ✗ 
 ≡ 

Aufgabe 11. Berechne die Summe eines Vektors


 ▸ 
[]
 ✗ 
 ≡ 

eCA9IFsxLDIsMyw0XQpzdW0gPSAwCmZvciAoaSBpbiB4KSB7CiAgc3VtID0gc3VtICsgeFtpXQp9CnByaW50KHN1bSk=

Datentabellen (Data Frames)

Eine Datentabelle besteht auf Spalten und Zeilen. Eine Zeile kann man als Liste auffassen, i.A. mit benannten Spaltennamen (oder numerisch indiziert). Die Zeilen können auch mit Namen versehen sein, i.A. werden Zeilen aber numerisch indiziert (erste Zeile nesitzt den Index 1).


Erzeugung von Datentabellen (data.frame)

 ▸ 
[]
 ✗ 
 ≡ 

Es gibt eine Vielzahl von Operationen und Funktionen die man auf Datentabellen anwenden kann:

Aufgabe 12. Erzeuge eine Datentabelle mit den Spalten x,sin,cos,tan für die Werte x im Bereich 0 bis 6 in den Abständen 0.5. Die Spalten sin,cos,tan sollen mit den mathematischen Funktionen programmatisch berechnet werden.


 ▸ 
[]
 ✗ 
 ≡ 

b3B0aW9ucyhkaWdpdHM9MikKeCA8LSBbMC41LDEsMS41LDIsMi41LDMsMy41LDQsNC41LDUsNS41LDZdCmRmIDwtIGRhdGEuZnJhbWUoeD14LHNpbj1zaW4oeCksY29zPWNvcyh4KSx0YW49dGFuKHgpCmxvZ2coZGYp

Analyse eines Beispieldatensatzes

Daten

DATA: Variable dataIRIS Type: { length : number, width : number, petal.length : number, petal.width : number, species : string } [151]

Der Datensatz ist bereits im Notebook enthalten und wird als Datenrahmen (data.frame) data.iris zur Verfügung gestellt!


Arithmetik auf Datenvektoren

 ▸ 
[]
 ✗ 
 ≡ 

Zerlgeung der Tabelle


Zerlegung in Spalten

 ▸ 
[]
 ✗ 
 ≡ 

Die Zielvariable y liegt als kategorische Variable vor. Eine Kodierung in eine numerische kann wie folgt mit der factor Funktion durchgeführt werden:


Kodierung

 ▸ 
[]
 ✗ 
 ≡ 

Aufgabe 13. Was enthält y.code? Was bewirkt factor (verwende print) und was enthält y.levels?


Analysefunktionen

Die universellste Analysefunktion ist summary, gefolgt von fivenum für numerische und table für kategorische Variablen.

Aufgabe 14. Analysiere den Datensatz mit 1. summary, 2. Einzelne Spalten mit fivenum und table. Welche Eigenschaften haben die einzelnen Variablen (Attribute)?

R summary liefert bei kategorischen Variablen keine Verteilungsanalyse. Mit dem Argument extended=TRUE kann diese hier aktiviert werden.


Analyse von Datensätzen und Datentabellen

 ▸ 
[]
 ✗ 
 ≡ 

bG9nZyhzdW1tYXJ5KGRhdGEuaXJpcykpCmxvZ2coZml2ZW51bShkYXRhLmlyaXNbLDFdKSkKbG9nZyhmaXZlbnVtKGRhdGEuaXJpc1ssMl0pKQpsb2dnKGZpdmVudW0oZGF0YS5pcmlzWywzXSkpCmxvZ2coZml2ZW51bShkYXRhLmlyaXNbLDRdKSkKbG9nZyh0YWJsZShkYXRhLmlyaXNbLDVdKSk=

Grafische Analyse

Die plot(x,y) Funktion ist universell und kann verschiedene Datenformate darstellen. Am häuigsten wird man sie für Punkt- und Linienverläufe verwenden. Die Breite (oder Höhe) des Plotfensters kann mit dev.new(width=300) gesetzt werden.


Beispiele für die Plot Funktion

 ▸ 
[]
 ✗ 
 ≡ 

Aufgabe 15. Benutzte die plot(x,y) Funktion um Zusammenhänge zwischen den einzlenen Variablen x1 bis x4 und mit der Zielvariablen y.code herzustellen. Findet man Strukturen, können schon geeignete Kandidaten für die Klassifikation gefunden werden?


Grafische Analyse von Attributen

 ▸ 
[]
 ✗ 
 ≡ 

cGxvdCh4MSx5LmNvZGUpCnBsb3QoeDIseS5jb2RlKQpwbG90KHgzLHkuY29kZSkKcGxvdCh4NCx5LmNvZGUp

X-Y Partitionierung

Grafisch konnten bereits Eingabevariablen mit der (nuemrisch kodierten) Ausgabevariable in einen Zusammenhang gesetzt werden. Analytisch kann man neben dem Informationsgewinn eine einfache Partitionierung der numerischen Eingabevariablen nach der Zielvariable vornehmen. Das ist im nächsten Beispiel gezeigt.


Partitionierung der x-Werte nach (kategorischen) y-Werten

 ▸ 
[]
 ✗ 
 ≡ 

Aufgabe 16. Analysiere die Partitionen. Lassen sich geeignete Teilungspunkte für wenigstens einer Zweiklassenseparation mit einer der Attribute erreichen?


Analyse der Partitionen

 ▸ 
[]
 ✗ 
 ≡ 



Created by the NoteBook Compiler Ver. 1.32.3 (c) Dr. Stefan Bosse (Sat Nov 16 2024 20:16:37 GMT+0100 (Central European Standard Time))