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.
É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.
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).
C'est OK si vous attrapez les trois suivants.
** 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) **
** Il est juste pour le frappeur de "ne pas sortir" et "d'aller à la base précédente"! ** **
** Les lanceurs et les joueurs de terrain doivent "prendre autant de retraits que possible" et "ne pas laisser l'adversaire viser la base avant"! ** **
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)
Enfin, le sujet de la programmation est là (attendez-moi).
Utilisons réellement Python.
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)
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 le notebook Jupyter.
> $ jupyter notebook
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
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.
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.
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.
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.
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)
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
OPS
BB/K
Il y a aussi K / BB, qui est l'opposé de BB / K, alors jetons un coup d'œil là aussi.
** 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).
Voici un résumé des extraits que j'ai écrits par fragments.
Principalement ce que je veux dire Main (expérimenté)
** Pourquoi n'est-ce pas lié à Hanshin! ** **
... demain, kimihiro_n, merci!
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