[PYTHON] Relation et erreur d'approximation de la distribution binomiale, distribution de Poisson, distribution normale, distribution supergéométrique

Aperçu

Livre de référence

Statistiques de base

En gros la relation de chaque distribution

Distribution supergéométrique et distribution binomiale

En distribution supergéométrique

En revanche, dans la distribution binomiale

La distribution hypergéométrique peut être bien approximée par une distribution binomiale si le nombre total (le nombre de billes dans la boîte) est suffisamment supérieur au nombre d'extraits.

Distribution binaire, distribution de Poisson et distribution normale

La distribution binomiale est

Calcul de la distribution et confirmation de l'erreur d'approximation

Code Python (partie fonction)

import scipy as sc
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib

# functions ------------------------
def binomial(n, x, p):
    '''
Distribution binaire
Les événements avec une probabilité p se produisent x fois dans n essais
Chaque essai est indépendant
Exemple: Un événement qui donne 3 sur un dé (probabilité p)=1/6) mais n dés=X lorsque secoué 10 fois=5 fois)
        nCx * p^x * (1-p)^(n-x)
    '''
    return (
        sc.special.comb(n, x)
        * np.power(p, x)
        * np.power(1 - p, n - x)
    )

def poisson(n, x, p):
    '''
Distribution de Poisson
        p->Lorsque 0, la distribution binomiale devient une distribution de Poisson.
    '''
    mean = n * p
    return (
        np.power(mean, x)
        * np.exp(-mean)
        / sc.special.factorial(x)
    )

def gaussian(n, x, p):
    '''
distribution normale
        n->Quand oo, la distribution binomiale devient une distribution normale
    '''
    mean = n * p
    variance = np.power(n * p * (1 - p), 1/2)
    return (
        1.0 
        / (np.power(2 * np.pi, 1/2) * variance)
        / np.exp(
            np.power(x - mean, 2)
            / (2 * np.power(variance, 2))
            )
    )

def hypergeometric(n, x, p, N):
    '''
Distribution super géométrique
Chaque essai n'est pas indépendant
Il est nécessaire de considérer tous les N pour une extraction sans restauration
    '''
    target_size = N * p  #Nombre de hits dans l'ensemble
    return (
        sc.special.comb(target_size, x)  #X combinaisons par
        * sc.special.comb(N - target_size, n - x)  #Perdu n-x combinaisons
        / sc.special.comb(N, n)  #Toutes les combinaisons de n
    )


def calc_distributions(n, p, cols, N=0):
    '''
    ex.:
    n = 30  #Nombre d'essais
    p = 0.16  #Pourcentage de hits
    N = 1000  #Tous (utilisé uniquement dans la distribution supergéométrique)
    '''
    #Préparer un tableau pour stocker les résultats
    bi_arr = np.zeros(n + 1, dtype=np.float)
    po_arr = np.zeros(n + 1, dtype=np.float)
    ga_arr = np.zeros(n + 1, dtype=np.float)

    for x in np.arange(n + 1):
        #Stocker les résultats dans un tableau
        bi_arr[x] = binomial(n, x, p) 
        po_arr[x] = poisson(n, x, p) 
        ga_arr[x] = gaussian(n, x, p) 

    #Stocker le résultat dans un bloc de données
    df = pd.DataFrame()
    df['Distribution binaire'] = bi_arr
    df['Distribution de Poisson'] = po_arr
    df['distribution normale'] = ga_arr

    if N > 0:
        hy_arr = np.zeros(n + 1, dtype=np.float)
        for x in np.arange(n + 1):
            hy_arr[x] = hypergeometric(n, x, p, N)
        df['Distribution super géométrique'] = hy_arr

    return df[cols]


def visualize(df,n, p, N=0):
    plot_params = {
        'linestyle':'-', 
        'markersize':5,
        'marker':'o'
    }
    colors = [
        'black',
        'blue',
        'green',
        'purple',
    ]
    
    plt.close(1)
    figure_ = plt.figure(1, figsize=(8,4))    
    axes_ = figure_.add_subplot(111)  #Créer des axes
    for i, col in enumerate(df.columns):
        if i == 0:
            plot_params['linewidth'] = 2
            plot_params['alpha'] = 1.0
        else:
            plot_params['linewidth'] = 1
            plot_params['alpha'] = 0.4
        plot_params['color'] = colors[i]
        axes_.plot(
            df.index.values, df[col].values,
            label = col,
            **plot_params,
        )

    plt.legend()
    plt.xlabel('Nombre de hits x')
    plt.ylabel('Probabilité de gagner x fois sur n fois')
    title = 'Pourcentage de visites p:{p:.2f},Nombre d'essais n:{n}'.format(p=p, n=n)
    if 'Distribution super géométrique' in df.columns:
        title += ',Tout N:{N}'.format(N=N)
    plt.title(title)
    xmax = n * p * 2
    if xmax<10: xmax = 10;
    plt.xlim([0, xmax])
    #(L'expression «nombre de fois» n'est pas bonne compte tenu de l'extraction sans restauration)

Exécuter dans des conditions différentes, vérifier l'erreur

Lancez les dés 100 fois et combien de fois 1 sort

n = 100; p = 0.167
df = calc_distributions(n, p, cols=['Distribution binaire', 'Distribution de Poisson', 'distribution normale'])
visualize(df, n, p)

image.png La distribution binaire et la distribution normale correspondent bien

Secouez la facette 100 fois 100 et combien de fois 1 apparaîtra

n = 100; p = 0.01
df = calc_distributions(n, p, cols=['Distribution binaire', 'Distribution de Poisson', 'distribution normale'])
visualize(df, n, p)

image.png La distribution binaire et la distribution de Poisson correspondent bien

10% des 5000 habitants sont des enfants. Combien d'enfants sur 100 sont-ils sélectionnés?

n = 100; p = 0.1; N = 5000
df = calc_distributions(n, p, cols=['Distribution super géométrique','Distribution binaire'], N=N)
visualize(df, n, p, N)

image.png La distribution supergéométrique et la distribution binomiale correspondent bien

10% des 500 habitants sont des enfants. Combien d'enfants sur 100 sont-ils sélectionnés?

n = 100; p = 0.1; N = 500
df = calc_distributions(n, p, cols=['Distribution super géométrique','Distribution binaire'], N=N)
visualize(df, n, p, N)

image.png L'erreur est perceptible par rapport au cas de N = 5000

fin

Recommended Posts

Relation et erreur d'approximation de la distribution binomiale, distribution de Poisson, distribution normale, distribution supergéométrique
Vérification de la distribution normale
Comprendre la signification des formules de distribution normale complexes et bizarres
[Statistiques] Visualisons la relation entre la distribution normale et la distribution du chi carré.
pix2pix tensorflow2 Enregistrement d'essais et d'erreurs