2012-05-11

Control 2012 - Tag 3


Das Messegebäude "von Hinten"
8:40 - Ich bin alleine am Stand und vervollständige die Notizen für den Blogeintrag "Tag 2". Von den Kollegen ist bisher niemand zu sehen. Wahrscheinlich bereiten sie gerade die Motivations-Ansprache vor. Während ich schreibe und und warte nehme ich mir vor mehr Notizen zu machen. Ich werde das Gefühl nicht los, noch etwas von gestern vergessen zu haben.

8:55 - Ich bin nicht mehr alleine und auf Anfrage hält Doug tatsächlich eine, nicht ganz ernst gemeinte, Morivationsrede.

Unsere Partner aus Amerika: Mike und Doug
 9:15 - Das Highlight des Tages bahnt sich an: Nachdem Bertram das Tablet mit ins Hotel genommen und dort zahlreiche Wifi-Analyser-Apps installiert hat lebt die Hoffnung auf eine stabile Internetverbindung wieder auf.

10:37 - Die App funktioniert. Da der Rest des Tages relativ ruhig verlief, ich es aber gleichzeitig nicht geschafft habe die letzte bisher unerschlossene Halle (5) zu besuchen, möchte ich kurz diese ominöse Android-App beschreiben:

Idee:
Wir wollen Daten mit den Sensoren eines Android-Tablets erheben und mithilfe von InfinityQS analysieren. Das beinhaltet im Wesentlichen:
  1. Eine App, die die Daten erhebt, darstellt und an InfinityQS schickt.
  2. Eine Schnittstellt zwischen der Android-App und InifinityQS zum Übertragen der Daten.
Die App:
Typische Android-Devices haben einen Lage-, Licht- und einen Abstandssensor. Ausserdem können natürlich Audio-Daten vom Mikrophon aufgenommen werden. Wir haben uns entschlossen den Lichtsensor sowie das Mikrophon zu verwenden. Dabei werden konstant Audio-Daten aufgenommen. Über eine Fast-Fourier-Transformation werden diese Daten in Frequenzen und die zugehörigen Amplituden umgerechnet.Ausgewählte Frequenzen werden im Tablet grafisch dargestellt.

Die Messeapp mit der Auswertung der Daten in InfinityQS
Die Schnittstelle und InfinityQS:
Auf dem Rechner werden die Daten von einem Java-Programm über eine TCP-IP-Verbindung empfangen und in eine Textdatei geschrieben. InfinityQS liest die Werte aus der Textdatei aus und analysiert sie anschließend. Im Bild sieht man ausgewählte Regelkarten für verschiedene Frequenze.

Man kann an den Grafiken und Daten relative gut ablesen, ob gerade jemand vor dem Tablet steht und spricht oder nicht. Man kann von der gemessenen Lautstärke auch gut auf den Traffic vor dem Stand schließen.

Am letzten Tag steht jetzt noch ein Ausflug in Halle 5 an. Dann werde ich hoffentlich noch viele interessante Bilder von Ausstellungsstücken präsentieren können!

2012-05-10

Control 2012 - Tag 2

Messegebäude andere Ansicht

08:30 - Da ich meine Eintrittskarte behalten habe läuft heute alles wie geschmiert. Um 9:00 Uhr stelle ich fest, dass diese Erwartungshaltung etwas voreilig war. Nachdem ich unsere Messe-App gestern Abend Zuhause noch einmal ausprobiert habe und alles stabil lief war ich optimistisch, dass wir das heute hinbekommen. Ausserdem haben Boris und Bertram ein neues Wunderwerk der Technik (W-Lan Router) mitgebracht.

08:45 Mit einem hauch von Neid bemerken wir, das am Nachbarstand eine Motivationsrede für einen Erfolgreichen Arbeitstag gehalten wird. Das sollten wir auch einführen. Auch unser amerikanischer Kollege Doug ist begeistert. Ich bin gespannt, wer den Part morgen übernimmt.

10:00 - Die Zeit vergeht wie im Fluge, da heute etwas mehr los zu sein scheint als gestern.

11:30 - Die erste Packung mit Keksen wird ausgepackt. Wirklich lecker.

14:30 - Wir stellen fest, dass der W-Lan Router sich positiv auf alle Geräte ausgewirkt hat. Die Verbindungen sind stabiler und/oder schneller. Leider gilt das mit einer Einschränkung: Galaxy Tab. Ich verbeuge mich vor der Technik und gebe auf. Zumindest produziert die App hübsche Bildchen auf dem Display (Foto folgt).

14:30 - Ich mache mich auf um einige Fotos von Ausstellungsstücken nachzuholen, die mir gestern aufgefallen waren. Resultat:
Maschine zum Sortieren von Metallkugeln
Projektor-R2-D2
15:30 - Der Rundgang durch Halle 7 mit Claudia und Doug zeigt, dass es dort nicht so spannend ist, wie  bei uns in Halle 3. Es ist recht wenig los und die Aussteller haben sich zum großen Teil nicht so spannende Highlights überlegt. Die große Ausnahme der Regel folgt auf dem Fuße:
Highlight von Halle 7

Schokoladenauto? Ich durfte es nicht probieren!

Autos sind sehr beliebte Ausstellungsstücke - liegt das vielleicht an der Männerquote?

Die Erholungsoase. Aber Vorsicht: Keine Selbstbedienung

17:00 - Fazit: Heute war sicher mehr los. Aber das ganze kann sich gerne noch einmal ein bisschen Steigern in den nächsten Tagen.

Hatte ich vergessen zu erwähnen, dass die Messe direkt am Flughafen liegt?


2012-05-08

Control 2012 - Erster Tag

Stuttgarter Messegebäude samt Parkplatz

8:30 - Pünktlich stehe ich vor dem Messegelände und erfahre, dass der Rest der Belegschaft noch unterwegs ist. Da ich als einziger nicht mit einer Eintrittskarte ausgestattet bin vertreibe ich mir die Zeit vor dem Messegelände und genieße das schöne Wetter.

8:45 - Claudia versorgt mich mit der lang ersehnten Eintrittskarte und so kann es losgehen. Der Stand befindet sich unweit von der Stelle an der wir vor einem Jahr residierten. Das ist aber schon die einzige Gemeinsamkeit. Jetzt sind die Monitore professionell  an den Wänden angebracht, die Plakate an den Standwänden überzeugen mit schlichter Eleganz und berücksichtigt man die einheitliche Oberbekleidung des Personals kann man das als einen Quantensprung in Sachen professioneller Erscheinung zusammenfassen.

Messestand mit dem Statcon-Team (vlnr: Boris Kulig, Claudia Walber, Sebastian Hoffmeister, Bertram Schäfer)
9:20 - Der Eindruck übermäßiger Professionalität wird getrübt durch einen Mangel an funktionstüchtigem W-Lan. Leider ist eine Internetverbindung essentiell zum Betreiben der vorbereiteten Android-App. Ein Thema, dass mich den Rest des (nicht nur Messe-) Tages beschäftigen wird.

11:00 - Ein Rundgang durch Halle 3 liefert zahlreiche neue Ideen, was man nächstes Jahr noch machen könnte. Angefangen von einer Maschine zum sortieren von Stahl-Kugeln gemäß ihres Durchmessers bis hin zur Liveproduktion von Schiedsrichterpfeifen gibt es allerlei praktische oder zumindest faszinierende Dinge zu bestaunen.

12:00 - Nach einer Sonderzahlung an eine der beiden Firmen, die für die Internetverbindung vor Ort zuständig sind, läuft auch das W-Lan … auf einigen Geräten. Leider gilt das nicht für das Galaxy Tab, für das besagte Android-App entwickelt wurde.

13:00 - Ein anderes Consulting und Trainings-Unternehmen beeindruckt durch einen R2-D2 in (annähernder) Lebensgröße. Zwar ist der Funktionsumfang eingeschränkt - statt Raumschiffe reparieren dient er nur als Projektor - aber er kann sich bewegen und lockt so sicher den einen oder anderen Kunden zum Stand.

16:00 - Der Messetag geht relativ beschaulich zu Ende. Der Besucherandrang lässt sich wahrscheinlich an zwei Händen abzählen, aber das war am ersten Tag auch schon letztes Jahr der Fall.

Ziel für Morgen:
- viele Fotos von den spannenden Maschinen (präziser: Messmitteln) machen

2012-01-10

Interaktive Graphiken online Präsentieren

Wieder einmal gibt es eine neue Ausgabe des R Journal und wieder finden sich dort spannende Themen. Besonders aufgefallen ist mir dieses mal ein Artikel von Markus Gesmann und Diego de Castillo: Using the Google Visualisation API with R!

 Mit dem googleVis Paket können interaktive Graphiken erstellt und direkt im Browser angezeigt werden.

Als kleiner Vorgeschmack:

Die Wechselkurse von EUR, GBP, YEN und Renminbi (Chinesische Währung) - jeweils zum USD.AnnotatedTimeLineIDf456e3929f

R version 2.14.1 (2011-12-22) • googleVis-0.2.13Google Terms of UseData Policy


Der Weg dahin ist gar nicht schwer. Zunächst müssen die Daten in die passende Form gebracht werden. Für obige Graphik heißt das:
  • eine Spalte für das Datum
  • eine Spalte für die numerischen Werte, die hier als Linie angezeigt werden (die Wechselkurse, die angezeigt werden sollen)
  • eine Spalte für die Unterteilung der numerischen Werte in verschiedene Kategorien (hier: die verschiedenen Währungen)
  • eine Spalte für die Titel der Annotationen (die sowohl in, wie auch neben der Grafik angezeigt werden)
  • eine Spalte für die Annotationen
Das sieht dann folgendermaßen aus:


Jetzt reichen zwei Befehle um die entsprechende Graphik zu erstellen und anzuzeigen:

lineChart = gvisAnnotatedTimeLine(exchange.data, 

            datevar="Datum", # Datumsvariable
            numvar="Kurs",  # numerische Werte
            idvar="Währung",  # enthält die Gruppen
            titlevar="Titel", # enthält die Titel der Bemerkungen
            annotationvar="Anmerkung", # die Bemerkungen
            options=list(displayAnnotations=TRUE,#Bemerkungen anzeigen
            scaleColumns='[0,1]', # 2-Y-Achsen (eine links eine rechts)
            scaleType='allmaximized'))

erzeugt HTML-Code, der alle zum Anzeigen der Grafik benötigten Informationen enthält. Um das Ergebnis zu sehen benutzt man:

plot(lineChart)

. Im Browser öffnet sich dann die oben angezeigte Grafik. Das Kommando:

lineChart

zeigt bei Bedarf den der Grafik zugrundeliegenden HTML-Code an. Dieser enthält unter anderem auch die Daten selber. Somit kann man die Grafik einfach im Internet veröffentlichen indem man den HTML-Code auf dem eigenen Web-Space hoch lädt. Oder man kopiert den HTML-Code in den eigenen Blog.

Literatur:

2011-10-13

Datenimport mal anders

Wer kennt es nicht. Man liest ein Paper und denkt sich: Diese Daten hätte ich jetzt auch gern. Sei es um die Ergebnisse noch einmal selber nachzurechnen oder andere Methoden mit der vorgestellten zu vergleichen.

[Einschub: Ok, es gibt wahrscheinlich den einen oder anderen, der diese Gefühl nicht kennt. Aber ganz abwegig ist es auch nicht :-)]

Glücklich, wer eine passende Grafik in dem Paper findet und das R-Paket digitize kennt.

Nehmen wir uns mal die folgende Grafik vor. Fehlen uns dazu die numerischen Werte (also die Koordinaten der einzelnen Punkte), so könnte man sich nun mit Lineal und Bleistift vor eine ausgedruckte Version setzen und die Werte der Punkte abmessen. Aber digitize macht es etwas bequemer.

Wir laden also das Paket digitize und müssen anschließend die Grafik in R importieren.

install.packages("digitize")
library(digitize)
axis = ReadAndCal("daten.jpg")


Es öffnet sich gleich die importierte JPG-Datei. Zuerst müssen wir nun 4 Referenzpunkte setzen. Jeweils 2 auf der X-Achse und 2 auf der Y-Achse. Das geschieht durch einen Linksklick in der Grafik.

Im nächsten Schritt müssen die einzelnen Datenpunkte in der Grafik markiert werden. Das geschieht wieder mit einem Linksklick in die Grafik.

points = DigitData(col="red")

Wer das ausprobiert, weiß spätestens jetzt warum sich das Paket nur für überschaubare Datensätze eignet. Manchmal dauert es etwas länger, aber wenn alle Punkte rot markiert sind beenden wir den Schritt indem man ESC drückt.
Zuletzt werden die gesammelten Achsen-Informationen benutzt um die Koordinaten der Punkte hochzurechnen. Dazu muss angeben werden an welchen Stellen die Punkte auf der X- bzw. Y-Achse gesetzt wurden (hier jeweils 0 und 2).

data = Calibrate(points, axis, 0, 2, 0, 2)

Es ergeben sich die Folgenden gerundeten Werte:

XY
1-2,5-2,6
21,21,3
300,3
40,80,4
522,2
60,10,3
7-0,3-0,3
82,32,8
9??
102,02,1


Abgesehen von minimalen Abweichungen stimmen diese Daten mit denen die ich tatsächlich benutzt habe um die Grafik zu erzeugen überein. Allein Punkt 9, der von den Koordinaten identisch zu Punkt 3 ist kann mit der Methode natürlich nicht gefunden werden. 2 direkt übereinanderliegende Punkte können in der Grafik schließlich nicht auseinandergehalten werden.

Literatur:
  • Timothée Poisot: The digitize Package: Extracting Numerical Data from Scatterplots - R Journal Vol 3/1 (June 2011). http://journal.r-project.org/archive/2011-1/RJournal_2011-1_Poisot.pdf (Stand:  10. Oktober 2011).


2011-10-07

(Welt)-Karten mit JMP

In Anlehnung an den letzten Beitrag möchte ich noch erwähnen, dass R natürlich nicht die einzige Software ist, die sich zum Erstellen von Karten eignet. Hier möchte ich noch kurz anhand der FIFA-Damen-Weltrangliste zeigen, wie sich die gleichen Grafiken in JMP erzeugen lassen.

Die benutzten Daten finden sich wieder im Internet.

Nachdem die Daten in JMP eingelesen sind erzeugen wir die Karte nun im Graph Builder (Graph ⇒ Graphik erstellen).

Zieht man die Ländernamen in den Shape- (bzw. Form-) Bereich des Graphbuilders entsteht automatische die entsprechende Weltkarte.
Danach fehlen noch die Farben gemäß der Punktezahl der verschiedenen Teams. Dazu zieht man die Variable Pts auf die Karte.
Nach einem bisschen Heraumspielen an den Farbverläufen (Rechtsklick auf die Legende ⇒ Verlauf) kann man eine Karte erzeugen, die der mit R erstellten verblüffend ähnlich sieht. Abgesehen davon, dass wir hier den Damen-Fußball und mit R den Herren-Fußball analysiert haben.
Auch hier stimmen die Namen der Länder nicht überall mit den von JMP erwarteten Namen überein. Das sieht man an den weißen Flächen auf der Karte (Zentral-Afrika, China,...).

Literatur:
  • FIFA Weltrangliste der Damen (Stand: 7. Oktober 2011) - http://www.fifa.com/worldranking/rankingtable/women/index.html

Weltkarten mit R

In der neuesten Ausgabe des R Journals findet sich ein lesenswerter Artikel zu dem Packet rworldmap. Diese erlaubt es mit wenigen Befehlen eine Weltkarte zu erstellen, in der die einzelnen Länder individuell eingefärbt sind. Wie einfach das ist will ich am Beispiel der FIFA-Männer-Fußball-Weltrangliste zeigen.

Länder eingefärbt nach ihren Punkten auf der Männer-FIFA-Weltrangliste
Zunächst müssen einige Pakete installiert werden. Wer sich mehr mit Landkarten in R beschäftigen möchte sollte einen Blick auf die Liste der mitinstallierten Pakete werfen: sp, maptools beschäftigen sich ebenfalls mit diesen Themen. 

install.packages("rworldmap")
library(rworldmap)

Nachdem die Bibliothek geladen ist müssen die Daten beschafft werden. Für unser Beispiel finden sich die Daten im Internet. Etwas aufbereitet sehen die Daten dann etwa so aus:

RankTeamPoints
1Spain1605
2Netherlands1571
3Germany1290
4Uruguay1184
5Portugal1158
6Italy1142


Wenn die Daten in R sind, brauchen wir nur noch 3 Befehle. Der erste verbindet die Information der Daten mit einer Weltkarte. Der zweite erstellt eine neue leere Weltkarte und der dritte benutzt die zuvor erzeugte Information um die leere Weltkarte einzufärben.

 
fifa.map.info = joinCountryData2Map(fifa.ranking, joinCode="NAME", nameJoinColumn="Team")

150 codes from your data successfully matched countries in the map
57 codes from your data failed to match with a country code in the map
96 codes from the map weren't represented in your data

Der Output sagt uns, dass 150 der Länder richtig erkannt wurden, 57 nicht erkannt wurden und 96 Länder in der Karte sind, die nicht von uns angesprochen wurden. Nicht erkennen kann R Länder die "falsch" geschrieben sind. So ist es natürlich ein Unterschied ob in den Daten USA (was bei uns der Fall ist) oder United States (was von R bzw. vom Packet rworldmap erwartet wird) steht. Im Moment wollen wir diese Problematik kurzfristig beiseite lassen und einfach die Karte zeichnen.

mapDevice()
mapCountryData(fifa.map.info, nameColumnToPlot="Points")
Die weißen Länder wurden nicht erkannt
Es ergibt sich die eingefärbte Karte mit einigen weißen Flecken. Dies sind Länder, die im ersten Schritt nicht erkannt wurden. Um diese Problem zu beheben müssen die Ländernamen im Datensatz an die Ländernamen, die das Packet kennt anpassen. Dabei hilft der Befehl

identifyCountries()

Mit Mausklick auf die Karte werden die unerkannten Ländernamen identifiziert. Diese können dann anschließend im Datensatz korrigiert werden.

Auf der Suche nach den richtigen Ländernamen
Nachdem die entsprechenden Ländernamen korrigiert wurden ergibt sich die endgültige Karte.
Mit korrigierten Ländernamen

Das Skript, dass die oberste Karte erzeugt verwendet noch einige zusätzliche Optionen. Der zugehörige Code findet im Anhang.


Literatur:
  • Andy South: rworldmap: A New R package for Mapping Global Data - The R Journal Volume 3/1, June 2011
  • Fifa Weltrangliste der Männer (Stand: 7. Oktober 2011) - http://www.fifa.com/worldranking/rankingtable/index.html

Anhang:

# Erstellen einer Karte mit der FIFA Weltrangliste
# Autor: Sebastian Hoffmeister - Statcon
# 7.10.2011

library(rworldmap) # Laden der benötigten Pakete
library(classInt)

fifa.ranking = read.csv(".../Fifa Ranking.csv") # Einlesen der Daten
fifa.map.info = joinCountryData2Map(fifa.ranking, joinCode="NAME", nameJoinColumn="Team") # Daten mit der Karte verbinden

palette = colorRampPalette(c("brown4", "darkgoldenrod1", "darkolivegreen4"))(80) # Farbverlauf selbst definieren.
classInt = classIntervals(fifa.map.info[["Points"]], n=80, style="jenks") # Eigene anzahl an Farb-Intervallen definieren
catMethod = classInt[["brks"]]

mapDevice() # Die leere Karte erstellen
mapCountryData(fifa.map.info, nameColumnToPlot="Points", colourPalette = palette, catMethod=catMethod) # Die leere Karte befüllen