web-dev-qa-db-fra.com

Calculer un intervalle de confiance à partir des données de l'échantillon

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é.

84
Bmayer0122
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.

124
shasan

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)
88
Ulrich Stern

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.

14
bogatron

À 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.

3
Xavier Guihot