Tester si les données observées suivent la distribution de Poisson (Test de l'adéquation de la distribution de Poisson par Python)

Problème de réglage

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 $ % $.

Visualisation

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 . Ensuite, trouvez la masse stochastique ( k = 0,7 $) pour la ** distribution de Poisson ** avec une moyenne de 2,93 $ et multipliez par 365 $ le nombre de jours d'observation pour obtenir la « fréquence attendue **».

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.
Télécharger (1) .png

Nombre de réclamations 0 cas 1 2 cas 3 cas 4 cas 5 cas 6 7 cas
Fréquence d'observation
f
22 49 82 86 63 39 16 8
Fréquence attendue
f_{p}
19.5 57.0 83.6 81.7 59.9 35.1 17.2 11.0

Test d'aptitude

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 $).

t = \sum \frac{(x-x_p)^2}{x_p}

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.
Download.png

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

Tester si les données observées suivent la distribution de Poisson (Test de l'adéquation de la distribution de Poisson par Python)
Tester l'adéquation de la distribution
Test de la différence entre les valeurs moyennes des données de comptage selon la distribution de Poisson
Pandas du débutant, par le débutant, pour le débutant [Python]
[Python] Teste le matagi lunaire du delta relatif
L'histoire de la lecture des données HSPICE en Python
Trouver la fonction de distribution cumulative par tri (version Python)
[Python] Génère des nombres aléatoires qui suivent la distribution de Rayleigh
Ne pas être conscient du contenu des données en python
Python: Diagramme de distribution de données bidimensionnelle (estimation de la densité du noyau)
Utilisons les données ouvertes de "Mamebus" en Python
Comprendre l'état de la perte de données - Python vs R
Vérifiez la nature atrophique de la distribution de probabilité en Python
Jugement des nombres premiers par Python
le zen de Python
Essayez de gratter les données COVID-19 Tokyo avec Python
Comment tester les attributs ajoutés par add_request_method de pyramid
L'histoire du rubyiste aux prises avec Python :: Dict data with pycall
[Homologie] Comptez le nombre de trous dans les données avec Python
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
Attacher au processus Python de la destination SSH et déboguer
[Python] J'ai essayé de collecter des données en utilisant l'API de wikipedia
Trouver le diamètre du graphique par recherche de priorité de largeur (mémoire Python)
J'ai réussi le test d'analyse de données Python, j'ai donc résumé les points
Ce que j'ai vu en analysant les données du marché des ingénieurs
Trouvons un graphique de la distribution de Poisson et de la distribution cumulative de Poisson en Python et Java, respectivement.