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