Le modèle de Python x Bradley-Terry visualise la transition des valeurs de force dans les ligues Sepa et Pa

Bradley-Terry's Model Ceci est un modèle de «force». En termes simples, le concept est que chaque «force» peut être quantifiée à partir des résultats du match. Les documents suivants ont été utiles, veuillez donc consulter ici pour plus de détails. Méthode d'évaluation quantitative de la "force" et de son application

Il y a n éléments (équipes et individuels) et une sorte de match est joué. Le match est un match d'un élément à un élément, et le résultat n'est qu'une victoire ou une défaite contre un élément. La "force" de chaque élément est mesurée à partir des résultats de plusieurs batailles. Ici, en supposant que la probabilité que l'élément i gagne l'élément j est Pij, pour toutes les combinaisons, Pij = πi / πi + πj (1) Introduisez πi. L'expression relationnelle de l'équation (1) est appelée le modèle de Bradley-Terry (BT). Dans le modèle BT, πi peut être considéré comme représentant la force de l'élément i.

Référencé

Je me réfère au contenu de la conférence au Data Mining Study Group based on Statistical Processing and Machine Learning # 03 auquel j'ai assisté l'autre jour. Voici une implémentation Python du modèle de Bradley-Terry. (Le nombre attribué à ws est une liste du nombre total de victoires des 6 équipes de la Ligue Se en 2014, à l'exclusion des résultats du jeu d'échange. Pour plus de commodité, le tirage au sort est compté comme 0,5.) Le thêta obtenu ici est la valeur numérique de la "force" de chaque équipe.

import numpy as np
theta = np.ones(6)/6.0 # \valeur initiale thêta
t = np.zeros(6)
r = 24.0 #Nombre de matchs
ws = np.array([66.5, 66.5, 66, 56.5, 55, 50.5])  #Nombre total de victoires
for iloop in range(0, 100):
    for i in range(0,6):
        acc = 0 #Accumulateur pour le total
        for j in range(0,6):
            if (j == i):
                pass
            else:
                acc += r / (theta[i]+theta[j])
        t[i] = ws[i]/acc
    s = sum(t)
    for i in range(0, 6):
        theta[i] = t[i] / s

Transition de force depuis 5 ans

En référence au modèle de Bradley-Terry ci-dessus, j'ai essayé de représenter graphiquement la transition de la Se League sur 5 ans avec matplotlib.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt
import os

theta = np.ones(6) / 6.0
t = np.zeros(6)
r = 24.0

teams = [u"Géant", u"Hanshin", u"Hiroshima", u"Chunichi", u"Yokohama", u"Yakult"]
colors = ["#f27b00", "#ffff00", "#ff0000", "#002468", "#044a90", "#111c3c"]
scores = [[67.5, 68, 48, 68.5, 42.5, 65.5], [66, 61, 57, 66, 43.5, 66.5], [76.5, 51.5, 55.5, 69, 43, 64.5], [74, 62.5, 58.5, 57.5, 55, 51.5], [66.5, 66.5, 66, 56.5, 55, 50.5]]
years = ["2010", "2011", "2012", "2013", "2014"]
points = [[], [], [], [], [], []]


def reset():
    global theta
    theta = np.ones(6) / 6.0

def bradley_terry(ws):
    for iloop in range(0, 100):
        for i in range(0, 6):
            acc = 0
            for j in range(0, 6):
                if i == j:
                    pass
                else:
                    acc += r / (theta[i] + theta[j])
            t[i] = ws[i] / acc
        s = sum(t)
        for i in range(0, 6):
            theta[i] = t[i] / s

if __name__ == '__main__':
    for score in scores:
        reset()
        bradley_terry(score)
        for i in range(0, 6):
            points[i].append(theta[i])

    for i in range(0, 6):
        data = np.loadtxt(points[i])
        plt.plot(
            data,
            linestyle="-",
            color=colors[i],
            label=teams[i],
            linewidth=2
        )

    plt.ylim(0, 0.5)
    X = np.arange(len(years))
    plt.xticks(X, years)
    plt.tick_params(labelleft="off")
    plt.xlabel("Year")
    plt.ylabel("BradleyTerry Rate")
    plt.title("Central League")
    plt.grid(True)
    plt.legend(loc="best")
    plt.rcParams.update({"font.size": 20})
    os.chdir("graph/")
    plt.savefig("central.eps")

    plt.show()

central.png

Il s'est avéré être quelque chose comme ça. ・ Force stable des géants ・ Chunichi, l'épaule droite de Yakult vers le bas ・ Hiroshima et Yokohama se lèvent Je pense que vous pouvez lire ...

Si vous essayez la même chose dans la Pa League, le graphique sera le suivant.

pacific.png

Par rapport au graphique de la Ligue Centrale, il est caractéristique que 6 lignes brisées soient foirées. Vous pouvez souvent exprimer le «pa mixte» qui se produit lorsque la classe AB est complètement remplacée en 2013 et 2014!

Recommended Posts

Le modèle de Python x Bradley-Terry visualise la transition des valeurs de force dans les ligues Sepa et Pa
Vérifier l'existence du fichier avec python
J'ai installé Pygame avec Python 3.5.1 dans l'environnement de pyenv sur OS X
Simulons la transition du taux d'infection par rapport à la densité de population avec python
Préparer l'environnement d'exécution de Python3 avec Docker
Mathématiques Todai 2016 résolues avec Python
[Note] Exportez le html du site avec python.
Calculez le nombre total de combinaisons avec python
Vérifiez la date du devoir de drapeau avec Python
Résolution du modèle Lorenz 96 avec Julia et Python
Convertir le code de caractère du fichier avec Python3
[Python] Déterminez le type d'iris avec SVM
[Blender x Python] Pensez au code avec des symboles
[Python & SQLite] J'ai analysé la valeur attendue d'une course avec des chevaux dans la fourchette 1x win ②
Extraire le tableau des fichiers image avec OneDrive et Python
Apprenez Nim avec Python (dès le début de l'année).
Calculer la somme des valeurs uniques par tabulation croisée des pandas
Détruire l'expression intermédiaire de la méthode sweep avec Python
Visualisez la gamme d'insertions internes et externes avec python
Calculer le coefficient de régression d'une analyse de régression simple avec python
Installez la dernière version stable de Python avec pyenv (à la fois 2 et 3)
Résumé du flux de base de l'apprentissage automatique avec Python
Obtenez l'état de fonctionnement de JR West avec Python
Créer une matrice avec numpy uniquement pour les colonnes dont la valeur totale des éléments des colonnes de la matrice est le X supérieur