Statistische Datenverarbeitung mit Java, R und Spring | Fachartikel


Fachthema
Wissen ist Macht
Statistische Datenverarbeitung mit Java,
R und Spring
aber mit wenigen Paketen und mit der Basis schon recht weit.
Hilfe gibt es über die Kommandos ?, ??, help(topic), demo() und
example(..).
Um mit Java und R zu starten, benötigen wir jetzt noch
die Bibliothek Rserve. Fast alle Bibliotheken lassen sich in
Rgui/R über install.packages installieren. Also noch install.
packages("Rserve") in der R-Shell eingeben, eine Downloadquelle
auswählen und der Nutzung von R aus Java heraus steht nichts
mehr im Weg!
Ralf Seger
Statistische Datenverarbeitung ist aktuell ein hochspannendes Thema.
Immer mehr Daten unterschiedlichster Art werden heute erhoben. Darunter große Mengen „roher“ Daten unbekannter Struktur – auch „Big Data“
genannt, die viele wertvolle Informationen für Unternehmen enthalten.
Doch nur wer Strukturen und Zusammenhänge erkennt, kann mit diesem
Wissen Geld verdienen. Eine Möglichkeit, diesen Schatz zu heben, bietet
die statistische Analyse. Einen erweiterbaren Werkzeugkasten, bestehend
aus Programmiersprache, Graphikwerkzeugen und vielem mehr, liefert R.
Getting started
Viele große Anbieter wie Oracle oder SAP nutzen heute
schon die von Venables und Ripley iniziierte Open-SourceVariante R der Statistiksprache S, um Data Mining zu betreiben. Für R existieren Tausende Pakete mit einem sehr breiten
Spektrum an statistischen Funktionen wie die graphische und
teilweise interaktive Darstellung von Daten, die Anbindung an
Datenquellen oder andere Systeme, Tests, neuronale Netze, erweiterbare Sprache und viele mehr.
Um dem Java-Entwickler R ein weniger näherzubringen,
möchte ich zunächst beschreiben, wie R seine Daten intern verwaltet, und die wichtige Bibliothek Rserve vorstellen, von der
aus R in Java verwendet werden kann. Mit Maven, Spring und
der J.O.R.I.S.-Bibliothek ist eine Verbindung zu R rasch hergestellt (s. Abb. 1). Danach folgen einige Anwendungsbeispiele
und ein kleiner Ausflug in die statistische Datenanalyse.
Die Installationsanleitung und Links zu Downloads sind auf
der R-Projekt-Homepage [R] zu finden. Dort gibt es auch eine
Anleitung zum Selberbauen. Nach dem Starten von R (Rgui.exe
oder R in Linux) erscheint eine einfache, aber funktionale Kommandozeilenumgebung. In dieser Umgebung kann man neue
Pakete installieren. Bemerkenswert ist der Kontext, in dem diese Umgebung abläuft. R nennt diese Umgebung „Workspace“.
In diesem Workspace werden Pakete geladen und alle Arten
von Objekten erzeugt und verarbeitet.
Eine Vielzahl an Online-Ressourcen wie Handbücher und
Blogs helfen beim Einstieg. Die riesige Menge an Paketen
wirkt zwar zunächst abschreckend, in der Praxis kommt man
E
Maven-Konfiguration und Verbindung mit Spring
über J.O.R.I.S.
Einen schnellen Weg, um nach der Installation von R und Rserve mit Java zu arbeiten, bieten Maven und Spring:
<dependency>
<groupId>org.r-project.joris</groupId>
<artifactId>jr-connection-mgr</artifactId>
<version>1.0.2</version>
</dependency>
Man benötigt nur eine minimale Spring-Konfiguration, und
schon hat man in Java eine Verbindung zu R:
@Configuration
@Import(RServiceConfiguration.class)
public class SpringConfiguration {
@Bean
public IRConnection managedIRConnection(
IRConnectionConfig configuration,
@Qualifier("rStarterProcess") ProcessService<IRConnection>
rStarterService){
return new IRConnectionMgrImpl().service(rStarterService).factory(
new REngineConnectionFactory()).getIRConnection(configuration);
}
@Bean
IRConnectionConfig connectionConfiguration() {
return new IRConnectionConfigImpl().steps(
installLibraries("RJDBC","RXKCD","tm",
"wordcloud","SnowballC","RcolorBrewer","ggplot2",
"RJDBC","vioplot")
.concat(loadLibraries("RJDBC","RXKCD","tm", "wordcloud",
"SnowballC","RcolorBrewer","MASS","ggplot2",
"reshape2","RJDBC","vioplot")) );
}
}
Diese IRConnection bietet in die eine Richtung Zugriff auf R analog zum Kommandozeilentool. Damit können R-Befehle für
das Laden und Installieren von Packages, Tests, Modellierung
und anderem ausgeführt werden. Die obige Konfiguration lädt
die Bibliotheken ein und sorgt in vernetzten Umgebungen sogar für die Erstinstallation.
Verbindungsvariationen
Abb. 1: Verbindung zwischen Java und R – J.O.R.I.S. dient als Interface
www.javaspektrum.de
Um R von Java aus zu steuern, hat sich die
Kombination Rserve und J.O.R.I.S. bewährt.
Rserve sorgt für den Datentransport und
J.O.R.I.S. bietet eine einfachere Integration. Für viele Anwendungsfälle genügt es,
R lokal zu installieren und Rserve auf dem
Standard-Port 6311 laufen zu lassen. Wenn
diese Option nicht gegeben ist, bleiben die
Möglichkeiten, auf einen anderen Port auszuweichen oder (unter Linux) die Socket49
Fachthema 
Schnittstelle zu verwenden. In dem Fall muss man zusätzlich
noch das Artefakt org.r-project.joris:linux-socket einbinden.
Wenn ich zum Beispiel Rserve mit J.O.R.I.S. unter Socket laufen lassen möchte, kann ich folgende Konfiguration (Beispiel
für OpenShift) verwenden:
RSERVE_SOCKET="$OPENSHIFT_DATA_DIR"socket/rserve
JORIS_host="$OPENSHIFT_INTERNAL_IP"
JORIS_port="9999"
Damit wird der Rserve auf socket/rserve gestartet, aber intern
über Port 9999 getunnelt.
Daten in R importieren
Um R-Funktionen zur Modellierung oder zum Testen zu nutzen, muss die Datenmatrix zuerst in R eingelesen werden. Mit
read.table(url,...) lassen sich Daten im Text-Format einlesen.
Die Formate xls, spss, csv und mtb (minitab) werden von Haus
aus unterstützt:
> sample<-read.table("http://lib.stat.cmu.edu/datasets/bodyfat",
skip=117, nrows=252)
> names(sample)<- c("density","pct","age","weight","height","neck",
"chest","abdomen","hip","thigh","knee","ankle","biceps",
"forearm","wrist")
Strukturen in Daten erkennen: Beispiel Körperfett
Obiger Datensatz enthält Messwerte: Körperfett („pct“ bzw.
„density“ – prozentual oder als Dichtemessung) und dreizehn
weitere erklärende Merkmale. In der Statistik spricht man von
erklärenden Variablen oder Merkmalen. Diese Merkmale sind
miteinander teilweise sehr hoch korreliert (s. Abb. 2).
Die Fragestellung einer statistischen Analyse lautet in diesem Fall: Wie kann ich den Zusammenhang von Körperfettanteil und den anderen Merkmalen am besten erklären? In der
Praxis werden die Daten jetzt manuell analysiert. Man entfernt
Ausreißer und die Vorbedingungen zur Modellauswahl werden geprüft. Gehen wir davon aus, dass die Vorbedingungen
für die Anpassung eines linearen Modells hier gegeben sind.
Mit R lässt sich so mit einem einfachen Kommando ein lineares Modell anpassen. lm berechnet das Modell aus den gewählten Variablen. Die weitere Analyse erfolgt mit den R-Kommandos summary, anova und plot:
lm(formula = pct ~ height + neck + chest + abdomen + wrist +
neck:chest, data = sample)
Residuals:
Min
1Q
Median 3Q
Max
-9.6843 -3.2256 -0.0685 3.0142 10.1763
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -1.334e+02 3.288e+01 -4.055 6.73e-05 ***
height
-2.124e-01 8.039e-02 -2.642 0.008780 **
neck
3.147e+00 8.678e-01 3.627 0.000349 ***
chest
1.266e+00 3.225e-01 3.927 0.000112 ***
abdomen
8.739e-01 6.491e-02 13.463 < 2e-16 ***
wrist
-1.371e+00 4.591e-01 -2.987 0.003099 **
neck:chest -3.529e-02 8.209e-03 -4.299 2.48e-05 ***
--Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 4.329 on 245 degrees of freedom
Multiple R-squared: 0.7388, Adjusted R-squared: 0.7324
F-statistic: 115.5 on 6 and 245 DF, p-value: < 2.2e-16
Der Prozess der Modellfindung ist hier sehr vereinfacht. R bietet einen Optimierungsalgorithmus zur Merkmalsselektion.
Als Referenz helfen hier die Kommandos step und stepAIC aus
der MASS-Bibliothek. Obiges Modell entstand aus dem durch
stepAIC optimierten Modell. Einige wenig signifikante Variablen wurden der Einfachheit halber entfernt. Weiterführende
Vorschläge zur Modellierung finden sich bei Burnham und Anderson [BrAn02].
Was macht das statistische Modell interessant?
Im oben beschriebenen Beispiel mit dreizehn möglichen erklärenden Merkmalen ist eine sehr große Zahl ähnlich guter Modelle zu finden. Das lineare Modell könnte man verbal so übersetzen: Der Körperfettanteil – auf Basis der erhobenen Daten –
kann geschätzt werden durch:
-0.2*height+3.1*neck+1.3*chest+0.9*abdomen-1.4*wrist-0.03*neck*wrist-133
Abb. 2: Korrelation der erklärenden Merkmale
50
Der Plot in Abbildung 3 zeigt die Abweichung der Messwerte
von dieser Formel.
Warum interessiert so ein Beispiel beim Einsatz von Java?
Die große Anzahl
ähnlich guter Modelle, zum Beispiel
gemessen am Akaike
Information Criterion,
liefert keine eindeutig
beste Merkmalsauswahl. Um die Modellqualität weiter zu steigern, können mehrere
Modelle kombiniert
werden. In einem datenbankgestützten
Java-Frontend lassen
sich zum Beispiel Ensembles sehr gut interaktiv und explora- Abb. 3: Residuenplot des Beispielmodells
tiv bilden.
JavaSPEKTRUM 1/2016

Fachthema
Abb. 4: Generische IREXP-Daten aus dem Beispielmodell als Java-Baum
R-Daten in Java verwenden
Die Objekte aus dem R Workspace können über die IRConnection direkt als generische Struktur in Java verwendet werden.
Die Funktion eval(..) liefert als Ergebnis ein IREXP-Objekt zurück, welches einen Baum an Unterobjekten enthält (s. Abb. 4).
Die Darstellung aus Abbildung 4 gewinnt man aus den konvertierten IREXP-Daten. Für kleine Datenmengen kann man
Ergebnisse aus R in dieser Weise verwerten. Der Vollständigkeit halber sei erwähnt, dass man über die erweiterte IJava2RConnection auch mittels assign direkt Arrays von primitiven Typen
aus Java nach R transportieren kann. Um allerdings mit größeren Datenmengen umzugehen, ist dieser Weg mühsam und
wenig performant.
Weitere Möglichkeiten zum Datentransfer
zwischen Java und R
Mit den Paketen RJCDB oder RODBC erhält man in R direkten Datenbankzugriff. Man benötigt für RJDBC lediglich ein
Java-Archiv (jar) für den Datenbanktreiber. Bei Windows und
RJDBC muss eine jvm.dll über der Path-Umgebungsvariable auffindbar sein, sonst blockiert ein Fehler den Ladevorgang
der Bibliothek. RJDBC verwendet intern die rJava-Bibliothek:
> library(RJDBC)
> drv <- JDBC("oracle.jdbc.OracleDriver",
"D://tools//oraclexe//driver//ojdbc6.jar") #windows Pfadtr enner //
> conn <- dbConnect (drv, "jdbc:oracle:thin:hr/hr@localhost:1521:xe")
> res <- dbSendQuery(conn," SELECT * FROM EMPLOYEES e JOIN
DEPARTMENTS d ON e.DEPARTMENT_ID = d.DEPARTMENT_ID")
> dataFrame <- dbFetch(res);
> dbClearResult(res)
> dbDisconnect(conn); #
> vioplot(dataFrame$SALARY, col="yellow",horizontal=TRUE, names="SALARY")
Die Daten aus einer relationalen Datenbank in ein data.frame (eine benamte Zeilen-Spalten-Matrix in R) zu konvertieren, ist
nicht aufwendig. Damit lassen sich in R eine Vielzahl an Plots
erstellen, Modelle anpassen und Tests ausführen. Man kann
beispielsweise numerische Verteilungen ansprechend visualisieren. Die Abbildungen 5 und 6 zeigen die Daten aus der
www.javaspektrum.de
Oracle-Tabelle in unterschiedlichen
Detaillierungsgraden.
In Abbildung 5 sind
die SALARY-Daten noch
nach
DEPARTMENT_
NAME aufgeteilt worden.
Obige
SALARY-Daten
lassen sich zum Beispiel
mithilfe des ShapiroWilk-Tests [WikiSWT] auf
ihre
Normalverteilung
hin untersuchen:
Abb. 5: Verteilung der Gehälter
> shapiro.test
(dataFrame$SALARY)
data: dataFrame$SALARY
W = 0.8727,
p-value = 4.546e-08
Da wir solche Rückgabewerte auch in Java auswerten können, lassen
sich hier praktische, dynamische Skripte erstellen.
Abb. 6: Gehälter pro Abteilung
Es gibt noch viele weitere Bibliotheken, um
Verbindung mit R aufzunehmen. Hier wären SSOAP (SOAP),
RCurl (HTTP, FTP ...), RLucene und andere zu nennen. Die
Auswahl an Bibliotheken und Verbindungsvarianten ist damit
sicherlich ausreichend. Vor dem Einsatz einer bestimmten Erweiterungsbibliothek empfiehlt sich ein Blick in die Anleitung,
um festzustellen, ob die Bibliothek schon einen entsprechenden Reifegrad entwickelt hat.
Anwendungsbeispiel Text Mining
R bietet unter anderem auch Bibliotheken für Text Mining an,
zum Beispiel tm. Die Textdaten kann man in einem Verzeichnis
ablegen und mit dem tm-Package aufbereiten. Als Datenquel51
Fachthema 
School of Mines & Technology, 2.10.1995,
le dienen hier einige Einführungsdokumente zu R. Um eine
Wordcloud zu erstellen, benötigt man die Packages tm, SnowballC, wordcloud und RcolorBrewer:
>
>
>
>
>
>
texts <- Corpus (DirSource("D://Temp"))
texts <- tm_map(texts, content_transformer(stripWhitespace))
texts <- tm_map(texts, content_transformer(tolower))
texts <- tm_map(texts, removeWords, stopwords("english"))
texts <- tm_map(texts, content_transformer(stemDocument))
wordcloud(texts, scale=c(5,0.5), max.words=100, random.order=FALSE,
rot.per=0.35, use.r.layout=FALSE, colors=brewer.pal(8, "Dark2"))
In der Praxis sammelt ein Robot diese Daten, der über ein Menge von Webseiten crawlt und Texte nach Lucene extrahiert.
http://lib.stat.cmu.edu/datasets/bodyfat
[BrAn02] K. P. Burnham, D. R. Anderson, Model Selection and
Multimodel Inference, 2002, Springer E-Book, §6
[Brok15] P. Brokmeier, Automated Unittesting of XQueries in
Oracle OSB, 29.9.2015, https://thecattlecrew.wordpress.com/
[CRAN] The Comprehensive R Archive Network, Contributed
Packages, http://cran.r-project.org/web/packages/
(6622 Pakete, Stand vom 07.05.2015)
[Deducer] An R Graphical User Interface for Everyone,
http://www.deducer.org/
[GGobi] Data Visualization System, http://www.ggobi.org/
[Glotaran] A Graphical User Interface for the R-package TIMP,
http://glotaran.org/
[iPlots] Interactive Plots for R,
http://cran.r-project.org/web/packages/iplots/index.html
[OpenShift] https://www.openshift.com/
[OracleR] Oracle R Enterprise, http://www.oracle.com/technetwork/
database/database-technologies/r/r-enterprise/overview
[R] R: The R Project for Statistical Computing,
http://www.r-project.org/
[Rattle] A Graphical User Interface for Data Mining using R,
http://rattle.togaware.com/
[rJava] Low-Level R to Java interface, https://www.rforge.net/rJava/
[Rserve] Binary R server, https://rforge.net/Rserve/
[SAPHANNAR] SAP HANA R Integration Guide,
http://scn.sap.com/docs/DOC-60314
[Seg14] R. Seger, Testing R/Rserve in the Cloud, 17.2.2014,
http://java-r-spring.blogspot.de/
[Theus11] M. Theus, R GUIs: Which one Fits you?, Blog,
27.3.2011, http://www.theusrus.de/blog/r-guis-which-one-fits-you/
[VeRi01] W. N. Venables, B. D. Ripley, Modern Applied Statistics
with S-PLUS, Springer, 2001
[WikiAI] http://de.wikipedia.org/wiki/Informationskriterium#Akaikes_
Informationskriterium
Abb. 7: Text Mining ermittelt Rs häufigste Worte
[WikiLR] http://de.wikipedia.org/wiki/Lineare_Regression
[WikiSWT] http://de.wikipedia.org/wiki/Shapiro-Wilk-Test
Zusammenfassung und Ausblick
R eignet sich hervorragend, um Strukturen von Daten zu untersuchen. Es wurden Möglichkeiten vorgestellt, wie man Daten zwischen R und Java austauscht. Eine kleine Auswahl an RFeatures wurde an kurzen Beispielen gezeigt. Für einen tieferen Einstieg in R findet man ausführliche Handbücher auf der
Website des Projekts [R]. Wer mit einem Buch starten möchte, dem sei das Werk der Initiatoren ans Herz gelegt [VeRi01].
Die Auswahl an GUIs ist beachtlich. Erste Auswahlkriterien bietet ein Blogbeitrag auf www.theusrus.de [Theus11]. Außerdem lohnt sich je nach Einsatzzweck auch ein Blick auf Rattle,
Glotaran oder Deducer [Rattle, Glotaran, Deducer].
Weiterführende Themen wie der Umgang mit Big Data finden sich in zahlreichen Blockbeiträgen, zum Beispiel im Cattle
Crew Blog [Brok15].
Auf jeden Fall gibt es keine Ausrede mehr, sich nicht mit R
auseinanderzusetzen, denn die Begründung, „man sei ja nur
im Java-Kontext unterwegs“, gilt heute nicht mehr. Ich wünsche viel Vergnügen beim Verbinden und Nutzen von R!
Dr. Ralf Seger ist promovierter Statistiker mit
Spezialisierung auf explorative Datenanalyse (EDA)
und Multi-Model Averaging. Bei OPITZ CONSULTING
entwickelt er Architekturen und spezielle, am liebsten
testgetriebene, Kundenlösungen im JEE- und SpringUmfeld.
E-Mail: [email protected]
JavaSPEKTRUM ist eine Fachpublikation des Verlags:
SIGS DATACOM GmbH
Lindlaustraße 2c · 53842 Troisdorf
Tel.: 0 22 41/23 41-100 · Fax: 0 22 41/23 41-199
E-Mail: [email protected] · www.javaspektrum.de
Literatur und Links
[BodyFat] R. W. Johnson, Dataset Archive Body Fat, Department of Mathematics & Computer Science, South Dakota
52
JavaSPEKTRUM 1/2016