J'ai des exemples de données pour lesquels je voudrais calculer un intervalle de confiance, en supposant une distribution normale.
J'ai trouvé et installé les paquets numpy et scipy et ai obtenu numpy pour renvoyer un écart moyen et standard (numpy.mean (données), les données étant une liste). Tout conseil sur l'obtention d'un échantillon d'intervalle de confiance serait très apprécié.
import numpy as np
import scipy.stats
def mean_confidence_interval(data, confidence=0.95):
a = 1.0 * np.array(data)
n = len(a)
m, se = np.mean(a), scipy.stats.sem(a)
h = se * scipy.stats.t.ppf((1 + confidence) / 2., n-1)
return m, m-h, m+h
vous pouvez calculer comme ça.
Voici une version abrégée du code de shasan, calculant l'intervalle de confiance à 95% de la moyenne du tableau a
:
import numpy as np, scipy.stats as st
st.t.interval(0.95, len(a)-1, loc=np.mean(a), scale=st.sem(a))
Mais utiliser StatsModels ' tconfint_mean est sans doute encore plus sympa:
import statsmodels.stats.api as sms
sms.DescrStatsW(a).tconfint_mean()
Les hypothèses sous-jacentes pour les deux sont que l'échantillon (le tableau a
) a été tiré indépendamment d'une distribution normale avec un écart-type inconnu (voir MathWorld ou Wikipedia ).
Pour un échantillon de grande taille n, la moyenne d'échantillon est normalement distribuée et vous pouvez calculer son intervalle de confiance à l'aide de st.norm.interval()
(comme suggéré dans le commentaire de Jaime). Mais les solutions ci-dessus sont également correctes pour les petits n, où st.norm.interval()
donne des intervalles de confiance trop étroits (c'est-à-dire une "fausse confiance"). Voir mon réponse à une question similaire pour plus de détails (et un des commentaires de Russ ici).
Voici un exemple où les options correctes donnent (essentiellement) des intervalles de confiance identiques:
In [9]: a = range(10,14)
In [10]: mean_confidence_interval(a)
Out[10]: (11.5, 9.4457397432391215, 13.554260256760879)
In [11]: st.t.interval(0.95, len(a)-1, loc=np.mean(a), scale=st.sem(a))
Out[11]: (9.4457397432391215, 13.554260256760879)
In [12]: sms.DescrStatsW(a).tconfint_mean()
Out[12]: (9.4457397432391197, 13.55426025676088)
Et enfin, le résultat incorrect en utilisant st.norm.interval()
:
In [13]: st.norm.interval(0.95, loc=np.mean(a), scale=st.sem(a))
Out[13]: (10.23484868811834, 12.76515131188166)
Commencez par rechercher valeur z pour votre intervalle de confiance souhaité dans un table de consultation . L'intervalle de confiance est alors mean +/- z*sigma
, où sigma
est l'écart type estimé de la moyenne de votre échantillon, donné par sigma = s / sqrt(n)
, où s
est l'écart type calculé à partir des données de votre échantillon. et n
est la taille de votre échantillon.
À partir de _Python 3.8
_, la bibliothèque standard fournit l'objet NormalDist
dans le cadre du module statistics
:
_from statistics import NormalDist
def confidence_interval(data, confidence=0.95):
dist = NormalDist.from_samples(data)
z = NormalDist().inv_cdf((1 + confidence) / 2.)
h = dist.stdev * z / ((len(data) - 1) ** .5)
return dist.mean - h, dist.mean + h
_
Cette:
Crée un objet NormalDist
à partir de l'échantillon de données ( NormalDist.from_samples(data)
, qui nous donne accès à la moyenne et à l'écart type de l'échantillon via NormalDist.mean
et NormalDist.stdev
.
Calculez le _Z-score
_ en fonction de la distribution normale standard (représentée par NormalDist()
) pour la confiance donnée en utilisant l'inverse de la fonction de distribution cumulative ( inv_cdf
).
Produit l'intervalle de confiance basé sur l'écart type et la moyenne de l'échantillon.
Cela suppose que la taille de l'échantillon est suffisamment grande (disons plus de ~ 100 points) pour pouvoir utiliser la distribution normale standard plutôt que la distribution t de l'étudiant pour calculer la valeur z
.