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.
La distribution binomiale est
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)
n = 100; p = 0.167
df = calc_distributions(n, p, cols=['Distribution binaire', 'Distribution de Poisson', 'distribution normale'])
visualize(df, n, p)
La distribution binaire et la distribution normale correspondent bien
n = 100; p = 0.01
df = calc_distributions(n, p, cols=['Distribution binaire', 'Distribution de Poisson', 'distribution normale'])
visualize(df, n, p)
La distribution binaire et la distribution de Poisson correspondent bien
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)
La distribution supergéométrique et la distribution binomiale correspondent bien
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)
L'erreur est perceptible par rapport au cas de N = 5000
fin
Recommended Posts