Es macht Spaß, ich Herd Liga Hallo!
In diesem Beitrag möchte ich ein Beispiel für die Baseballstatistik "Sabre Metrics" mit professionellem Baseball vorstellen, die jeder liebt und Pandas und andere, die auf der Straße beliebt sind und die ich auch für Arbeit und Hobbys verwende.
Außerdem ist dieser Artikel Python Adventskalender 2016 12/4 Minuten Artikel & ** Bis Sie den Artikel gelesen und den Code kopiert und verschoben haben Die dafür benötigte Zeit wird mit ca. 33 Minuten und 4 Sekunden angenommen. **
Starting Menmber
Darüber hinaus wurde dieser Artikel in der Vergangenheit geschrieben. "Mal sehen, wie erstaunlich der Schlagmann Shohei Otani mit nur wenigen Zeilen Python-Code ist ”Wird aus Sicht der Python-Programmierung und der Baseball-Statistik neu transkribiert.
Schreiben Sie Python-Code und analysieren Sie die Hitter! Vorher möchte ich Ihnen die Light Sabre Metrics vorstellen.
Wenn Sie es richtig schreiben, wird es nicht enden, selbst wenn es einen ganzen Tag dauert, also werde ich in Zukunft nur die Punkte vorstellen, die für Hack notwendig sind.
Dies ist ein Zitat aus Wikipedia (Sabre Metrics).
Sabermetrics (SABRmetrics) ist eine Analysemethode, die Daten im Baseball unter statistischen Gesichtspunkten objektiv analysiert und Spielerbewertungen und -strategien berücksichtigt. ** ** **
Trefferquote / Trefferpunkt / Homerun, Sieg, Verteidigungsquote, Fehler usw. Es gibt verschiedene Indikatoren im Baseball, aber sobald diese beiseite gelegt werden, wird ein Index für die "objektive Analyse" basierend auf der "Hypothese" erstellt. , Die Analysemethode "Über die Bewertung / Strategie der Spieler nachdenken" und ihre Idee sind Sabre Metrics.
Indikatoren werden erstellt, indem vorhandene Daten (Punktedaten wie Sitze, Treffer, Innings usw.) und detaillierte Sensordaten, die von Geschwindigkeitskanonen und Kameras / Radargeräten erfasst werden, vollständig genutzt werden.
Dieses Mal werden wir Score-Daten verwenden (Sensordaten existieren im Web überhaupt nicht viel).
Es ist in Ordnung, wenn Sie die folgenden drei fangen.
** Die Gewinnquote beträgt 50%, wenn die Tordifferenz des Teams Null beträgt (Pitagolas-Gewinnquote) **
** Es ist gerecht für den Teig, "nicht rauszugehen" und "zur vorherigen Basis zu gehen"! ** ** **
** Pitchers & Fielder sollten "so viele Outs wie möglich machen" und "den Gegner nicht auf die vordere Basis zielen lassen"! ** ** **
hat die Idee von "[Pitagolas Gewinnrate](https://ja.wikipedia.org/wiki/Pitagolas Gewinnrate)", und diese Gewinnratenvorhersage ist die Grundlage aller Baseballstatistiken.
** Wenn das Ziel Null ist, 50%, plus ist eine Ersparnis, minus ist eine hohe Wahrscheinlichkeit der Verschuldung. **
Außerdem wird Baseball weiterhin angreifen, es sei denn, Sie erhalten drei Outs
Sollte geschätzt werden! Sie können die Richtlinie sehen.
(Es gibt verschiedene Theorien und ich gebe Uneinigkeit zu.) Sabre-Metriken vermeiden "Spiele mit einem hohen Risiko, draußen zu sein", wie das Opfer von Bunts und den Diebstahl von Basen.
Ich möchte ein bisschen mehr wissen! Für diejenigen, die sagen, Artikel in 30 Minuten erklärt (Dies ist mein früherer Artikel und stellen den Hintergrund und einfache Anwendungsfälle vor Bitte beziehen Sie sich darauf, weil es (Stemma) gibt
Endlich ist das Thema Programmierung da (warte auf mich).
Lassen Sie uns tatsächlich Python verwenden.
Dieser Artikel ist
Ich werde unter der Prämisse erklären (ich hoffe, Sie können es entsprechend Ihrer eigenen Umgebung lesen)
& Fragmentierte Codefragmente werden angezeigt, aber derjenige, der sie am Ende zusammengefasst hat, wird ebenfalls veröffentlicht.
(Um es klar auszudrücken: Wenn Sie den letzten kopieren, sollten Sie ihn nachahmen können.)
Schreiben Sie diesmal den Code mit der folgenden Konfiguration.
Wenn Sie pip verwenden, reicht es aus, diese eine Zeile auszuführen (bitte lesen Sie sie gut für Leute wie Anaconda).
> $ pip install ipython pandas beautifulsoup4 numpy lxml html5lib jupyter matplotlib seaborn
Starten Sie das Jupyter-Notizbuch.
> $ jupyter notebook
Da ich ein Diagramm schreibe, schreibe ich eine magische Funktion (die mit% beginnt) und importiere Pandas.
Geben Sie übrigens die Anzahl der Spalten und Zeilen an, die im Notizbuch angezeigt werden sollen, um das spätere Debuggen zu erleichtern.
%matplotlib inline
import pandas
#Erhöhen Sie die Anzeigespalten / -zeilen(30 Reihen,10 Zeilen)
pandas.options.display.max_columns = 30
pandas.options.display.max_rows = 10
Holen Sie es sich mit der Methode read_html von pandas.
Auf der Rückseite verwende ich beautifulsoup, html5lib usw., um das Table-Tag abzukratzen.
url = 'http://npb.jp/bis/players/21825112.html' #Yojima Steel's HP(npb.jp)
df = pandas.io.html.read_html(url) #Schaben Sie das Tabellen-Tag! Liste von df(Der Inhalt sind Pandas.core.frame.DataFrame-Objekt)Ich werde mit zurückkehren
Auf dieser Seite befinden sich mehrere Tabellen. Finden Sie also heraus, in welcher Zeile die Trefferquote liegt.
Wenn Sie zuerst die Antwort sagen, ist Index = 3 (4. Zeile) das Trefferergebnis.
Vielleicht passiert das.
Wählen Sie die gewünschte Tabelle aus mehreren Tabellen auf der Seite aus und bereinigen Sie den Datentyp usw. für eine einfache spätere Verarbeitung.
#Verwerfen Sie Mülldaten und verschieben Sie sie in einen anderen Datenrahmen(Index und,Ergebnisse vor 2010&gesamt)
atbats = df[3].drop([0, 1, 2, 3,4, 11])
Da die Spalte dieser Daten ein Index ist (die tatsächliche japanische Spalte wird als Daten behandelt), fügen Sie die Spalte erneut hinzu.
Japanisch ist in Ordnung, aber ich persönlich empfehle die Abkürzung für Baseball-Englisch (ich denke, es ist denen bekannt, die MLB schauen).
Da der Datentyp auch ein gewöhnliches Objekt ist (er ändert den Datentyp nicht wie read_csv), werde ich den Typ korrekt angeben.
#Geben Sie einen Spaltennamen an(Baseball englische Abkürzung)
atbats.columns = ['year', 'team', 'g', 'pa', 'ab', 'r', 'h', '_2b', '_3b', 'hr', 'tb', 'rbi', 'sb', 'cs', 'sh', 'sf', 'bb', 'hbp', 'so', 'dp', 'ba', 'slg', 'obp']
#Verarbeiten Sie jede Spalte vor
import numpy as np
atbats['year'] = atbats['year'].fillna(0).astype(np.float64)
atbats['g'] = atbats['g'].fillna(0).astype(np.float64)
atbats['pa'] = atbats['pa'].fillna(0).astype(np.float64)
atbats['ab'] = atbats['ab'].fillna(0).astype(np.float64)
atbats['r'] = atbats['r'].fillna(0).astype(np.float64)
atbats['h'] = atbats['h'].fillna(0).astype(np.float64)
atbats['_2b'] = atbats['_2b'].fillna(0).astype(np.float64)
atbats['_3b'] = atbats['_3b'].fillna(0).astype(np.float64)
atbats['hr'] = atbats['hr'].fillna(0).astype(np.float64)
atbats['tb'] = atbats['tb'].fillna(0).astype(np.float64)
atbats['rbi'] = atbats['rbi'].fillna(0).astype(np.float64)
atbats['sb'] = atbats['sb'].fillna(0).astype(np.float64)
atbats['cs'] = atbats['cs'].fillna(0).astype(np.float64)
atbats['sh'] = atbats['tb'].fillna(0).astype(np.float64)
atbats['sf'] = atbats['sf'].fillna(0).astype(np.float64)
atbats['bb'] = atbats['bb'].fillna(0).astype(np.float64)
atbats['hbp'] = atbats['hbp'].fillna(0).astype(np.float64)
atbats['so'] = atbats['so'].fillna(0).astype(np.float64)
atbats['dp'] = atbats['dp'].fillna(0).astype(np.float64)
atbats['ba'] = atbats['ba'].fillna(0).astype(np.float64)
atbats['slg'] = atbats['slg'].fillna(0).astype(np.float64)
atbats['obp'] = atbats['obp'].fillna(0).astype(np.float64)
Wenn Sie es in diesen Zustand bringen können, ist es Zeit für eine unterhaltsame Visualisierung und Indexberechnung.
Hier verwenden wir Seaborn.
Lassen Sie uns den Übergang der Schlagrate von 2011 auf 2016 sehen.
#Zeichnen Sie ein Diagramm(bei seaborn)
import seaborn as sns
#Schlagdurchschnitt(ba, batting average)Zu einem Faltliniendiagramm
sns.pointplot(x="year", y="ba", data=atbats)
Ich bin sicher, Sie werden eine Grafik wie diese sehen.
Sie können sehen, dass die Zahlen für 2015 gesunken sind.
Dieses Jahr war das Jahr mit der schlechtesten Leistung aufgrund von Verletzungen während der Saison, zusätzlich zu den verletzten Schultern und Oberschenkeln seit 2014 (aus meiner Erinnerung und Wikipedia).
Es gibt einige andere Daten. Wenn Sie also interessiert sind, erstellen Sie bitte eine Grafik und spielen Sie damit.
Darüber hinaus ist es gut, auf der offiziellen Website nachzusehen, wie man Seaborn benutzt.
offizielles Dokument für Seeleute
Dieses Mal werde ich mit einem einfachen Index herausfordern.
OPS(On the base Plus Slugging) Erfassen Sie die grobe Angriffskraft, indem Sie die Basisrate + die lange Trefferquote, die Fähigkeit, nicht auszugehen (Basisrate) und die Fähigkeit, zur Basis vorzurücken (lange Trefferquote), addieren.
BB/K(Base on Balls per Strike out)
Dies kann durch vier Betriebsregeln zwischen Datenrahmen erfolgen.
#OPS und BB/Berechne K.
atbats['ops'] = atbats['obp'] + atbats['slg'] # OPS
atbats['bb_k'] = atbats['bb'] / atbats['so'] # BB/K
OPS
BB/K
Es gibt auch K / BB, was das Gegenteil von BB / K ist, also schauen wir uns das auch an.
** Sie können sehen, dass Yojima Steel in diesem Jahr ungefähr dreimal pro 4 Bälle geschwungen hat. **
Wenn K / BB nicht in 1.5-2.0 passt, wenn nicht so schlecht wie 6.09 im Jahr 2011 und 4.42 im Jahr 2015,
** Nr. 1 Schlagart in Bezug auf OPS, aber mehr Treffer als Chancen, auf die Basis zu kommen **
Es scheint ein schmerzhaftes Gefühl zu sein.
Die Hokkaido Nippon Ham Fighters sind ein Team, das die Daten sehr detailliert betrachtet (obwohl es ein Rätsel ist, Opferbunts zu empfehlen), und es scheint möglich, dass die Verschlechterung der Zahlen in diesem Bereich zu FA führte (tatsächlich detailliertere Zahlen & hier). Die Verteidigung, die nicht zum Ausdruck gebracht werden kann, ist ebenfalls betroffen.
Hier ist eine Zusammenfassung der Schnipsel, die ich in Fragmenten geschrieben habe.
Speichern wir den positiven Stahl
Hauptsächlich was ich sagen möchte Main (erfahren)
** Warum hat es nichts mit Hanshin zu tun! ** ** **
... morgen, kimihiro_n, danke!
Für diejenigen, die mehr über Sabre Metrics erfahren möchten.
Ich frage mich, ob es keinen Zweifel gibt, ob dieser Bereich unterdrückt wird!
Recommended Posts