Samstag, 21. März 2015

Visualisierung mit Google Treemap

Seitdem ich die Treemaps auf MarketWatch.com gesehen habe, wollte ich in diese Richtung visualisieren. Aber welche Daten soll ich dafür verwenden?






















Da ich fast täglich die "NBA Game Time" App auf meinem Handy benutze, ist mir aufgefallen, dass die National Basketball Association eine riesige Datenbank voller Statistiken besitzt. Auf nba.com/stats kann man zu ziemlich allen möglichen Bezügen Statistiken abrufen. Leider ist ein Export im CSV-Format meines Wissens nicht möglich.

















Da ich keine Statistik visualisieren wollte, die es schon gibt, musste ich mir etwas ausdenken. Da sich die Playoffs nähern und die Presse oft davon schreibt, wie stark der Westen im Vergleich zum Osten ist, dachte ich mir, gehe ich der Sache nach. Außerdem gibt es seit der Saison 2011/2012 eine Reihe neuer Statistiken in der NBA. Zum Beispiel die Advanced Statistics. Diese Statistiken wollen vor allem die Effizienz der Spieler messen. Auch ist es wesentlich schwerer die Defense als die Offense zu messen. Dafür kommen zum Beispiel spezielle Kameras zum Einsatz, wie in diesem Bericht erwähnt wird.
Die Statistik mit der kompliziertesten Formel ist das Player Efficiency Rating (PER):
PER = (LgPace/TmPace) * (15/LgPER) * (1/MP) * [3P + (AST*0,67) + (FG*{2-[(TmAST/TmFG)*0,588]}) + (FT*0,5*{2-0,33*(TmAST/TmFG)}) + (DefREB*VOP*LgOffREB%) + (OffReb*VOP*LgDefREB%) + (STL*VOP) + (BLK*VOP*LgDefREB%) - (TO*VOP) - [(FGA-FG)*VOP*LgDefREB%] - {(FTA-FT)*VOP*0,44*[0,44+(0,56*LgDefREB%)]} - {PF*[(LgFT/LgPF)-((LgFTA/LgPF)*0,44*VOP)]}]. 
Somit sollen sich auch Statistiken unterschiedlicher Epochen vergleichen lassen. Und wer hätte es gedacht,  auf dem ersten Platz steht Michael Jordan mit einem Wert von 27,91.

In einigen Statistiken werden aktuell verletzte Spieler nicht aufgeführt. Somit kann es sein, dass beispielsweise ein PER-Wert eines Spielers nicht automatisch verfügbar ist und manuell berechnet werden müsste. Aus diesem Grund habe ich mich entschieden die EFF (Efficiency) zu verwenden. Die Effizienz stellt eine Vergleichsgröße dar, mit der die Leistung eines Spielers bewertet und vergleichbar gemacht werden kann (und ist im Vergleich zur PER einfach und schneller zu berechnen).
Effizienz = (Punkte + Rebounds + Assists + Steals + Blocks) - ((Anzahl Wurfversuche - Anzahl verwandelte Würfe) + (Anzahl Freiwurfversuche - Anzahl verwandelte Freiwürfe) + Turnover)















In Google Treemaps kann man Grundsätzlich zwei Parameter einstellen. Die Größe eines Vierecks und die Farbe. Außerdem kann man die Vierecke beschriften und per Mousover den Wert, welcher dahinter liegt, anzeigen lassen. Meine Visualisierung soll folgendes veranschaulichen:
  1. Eine Gegenüberstellung der Western Conference und Eastern Conference, anhand der Win%. Wie viel Prozent der Spiele hat ein Team gewonnen? Je höher desto größer das Viereck der jeweiligen Conference. Die Farbe wird durch die Anzahl der Siege berechnet. 0% Siege = Farbe Pink, 100% Siege = Farbe Blau.
  2. Die Conferences sind in Teams eingeteilt (Hiebei jeweils nur 8 Teams - die acht, welche aktuell in die Playoffs einziehen würden). Die Teams werden wiederum durch die Spieler bewertet.
  3. Jedem Team habe ich die fünf Spieler der Starting Lineup zugewiesen. Hier wollte ich die Korrelation von durchschnittlicher Spielzeit (MIN) und Effizienz (EFF) darstellen. Je mehr Spielzeit, desto größer das Viereck. Umso eine höhere EFF, desto blauer das Viereck.
Mein Resultat sieht vorerst so aus (auf Result klicken - im Treamap ist Linksklick = vor, Rechtsklick = zurück): 




Dabei bestehen noch einige Probleme. Der Mousovereffekt muss noch optimiert werden (Beschriftung). Komfortabel wäre es natürlich auch, die Daten als JSON-Datei einzubinden. Als Child-Elemente von den Spielern wollte ich noch weitere Statistiken anfügen, die ich schon angefangen habe vorzubereiten:

      ['Points',    'Harrison Barnes',            10.5,                              9.1],
          ['Rebounds',    'Harrison Barnes',            5.6,                              9.1],
          ['Assists',    'Harrison Barnes',            1.4,                              9.1],
       
          ['Points',    'Andrew Bogut',            6.2,                              11.3],
          ['Rebounds',    'Andrew Bogut',            8,                              11.3],
          ['Assists',    'Andrew Bogut',            2.6,                              11.3],
       
          ['Points',    'Stephen Curry',            23.3,                              17.8],
          ['Rebounds',    'Stephen Curry',            4.3,                              17.8],
          ['Assits',    'Stephen Curry',            7.9,                              17.8],
       
          ['Points',    'Draymond Green',            11.8,                              11.3],
          ['Rebounds',    'Draymond Green',            8.1,                              11.3],
          ['Assists',    'Draymond Green',            3.6,                              11.3],
       
          ['Points',    'Klay Thompson',            21.9,                              12.7],
          ['Rebounds',    'Klay Thompson',            3.2,                              12.7],
          ['Assists',    'Klay Thompson',            2.9,                              12.7],
       
          ['Points',    'Tony Allen',            8.7,                              8.7],
          ['Rebounds',    'Tony Allen',            4.4,                              8.7],
          ['Assists',    'Tony Allen',            1.4,                              8.7],

Leider ist das so nicht möglich, da identische Children nicht auf unterschiedliche Parents zugreifen können. Eine Lösung hierzu ist mir bisher noch nicht eingefallen. Ich werde aber daran arbeiten und Neuigkeiten wieder hier berichten.

Keine Kommentare:

Kommentar veröffentlichen