Data Science mit R im Microsoft Umfeld

Ich möchte euch ein Thema vorstellen, welches mich seit einigen Wochen recht intensiv beschäftigt, nämlich die Datenanalyse mit R.Aufmerksam wurde ich darauf, als Microsoft die Programmiersprache R bei Azure Machine Learning als Analysewerkezeug eingesetzt hat.Kurz darauf kam dann die Ankündigung, dass auch der SQLServer 2016 R in der Datenbank unterstützt.Ich möchte euch in diesem Blogeintrag den Einstieg mit R ein wenig erleichtern. 20151008 (1)

Was ist R

R ist eine Programmiersprache mit freier (und kostenloser) Umgebung (inklusive Entwicklungsumgebung) zur statistischen Datenverarbeitung. R ist eine Skriptsprache und integriert eine Vielzahl von Befehlen, bzw. Funktionen, um Daten zu organisieren, zu transformieren, auszuwerten und zu visualisieren.

R kann derzeit, bzw. demnächst in folgenden Microsoft Produkten eingesetzt werden:

· Unter Windows, quasi „standalone“
· Gemeinsam mit R.Net in einer .NET Applikation
· Unter Azure mit Azure Machine Learning
· Mit SQLServer 2016 (voraussichtlich ab CTP3)

Nun gut, versuchen wir nun ein erstes R-Script auf die Beine zu stellen. Dazu benötigen wir erst einmal R auf unserer Maschine.

Installation von R

Um R auf einem Windows Rechner zum Laufen zu bekommen sind zwei Schritte notwendig:

· Installation von R https://cran.r-project.org/

o 32- und 64-bit Versionen sind hier vorhanden

· Installation von R-Studio https://www.rstudio.com/products/rstudio/download/

o Open Source (AGPL v3 Lizenz), bzw. kommerzielle Lizenzen ($995/Jahr) verfügbar

20151008 (2)

Leider gibt es für R nach kein Add-In, um es innerhalb von Visual Studio nutzen zu können. D. h. die Wahl fällt hiermit nicht schwer, es muss für die ersten Gehversuche R-Studio herhalten. Dazu reicht natürlich die Open Source Variante vollkommen aus. Nach der Installation sind zwei neue Icons verfügbar:

20151008 (3)  Ersteres ist das R-StudioLetzteres ist das Command-Line Tool.

Ich werde im weiteren Verlauf RStudio verwenden - also nichts wie ran an den Speck und RStudio gleich einmal starten.

Erste Schritte mit R unter Windows

Das RStudio bietet auch die Möglichkeit Kommandos in einem Konsolenfenster direkt abzusetzen, somit bietet sich doch das klassische „Hello World“-Beispiel geradezu an: man gibt Folgendes ein und nach dem Drücken der Enter-Taste erscheint sofort die Ausgabe durch die R-Console:

> print("Hallo, aus der R-Console")
[1] "Hallo, aus der R-Console"

Berechnen wir doch gleich auch einmal die Antwort auf alles:

> 40 + 2
[1] 42

Sehr gut, einfaches Rechnen klappt also auch. Wie sieht es aus mit einer Gaußschen Berechnung der Zahlen von 1 – 15:

> sum(1:15)
[1] 120

Oh ja, das war nun scheinbar auch kein Problem für R. Wollen wir dann doch gleich einmal einen Vektor mit ebendiesen Zahlen (1 bis 15) in die Variable x bilden und lassen uns diesen ausgeben:

> x <- 1:15
> x
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Nun denn, dann bitte einen zweiten Vektor in die Variable y und diesen bitte zum Vektor x aufaddieren:

> y <- 10
> x + y
[1] 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

Abschließend wollen wir noch eine kleine Eingabeaufforderung bauen:

> h <- 'Hallo'
> name <- readline('Name: ')
Name: Berndt

Und lassen uns den Namen abschließend ausgeben:

> paste (h, name)
[1] "Hallo Berndt"

Das sieht in RStudio dann so aus – links die Konsole, rechts die angelegten Variablen:

20151008 (1)

Die Console kann übrigens mit CTRL+L wieder geleert werden. Einfache Abfragen klappen hervorragend, aber wie sieht es nun mit einem etwas komplexeren Beispiel aus?

Der Script-Modus

Sehen wir uns ein anspruchsvolleres Beispiel an. Angenommen wir gehen jeden Tag am Abend nach der Arbeit ins Casino und spielen eine, oder auch mehrere Runden Roulette. Dann gehen wir entweder mit mehr oder weniger Geld nach Hause, je nachdem wie gut der Abend läuft. Ich habe das für uns für eine Woche mitgeschrieben und in den Vektor rouletteWoche eingetragen, die Wochentage selbst in den Vektor wochenTage. In R lassen sich diese beiden Vektoren mit der names Methode zu einem Name/Value Paar verbinden. Jetzt würden wir gerne folgendes berechnen bzw. anzeigen:

· Anzahl der Tage mit Gewinn (wo wir im Plus waren)
· Den Wochentag und den Wert an diesen Tagen
· Die Summe der Tage, wo Gewinn gemacht wurde
· Die Summe über die ganze Woche

In diesem Skript kann R erstmals seine Stärken etwas ausspielen, das fertige Skript für unsere Anforderungen sieht so aus:

#Gewinne im Casino von Montag bis Freitag
rouletteWoche <- c(-120, -50, 200, -150, 210)
wochenTage <- c("Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag")

#Wochentage zuweisen
names(rouletteWoche) <- wochenTage

#Anzahl der Tage mit Gewinn
anzahlTage <- sum(rouletteWoche > 0)
anzahlTage

#Tage mit Gewinn und Wert
rouletteTagePlus <- rouletteWoche[rouletteWoche > 0]
rouletteTagePlus

#Summe aller Tage mit Gewinn
rouletteTotalPlus <- sum(rouletteWoche[rouletteWoche > 0])
rouletteTotalPlus

#Summe aller Tage
rouletteTotal <- sum(rouletteWoche)
rouletteTotal

In RStudio sieht das so ähnlich aus, allerdings mit etwas mehr Farbe.

20151008 (2)

Das Ergebnis ist für diese wenigen Zeilen Code durchaus sehenswert:

20151008 (3)

R Packages und der SQLServer

Natürlich ist das hier nur ein sehr einfaches Beispiel, aber R ist sehr mächtig und auch eine beliebte Programmiersprache. Das lässt sich daran erkennen, dass es mittlerweile 7196 verfügbare Packages gibt. Diese sind ähnlich der unter .NET bekannten NuGet Packages und reichern R um weitere Bibliotheken an. Die Beschreibung ebendieser findet man hier: https://cran.r-project.org/web/packages/. Damit sollte ein erfolgreicher Schnellstart mit R und Daten beispielsweise aus dem SQLServer 2012 (derzeit mit dem RODBC-Package) kein Problem darstellen (bis wir die Integration im SQLServer 2016 testen können).

Holen wir uns also das RODBC Package mit RStudio zur Verwendung im nächsten Skript. Der Menüpunkt Tools -> Install Packages erweist sich hier als sehr hilfreich.

20151008 (4)

Es öffnet sich ein neues Fenster und es muss hier der Name des Packages eingegeben werden, in diesem Fall ist es das RODBC Package. Der Install Button erledigt den Rest.

20151008 (5)

Gut, jetzt wollen wir ein Skript erstellen, welches:

· Das RODBC Package einbindet.
· Eine Variable conn erstellt, die die von mir eingerichtete ODBC-Datenquelle (64-bit in meinem Fall) mit dem Namen LocalServer verwendet
· Ein einfaches Query-Statement absetzt und das Resultat in einer Variable queryResult bereitstellt
· Die Verbindung schließt und abschließend das Resultat ausgibt.

Das fertige Skript sieht in R somit so aus:

library(RODBC)
conn <- odbcConnect(dsn="LocalServer")
queryResult <- sqlQuery(conn, "SELECT * FROM HumanResources.Department")
odbcClose(conn)
queryResult

Das klappt auch ohne eingerichteter ODBC-Datenquelle, durch die komplette Angabe aller benötigten Informationen:

conn < - odbcDriverConnect("Driver=SQL Server; Server=localhost; Database=AdventureWorks2012; Uid=username; Pwd=password;")

Das Resultat in RStudio lässt sich durchaus sehen:

20151008 (4)

Die native R Integration in den SQLServer 2016 ist voraussichtlich in der CTP3 zu sehen, ich freue mich schon darauf diese dann auszuprobieren. Wenn wir allerdings schon beim Programmieren sind, vielleicht lässt sich R auch aus C# heraus verwenden?

R.Net zur R Integration in eine .NET Applikation

Ja, das klappt es gibt ein NuGet Package mit dem Namen R.NET. Dieses ermöglicht die Verbindung dieser beiden Welten. Also nichts wie ran an den Speck und gleich einmal testweise eine Consolen-, oder WPF-Applikation erstellt und gleich das NuGet Package referenzieren.

20151008 (5)

Jetzt muß noch eine C# Methode erstellt werden, welche die R-Engine initialisiert. Dann kann es auch gleich los gehen mit der Kommunikation zwischen C# und R und auch anders herum zwischen C# und R.

try

{

REngine engine = REngine.GetInstance();

CharacterVector charVec = engine.CreateCharacterVector(
new[] { "Hallo, R! Hier ist .NET!" });

engine.SetSymbol("greetings", charVec);

engine.Evaluate("str(greetings)"); // print out in the console

string[] a = engine.Evaluate(
"'Hi there .NET, from the R engine'").AsCharacter().ToArray();

Console.WriteLine("R answered: '{0}'", a[0]);

}

catch (Exception ex)

{

throw;

}

Im Visual Studio sieht das folgendermaßen aus:

20151008 (6)

Abschließend wollen wir uns noch die Unterstützung von R unter Azure Machine Learning ansehen.

Azure Machine Learning und R

Unter Azure stehen uns zwei R Module zur Verfügung

20151008 (6)

Das „Execute R Script“ Modul integriert R Skripte in den Azure Machine Learning Workflow. Dadurch ist es möglich, Eingangsdaten mit einem der Eingänge bzw. einem der Ausgänge zu verbinden, wie in dem nachfolgenden Bild zu sehen. Dieses Bild ist ein Ausschnitt aus einer Blog-Vorschlagsengine, die ich mit Azure Machine Learning gebaut habe:

20151008 (7)

Man sieht, dass das Execute R Skript Modul drei Eingänge zur Verfügung stellt: Zwei für Daten und einen Dritten, der dazu dient, weitere bzw. komplexere R Skripte als Zip-Datei diesem Modul zur Verfügung zu stellen. Der linke der beiden Ausgänge dient zur Weiterverarbeitung des Resultats des R Moduls, der rechte Ausgang stellt ein R-Device zur Verfügung, dieses dient beispielsweise zur Fehlerbehandlung, aber auch zur grafischen Ausgabe des Ergebnisses des Moduls.

Das „Create R Model“ Modul dient dazu ein R-Skript als Azure Machine Learning Model zur Verfügung zu stellen. Es benötigt zwei R Skripte. Das erste um das Model zu berechnen, letzteres um das Model zu bewerten. Damit ist es möglich, den definierten Algorithmus zu trainieren und zu bewerten. Das R Model Modul verhält sich von außen her, wie die eingebauten Models (im oberen Beispiel habe ich das K-Means Clustering Model verwendet), aber es kann eben auch ein eigener Algorithmus (als R Skript) verwendet werden.

Ein komplettes Beispiel für R unter Azure Machine Learning ist hier zu finden:
https://azure.microsoft.com/en-us/documentation/articles/machine-learning-r-quickstart/

Übrigens, ein kleiner Tipp am Ende:
Mit dem „AzureML“ R-Package lassen sich direkt aus RStudio heraus für AzureMachine Learning WebServices erstellen, finden und auch abfragen. Mehr Informationen dazu hier:
https://cran.r-project.org/web/packages/AzureML/AzureML.pdf

Zusammenfassung

R ist eine faszinierende Skriptsprache, wenn es um die Analyse von Daten geht. Microsoft unterstützt R derzeit im Bereich Azure Machine Learning und demnächst nativ im SQLServer 2016. Mit RStudio steht für den Desktop eine IDE zur Verfügung mit der sich R-Skripte erstellen und ausführen lassen.

Ich hoffe ich konnte euer Interesse für R wecken und ich wünsche euch viel Spaß mit R!


Berndt Hamböck ist seit 2007 MCT, darüber hinaus befasst er sich mit Lösungen für komplexe Anwendungsszenarien mit den neuesten Microsoft Technologien. Die Erfahrungen aus der Projektarbeit gibt er in Vorträgen und Trainings weiter und begleitet Entwicklerteams in Softwareunternehmen bei Projekten im Microsoft Umfeld.

Das ist ein Gastbeitrag. Die Meinung des Autors muss sich nicht mit jener von Microsoft decken. Durch den Artikel ergeben sich keinerlei Handlungsempfehlungen. Microsoft übernimmt keine Gewähr für die Richtigkeit oder Vollständigkeit der Angaben