Distribution de probabilité de test statistique de niveau 2 apprise en Python

introduction

Lors de l'étude des tests statistiques, diverses distributions de probabilités apparaissent, mais je pense qu'il est difficile d'obtenir une image simplement en regardant les formules mathématiques. Tout en déplaçant divers paramètres avec Python, dessinez la distribution de probabilité et attachez l'image.

référence

Pour l'explication de la distribution de probabilité, reportez-vous à ce qui suit.

Diverses distributions de probabilité

Cet article ne donne pas d'explications détaillées telles que la dérivation de diverses formules mathématiques, mais se concentre sur la compréhension de la forme de chaque distribution et la signification de cette distribution. Cet article traite des deux distributions suivantes.

Distribution binaire

Le nombre d'essais $ n $ réussis (essais de Bernouy) qui n'ont que deux conséquences, par exemple "si le recto ou le verso sort quand une pièce est lancée" La distribution qui suit est appelée distribution binomiale **.

――Le nombre de fois que vous lancez les dés 10 fois et obtenez 1 ――Le nombre de fois où le tableau apparaît lorsque vous lancez une pièce 5 fois ――Le nombre de fois où une équipe de baseball avec un taux de victoire de 70% joue 144 matchs et gagne

Etc. suivent une distribution binomiale.

La formule de la fonction de masse stochastique de la distribution binomiale est exprimée comme suit.


P(X = k) = {}_n C _kp^k(1-p)^{n-k}

$ n $ est le nombre d'essais, $ p $ est la probabilité de succès de l'essai et $ k $ est le nombre d'essais réussis.

De plus, lorsque la variable de probabilité $ X $ suit une distribution binomiale, la valeur attendue $ E (X) $ et la variance $ V (X) $ sont les suivantes.


E(X) = np


V(X) = np(1 - p)

Je pense que la valeur attendue est le produit du nombre d'essais $ n $ et de la probabilité de succès $ p $, ce qui correspond au sentiment.

Maintenant, dessinons une distribution de probabilité en Python. Lorsque vous effectuez 50 $ d'essais avec une probabilité de succès de 10 $ % $, vérifiez la distribution du nombre de succès.

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()

def comb_(n, k):
    result = math.factorial(n) / (np.math.factorial(n - k) * np.math.factorial(k))
    return result


def binomial_dist(p, n, k):
    result = comb_(n, k) * (p**k) * ((1 - p) ** (n - k))
    return result

x =  np.arange(1, 50, 1)

y = [binomial_dist(a, 50, i) for i in x]

plt.bar(x, y, align="center", width=0.4, color="blue", 
             alpha=0.5, label="binomial p= " + "{:.1f}".format(a))

plt.legend()
plt.ylim(0, 0.3)
plt.xlim(0, 50)

plt.show()
plt.savefig('binomial_dist_sample.png')

binomial_dist_sample.png

Puisque la probabilité de succès est de 10 $ % $, vous pouvez voir que la probabilité de succès est toujours la plus élevée pour 4,5 $. Il correspond également que la valeur attendue est $ np = 50 × 0,1 = 5 $. Vous pouvez également voir que les chances de succès au-dessus de 10 $ sont très faibles et 20 $ est un niveau miracle.

Voyons maintenant comment la distribution change à mesure que nous augmentons le taux de réussite (change $ p $).

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
%matplotlib notebook

def comb_(n, k):
    result = math.factorial(n) / (np.math.factorial(n - k) * np.math.factorial(k))
    return result


def binomial_dist(p, n, k):
    result = comb_(n, k) * (p**k) * ((1 - p) ** (n - k))
    return result

fig = plt.figure()

def update(a):
    plt.cla() 
    x =  np.arange(1, 50, 1)
    y = [binomial_dist(a, 50, i) for i in x]

    plt.bar(x, y, align="center", width=0.4, color="blue", 
                 alpha=0.5, label="binomial p= " + "{:.1f}".format(a))
    
    plt.legend()
    plt.ylim(0, 0.3)
    plt.xlim(0, 50)
    
    
ani = animation.FuncAnimation(fig,
                              update,
                              interval=1000,
                              frames = np.arange(0.1, 1, 0.1),
                              blit=True)
plt.show()
ani.save('Binomial_dist.gif', writer='pillow') 

Binomial_dist.gif

Vous pouvez voir que plus $ p $ est proche de 0,5 $ (la probabilité de succès est de 50 $ % $), plus la queue de la distribution est large et plus elle est proche de 0 $ ou 1 $, plus la forme est nette. En regardant la formule de $ V (X) = np (1-p) $, nous pouvons voir que plus $ p $ est proche de 0,5 $ $, plus la valeur de la variance est grande. Si le taux de réussite est égal, les résultats varieront en conséquence, ce qui correspond au sentiment.

Distribution de Poisson

Vient ensuite la distribution de Poisson. La distribution de probabilité qui représente la probabilité qu'un événement qui se produit en moyenne $ \ lambda $ fois par unité de temps se produise exactement $ k $ fois ** est appelée distribution de Poisson.

--Nombre de véhicules passant par une intersection spécifique en une heure --Nombre d'accès au site en une heure --Nombre d'e-mails reçus par jour --Nombre de visiteurs du magasin au cours d'une certaine période de temps

On dit que etc. suivent la distribution de Poisson.

La formule de la fonction de masse de probabilité de distribution de Poisson est exprimée comme suit.

P(X=k) = \frac{\lambda^k \mathrm{e}^{-\lambda}}{k!}

C'est une formule très déroutante, mais si vous voulez connaître le processus de dérivation détaillé, veuillez consulter Article précédent. La valeur attendue $ E (X) $ et la variance $ V (X) $ lorsque la variable de probabilité $ X $ suit la distribution de Poisson sont les suivantes.


E(X) = \lambda


V(X) = \lambda

Puisque nous parlons d'événements qui se produisent en moyenne $ \ lambda $ fois, il est compréhensible que la valeur attendue soit $ \ lambda $ telle quelle.

Maintenant, dessinons une distribution de probabilité en Python. Superposons la distribution de Poisson pour voir ce que chacun des événements qui se produisent en moyenne 5 $ fois, les événements qui se produisent en moyenne 10 $ fois et les événements qui se produisent en moyenne 15 $ fois par unité de temps.


import numpy as np
import matplotlib.pyplot as plt

def poisson(k, lambda_):
    k = int(k)
    result = (lambda_**k) * (np.exp(-lambda_))  / np.math.factorial(k)
    return result

x =  np.arange(1, 50, 1)
y1= [poisson(i, 5) for i in x]
y2= [poisson(i, 15) for i in x]
y3= [poisson(i, 30) for i in x]

plt.bar(x, y1, align="center", width=0.4, color="red"
                ,alpha=0.5, label="Poisson λ= %d" % 5)

plt.bar(x, y2, align="center", width=0.4, color="green"
                ,alpha=0.5, label="Poisson λ= %d" % 15)

plt.bar(x, y3, align="center", width=0.4, color="blue"
                ,alpha=0.5, label="Poisson λ= %d" % 30)

plt.legend()
plt.savefig('Poisson_sample.png')
plt.show()

Poisson_sample.png

Puisque la valeur de $ \ lambda $ est égale et distribuée, plus la valeur de $ \ lambda $ est grande, plus la base de la distribution de probabilité est large. En regardant le mouvement du changement dans la distribution lorsque $ \ lambda $ est augmenté, cela ressemble à ceci.


import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np
from scipy.stats import poisson
fig = plt.figure()

def update(a):
    plt.cla()
    
    x =  np.arange(1, 50, 1)

    y = [poisson.pmf(i,a) for i in x]

    plt.bar(x, y, align="center", width=0.4, color="red", 
                 alpha=0.5, label="Poisson λ= %d" % a)
    
    plt.legend()
    plt.ylim(0, 0.3)
    plt.xlim(0, 50)
    
ani = animation.FuncAnimation(fig,
                              update,
                              interval=500,
                              frames = np.arange(1, 31, 1),
                              blit=True)
plt.show()
ani.save('Poisson_distribution.gif', writer='pillow') 

Poisson_distribution.gif

Vous pouvez voir que lorsque la valeur de $ \ lambda $ augmente, la queue de la distribution change. Plus le $ \ lambda $ est élevé, qui est le nombre moyen d'événements qui se produisent par unité de temps, plus le nombre de fois que l'événement se produira variera.

Distribution binaire et distribution de Poisson

La distribution de Poisson est en fait une distribution de probabilité créée à partir de la distribution binomiale. La distribution de Poisson consiste à rapprocher $ n → ∞ $ de $ p → 0 $ tout en gardant $ np = \ lambda $ constant. (Il s'agit de la limitation extrême de Poisson. [Article précédent] (https://qiita.com/g-k/items/836820b826775feb5628) est expliqué, donc si vous êtes intéressé, veuillez y aller. )

En d'autres termes, parmi les événements qui suivent la distribution binomiale, ** les événements qui sont nombreux et se produisent rarement ** suivent la distribution de Poisson.

À titre d'exemple concret, dessinons une distribution binomiale de $ n = 100 $ $ p = 0,1 $ et une distribution de Poisson de $ \ lambda = 1 $.

import numpy as np
import matplotlib.pyplot as plt

def poisson(k, lambda_):
    result = (lambda_**k) * (np.exp(-lambda_))  / np.math.factorial(k)
    return result

def comb_(n, k):
    result = math.factorial(n) / (np.math.factorial(n - k) * np.math.factorial(k))
    return result

def binomial_dist(p, n, k):
    result = comb_(n, k) * (p**k) * ((1 - p) ** (n - k))
    return result

x =  np.arange(1, 100, 1)
y1= [poisson(i, 1) for i in x]
y2 = [binomial_dist(0.01, 100, i) for i in x]

plt.xlim(0, 30)

plt.bar(x, y1, align="center", width=0.4, color="red"
                ,alpha=0.5, label="Poisson λ= %d" % 1)

plt.bar(x, y2, align="center", width=0.4, color="blue", 
                 alpha=0.5, label="binomial p= " + "{:.2f}".format(0.01))

plt.legend()
plt.savefig('bino_poisson.png')
plt.show()

bino_poisson.png

Vous pouvez voir que les distributions se chevauchent presque exactement. En dessinant réellement la distribution de cette manière, il devient plus facile de comprendre la relation entre les distributions.

NEXT La prochaine fois, nous aborderons la «distribution géométrique», la «distribution exponentielle» et la «distribution binomiale négative».

Recommended Posts

Distribution de probabilité de niveau 2 du test statistique apprise en Python ②
Distribution de probabilité de test statistique de niveau 2 apprise en Python
[Test statistique niveau 2] Distribution de probabilité discrète
Test statistique (test multiple) en Python: scikit_posthocs
[Test statistique 2e année / quasi 1e année] Formation à l'analyse régressive avec Python (2)
Distribution logistique en Python
1. Statistiques apprises avec Python 2-1. Distribution de probabilité [variable discrète]
Vérifiez la nature atrophique de la distribution de probabilité en Python
Refactoring appris avec Python (Basic)
Algorithme en Python (jugement premier)
Classe Python pour apprendre avec la chimioinfomatique
Générer une distribution U en Python
Ce que j'ai appris en Python
Code de caractère appris en Python
Fonctions Python apprises avec la chimioinfomatique
Test d'hypothèse et distribution de probabilité
Définir le test python dans jenkins
1. Statistiques apprises avec Python 2. Distribution des probabilités [Compréhension approfondie de scipy.stats]
Implémentation de distribution normale mixte en python
Ecrire le code de test du sélénium en python
J'ai essayé d'étudier le processus avec Python
Utilisation élémentaire d'ITK apprise avec Python
Essayez de transcrire la fonction de masse stochastique de la distribution binomiale en Python
Test de stress avec Locust écrit en Python
Ecrire le test dans la docstring python
Probabilité de transition de la chaîne de Markov écrite en Python
Mettre en œuvre collectivement des tests d'hypothèses statistiques en Python
Étudier les mathématiques avec Python: résoudre des problèmes simples de probabilité
Créez un environnement de test Vim + Python en 1 minute
Je veux faire le test de Dunnett en Python
Variables Python et types de données appris avec la chimio-automatique
Faites correspondre la distribution de chaque groupe en Python
Énumération des nombres premiers et jugement des nombres premiers en Python
Configurez un serveur SMTP de test en Python.
TensorFlow: exécuter des données apprises en Python sur Android
Quadtree en Python --2
CURL en Python
Métaprogrammation avec Python
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
Méta-analyse en Python
Unittest en Python
Discord en Python
DCI en Python
tri rapide en python
nCr en python
N-Gram en Python
Distribution et test
Programmation avec Python
Plink en Python
Constante en Python
Test d'intégrité Python
Sqlite en Python
Étape AIC en Python
LINE-Bot [0] en Python
CSV en Python