[Python] Yuriko Koike Calculez le nombre de votes dont vous avez besoin [matplotlib]

Aperçu

L'élection du gouverneur de Tokyo a eu lieu, mais le rapport préliminaire de Yuriko Koike est sorti assez tôt. Soudain, je me suis dit: "Combien de votes dois-je ouvrir?", Je vais donc donner une estimation approximative. La première chose à savoir est que ** le nombre de votes requis pour obtenir le bon résultat dépend de la proximité du jeu **. S'il y a des gens qui ont massivement remporté le nombre de voix, il semble que ce sera décidé immédiatement, et si la 1ère et la 2ème place sont proches, je pense que l'on peut imaginer que vous ne le saurez que si vous ouvrez beaucoup de votes. Cette fois, compte tenu de l'élection du gouverneur de Tokyo tenue en juillet 2020, nous nous concentrerons sur Yuriko Koike (1ère place) et Kenji Utsunomiya (2ème place).

Voir les meilleurs résultats

Jetons maintenant un œil aux résultats. Je me suis référé à la page suivante. https://www3.nhk.or.jp/news/html/20200705/k10012497581000.html En regardant cela, il semble que Yuriko Koike à la 1ère place soit à environ 60%, et Kenji Utsunomiya à la 2ème place à environ 15%.

Trouvez l'intervalle de confiance à l'aide des statistiques

Qu'est-ce que «** correct **» en premier lieu? Pensons à partir de ce point. Pour le déterminer, nous devons considérer l '"erreur" ou "l'intervalle de confiance". Par exemple, si vous ouvrez 100 votes sur le total et que Yuriko Koike a 60 votes, vous pouvez voir que "Yuriko Koike est d'environ 60%." Cependant, il est dangereux de décider exactement 60% avec cela seul. Si tous les votes sont ouverts, cela peut en fait être un peu plus de 62%, ou 59%. Lorsqu'il est décidé qu'il sera compris entre 59 et 61%, nous disons «60% d'erreur ± 1%». C'est un style d'écriture que vous pouvez apprendre même en mathématiques à l'école élémentaire. En revanche, s'il s'agit d'une méthode utilisant une méthode appelée test statistique Nous disons: "Il y a 95% de chances que le taux de vote de Yuriko Koike soit compris entre 59 et 61%". À l'heure actuelle, la section 59-61 est appelée la section de confiance. Cette fois, j'ai implémenté cela en Python. Si l'intervalle de confiance est de XX% et que le taux de vote est de r% suite à l'ouverture de N votes, les limites supérieure et inférieure de l'intervalle de confiance peuvent être obtenues par la méthode suivante. Je vais laisser les formules détaillées pour le moment, mais comme elles peuvent être tirées de presque tous les manuels de statistiques, je pense que ceux qui sont intéressés approfondiront leur compréhension des statistiques. Par exemple, les sites suivants peuvent être utiles:

def getR(r, N):
    """
    return:Confiance x%Limites inférieure et supérieure du taux de vote en,Renvoie dans l'ordre de la limite inférieure et de la limite supérieure
    r:Taux de vote calculé à partir du résultat des votes d'ouverture
    N:Nombre de votes ouverts
Intervalle de confiance(x)Comment décider
    k = 1.96 :Intervalle de confiance 95%dans le cas de
    k = 2.58 :Intervalle de confiance 99%dans le cas de
    k = 3.29 :Intervalle de confiance 99.9%dans le cas de
    """
    k = 3.29 #99.9%
    #Limites inférieure et supérieure
    lower_limit = r - k * math.sqrt(r*(1-r)/N)
    upper_limit = r + k * math.sqrt(r*(1-r)/N)
    return lower_limit, upper_limit

Essayez de visualiser avec matplotlib

Maintenant que nous avons défini la fonction en Python, visualisons-la. Tracons le taux de vote approximatif et la section de confiance de Yuriko Koike (Yuriko) et Kenji Utsunomiya (Kenji). Regardons l'axe horizontal comme le nombre de votes à ouvrir. Le taux de vote moyen est fixé à Yuriko Koike "0,6" et Kenji Utsunomiya "0,15" quel que soit le nombre de votes ouverts. (À l'origine, cette valeur devrait changer à chaque fois qu'un vote est ouvert, mais il n'y a aucun moyen de le savoir ...) Eh bien, ça ne devrait pas être si loin. L'intervalle de confiance est généralement calculé dans le cas de 95%, mais calculons-le à 99,9%. C'est juste "gagnant ** confirmé **", donc c'est un peu effrayant de le supprimer avec une chance de 5%. Vous pouvez facilement changer le pourcentage de ceci en changeant la valeur de k avec la fonction définie ci-dessus. À propos, la valeur de ce «k» est extraite de la table de distribution normale standard. https://www.koka.ac.jp/morigiwa/sjs/standard_normal_distribution.htm

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

#Taux de vote approximatif
yuriko_rate = 0.6
kenji_rate = 0.15

yuriko_upper = []
yuriko_lower = []
kenji_upper = []
kenji_lower = []

#100 personnes jusqu'à 1000 personnes
N_open = [i for i in range(100,1000, 100)]
for n_open in N_open:
    yuriko_lower.append( getR(yuriko_rate, n_open)[0])
    yuriko_upper.append( getR(yuriko_rate, n_open)[1])
    kenji_lower.append(  getR(kenji_rate, n_open) [0])
    kenji_upper.append(  getR(kenji_rate, n_open) [1])

yuriko_upper = np.array(yuriko_upper)
yuriko_lower = np.array(yuriko_lower)
yuriko_mean = (yuriko_lower + yuriko_upper) / 2
kenji_upper = np.array(kenji_upper)
kenji_lower = np.array(kenji_lower)
kenji_mean = (kenji_lower + kenji_upper) / 2

plt.plot(N_open, yuriko_mean,
         color='blue', marker='o',
         markersize=5, label='Yuriko')

plt.fill_between(N_open,
                 yuriko_upper,
                 yuriko_lower,
                 alpha=0.15, color='blue')

plt.plot(N_open, kenji_mean,
         color='green', linestyle='--',
         marker='s', markersize=5,
         label='Kenji')

plt.fill_between(N_open,
                 kenji_upper,
                 kenji_lower,
                 alpha=0.15, color='green')

plt.grid()
plt.xlabel('Number of votes')
plt.ylabel('Rates')
plt.legend(loc='upper right')
plt.ylim([0., 1.0])
plt.tight_layout()
plt.show()

Le résultat de sortie est le suivant. La limite inférieure de Yuriko est supérieure à la limite supérieure de Kenji lorsque seulement 100 votes sont ouverts, malgré le fait que la section de confiance est de 99,9%, ce qui est assez strict. Lorsque la valeur sur l'axe horizontal augmente, la précision augmente, donc cette section converge également, mais vous pouvez voir que Yuriko est confirmé pour gagner avec un petit nombre de votes.

yuriko1.png

Voyons ce qui se passe si Yuriko et Kenji sont un peu plus proches. Cette fois, au moment du rapport préliminaire, Yuriko était à 60% et Kenji à 15%, ce qui était une victoire écrasante pour Yuriko.

yuriko2.png

En regardant le graphique, même lorsque 1000 votes sont ouverts, les sections de confiance des deux personnes se chevauchent. Cela montre que même si Yuriko a plus de voix que Kenji à la suite de l'ouverture de 1000 votes, cela n'est toujours pas statistiquement suffisant.

Conclusion

Lors de l'élection du gouverneur de Tokyo cette fois, il a été rapporté que Yuriko Koike avait été élu assez tôt, mais compte tenu de la différence de taux de vote entre la 1ère et la 2ème place, on peut voir que le nombre de votes requis est assez faible. Il y a des gens dans le monde qui disent: "Les résultats des élections ne peuvent pas sortir si vite! C'est une élection injuste! Combien de personnes pensez-vous qu'il y a!", Mais ce sont ces gens qui étudient les statistiques. Je veux que tu le fasses. Le libellé que j'ai vu sur Twitter auparavant et j'étais convaincu «Dois-je tout boire pour goûter la soupe miso? C'est. Vous pouvez dire si la soupe miso est salée en goûtant une bouchée, non? Peu importe le nombre de citoyens, il n'est pas nécessaire d'ouvrir tous les votes pour envoyer le bon bulletin.

point important

Le calcul ci-dessus contient une hypothèse importante. Autrement dit, ** il n'y a pas de parti pris dans les votes ouverts **. Par exemple, même si vous ouvrez les mêmes 100 votes, le résultat correct ne sera pas obtenu s'il y a un biais tel que "ouvrir les votes des votes locaux de Kenji Utsunomiya" ou "ouvrir les votes seulement dans les années 20". Il est difficile d'éliminer complètement le biais, mais il doit être extrait au hasard pour le réduire autant que possible. Compte tenu d'un tel biais, le nombre de votes réellement requis pour ce rapport préliminaire peut être un peu plus élevé, mais comme vous pouvez le voir sur la figure ci-dessus, il y a une différence significative même avec 100 votes, donc dans tous les cas, il n'est pas nécessaire d'ouvrir autant de votes. Faisons le. Pour expliquer le biais avec l'exemple de la soupe miso, après avoir mis le miso dans de l'eau chaude avec du dobon, ** si vous ne le remuez pas correctement, la même bouchée peut être très salée ou insipide **. Mélangez autant que possible pour uniformiser avant la dégustation, non? Le vote et les dernières nouvelles sont les mêmes.

prime

C'est un peu avancé, mais les limites inférieure et supérieure de l'intervalle de confiance apparaissant dans le getR () ci-dessus

lower_limit = r - k * math.sqrt(r*(1-r)/N)
upper_limit = r + k * math.sqrt(r*(1-r)/N)

Je voudrais aborder la dérivation de. Convertissez le code en formule. Soit R le vrai taux de vote (lorsque tous les votes sont ouverts) L'intervalle de confiance est multiplié par (limite inférieure) <R <(limite supérieure). En d'autres termes

r - k\sqrt{r(1-r)/N}<R<r + k\sqrt{r(1-r)/N}

Peut être écrit. Je vais le transformer un peu.

- k\sqrt{r(1-r)/N}< R-r < k\sqrt{r(1-r)/N} \\
- k< \frac{R-r}{\sqrt{r(1-r)/N}} < k

Peut être écrit. Considérez la signification de cette formule. "Entre -k et k" a du sens. Ce k est tiré de la ** table de distribution normale standard **, comme mentionné un peu plus haut. La distribution normale standard représente une distribution normale avec une valeur moyenne de 0 et une variance (= σ ^ 2) de 1. En d'autres termes, ce k tombe-t-il dans l'intervalle de confiance x% dans la distribution normale standard lorsque la valeur sur l'axe horizontal est à l'intérieur? C'est un calcul de cela. En d'autres termes, en regardant la formule ci-dessus

\frac{R-r}{\sqrt{r(1-r)/N}}

Suivra la distribution normale standard. Tu peux voir ça. Voyons maintenant si cette valeur suit vraiment la distribution normale standard. En général, si la variance est σ ^ 2, la valeur attendue μ et la valeur observée X, la formule suivante suit la distribution normale standard.

\frac{X-\mu}{\sigma}

À propos, la distribution normale est symétrique, donc les molécules sont les mêmes même si elles sont remplacées. Compte tenu de cela, r de R-r correspond au taux de vote lorsque le vote est ouvert au milieu (seulement N votes), et R correspond à μ-X tel quel car c'est le vrai taux de vote. Alors la partie √r (1-r) / N restante semble correspondre à σ. Laissez-nous guider cela aussi.

La distribution en répétant les deux choix de "si le vote divulgué est Yuriko Koike" peut être considérée comme une distribution binomiale. En général, la moyenne et la variance d'une distribution binomiale sont

\mu = r \\
\sigma^2 = r(1-r)

Peut être exprimé comme. r est la probabilité de succès d'une tentative. Dans ce cas, cela correspond à "la probabilité que le vote ouvert soit Yuriko Koike". Cette fois, nous calculerons la dispersion à l'ouverture de N votes. Généralement, la variance en fonction de la valeur moyenne (erreur standard) peut être calculée par σ / √N. Donc dans ce cas

\sqrt{r(1-r)/N}

Et cela correspondait à la formule ci-dessus. De ce qui précède

\frac{R-r}{\sqrt{r(1-r)/N}}

Est dérivée pour suivre la distribution normale standard, et la définition montre que l'intervalle de confiance peut être calculé avec -k <R <k.

Recommended Posts

[Python] Yuriko Koike Calculez le nombre de votes dont vous avez besoin [matplotlib]
Calculez le nombre total de combinaisons avec python
Calculez le nombre de changements
[Python] Calculez le nombre de chiffres requis lors de la saisie de 0 [Note]
Sortie du nombre de cœurs de processeur en Python
Code pour vérifier le fonctionnement de Python Matplot lib
[Python] Un programme qui compte le nombre de vallées
Comment obtenir le nombre de chiffres en Python
[Python] Calculez la valeur moyenne de la valeur de pixel RVB de l'objet
Calcul du nombre minimum de voix requis à partir du taux de vote
Calculer le coefficient de régression d'une analyse de régression simple avec python
Obtenir la taille (nombre d'éléments) de Union Find en Python
[Python] Obtenez le nombre de vues de tous les articles publiés
[Introduction à Python] Utilisation basique de la bibliothèque matplotlib
Combien connaissez-vous les bases de Python?
le zen de Python
Installation de matplotlib (Python 3.3.2)
Calculez des millions de chiffres dans la racine carrée de 2 avec python
Obtenez le nombre d'éléments spécifiques dans la liste python
Python --Trouvez le nombre de groupes dans l'expression regex
[Homologie] Comptez le nombre de trous dans les données avec Python
Visualisons le nombre de personnes infectées par le virus corona avec matplotlib
10. Compter le nombre de lignes
Vers la retraite de Python2
Obtenez le nombre de chiffres
Changer le style de matplotlib
À propos des fonctionnalités de Python
Le pouvoir des pandas: Python
Comptez bien le nombre de caractères thaïlandais et arabes en Python
Obtenez le nombre de PV d'articles Qiita que vous avez publiés avec l'API
[Python] Réduisons le nombre d'éléments dans le résultat dans le fonctionnement de l'ensemble
Astuces: [Python] Calculez la valeur moyenne de la zone spécifiée avec bedgraph
Obtenez le nombre de lecteurs d'articles sur Mendeley en Python