Dans un supermarché **, le nombre de plaintes de clients (par jour) ** a été agrégé à 365 $ par jour, et les résultats sont les suivants.
Nombre de réclamations | 0 cas | 1 | 2 cas | 3 cas | 4 cas | 5 cas | 6 | 7 cas |
---|---|---|---|---|---|---|---|---|
Fréquence d'observation (Nombre de jours) |
22 | 49 | 82 | 86 | 63 | 39 | 16 | 8 |
Pouvons-nous considérer ces données comme ** suivant la distribution de Poisson **? Test au niveau de signification de 5 $ % $.
Faisons un graphique de «** fréquence attendue » et « fréquence observée **» calculées en supposant qu'elle suit la distribution de Poisson.
"** Fréquence prévue " est calculé comme suit. Tout d'abord, multipliez le nombre de réclamations par le nombre d'observations ** et divisez par le nombre de jours d'observation de 365 $ pour obtenir le nombre moyen de réclamations par jour ** $ \ mu = 2,931
Visualisation des fréquences observées et attendues
import numpy as np
import scipy.stats as st
import japanize_matplotlib
import matplotlib.pyplot as plt
n = np.arange(0,7+1)
f = np.array((22,49,82,86,63,39,16,8)) #la fréquence
mu = (n*f).sum()/f.sum() #Calculer le nombre moyen de sinistres 2.931
Po = st.poisson(mu=mu) # μ=2.Distribution de Poisson de 931
xp = Po.pmf(k=n) # k=1...Masse de probabilité de 7
xp[-1] = 1 - st.poisson.cdf(n[-2],mu=mu) # k>=7 masse de probabilité k=Intégré dans 7
fp = xp * f.sum() #Fréquence attendue
plt.figure(figsize=(6,3),dpi=120,facecolor='white')
plt.bar(n,f,width=0.9, label='Fréquence d'observation')
plt.plot(n,fp,'o--', c='tab:orange', label=f'Fréquence attendue$Po\,(\\lambda={mu:.2f})$')
plt.tick_params(axis='x',length=0)
plt.legend(framealpha=1, fancybox=False)
plt.gca().set_axisbelow(True)
plt.grid(axis='y')
plt.show()
Le résultat de l'exécution est le suivant.
Nombre de réclamations | 0 cas | 1 | 2 cas | 3 cas | 4 cas | 5 cas | 6 | 7 cas |
---|---|---|---|---|---|---|---|---|
Fréquence d'observation |
22 | 49 | 82 | 86 | 63 | 39 | 16 | 8 |
Fréquence attendue |
19.5 | 57.0 | 83.6 | 81.7 | 59.9 | 35.1 | 17.2 | 11.0 |
L'hypothèse selon laquelle «les objets suivent la distribution de Poisson» (hypothèse nulle) est-elle correcte? Est évalué par ** test statistique **.
Si cette hypothèse est correcte, alors les ** statistiques ** $ t suivantes calculées à partir de ** fréquence d'observation ** $ \ boldsymbol {x} $ et ** fréquence hypothétique attendue ** $ \ boldsymbol {x} _p $ Le test est effectué en utilisant la propriété qui suit (approximativement) la ** distribution du chi carré ** (degré de liberté $ n-2 $).
Dans le numéro actuel, le nombre de réclamations se situe dans la fourchette de 8 $ de 0 $ à 7 $, donc la ** liberté ** est $ n-2 = 8-2 = 6 $.
Trouvons une fonction de densité de probabilité pour une distribution chi carré avec 6 $ de liberté.
Distribution du chi carré avec 6 degrés de liberté
import numpy as np
import scipy.stats as st
import japanize_matplotlib
import matplotlib.pyplot as plt
x = np.linspace(0,25,200)
p = st.chi2.pdf(x, df=6)
x_p95 = st.chi2.ppf(0.95, df=6)
y_range = (0.00,0.16)
plt.figure(figsize=(6,3),dpi=120,facecolor='white')
plt.plot(x,p)
plt.vlines(x_p95,*y_range,lw=1,ls=':',color='tab:red')
x2 = np.linspace(0,x_p95,200)
plt.fill_between(x2,st.chi2.pdf(x2,df=6),np.zeros(len(x2)),facecolor='tab:blue',alpha=0.3)
plt.text(5,0.05,'0.95',ha='center',va='center')
plt.text(x_p95,-0.004,f'{x_p95:.2f}',c='tab:red', ha='center',va='top')
plt.text(x_p95,0.08,f'→ Zone de rejet',c='tab:red')
arrowprops=dict(arrowstyle='->',connectionstyle='angle,angleA=0,angleB=60, rad=1')
kw = dict(xycoords='data',textcoords='data',ha='left', arrowprops=arrowprops)
plt.gca().annotate('0.05', xy=(13.3, 0.003), xytext=(15.5,0.016), **kw)
plt.xlim(0,25)
plt.ylim(*y_range)
plt.xlabel('Statistiques$t$')
plt.show()
Le résultat de l'exécution est le suivant.
En fait, trouvez la statistique $ t $ et sa valeur $ p $ correspondante.
Calcul des statistiques de test et de la valeur p
t = ( ((f-fp)**2)/fp ).sum() #Statistiques t
p = 1 - st.chi2.cdf(t,df=len(n)-2) #6 degrés de liberté(8-2)Valeur P correspondant à t dans la distribution du chi carré de
print(f'Statistiques t= {t:.2f}, Valeur P= {p:.2f} ',end='')
if p >= 0.05 :
print('( >= 0.05 ) \n L'hypothèse nulle (suivant la distribution de Poisson) n'est pas rejetée')
else :
print('( < 0.05 ) \n L'hypothèse nulle (suivant la distribution de Poisson) est rejetée')
Le résultat de l'exécution est le suivant.
Statistiques t= 3.22, valeur p= 0.78 ( >= 0.05 )
L'hypothèse nulle (suivant la distribution de Poisson) n'est pas rejetée
Recommended Posts