[PYTHON] [Pour les débutants] Statistiques de baseball dont on peut se souvenir en 33 minutes et 4 secondes et PyData ~ avec Yojima Steel

C'est amusant, je poêle ligue Bonjour!

Dans cette entrée, je voudrais présenter un exemple de statistiques de baseball "Sabre Metrics" utilisant le baseball professionnel que tout le monde aime et les pandas et d'autres qui sont populaires dans les rues récemment et sont également utilisés à la fois pour le travail et les loisirs.

De plus, cet article est Calendrier de l'Avent Python 2016 article de 12/4 minutes & ** Jusqu'à ce que vous lisiez l'article, copiez le code et le déplaciez Le temps requis pour est supposé être d'environ 33 minutes et 4 secondes. **

Starting Menmber

De plus, cet article a écrit dans le passé "Voyons à quel point le frappeur Shohei Otani est incroyable avec seulement quelques lignes de code Python »Est nouvellement transcrit du point de vue de la programmation Python et des statistiques de baseball.

Auto-introduction

Mesures Sabre à comprendre en 10 minutes (statistiques de baseball)

Écrivez du code Python et analysez les frappeurs! Avant ..., j'aimerais vous présenter les métriques Light Saber.

Si vous l'écrivez correctement, cela ne se terminera pas même si cela prend une journée entière, donc je ne présenterai que les points nécessaires à Hack à l'avenir.

Qu'est-ce que les métriques Sabre?

Ceci est une citation de Wikipedia (Saber Metrics).

Sabermetrics (SABRmetrics, Sabermetrics) est une méthode analytique qui analyse objectivement les données d'un point de vue statistique dans le ** baseball et considère les évaluations et les stratégies des joueurs. ** **

Hit rate / hit point / home run, victoire, taux de défense, erreur etc ... Il existe différents indicateurs dans le baseball, mais une fois ceux-ci mis de côté, un indice d '«analyse objective» est créé sur la base de l' «hypothèse». , La méthode d'analyse «Penser l'évaluation / stratégie des joueurs» et son idée sont Sabre Metrics.

Les indicateurs sont créés en utilisant pleinement les données existantes (données de score telles que les sièges, les coups sûrs, les lancers de manches, etc.) et les données détaillées des capteurs capturées par les pistolets de vitesse et les caméras / radars.

Cette fois, nous utiliserons les données de score (les données des capteurs n'existent pas beaucoup sur le Web en premier lieu).

Idée de base des métriques Sabre

C'est OK si vous attrapez les trois suivants.

  1. ** Le taux de victoire est de 50% lorsque la différence de buts de l'équipe est de zéro (taux de victoire de Pitagolas) **

  2. ** Il est juste pour le frappeur de "ne pas sortir" et "d'aller à la base précédente"! ** **

  3. ** Les lanceurs et les joueurs de terrain doivent "prendre autant de retraits que possible" et "ne pas laisser l'adversaire viser la base avant"! ** **

  4. a l'idée du "[taux de victoire de Pitagolas](https://ja.wikipedia.org/wiki/Pitagolas taux de victoire)", et cette prédiction du taux de victoire est la base de toutes les statistiques de baseball.

** Si l'objectif est zéro, il y a une possibilité élevée de 50%, plus l'épargne, moins est probablement la dette, je suppose. **

De plus, le baseball continuera d'attaquer à moins que vous n'obteniez trois retraits, donc

Doit être chéri! Vous pouvez voir la ligne directrice.

(Il existe différentes théories et j'admets mon désaccord) Les métriques de Sabre évitent les «jeux avec un risque élevé d'être absent», comme le sacrifice de bunts et le vol de bases.

Je veux en savoir un peu plus! Pour ceux qui disent, Article expliqué en 30 minutes (Ceci est mon article passé et présente le contexte et les cas d'utilisation simples Veuillez vous référer à ceci car il y a (Stemme)

Jetez un coup d'œil aux caractéristiques du frappeur avec Python + Pandas en 20 minutes

Enfin, le sujet de la programmation est là (attendez-moi).

Utilisons réellement Python.

Choses à faire

Préparation préalable

Cet article est

Je vais expliquer sur la prémisse de (j'espère que vous pourrez le lire en fonction de votre propre environnement)

& Des extraits de code fragmentés apparaîtront, mais je publierai également le dernier.

(Pour le dire clairement, si vous copiez le dernier, vous devriez pouvoir l'imiter)

Installation de la bibliothèque

Cette fois, écrivez le code avec la configuration suivante.

Si vous utilisez pip, il suffit d'exécuter cette ligne (veuillez bien la lire pour des personnes comme anaconda).

> $ pip install ipython pandas beautifulsoup4 numpy lxml html5lib jupyter matplotlib seaborn

Démarrez l'environnement

Démarrez le notebook Jupyter.

> $ jupyter notebook

Acquisition et nettoyage des trames de données (pré-traitement)

Importation de bibliothèque, etc.

Puisque j'écrirai un graphique, j'écrirai une fonction magique (celle qui commence par%) et importer des pandas.

À propos, spécifiez le nombre de colonnes et de lignes à afficher dans le bloc-notes pour faciliter le débogage ultérieur.

%matplotlib inline
import pandas

#Augmenter l'affichage des colonnes / lignes(30 rangs,10 lignes)

pandas.options.display.max_columns = 30
pandas.options.display.max_rows = 10

Obtenir le cadre de données

Obtenez-le avec la méthode read_html de pandas.

Au verso, j'utilise beautifulsoup, html5lib, etc. pour gratter la balise Table.

url = 'http://npb.jp/bis/players/21825112.html'  #HP de Yojima Steel(npb.jp)
df = pandas.io.html.read_html(url)  #Gratter l'étiquette de table! Liste des df(Le contenu est des pandas.core.frame.Objet DataFrame)Reviendra avec

Il y a plusieurs tableaux sur cette page, alors découvrez quelle ligne correspond au score de réussite.

Si vous dites la réponse en premier, index = 3 (4ème ligne) est le résultat du hit.

Peut-être que cela arrivera.

FireShot Capture 4 - yo_daikan - http___localhost_8888_notebooks_yo_daikan.ipynb.png

Prétraitement

Sélectionnez la table requise parmi plusieurs tables de la page et nettoyez le type de données, etc. pour un traitement ultérieur facile.

#Supprimer les données inutiles et passer à un autre bloc de données(index et,Résultats avant 2010&total)
atbats = df[3].drop([0, 1, 2, 3,4, 11])

De plus, comme la colonne de ces données est index (la colonne japonaise réelle est traitée comme des données), rajoutez la colonne.

Le japonais est correct, mais je recommande personnellement l'abréviation pour l'anglais de baseball (je pense que c'est familier à ceux qui regardent MLB).

De plus, comme le type de données est également un objet ordinaire (il ne change pas le type de données comme read_csv), je vais spécifier le type correctement.

#Donnez un nom de colonne(Abréviation anglaise de baseball)
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']

#Prétraitez chaque colonne
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)

Si vous pouvez l'amener à cet état, il est temps pour la visualisation amusante et le calcul d'index.

FireShot Capture 5 - yo_daikan - http___localhost_8888_notebooks_yo_daikan.ipynb.png

Temps d'analyse!

Tout d'abord, essayez de représenter graphiquement les indicateurs

Ici, nous utilisons seaborn.

Voyons la transition du taux au bâton de 2011 à 2016.

#Dessinez un graphique(à seaborn)
import seaborn as sns

#moyenne au bâton(ba, batting average)Vers un graphique de ligne de pliage
sns.pointplot(x="year", y="ba", data=atbats)

Je suis sûr que vous verrez un graphique comme celui-ci.

ダウンロード.png

Vous pouvez voir que les chiffres pour 2015 ont chuté.

Cette année a été l'année de la pire performance en raison de blessures pendant la saison, en plus des épaules et des cuisses blessées depuis 2014 (de ma mémoire et Wikipedia).

Il y a d'autres données, donc si vous êtes intéressé, veuillez faire un graphique et jouer avec.

De plus, il est bon de consulter le site officiel pour savoir comment utiliser seaborn.

document officiel seaborn

Enfin, dans le monde de Sabre Metrics! !! !!

Cette fois, je vais contester avec un simple index.

OPS(On the base Plus Slugging) Saisissez la puissance d'attaque brute en ajoutant le taux de base + le taux de frappe long, la capacité de ne pas sortir (taux de base) et la capacité d'avancer à la base (taux de frappe long)

BB/K(Base on Balls per Strike out)

code

Cela peut être fait par quatre règles de fonctionnement entre les trames de données.

#OPS et BB/Calculer K

atbats['ops'] = atbats['obp'] + atbats['slg'] # OPS
atbats['bb_k'] = atbats['bb'] / atbats['so'] # BB/K

Cliquez ici pour les résultats!

OPS

FireShot Capture 6 - yo_daikan - http___localhost_8888_notebooks_yo_daikan.ipynb.png

BB/K

FireShot Capture 7 - yo_daikan - http___localhost_8888_notebooks_yo_daikan.ipynb.png

Considération

Relancez le défi! ~ Combien de balançoires à chaque fois que vous en choisissez une

Il y a aussi K / BB, qui est l'opposé de BB / K, alors jetons un coup d'œil là aussi.

FireShot Capture 8 - yo_daikan - http___localhost_8888_notebooks_yo_daikan.ipynb.png

** Vous pouvez voir que le Yojima Steel de cette année se balançait environ 3 fois par 4 balles. **

Même si ce n'est pas aussi mauvais que 6,09 en 2011 et 4,42 en 2015, K / BB doit être compris entre 1,5 et 2,0.

** Type de frappeur n ° 1 en termes de FPO, mais plus de grèves que de chances d'obtenir sur la base **

Cela semble être une sensation douloureuse.

Les Hokkaido Nippon Ham Fighters sont une équipe qui examine les données de manière très détaillée (bien qu'il soit un mystère de recommander des caries sacrificielles), et il semble possible que la détérioration des chiffres dans ce domaine ait conduit à FA (en fait des chiffres plus détaillés et ici). La défense qui ne peut pas être exprimée est également affectée).

Résumé (3 minutes 4 secondes)

Cet extrait de code (1 minute)

Voici un résumé des extraits que j'ai écrits par fragments.

Sauvons l'acier positif

Impressions et ce que je veux dire (2 minutes)

Au sens Python (ou PyData)

Principalement ce que je veux dire Main (expérimenté)

Au sens du baseball (ou des métriques d'épargne)

Un dernier mot (4 secondes)

** Pourquoi n'est-ce pas lié à Hanshin! ** **

... demain, kimihiro_n, merci!

[Bonus] Livre de référence (baseball)

Pour ceux qui souhaitent en savoir plus sur Sabre Metrics.

Je me demande s'il n'y a aucun doute si cette zone est supprimée!

Recommended Posts

[Pour les débutants] Statistiques de baseball dont on peut se souvenir en 33 minutes et 4 secondes et PyData ~ avec Yojima Steel
Comprendre les probabilités et les statistiques qui peuvent être utilisées pour la gestion des progrès avec un programme python
Enregistrement d'image ANT qui peut être utilisé en 5 minutes
Analyse morphologique et tfidf (avec code de test) pouvant être effectuée en 1 minute environ
J'ai acheté et analysé la loterie jumbo de fin d'année avec Python qui peut être exécutée dans Colaboratory
Créez une Spinbox qui peut être affichée en binaire avec Tkinter
Créez une Spinbox pouvant être affichée dans HEX avec Tkinter
J'ai écrit un tri-arbre qui peut être utilisé pour l'implémentation de dictionnaire à grande vitesse en langage D et Python
[Peut être fait en 10 minutes] Créez rapidement un site Web local avec Django
Optimisation mathématique pour un travail gratuit avec Python + PuLP
Une histoire que heroku, qui peut se faire en 5 minutes, a en fait duré 3 jours
Notes pour créer des figures pouvant être publiées dans des revues avec matplotlib
Programme d'installation facile et programme de mise à jour automatique pouvant être utilisé dans n'importe quelle langue